//
// 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, uint8_t>(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, uint8_t>(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, uint8_t>(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, uint8_t>(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, uint8_t>(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()
