//
// 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 MinimumFixture : public ParserFlatbuffersFixture
{
    explicit MinimumFixture(const std::string & inputShape1,
                            const std::string & inputShape2,
                            const std::string & outputShape)
    {
        m_JsonString = R"(
            {
                "version": 3,
                "operator_codes": [ { "builtin_code": "MINIMUM" } ],
                "subgraphs": [ {
                    "tensors": [
                        {
                            "shape": )" + inputShape1 + R"(,
                            "type": "FLOAT32",
                            "buffer": 0,
                            "name": "inputTensor1",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        },
                        {
                            "shape": )" + inputShape2 + R"(,
                            "type": "FLOAT32",
                            "buffer": 1,
                            "name": "inputTensor2",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        },
                        {
                            "shape": )" + outputShape + R"( ,
                            "type": "FLOAT32",
                            "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 ],
                            "custom_options_format": "FLEXBUFFERS"
                        }
                    ],
                } ],
                "buffers" : [
                    { },
                    { }
                ]
            }
        )";
        Setup();
    }
};


struct MinimumFixture4D : MinimumFixture
{
    MinimumFixture4D() : MinimumFixture("[ 1, 2, 2, 3 ]",
                                        "[ 1, 2, 2, 3 ]",
                                        "[ 1, 2, 2, 3 ]") {}
};

BOOST_FIXTURE_TEST_CASE(ParseMinimum4D, MinimumFixture4D)
{
  RunTest<4, armnn::DataType::Float32>(
      0,
      {{"inputTensor1", { 0.0f,  1.0f,  2.0f,
                          3.0f,  4.0f,  5.0f,
                          6.0f,  7.0f,  8.0f,
                          9.0f, 10.0f, 11.0f }},
      {"inputTensor2",  { 0.0f, 0.0f, 0.0f,
                          5.0f, 5.0f, 5.0f,
                          7.0f, 7.0f, 7.0f,
                          9.0f, 9.0f, 9.0f }}},
      {{"outputTensor", { 0.0f, 0.0f, 0.0f,
                          3.0f, 4.0f, 5.0f,
                          6.0f, 7.0f, 7.0f,
                          9.0f, 9.0f, 9.0f }}});
}

struct MinimumBroadcastFixture4D : MinimumFixture
{
    MinimumBroadcastFixture4D() : MinimumFixture("[ 1, 1, 2, 1 ]",
                                                 "[ 1, 2, 1, 3 ]",
                                                 "[ 1, 2, 2, 3 ]") {}
};

BOOST_FIXTURE_TEST_CASE(ParseMinimumBroadcast4D, MinimumBroadcastFixture4D)
{
  RunTest<4, armnn::DataType::Float32>(
      0,
      {{"inputTensor1", { 2.0f,
                          4.0f }},
      {"inputTensor2",  { 1.0f, 2.0f, 3.0f,
                          4.0f, 5.0f, 6.0f }}},
      {{"outputTensor", { 1.0f, 2.0f, 2.0f,
                          1.0f, 2.0f, 3.0f,
                          2.0f, 2.0f, 2.0f,
                          4.0f, 4.0f, 4.0f }}});
}

struct MinimumBroadcastFixture4D1D : MinimumFixture
{
    MinimumBroadcastFixture4D1D() : MinimumFixture("[ 1, 2, 2, 3 ]",
                                                   "[ 1 ]",
                                                   "[ 1, 2, 2, 3 ]") {}
};

BOOST_FIXTURE_TEST_CASE(ParseMinimumBroadcast4D1D, MinimumBroadcastFixture4D1D)
{
  RunTest<4, armnn::DataType::Float32>(
      0,
      {{"inputTensor1", { 0.0f,  1.0f,  2.0f,
                          3.0f,  4.0f,  5.0f,
                          6.0f,  7.0f,  8.0f,
                          9.0f, 10.0f, 11.0f }},
      {"inputTensor2",  { 5.0f }}},
      {{"outputTensor", {  0.0f, 1.0f, 2.0f,
                           3.0f, 4.0f, 5.0f,
                           5.0f, 5.0f, 5.0f,
                           5.0f, 5.0f, 5.0f }}});
}

struct MinimumBroadcastFixture1D4D : MinimumFixture
{
    MinimumBroadcastFixture1D4D() : MinimumFixture("[ 3 ]",
                                                   "[ 1, 2, 2, 3 ]",
                                                   "[ 1, 2, 2, 3 ]") {}
};

BOOST_FIXTURE_TEST_CASE(ParseMinimumBroadcast1D4D, MinimumBroadcastFixture1D4D)
{
  RunTest<4, armnn::DataType::Float32>(
      0,
      {{"inputTensor1", { 5.0f,  6.0f,  7.0f }},
      {"inputTensor2",  { 0.0f,  1.0f,  2.0f,
                          3.0f,  4.0f,  5.0f,
                          6.0f,  7.0f,  8.0f,
                          9.0f, 10.0f, 11.0f }}},
      {{"outputTensor", { 0.0f, 1.0f, 2.0f,
                          3.0f, 4.0f, 5.0f,
                          5.0f, 6.0f, 7.0f,
                          5.0f, 6.0f, 7.0f }}});
}

struct MinimumBroadcastFixture2D0D : public ParserFlatbuffersFixture
{
    explicit MinimumBroadcastFixture2D0D()
    {
        m_JsonString = R"(
            {
                "version": 3,
                "operator_codes": [ { "builtin_code": "MINIMUM" } ],
                "subgraphs": [ {
                    "tensors": [
                        {
                            "shape": [ 1, 2 ],
                            "type": "FLOAT32",
                            "buffer": 0,
                            "name": "input0",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        },
                        {
                            "shape": [ ],
                            "type": "FLOAT32",
                            "buffer": 2,
                            "name": "input1",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        },
                        {
                            "shape": [ 1, 2 ] ,
                            "type": "FLOAT32",
                            "buffer": 1,
                            "name": "output",
                            "quantization": {
                                "min": [ 0.0 ],
                                "max": [ 255.0 ],
                                "scale": [ 1.0 ],
                                "zero_point": [ 0 ],
                            }
                        }
                    ],
                    "inputs": [ 0 ],
                    "outputs": [ 2 ],
                    "operators": [
                        {
                            "opcode_index": 0,
                            "inputs": [ 0, 1 ],
                            "outputs": [ 2 ],
                            "custom_options_format": "FLEXBUFFERS"
                        }
                    ],
                } ],
                "buffers" : [
                    { },
                    { },
                    { "data": [ 0, 0, 0, 64 ] }
                ]
            }
        )";
        Setup();
    }
};

BOOST_FIXTURE_TEST_CASE(ParseMinimumBroadcast2D0D, MinimumBroadcastFixture2D0D)
{
    RunTest<2, armnn::DataType::Float32>(
            0,
            {{"input0", { 1.0f, 5.0f }}},
            {{"output", { 1.0f, 2.0f }}});
}

BOOST_AUTO_TEST_SUITE_END()
