//===-- flang/unittests/RuntimeGTest/MiscIntrinsic.cpp ----------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "gtest/gtest.h"
#include "tools.h"
#include "../../runtime/allocatable.h"
#include "../../runtime/cpp-type.h"
#include "../../runtime/descriptor.h"
#include "../../runtime/misc-intrinsic.h"

using namespace Fortran::runtime;

// TRANSFER examples from Fortran 2018

TEST(MiscIntrinsic, TransferScalar) {
  StaticDescriptor<2, true, 2> staticDesc[2];
  auto &result{staticDesc[0].descriptor()};
  auto source{MakeArray<TypeCategory::Integer, 4>(
      std::vector<int>{}, std::vector<std::int32_t>{1082130432})};
  auto &mold{staticDesc[1].descriptor()};
  mold.Establish(TypeCategory::Real, 4, nullptr, 0);
  RTNAME(Transfer)(result, *source, mold, __FILE__, __LINE__);
  EXPECT_EQ(result.rank(), 0);
  EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Real, 4}.raw()));
  EXPECT_EQ(*result.OffsetElement<float>(), 4.0);
  result.Destroy();
}

TEST(MiscIntrinsic, TransferMold) {
  StaticDescriptor<2, true, 2> staticDesc[2];
  auto &result{staticDesc[0].descriptor()};
  auto source{MakeArray<TypeCategory::Real, 4>(
      std::vector<int>{3}, std::vector<float>{1.1F, 2.2F, 3.3F})};
  auto &mold{staticDesc[1].descriptor()};
  SubscriptValue extent[1]{1};
  mold.Establish(TypeCategory::Complex, 4, nullptr, 1, extent);
  RTNAME(Transfer)(result, *source, mold, __FILE__, __LINE__);
  EXPECT_EQ(result.rank(), 1);
  EXPECT_EQ(result.GetDimension(0).LowerBound(), 1);
  EXPECT_EQ(result.GetDimension(0).Extent(), 2);
  EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Complex, 4}.raw()));
  EXPECT_EQ(result.OffsetElement<float>()[0], 1.1F);
  EXPECT_EQ(result.OffsetElement<float>()[1], 2.2F);
  EXPECT_EQ(result.OffsetElement<float>()[2], 3.3F);
  EXPECT_EQ(result.OffsetElement<float>()[3], 0.0F);
  result.Destroy();
}

TEST(MiscIntrinsic, TransferSize) {
  StaticDescriptor<2, true, 2> staticDesc[2];
  auto &result{staticDesc[0].descriptor()};
  auto source{MakeArray<TypeCategory::Real, 4>(
      std::vector<int>{3}, std::vector<float>{1.1F, 2.2F, 3.3F})};
  auto &mold{staticDesc[1].descriptor()};
  SubscriptValue extent[1]{1};
  mold.Establish(TypeCategory::Complex, 4, nullptr, 1, extent);
  RTNAME(TransferSize)(result, *source, mold, __FILE__, __LINE__, 1);
  EXPECT_EQ(result.rank(), 1);
  EXPECT_EQ(result.GetDimension(0).LowerBound(), 1);
  EXPECT_EQ(result.GetDimension(0).Extent(), 1);
  EXPECT_EQ(result.type().raw(), (TypeCode{TypeCategory::Complex, 4}.raw()));
  EXPECT_EQ(result.OffsetElement<float>()[0], 1.1F);
  EXPECT_EQ(result.OffsetElement<float>()[1], 2.2F);
  result.Destroy();
}
