//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include <boost/test/unit_test.hpp>
#include "ParserFlatbuffersFixture.hpp"
#include "../TfLiteParser.hpp"

#include <string>
#include <iostream>

BOOST_AUTO_TEST_SUITE(TensorflowLiteParser)

struct ConcatenationFixture : public ParserFlatbuffersFixture
{
    explicit ConcatenationFixture(const std::string & inputShape1,
                                  const std::string & inputShape2,
                                  const std::string & outputShape,
                                  const std::string & axis,
                                  const std::string & activation="NONE")
    {
        m_JsonString = R"(
            {
                "version": 3,
                "operator_codes": [ { "builtin_code": "CONCATENATION" } ],
                "subgraphs": [ {
                    "tensors": [
                        {
                            "shape": )" + inputShape1 + R"(,
                            "type": "UINT8",
                            "buffer": 0,
                            "name": "inputTensor1",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        },
                        {
                            "shape": )" + inputShape2 + R"(,
                            "type": "UINT8",
                            "buffer": 1,
                            "name": "inputTensor2",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        },
                        {
                            "shape": )" + outputShape + R"( ,
                            "type": "UINT8",
                            "buffer": 2,
                            "name": "outputTensor",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        }
                    ],
                    "inputs": [ 0, 1 ],
                    "outputs": [ 2 ],
                    "operators": [
                        {
                            "opcode_index": 0,
                            "inputs": [ 0, 1 ],
                            "outputs": [ 2 ],
                            "builtin_options_type": "ConcatenationOptions",
                            "builtin_options": {
                                "axis": )" + axis + R"(,
                                "fused_activation_function": )" + activation + R"(
                            },
                            "custom_options_format": "FLEXBUFFERS"
                        }
                    ],
                } ],
                "buffers" : [
                    { },
                    { }
                ]
            }
        )";
        Setup();
    }
};


struct ConcatenationFixtureNegativeDim : ConcatenationFixture
{
    ConcatenationFixtureNegativeDim() : ConcatenationFixture("[ 1, 1, 2, 2 ]",
                                                             "[ 1, 1, 2, 2 ]",
                                                             "[ 1, 2, 2, 2 ]",
                                                             "-3" ) {}
};

BOOST_FIXTURE_TEST_CASE(ParseConcatenationNegativeDim, ConcatenationFixtureNegativeDim)
{
    RunTest<4, armnn::DataType::QuantisedAsymm8>(
        0,
        {{"inputTensor1", { 0, 1, 2, 3 }},
        {"inputTensor2", { 4, 5, 6, 7 }}},
        {{"outputTensor", { 0, 1, 2, 3, 4, 5, 6, 7 }}});
}

struct ConcatenationFixtureNCHW : ConcatenationFixture
{
    ConcatenationFixtureNCHW() : ConcatenationFixture("[ 1, 1, 2, 2 ]", "[ 1, 1, 2, 2 ]", "[ 1, 2, 2, 2 ]", "1" ) {}
};

BOOST_FIXTURE_TEST_CASE(ParseConcatenationNCHW, ConcatenationFixtureNCHW)
{
    RunTest<4, armnn::DataType::QuantisedAsymm8>(
        0,
        {{"inputTensor1", { 0, 1, 2, 3 }},
        {"inputTensor2", { 4, 5, 6, 7 }}},
        {{"outputTensor", { 0, 1, 2, 3, 4, 5, 6, 7 }}});
}

struct ConcatenationFixtureNHWC : ConcatenationFixture
{
    ConcatenationFixtureNHWC() : ConcatenationFixture("[ 1, 1, 2, 2 ]", "[ 1, 1, 2, 2 ]", "[ 1, 1, 2, 4 ]", "3" ) {}
};

BOOST_FIXTURE_TEST_CASE(ParseConcatenationNHWC, ConcatenationFixtureNHWC)
{
    RunTest<4, armnn::DataType::QuantisedAsymm8>(
        0,
        {{"inputTensor1", { 0, 1, 2, 3 }},
        {"inputTensor2", { 4, 5, 6, 7 }}},
        {{"outputTensor", { 0, 1, 4, 5, 2, 3, 6, 7 }}});
}

struct ConcatenationFixtureDim1 : ConcatenationFixture
{
    ConcatenationFixtureDim1() : ConcatenationFixture("[ 1, 2, 3, 4 ]", "[ 1, 2, 3, 4 ]", "[ 1, 4, 3, 4 ]", "1" ) {}
};

BOOST_FIXTURE_TEST_CASE(ParseConcatenationDim1, ConcatenationFixtureDim1)
{
    RunTest<4, armnn::DataType::QuantisedAsymm8>(
        0,
        { { "inputTensor1", {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
                               12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 } },
        { "inputTensor2", {  50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
                             62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73 } } },
        { { "outputTensor", {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,
                               12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
                               50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
                               62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73 } } });
}

struct ConcatenationFixtureDim3 : ConcatenationFixture
{
    ConcatenationFixtureDim3() : ConcatenationFixture("[ 1, 2, 3, 4 ]", "[ 1, 2, 3, 4 ]", "[ 1, 2, 3, 8 ]", "3" ) {}
};

BOOST_FIXTURE_TEST_CASE(ParseConcatenationDim3, ConcatenationFixtureDim3)
{
    RunTest<4, armnn::DataType::QuantisedAsymm8>(
        0,
        { { "inputTensor1", {  0,  1,  2,  3,
                               4,  5,  6,  7,
                               8,  9, 10, 11,
                               12, 13, 14, 15,
                               16, 17, 18, 19,
                               20, 21, 22, 23 } },
        { "inputTensor2", {  50, 51, 52, 53,
                             54, 55, 56, 57,
                             58, 59, 60, 61,
                             62, 63, 64, 65,
                             66, 67, 68, 69,
                             70, 71, 72, 73 } } },
        { { "outputTensor", {  0,  1,  2,  3,
                               50, 51, 52, 53,
                               4,  5,  6,  7,
                               54, 55, 56, 57,
                               8,  9,  10, 11,
                               58, 59, 60, 61,
                               12, 13, 14, 15,
                               62, 63, 64, 65,
                               16, 17, 18, 19,
                               66, 67, 68, 69,
                               20, 21, 22, 23,
                               70, 71, 72, 73 } } });
}

BOOST_AUTO_TEST_SUITE_END()
