//
// 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 PackFixture : public ParserFlatbuffersFixture
{
    explicit PackFixture(const std::string & inputShape,
                         const unsigned int numInputs,
                         const std::string & outputShape,
                         const std::string & axis)
    {
        m_JsonString = R"(
            {
                "version": 3,
                "operator_codes": [ { "builtin_code": "PACK" } ],
                "subgraphs": [ {
                    "tensors": [)";

        for (unsigned int i = 0; i < numInputs; ++i)
        {
            m_JsonString += R"(
                        {
                            "shape": )" + inputShape + R"(,
                            "type": "FLOAT32",
                            "buffer": )" + std::to_string(i) + R"(,
                            "name": "inputTensor)" + std::to_string(i + 1) + R"(",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        },)";
        }

        std::string inputIndexes;
        for (unsigned int i = 0; i < numInputs-1; ++i)
        {
            inputIndexes += std::to_string(i) + R"(, )";
        }
        inputIndexes += std::to_string(numInputs-1);

        m_JsonString += R"(
                        {
                            "shape": )" + outputShape + R"( ,
                            "type": "FLOAT32",
                            "buffer": )" + std::to_string(numInputs) + R"(,
                            "name": "outputTensor",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        }
                    ],
                    "inputs": [ )" + inputIndexes + R"( ],
                    "outputs": [ 2 ],
                    "operators": [
                        {
                            "opcode_index": 0,
                            "inputs": [ )" + inputIndexes + R"( ],
                            "outputs": [ 2 ],
                            "builtin_options_type": "PackOptions",
                            "builtin_options": {
                                "axis": )" + axis + R"(,
                                "values_count": )" + std::to_string(numInputs) + R"(
                            },
                            "custom_options_format": "FLEXBUFFERS"
                        }
                    ],
                } ],
                "buffers" : [)";
            
            for (unsigned int i = 0; i < numInputs-1; ++i)
            {
                m_JsonString += R"(
                    { },)";
            }
            m_JsonString += R"(
                    { }
                ]
            })";
        Setup();
    }
};

struct SimplePackFixture : PackFixture
{
    SimplePackFixture() : PackFixture("[ 3, 2, 3 ]",
                                      2,
                                      "[ 3, 2, 3, 2 ]",
                                      "3") {}
};

BOOST_FIXTURE_TEST_CASE(ParsePack, SimplePackFixture)
{
    RunTest<4, armnn::DataType::Float32>(
    0,
    { {"inputTensor1", { 1, 2, 3,
                         4, 5, 6,

                         7, 8, 9,
                         10, 11, 12,

                         13, 14, 15,
                         16, 17, 18 } },
    {"inputTensor2", { 19, 20, 21,
                       22, 23, 24,

                       25, 26, 27,
                       28, 29, 30,

                       31, 32, 33,
                       34, 35, 36 } } },
    { {"outputTensor", { 1, 19,
                         2, 20,
                         3, 21,

                         4, 22,
                         5, 23,
                         6, 24,


                         7, 25,
                         8, 26,
                         9, 27,

                         10, 28,
                         11, 29,
                         12, 30,
 

                         13, 31,
                         14, 32,
                         15, 33,

                         16, 34,
                         17, 35,
                         18, 36 } } });
}

BOOST_AUTO_TEST_SUITE_END()
