#!/usr/bin/env python3
# Copyright (c) 2023 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0

'''
This test file contains tests for platform.py module of twister
'''
import sys
import os
import mock
import pytest

ZEPHYR_BASE = os.getenv("ZEPHYR_BASE")
sys.path.insert(0, os.path.join(ZEPHYR_BASE, "scripts/pylib/twister"))

from twisterlib.platform import Platform


TESTDATA_1 = [
    (
"""\
identifier: dummy empty
arch: arc
""",
        {
            'name': 'dummy empty',
            'arch': 'arc',
            'twister': True,
            'ram': 128,
            'timeout_multiplier': 1.0,
            'ignore_tags': [],
            'only_tags': [],
            'default': False,
            'binaries': [],
            'flash': 512,
            'supported': set(),
            'vendor': '',
            'tier': -1,
            'type': 'na',
            'simulation': 'na',
            'simulation_exec': None,
            'supported_toolchains': [],
            'env': [],
            'env_satisfied': True
        },
        '<dummy empty on arc>'
    ),
    (
"""\
identifier: dummy full
arch: riscv
twister: true
ram: 1024
testing:
  timeout_multiplier: 2.0
  ignore_tags:
    - tag1
    - tag2
  only_tags:
    - tag3
  default: true
  binaries:
    - dummy.exe
    - dummy.bin
flash: 4096
supported:
  - ble
  - netif:openthread
  - gpio
vendor: vendor1
tier: 1
type: unit
simulation: nsim
simulation_exec: nsimdrv
toolchain:
  - zephyr
  - llvm
env:
  - dummynonexistentvar
""",
        {
            'name': 'dummy full',
            'arch': 'riscv',
            'twister': True,
            'ram': 1024,
            'timeout_multiplier': 2.0,
            'ignore_tags': ['tag1', 'tag2'],
            'only_tags': ['tag3'],
            'default': True,
            'binaries': ['dummy.exe', 'dummy.bin'],
            'flash': 4096,
            'supported': set(['ble', 'netif', 'openthread', 'gpio']),
            'vendor': 'vendor1',
            'tier': 1,
            'type': 'unit',
            'simulation': 'nsim',
            'simulation_exec': 'nsimdrv',
            'supported_toolchains': ['zephyr', 'llvm', 'cross-compile'],
            'env': ['dummynonexistentvar'],
            'env_satisfied': False
        },
        '<dummy full on riscv>'
    ),
]

@pytest.mark.parametrize(
    'platform_text, expected_data, expected_repr',
    TESTDATA_1,
    ids=['almost empty specification', 'full specification']
)
def test_platform_load(platform_text, expected_data, expected_repr):
    platform = Platform()

    with mock.patch('builtins.open', mock.mock_open(read_data=platform_text)):
        platform.load('dummy.yaml')

    for k, v in expected_data.items():
        if not hasattr(platform, k):
            assert False, f'No key {k} in platform {platform}'
        att = getattr(platform, k)
        if isinstance(v, list) and not isinstance(att, list):
            assert False, f'Value mismatch in key {k} in platform {platform}'
        if isinstance(v, list):
            assert sorted(att) == sorted(v)
        else:
            assert att == v

    assert platform.__repr__() == expected_repr
