import os
import pytest

from buildstream import LoadError, LoadErrorReason
from buildstream._loader import Loader
from buildstream._metaelement import MetaElement
from . import make_options

DATA_DIR = os.path.join(
    os.path.dirname(os.path.realpath(__file__)),
    'arches',
)


##############################################################
#                Test Simple Arch Conditionals               #
##############################################################
@pytest.mark.datafiles(DATA_DIR)
def test_simple_conditional_nomatch(datafiles):

    basedir = os.path.join(datafiles.dirname, datafiles.basename)
    loader = Loader(
        basedir, 'elements/simple-conditional.bst', make_options(basedir), 'arm', None)

    element = loader.load()
    assert(isinstance(element, MetaElement))
    number = element.config.get('number')

    # Did not provide any arch specific data for 'arm', number remains 5
    assert(number == 5)


@pytest.mark.datafiles(DATA_DIR)
def test_simple_conditional_x86_64(datafiles):

    basedir = os.path.join(datafiles.dirname, datafiles.basename)
    loader = Loader(
        basedir, 'elements/simple-conditional.bst', make_options(basedir), 'x86_64', None)

    element = loader.load()
    assert(isinstance(element, MetaElement))
    number = element.config.get('number')

    # x86_64 arch overrides the number to 6
    assert(number == 6)


@pytest.mark.datafiles(DATA_DIR)
def test_simple_conditional_x86_32(datafiles):

    basedir = os.path.join(datafiles.dirname, datafiles.basename)
    loader = Loader(
        basedir, 'elements/simple-conditional.bst', make_options(basedir), 'x86_32', None)

    element = loader.load()
    assert(isinstance(element, MetaElement))
    number = element.config.get('number')

    # x86_32 arch overrides the number to 7
    assert(number == 7)


##############################################################
#            Test Arch and Host-Arch Conditionals            #
##############################################################


@pytest.mark.datafiles(DATA_DIR)
def test_host_arch_conditional_armv8(datafiles):

    basedir = os.path.join(datafiles.dirname, datafiles.basename)
    loader = Loader(
        basedir, 'elements/host-arch-conditional.bst', make_options(basedir), 'armv8', None)

    element = loader.load()
    assert(isinstance(element, MetaElement))
    number = element.config.get('number')

    # armv8 host-arch overrides the number to 88
    assert(number == 88)


@pytest.mark.datafiles(DATA_DIR)
def test_host_arch_conditional_ignores_target_arch(datafiles):

    basedir = os.path.join(datafiles.dirname, datafiles.basename)
    loader = Loader(
        basedir, 'elements/host-arch-conditional.bst', make_options(basedir), 'armv8', 'x86_32')

    element = loader.load()
    assert(isinstance(element, MetaElement))
    number = element.config.get('number')

    # The setting a target-arch has no effect on host-arches: the number is
    # still 88
    assert(number == 88)


@pytest.mark.datafiles(DATA_DIR)
def test_host_arch_conditional_overridden(datafiles):

    basedir = os.path.join(datafiles.dirname, datafiles.basename)
    loader = Loader(
        basedir, 'elements/host-arch-conditional.bst', make_options(basedir), 'armv8', 'x86_64')

    element = loader.load()
    assert(isinstance(element, MetaElement))
    number = element.config.get('number')

    # The 'arches' conditional follows the target architecture, and overrides
    # anything specified in 'host-arches'.
    assert(number == 6)
