# Copyright © 2019 Arm Ltd. All rights reserved.
# SPDX-License-Identifier: MIT
import os

import pytest
import pyarmnn as ann
import numpy as np


@pytest.fixture(scope="function")
def get_tensor_info_input(shared_data_folder):
    """
    Sample input tensor information.
    """
    parser = ann.ITfLiteParser()
    parser.CreateNetworkFromBinaryFile(os.path.join(shared_data_folder, 'ssd_mobilenetv1.tflite'))
    graph_id = 0

    input_binding_info = [parser.GetNetworkInputBindingInfo(graph_id, 'normalized_input_image_tensor')]

    yield input_binding_info


@pytest.fixture(scope="function")
def get_tensor_info_output(shared_data_folder):
    """
    Sample output tensor information.
    """
    parser = ann.ITfLiteParser()
    parser.CreateNetworkFromBinaryFile(os.path.join(shared_data_folder, 'ssd_mobilenetv1.tflite'))
    graph_id = 0

    output_names = parser.GetSubgraphOutputTensorNames(graph_id)
    outputs_binding_info = []

    for output_name in output_names:
        outputs_binding_info.append(parser.GetNetworkOutputBindingInfo(graph_id, output_name))

    yield outputs_binding_info


def test_make_input_tensors(get_tensor_info_input):
    input_tensor_info = get_tensor_info_input
    input_data = []

    for tensor_id, tensor_info in input_tensor_info:
        input_data.append(np.random.randint(0, 255, size=(1, tensor_info.GetNumElements())).astype(np.uint8))

    input_tensors = ann.make_input_tensors(input_tensor_info, input_data)
    assert len(input_tensors) == 1

    for tensor, tensor_info in zip(input_tensors, input_tensor_info):
        # Because we created ConstTensor function, we cannot check type directly.
        assert type(tensor[1]).__name__ == 'ConstTensor'
        assert str(tensor[1].GetInfo()) == str(tensor_info[1])


def test_make_output_tensors(get_tensor_info_output):
    output_binding_info = get_tensor_info_output

    output_tensors = ann.make_output_tensors(output_binding_info)
    assert len(output_tensors) == 4

    for tensor, tensor_info in zip(output_tensors, output_binding_info):
        assert type(tensor[1]) == ann.Tensor
        assert str(tensor[1].GetInfo()) == str(tensor_info[1])


def test_workload_tensors_to_ndarray(get_tensor_info_output):
    output_binding_info = get_tensor_info_output
    output_tensors = ann.make_output_tensors(output_binding_info)

    data = ann.workload_tensors_to_ndarray(output_tensors)

    for i in range(0, len(output_tensors)):
        assert len(data[i]) == output_tensors[i][1].GetNumElements()


def test_make_input_tensors_fp16(get_tensor_info_input):
    # Check ConstTensor with float16
    input_tensor_info = get_tensor_info_input
    input_data = []

    for tensor_id, tensor_info in input_tensor_info:
        input_data.append(np.random.randint(0, 255, size=(1, tensor_info.GetNumElements())).astype(np.float16))
        tensor_info.SetDataType(ann.DataType_Float16) # set datatype to float16

    input_tensors = ann.make_input_tensors(input_tensor_info, input_data)
    assert len(input_tensors) == 1

    for tensor, tensor_info in zip(input_tensors, input_tensor_info):
        # Because we created ConstTensor function, we cannot check type directly.
        assert type(tensor[1]).__name__ == 'ConstTensor'
        assert str(tensor[1].GetInfo()) == str(tensor_info[1])
        assert tensor[1].GetDataType() == ann.DataType_Float16
        assert tensor[1].GetNumElements() == 270000
        assert tensor[1].GetNumBytes() == 540000  # check each element is two byte
