﻿//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include <boost/test/unit_test.hpp>
#include <boost/multi_array.hpp>

#include "armnn/ArmNN.hpp"
#include "backends/RefWorkloadFactory.hpp"
#if ARMCOMPUTECL_ENABLED
#include "backends/ClWorkloadFactory.hpp"
#endif
#if ARMCOMPUTENEON_ENABLED
#include "backends/NeonWorkloadFactory.hpp"
#endif
#include "backends/CpuTensorHandle.hpp"
#include "test/TensorHelpers.hpp"

#include "TensorCopyUtils.hpp"
#include "WorkloadTestUtils.hpp"

#if ARMCOMPUTECL_ENABLED || ARMCOMPUTENEON_ENABLED
#include "../ArmComputeTensorUtils.hpp"
#endif

BOOST_AUTO_TEST_SUITE(MemCopyTestSuite)

void MemCopyTest(armnn::IWorkloadFactory& srcWorkloadFactory, armnn::IWorkloadFactory& dstWorkloadFactory,
                 bool withSubtensors)
{
    const std::array<unsigned int, 4> shapeData = { { 1u, 1u, 6u, 5u } };
    const armnn::TensorShape tensorShape(4, shapeData.data());
    const armnn::TensorInfo tensorInfo(tensorShape, armnn::DataType::Float32);
    boost::multi_array<float, 4> inputData = MakeTensor<float, 4>(tensorInfo, std::vector<float>(
        {
            1.0f, 2.0f, 3.0f, 4.0f, 5.0f,

            6.0f, 7.0f, 8.0f, 9.0f, 10.0f,

            11.0f, 12.0f, 13.0f, 14.0f, 15.0f,

            16.0f, 17.0f, 18.0f, 19.0f, 20.0f,

            21.0f, 22.0f, 23.0f, 24.0f, 25.0f,

            26.0f, 27.0f, 28.0f, 29.0f, 30.0f,
        })
    );

    boost::multi_array<float, 4> outputData(shapeData);

    auto inputTensorHandle = srcWorkloadFactory.CreateTensorHandle(tensorInfo);
    auto outputTensorHandle = dstWorkloadFactory.CreateTensorHandle(tensorInfo);

    AllocateAndCopyDataToITensorHandle(inputTensorHandle.get(), inputData.data());
    outputTensorHandle->Allocate();

    armnn::MemCopyQueueDescriptor memCopyQueueDesc;
    armnn::WorkloadInfo workloadInfo;

    const unsigned int origin[4] = {};

    auto workloadInput = (withSubtensors && srcWorkloadFactory.SupportsSubTensors())
                         ? srcWorkloadFactory.CreateSubTensorHandle(*inputTensorHandle, tensorShape, origin)
                         : std::move(inputTensorHandle);
    auto workloadOutput = (withSubtensors && dstWorkloadFactory.SupportsSubTensors())
                          ? dstWorkloadFactory.CreateSubTensorHandle(*outputTensorHandle, tensorShape, origin)
                          : std::move(outputTensorHandle);

    AddInputToWorkload(memCopyQueueDesc, workloadInfo, tensorInfo, workloadInput.get());
    AddOutputToWorkload(memCopyQueueDesc, workloadInfo, tensorInfo, workloadOutput.get());

    dstWorkloadFactory.CreateMemCopy(memCopyQueueDesc, workloadInfo)->Execute();

    CopyDataFromITensorHandle(outputData.data(), workloadOutput.get());

    BOOST_TEST(CompareTensors(inputData, outputData));
}

template <typename SrcWorkloadFactory, typename DstWorkloadFactory>
void MemCopyTest(bool withSubtensors)
{
    SrcWorkloadFactory srcWorkloadFactory;
    DstWorkloadFactory dstWorkloadFactory;
    MemCopyTest(srcWorkloadFactory, dstWorkloadFactory, withSubtensors);
}

#if ARMCOMPUTECL_ENABLED || ARMCOMPUTENEON_ENABLED

BOOST_AUTO_TEST_CASE(AclTypeConversions)
{
    arm_compute::Strides strides(1,2,3,4);
    armnn::TensorShape convertedStrides = armnn::armcomputetensorutils::GetStrides(strides);
    BOOST_TEST(convertedStrides[0] == 4);
    BOOST_TEST(convertedStrides[1] == 3);
    BOOST_TEST(convertedStrides[2] == 2);
    BOOST_TEST(convertedStrides[3] == 1);

    arm_compute::TensorShape shape(5,6,7,8);
    armnn::TensorShape convertedshape = armnn::armcomputetensorutils::GetShape(shape);
    BOOST_TEST(convertedshape[0] == 8);
    BOOST_TEST(convertedshape[1] == 7);
    BOOST_TEST(convertedshape[2] == 6);
    BOOST_TEST(convertedshape[3] == 5);
}
#endif

#if ARMCOMPUTECL_ENABLED

BOOST_AUTO_TEST_CASE(CopyBetweenCpuAndGpu)
{
    MemCopyTest<armnn::RefWorkloadFactory, armnn::ClWorkloadFactory>(false);
}

BOOST_AUTO_TEST_CASE(CopyBetweenGpuAndCpu)
{
    MemCopyTest<armnn::ClWorkloadFactory, armnn::RefWorkloadFactory>(false);
}

BOOST_AUTO_TEST_CASE(CopyBetweenCpuAndGpuWithSubtensors)
{
    MemCopyTest<armnn::RefWorkloadFactory, armnn::ClWorkloadFactory>(true);
}

BOOST_AUTO_TEST_CASE(CopyBetweenGpuAndCpuWithSubtensors)
{
    MemCopyTest<armnn::ClWorkloadFactory, armnn::RefWorkloadFactory>(true);
}

#endif // ARMCOMPUTECL_ENABLED

#if ARMCOMPUTENEON_ENABLED

BOOST_AUTO_TEST_CASE(CopyBetweenCpuAndNeon)
{
    MemCopyTest<armnn::RefWorkloadFactory, armnn::NeonWorkloadFactory>(false);
}

BOOST_AUTO_TEST_CASE(CopyBetweenNeonAndCpu)
{
    MemCopyTest<armnn::NeonWorkloadFactory, armnn::RefWorkloadFactory>(false);
}

BOOST_AUTO_TEST_CASE(CopyBetweenCpuAndNeonWithSubtensors)
{
    MemCopyTest<armnn::RefWorkloadFactory, armnn::NeonWorkloadFactory>(true);
}

BOOST_AUTO_TEST_CASE(CopyBetweenNeonAndCpuWithSubtensors)
{
    MemCopyTest<armnn::NeonWorkloadFactory, armnn::RefWorkloadFactory>(true);
}

#endif // ARMCOMPUTENEON_ENABLED

#if ARMCOMPUTECL_ENABLED && ARMCOMPUTENEON_ENABLED

BOOST_AUTO_TEST_CASE(CopyBetweenNeonAndGpu)
{
    MemCopyTest<armnn::NeonWorkloadFactory, armnn::ClWorkloadFactory>(false);
}

BOOST_AUTO_TEST_CASE(CopyBetweenGpuAndNeon)
{
    MemCopyTest<armnn::ClWorkloadFactory, armnn::NeonWorkloadFactory>(false);
}

BOOST_AUTO_TEST_CASE(CopyBetweenNeonAndGpuWithSubtensors)
{
    MemCopyTest<armnn::NeonWorkloadFactory, armnn::ClWorkloadFactory>(true);
}

BOOST_AUTO_TEST_CASE(CopyBetweenGpuAndNeonWithSubtensors)
{
    MemCopyTest<armnn::ClWorkloadFactory, armnn::NeonWorkloadFactory>(true);
}

#endif

BOOST_AUTO_TEST_SUITE_END()
