//
// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
// SPDX-License-Identifier: MIT
//

#include "ParserFlatbuffersSerializeFixture.hpp"
#include <armnnDeserializer/IDeserializer.hpp>

#include <string>

TEST_SUITE("Deserializer_Convolution3d")
{
struct Convolution3dFixture : public ParserFlatbuffersSerializeFixture
{
    explicit Convolution3dFixture(const std::string& inputShape,
                                  const std::string& outputShape,
                                  const std::string& weightsShape,
                                  const std::string& dataType)
    {
        m_JsonString = R"(
        {
          inputIds: [0],
          outputIds: [2],
          layers: [
            {
              layer_type: "InputLayer",
              layer: {
                base: {
                  layerBindingId: 0,
                  base: {
                    layerName: "InputLayer",
                    layerType: "Input",
                    inputSlots: [

                    ],
                    outputSlots: [
                      {
                        tensorInfo: {
                          dimensions: )" + inputShape + R"(,
                          dataType: )" + dataType + R"(,
                          quantizationScale: 0.1,
                          dimensionSpecificity: [
                            true,
                            true,
                            true,
                            true,
                            true
                          ]
                        }
                      }
                    ]
                  }
                }
              }
            },
            {
              layer_type: "ConstantLayer",
              layer: {
                base: {
                  index: 1,
                  layerName: "Weights",
                  layerType: "Constant",
                  inputSlots: [

                  ],
                  outputSlots: [
                    {
                      tensorInfo: {
                        dimensions: )" + weightsShape + R"(,
                        dataType: )" + dataType + R"(,
                        quantizationScale: 0.1,
                        dimensionSpecificity: [
                          true,
                          true,
                          true,
                          true,
                          true
                        ]
                      }
                    }
                  ]
                },
                input: {
                  info: {
                    dimensions: )" + weightsShape + R"(,
                    dataType: )" + dataType + R"(,
                    quantizationScale: 0.1,
                    dimensionSpecificity: [
                      true,
                      true,
                      true,
                      true,
                      true
                    ]
                  },
                  data_type: "ByteData",
                  data: {
                    data: [
                      1, 1, 1,
                      1, 1, 1,
                      1, 1, 1,

                      0, 0, 0,
                      0, 0, 0,
                      0, 0, 0,

                      0, 0, 0,
                      0, 0, 0,
                      0, 0, 0
                    ]
                  }
                }
              }
            },
            {
              layer_type: "Convolution3dLayer",
              layer: {
                base: {
                  index: 2,
                  layerName: "convolution3d",
                  layerType: "Convolution3d",
                  inputSlots: [
                    {
                      connection: {
                        sourceLayerIndex: 0,
                        outputSlotIndex: 0
                      }
                    },
                    {
                      index: 1,
                      connection: {
                        sourceLayerIndex: 1,
                        outputSlotIndex: 0
                      }
                    }
                  ],
                  outputSlots: [
                    {
                      tensorInfo: {
                        dimensions: )" + outputShape + R"(,
                        dataType: )" + dataType + R"(,
                        quantizationScale: 0.1,
                        dimensionSpecificity: [
                          true,
                          true,
                          true,
                          true,
                          true
                        ]
                      }
                    }
                  ]
                },
                descriptor: {
                  strideX: 2,
                  strideY: 2,
                  strideZ: 2
                }
              }
            },
            {
              layer_type: "OutputLayer",
              layer: {
                base: {
                  layerBindingId: 2,
                  base: {
                    index: 3,
                    layerName: "OutputLayer",
                    layerType: "Output",
                    inputSlots: [
                      {
                        connection: {
                          sourceLayerIndex: 2,
                          outputSlotIndex: 0
                        }
                      }
                    ],
                    outputSlots: [

                    ]
                  }
                }
              }
            }
          ],
          featureVersions: {
            bindingIdsScheme: 1,
            weightsLayoutScheme: 1,
            constantTensorsAsInputs: 1
          }
        }
        )";
        Setup();
    }


};

struct SimpleConvolution3dFixture : Convolution3dFixture
{
    SimpleConvolution3dFixture() : Convolution3dFixture(
            "[ 1, 5, 5, 5, 1 ]",
            "[ 1, 2, 2, 2, 1 ]",
            "[ 3, 3, 3, 1, 1 ]",
            "QAsymmS8") {}
};

TEST_CASE_FIXTURE(SimpleConvolution3dFixture, "Convolution3dInt8")
{
    RunTest<5, armnn::DataType::QAsymmS8>(
            0,
            {{"InputLayer", { 0,  1,  2,  3,  4,
                              5,  6,  7,  8,  9,
                             10, 11, 12, 13, 14,
                             15, 16, 17, 18, 19,

                             20, 21, 22, 23, 24,
                             25, 26, 27, 28, 29,
                             30, 31, 32, 33, 34,
                             35, 36, 37, 38, 39,
                             40, 41, 42, 43, 44,

                             45, 46, 47, 48, 49,
                             50, 51, 52, 53, 54,
                             55, 56, 57, 58, 59,
                             60, 61, 62, 63, 64,
                             65, 66, 67, 68, 69,

                             70, 71, 72, 73, 74,
                             75, 76, 77, 78, 79,
                             80, 81, 82, 83, 84,
                             85, 86, 87, 88, 89,
                             90, 91, 92, 93, 94,
                             95, 96, 97, 98, 99,

                             100, 101, 102, 103, 104,
                             105, 106, 107, 108, 109,
                             110, 111, 112, 113, 114,
                             115, 116, 117, 118, 119,
                             120, 121, 122, 123, 124
                             }}},
            {{"OutputLayer", {5,  7,

                              14, 16,

                              50, 52,

                              59, 61}}});
}

}
