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

#include <boost/test/unit_test.hpp>
#include "ParserFlatbuffersSerializeFixture.hpp"
#include "../Deserializer.hpp"

#include <string>
#include <iostream>

BOOST_AUTO_TEST_SUITE(Deserializer)

struct NormalizationFixture : public ParserFlatbuffersSerializeFixture
{
    explicit NormalizationFixture(const std::string &inputShape,
        const std::string & outputShape,
        const std::string &dataType,
        const std::string &normAlgorithmChannel,
        const std::string &normAlgorithmMethod,
        const std::string &dataLayout)
    {
        m_JsonString = R"(
        {
            inputIds: [0],
            outputIds: [2],
            layers: [{
                layer_type: "InputLayer",
                layer: {
                    base: {
                        layerBindingId: 0,
                        base: {
                            index: 0,
                            layerName: "InputLayer",
                            layerType: "Input",
                            inputSlots: [{
                                index: 0,
                                connection: {sourceLayerIndex:0, outputSlotIndex:0 },
                                }],
                            outputSlots: [{
                                index: 0,
                                tensorInfo: {
                                    dimensions: )" + inputShape + R"(,
                                    dataType: )" + dataType + R"(,
                                    quantizationScale: 0.5,
                                    quantizationOffset: 0
                                    },
                                }]
                            },
                        }
                    },
                },
            {
            layer_type: "NormalizationLayer",
            layer : {
                base: {
                    index:1,
                    layerName: "NormalizationLayer",
                    layerType: "Normalization",
                    inputSlots: [{
                            index: 0,
                            connection: {sourceLayerIndex:0, outputSlotIndex:0 },
                        }],
                    outputSlots: [{
                        index: 0,
                        tensorInfo: {
                            dimensions: )" + outputShape + R"(,
                            dataType: )" + dataType + R"(
                        },
                        }],
                    },
                descriptor: {
                    normChannelType: )" + normAlgorithmChannel + R"(,
                    normMethodType: )" + normAlgorithmMethod + R"(,
                    normSize: 3,
                    alpha: 1,
                    beta: 1,
                    k: 1,
                    dataLayout: )" + dataLayout + R"(
                    }
                },
            },
            {
            layer_type: "OutputLayer",
            layer: {
                base:{
                    layerBindingId: 0,
                    base: {
                        index: 2,
                        layerName: "OutputLayer",
                        layerType: "Output",
                        inputSlots: [{
                            index: 0,
                            connection: {sourceLayerIndex:1, outputSlotIndex:0 },
                        }],
                        outputSlots: [ {
                            index: 0,
                            tensorInfo: {
                                dimensions: )" + outputShape + R"(,
                                dataType: )" + dataType + R"(
                            },
                        }],
                    }
                }},
            }]
        }
 )";
        SetupSingleInputSingleOutput("InputLayer", "OutputLayer");
    }
};

struct FloatNhwcLocalBrightnessAcrossNormalizationFixture : NormalizationFixture
{
    FloatNhwcLocalBrightnessAcrossNormalizationFixture() : NormalizationFixture("[ 2, 2, 2, 1 ]", "[ 2, 2, 2, 1 ]",
        "Float32", "0", "0", "NHWC") {}
};


BOOST_FIXTURE_TEST_CASE(Float32NormalizationNhwcDataLayout, FloatNhwcLocalBrightnessAcrossNormalizationFixture)
{
    RunTest<4, armnn::DataType::Float32>(0, { 1.0f, 2.0f, 3.0f, 4.0f,
                                              5.0f, 6.0f, 7.0f, 8.0f },
                                            { 0.5f, 0.400000006f, 0.300000012f, 0.235294119f,
                                              0.192307696f, 0.16216217f, 0.140000001f, 0.123076923f });
}

struct FloatNchwLocalBrightnessWithinNormalizationFixture : NormalizationFixture
{
    FloatNchwLocalBrightnessWithinNormalizationFixture() : NormalizationFixture("[ 2, 1, 2, 2 ]", "[ 2, 1, 2, 2 ]",
        "Float32", "1", "0", "NCHW") {}
};

BOOST_FIXTURE_TEST_CASE(Float32NormalizationNchwDataLayout, FloatNchwLocalBrightnessWithinNormalizationFixture)
{
    RunTest<4, armnn::DataType::Float32>(0, { 1.0f, 2.0f, 3.0f, 4.0f,
                                              5.0f, 6.0f, 7.0f, 8.0f },
                                            { 0.0322581f, 0.0645161f, 0.0967742f, 0.1290323f,
                                              0.0285714f, 0.0342857f, 0.04f, 0.0457143f });
}


BOOST_AUTO_TEST_SUITE_END()