"""Tests for json2numpy.py."""
# Copyright (c) 2021-2022, ARM Limited.
# SPDX-License-Identifier: Apache-2.0
import json
import os

import numpy as np
import pytest
from json2numpy.json2numpy import main


@pytest.mark.parametrize(
    "npy_filename,json_filename,data_type",
    [
        ("single_num.npy", "single_num.json", np.int8),
        ("multiple_num.npy", "multiple_num.json", np.int8),
        ("single_num.npy", "single_num.json", np.int16),
        ("multiple_num.npy", "multiple_num.json", np.int16),
        ("single_num.npy", "single_num.json", np.int32),
        ("multiple_num.npy", "multiple_num.json", np.int32),
        ("single_num.npy", "single_num.json", np.int64),
        ("multiple_num.npy", "multiple_num.json", np.int64),
        ("single_num.npy", "single_num.json", np.uint8),
        ("multiple_num.npy", "multiple_num.json", np.uint8),
        ("single_num.npy", "single_num.json", np.uint16),
        ("multiple_num.npy", "multiple_num.json", np.uint16),
        ("single_num.npy", "single_num.json", np.uint32),
        ("multiple_num.npy", "multiple_num.json", np.uint32),
        ("single_num.npy", "single_num.json", np.uint64),
        ("multiple_num.npy", "multiple_num.json", np.uint64),
        ("single_num.npy", "single_num.json", np.float16),
        ("multiple_num.npy", "multiple_num.json", np.float16),
        ("single_num.npy", "single_num.json", np.float32),
        ("multiple_num.npy", "multiple_num.json", np.float32),
        ("single_num.npy", "single_num.json", np.float64),
        ("multiple_num.npy", "multiple_num.json", np.float64),
        ("single_num.npy", "single_num.json", bool),
        ("multiple_num.npy", "multiple_num.json", bool),
    ],
)
def test_json2numpy_npy_file(npy_filename, json_filename, data_type):
    """Test conversion to JSON."""
    # Generate numpy data.
    if "single" in npy_filename:
        npy_data = np.ndarray(shape=(1, 1), dtype=data_type)
    elif "multiple" in npy_filename:
        npy_data = np.ndarray(shape=(2, 3), dtype=data_type)

    # Get filepaths
    npy_file = os.path.join(os.path.dirname(__file__), npy_filename)
    json_file = os.path.join(os.path.dirname(__file__), json_filename)

    # Save npy data to file and reload it.
    with open(npy_file, "wb") as f:
        np.save(f, npy_data)
    npy_data = np.load(npy_file)

    args = [npy_file]
    """Converts npy file to json"""
    assert main(args) == 0

    json_data = json.load(open(json_file))
    assert np.dtype(json_data["type"]) == npy_data.dtype
    assert np.array(json_data["data"]).shape == npy_data.shape
    assert (np.array(json_data["data"]) == npy_data).all()

    # Remove files created
    if os.path.exists(npy_file):
        os.remove(npy_file)
    if os.path.exists(json_file):
        os.remove(json_file)


@pytest.mark.parametrize(
    "npy_filename,json_filename,data_type",
    [
        ("single_num.npy", "single_num.json", np.int8),
        ("multiple_num.npy", "multiple_num.json", np.int8),
        ("single_num.npy", "single_num.json", np.int16),
        ("multiple_num.npy", "multiple_num.json", np.int16),
        ("single_num.npy", "single_num.json", np.int32),
        ("multiple_num.npy", "multiple_num.json", np.int32),
        ("single_num.npy", "single_num.json", np.int64),
        ("multiple_num.npy", "multiple_num.json", np.int64),
        ("single_num.npy", "single_num.json", np.uint8),
        ("multiple_num.npy", "multiple_num.json", np.uint8),
        ("single_num.npy", "single_num.json", np.uint16),
        ("multiple_num.npy", "multiple_num.json", np.uint16),
        ("single_num.npy", "single_num.json", np.uint32),
        ("multiple_num.npy", "multiple_num.json", np.uint32),
        ("single_num.npy", "single_num.json", np.uint64),
        ("multiple_num.npy", "multiple_num.json", np.uint64),
        ("single_num.npy", "single_num.json", np.float16),
        ("multiple_num.npy", "multiple_num.json", np.float16),
        ("single_num.npy", "single_num.json", np.float32),
        ("multiple_num.npy", "multiple_num.json", np.float32),
        ("single_num.npy", "single_num.json", np.float64),
        ("multiple_num.npy", "multiple_num.json", np.float64),
        ("single_num.npy", "single_num.json", bool),
        ("multiple_num.npy", "multiple_num.json", bool),
    ],
)
def test_json2numpy_json_file(npy_filename, json_filename, data_type):
    """Test conversion to binary."""
    # Generate json data.
    if "single" in npy_filename:
        npy_data = np.ndarray(shape=(1, 1), dtype=data_type)
    elif "multiple" in npy_filename:
        npy_data = np.ndarray(shape=(2, 3), dtype=data_type)

    # Generate json dictionary
    list_data = npy_data.tolist()
    json_data_type = str(npy_data.dtype)

    json_data = {}
    json_data["type"] = json_data_type
    json_data["data"] = list_data

    # Get filepaths
    npy_file = os.path.join(os.path.dirname(__file__), npy_filename)
    json_file = os.path.join(os.path.dirname(__file__), json_filename)

    # Save json data to file and reload it.
    with open(json_file, "w") as f:
        json.dump(json_data, f)
    json_data = json.load(open(json_file))

    args = [json_file]
    """Converts json file to npy"""
    assert main(args) == 0

    npy_data = np.load(npy_file)
    assert np.dtype(json_data["type"]) == npy_data.dtype
    assert np.array(json_data["data"]).shape == npy_data.shape
    assert (np.array(json_data["data"]) == npy_data).all()

    # Remove files created
    if os.path.exists(npy_file):
        os.remove(npy_file)
    if os.path.exists(json_file):
        os.remove(json_file)
