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

from pyarmnn import BackendOptions, BackendOption, BackendId, OptimizerOptions, ShapeInferenceMethod_InferAndValidate


@pytest.mark.parametrize("data", (True, -100, 128, 0.12345, 'string'))
def test_backend_option_ctor(data):
    bo = BackendOption("name", data)
    assert "name" == bo.GetName()


def test_backend_options_ctor():
    backend_id = BackendId('a')
    bos = BackendOptions(backend_id)

    assert 'a' == str(bos.GetBackendId())

    another_bos = BackendOptions(bos)
    assert 'a' == str(another_bos.GetBackendId())


def test_backend_options_add():
    backend_id = BackendId('a')
    bos = BackendOptions(backend_id)
    bo = BackendOption("name", 1)
    bos.AddOption(bo)

    assert 1 == bos.GetOptionCount()
    assert 1 == len(bos)

    assert 'name' == bos[0].GetName()
    assert 'name' == bos.GetOption(0).GetName()
    for option in bos:
        assert 'name' == option.GetName()

    bos.AddOption(BackendOption("name2", 2))

    assert 2 == bos.GetOptionCount()
    assert 2 == len(bos)


def test_backend_option_ownership():
    backend_id = BackendId('b')
    bos = BackendOptions(backend_id)
    bo = BackendOption('option', True)
    bos.AddOption(bo)

    assert bo.thisown

    del bo

    assert 1 == bos.GetOptionCount()
    option = bos[0]
    assert not option.thisown
    assert 'option' == option.GetName()

    del option

    option_again = bos[0]
    assert not option_again.thisown
    assert 'option' == option_again.GetName()


def test_optimizer_options_with_model_opt():
    a = BackendOptions(BackendId('a'))

    oo = OptimizerOptions(True,
                          False,
                          False,
                          ShapeInferenceMethod_InferAndValidate,
                          True,
                          [a])

    mo = oo.m_ModelOptions

    assert 1 == len(mo)
    assert 'a' == str(mo[0].GetBackendId())

    b = BackendOptions(BackendId('b'))

    c = BackendOptions(BackendId('c'))

    oo.m_ModelOptions = (a, b, c)

    mo = oo.m_ModelOptions

    assert 3 == len(oo.m_ModelOptions)

    assert 'a' == str(mo[0].GetBackendId())
    assert 'b' == str(mo[1].GetBackendId())
    assert 'c' == str(mo[2].GetBackendId())


def test_optimizer_option_default():
    oo = OptimizerOptions(True,
                          False,
                          False,
                          ShapeInferenceMethod_InferAndValidate,
                          True)

    assert 0 == len(oo.m_ModelOptions)


def test_optimizer_options_fail():
    a = BackendOptions(BackendId('a'))

    with pytest.raises(TypeError) as err:
        OptimizerOptions(True,
                         False,
                         False,
                         ShapeInferenceMethod_InferAndValidate,
                         True,
                         a)

    assert "Wrong number or type of arguments" in str(err.value)

    with pytest.raises(RuntimeError) as err:
        OptimizerOptions(True,
                         False,
                         True,
                         ShapeInferenceMethod_InferAndValidate,
                         True,
                         [a])

    assert "BFloat16 and Float16 optimization cannot be enabled at the same time" in str(err.value)

    with pytest.raises(TypeError) as err:
        oo = OptimizerOptions(True,
                              False,
                              False,
                              ShapeInferenceMethod_InferAndValidate,
                              True)

        oo.m_ModelOptions = 'nonsense'

    assert "in method 'OptimizerOptions_m_ModelOptions_set', argument 2" in str(err.value)

    with pytest.raises(TypeError) as err:
        oo = OptimizerOptions(True,
                              False,
                              False,
                              ShapeInferenceMethod_InferAndValidate,
                              True)

        oo.m_ModelOptions = ['nonsense', a]

    assert "in method 'OptimizerOptions_m_ModelOptions_set', argument 2" in str(err.value)
