#!/usr/bin/env python3
# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
"""Generate File List Tests."""

import pathlib
import unittest

from pw_stm32cube_build import find_files


class ParseProductStringTest(unittest.TestCase):
    """parse_product_str tests."""
    def test_start_with_stm32(self):
        with self.assertRaises(ValueError):
            find_files.parse_product_str('f439zit')

    def test_specify_chip(self):
        with self.assertRaises(ValueError):
            find_files.parse_product_str('stm32f43')

    def test_stm32f412zx(self):
        (family, defines, name) = find_files.parse_product_str('stm32f412zx')

        self.assertEqual(family, 'stm32f4xx')
        self.assertEqual(defines, {'STM32F412xx', 'STM32F412Zx'})
        self.assertEqual(name, 'stm32f412zx')

    def test_stm32f439xx(self):
        (family, defines, name) = find_files.parse_product_str('STM32F439xx')

        self.assertEqual(family, 'stm32f4xx')
        self.assertEqual(defines, {'STM32F439xx'})
        self.assertEqual(name, 'stm32f439xx')

    def test_stm32f439(self):
        (family, defines, name) = find_files.parse_product_str('STM32F439')

        self.assertEqual(family, 'stm32f4xx')
        self.assertEqual(defines, {'STM32F439xx'})
        self.assertEqual(name, 'stm32f439xx')

    def test_stm32f439xi(self):
        (family, defines, name) = find_files.parse_product_str('STM32F439xI')

        self.assertEqual(family, 'stm32f4xx')
        self.assertEqual(defines, {'STM32F439xx', 'STM32F439xI'})
        self.assertEqual(name, 'stm32f439xi')

    def test_stm32f439zit6u(self):
        (family, defines,
         name) = find_files.parse_product_str('stm32f439zit6u')

        self.assertEqual(family, 'stm32f4xx')
        self.assertEqual(
            defines,
            {'STM32F439xx', 'STM32F439Zx', 'STM32F439xI', 'STM32F439ZI'})
        self.assertEqual(name, 'stm32f439zit6u')

    def test_stm32l552zet(self):
        (family, defines, name) = find_files.parse_product_str('stm32l552zet')

        self.assertEqual(family, 'stm32l5xx')
        self.assertEqual(
            defines,
            {'STM32L552xx', 'STM32L552Zx', 'STM32L552xE', 'STM32L552ZE'})
        self.assertEqual(name, 'stm32l552zet')

    def test_stm32l552xc(self):
        (family, defines, name) = find_files.parse_product_str('stm32l552xc')

        self.assertEqual(family, 'stm32l5xx')
        self.assertEqual(defines, {'STM32L552xx', 'STM32L552xC'})
        self.assertEqual(name, 'stm32l552xc')

    def test_stm32wb5m(self):
        (family, defines, name) = find_files.parse_product_str('stm32wb5m')

        self.assertEqual(family, 'stm32wbxx')
        self.assertEqual(defines, {'STM32WB5Mxx'})
        self.assertEqual(name, 'stm32wb5mxx')


class SelectDefineTest(unittest.TestCase):
    """select_define tests."""
    def test_stm32f412zx_not_found(self):
        with self.assertRaises(ValueError):
            find_files.select_define({'STM32F412xx', 'STM32F412Zx'}, "")

    def test_stm32f412zx_found(self):
        define = find_files.select_define(
            {'STM32F412xx', 'STM32F412Zx'},
            "asdf\nfdas\n#if defined(STM32F412Zx)\n")
        self.assertEqual(define, 'STM32F412Zx')

    def test_stm32f412zx_multiple_found(self):
        with self.assertRaises(ValueError):
            find_files.select_define({
                'STM32F412xx', 'STM32F412Zx'
            }, "asdf\n#if defined (STM32F412xx)\n#elif defined(STM32F412Zx)\n")


class MatchFilenameTest(unittest.TestCase):
    """match_filename tests."""
    def test_stm32f412zx(self):
        # Match should fail if product name is not specific enough
        self.assertTrue(
            find_files.match_filename('stm32f412zx', 'stm32f412zx_flash.icf'))
        self.assertFalse(
            find_files.match_filename('stm32f412xx', 'stm32f412zx_flash.icf'))
        self.assertTrue(
            find_files.match_filename('stm32f412zx', 'startup_stm32f412zx.s'))
        self.assertFalse(
            find_files.match_filename('stm32f412xx', 'startup_stm32f429zx.s'))

    def test_stm32f439xx(self):
        self.assertTrue(
            find_files.match_filename('stm32f439xx', 'stm32f439xx_flash.icf'))
        self.assertFalse(
            find_files.match_filename('stm32f439xx', 'stm32f429xx_flash.icf'))
        self.assertTrue(
            find_files.match_filename('stm32f439xx', 'startup_stm32f439xx.s'))
        self.assertFalse(
            find_files.match_filename('stm32f439xx', 'startup_stm32f429xx.s'))

    def test_stm32f439xi(self):
        self.assertTrue(
            find_files.match_filename('stm32f439xi', 'stm32f439xx_flash.icf'))
        self.assertFalse(
            find_files.match_filename('stm32f439xi', 'stm32f429xx_flash.icf'))
        self.assertTrue(
            find_files.match_filename('stm32f439xi', 'startup_stm32f439xx.s'))
        self.assertFalse(
            find_files.match_filename('stm32f439xi', 'startup_stm32f429xx.s'))

    def test_stm32l552zet(self):
        self.assertTrue(
            find_files.match_filename('stm32l552zet', 'STM32L552xE_FLASH.ld'))
        self.assertTrue(
            find_files.match_filename('stm32l552zet', 'STM32L552xx_FLASH.ld'))
        self.assertFalse(
            find_files.match_filename('stm32l552zet', 'STM32L552xC_FLASH.ld'))
        self.assertTrue(
            find_files.match_filename('stm32l552zet', 'stm32l552xe_flash.icf'))
        self.assertFalse(
            find_files.match_filename('stm32l552zet', 'stm32l552xc_flash.icf'))
        self.assertTrue(
            find_files.match_filename('stm32l552zet', 'startup_stm32l552xx.s'))
        self.assertFalse(
            find_files.match_filename('stm32l552zet', 'startup_stm32l562xx.s'))


class FindLinkerFilesTest(unittest.TestCase):
    """find_linker_files tests."""
    TEST_PATH = pathlib.Path('/test/path')

    def test_stm32f439xx(self):
        files = [
            'path/to/stm32f439xx_flash.icf',
            'other/path/to/stm32f439xx_sram.icf'
        ]
        gcc_linker, iar_linker = find_files.find_linker_files(
            'stm32f439xx', files, self.TEST_PATH)

        self.assertEqual(gcc_linker, None)
        self.assertEqual(iar_linker, self.TEST_PATH / files[0])

    def test_stm32f439xx_find_ld(self):
        files = [
            'path/to/stm32f439xx_flash.icf',
            'other/path/to/stm32f439xx_sram.icf',
            'path/to/STM32F439xx_FLASH.ld',
        ]
        gcc_linker, iar_linker = find_files.find_linker_files(
            'stm32f439xx', files, self.TEST_PATH)

        self.assertEqual(gcc_linker, self.TEST_PATH / files[2])
        self.assertEqual(iar_linker, self.TEST_PATH / files[0])

    def test_stm32f439xc_error_multiple_matching_ld(self):
        files = [
            'path/to/stm32f439xx_flash.icf',
            'other/path/to/stm32f439xx_sram.icf',
            'other/path/to/STM32F439xI_FLASH.ld',
            'path/to/STM32F439xx_FLASH.ld',
        ]
        with self.assertRaises(ValueError):
            find_files.find_linker_files('stm32f439xi', files, self.TEST_PATH)

    def test_stm32f439xc_error_multiple_matching_icf(self):
        files = [
            'path/to/stm32f439xx_flash.icf',
            'other/path/to/stm32f439xc_flash.icf',
        ]
        with self.assertRaises(ValueError):
            find_files.find_linker_files('stm32f439xc', files, self.TEST_PATH)

    def test_stm32f439xc_error_none_found(self):
        files = [
            'path/to/stm32f439xc_flash.icf',
            'other/path/to/stm32f439xc_flash.icf',
        ]
        with self.assertRaises(ValueError):
            find_files.find_linker_files('stm32f439xx', files, self.TEST_PATH)

    # ignore secure and nonsecure variants for the M33 boards
    def test_stm32l552xe_ignore_s_ns(self):
        files = [
            'iar/linker/stm32l552xe_flash_ns.icf',
            'iar/linker/stm32l552xe_flash_s.icf',
            'iar/linker/stm32l552xe_flash.icf',
            'gcc/linker/STM32L552xE_FLASH_ns.ld',
            'gcc/linker/STM32L552xE_FLASH_s.ld',
            'gcc/linker/STM32L552xE_FLASH.ld',
        ]
        gcc_linker, iar_linker = find_files.find_linker_files(
            'stm32l552xe', files, self.TEST_PATH)

        self.assertEqual(gcc_linker, self.TEST_PATH / files[-1])
        self.assertEqual(iar_linker, self.TEST_PATH / files[2])


class FindStartupFileTest(unittest.TestCase):
    """find_startup_file tests."""
    TEST_PATH = pathlib.Path('/test/path')

    def test_stm32f439xx_none_found(self):
        files = [
            'path/to/stm32f439xx_flash.icf',
            'other/path/to/stm32f439xx_sram.icf',
            'path/iar/startup_stm32f439xx.s',
        ]
        with self.assertRaises(ValueError):
            find_files.find_startup_file('stm32f439xx', files, self.TEST_PATH)

    def test_stm32f439xx(self):
        files = [
            'path/to/stm32f439xx_flash.icf',
            'other/path/to/stm32f439xx_sram.icf',
            'path/iar/startup_stm32f439xx.s',
            'path/gcc/startup_stm32f439xx.s',
        ]
        startup_file = find_files.find_startup_file('stm32f439xx', files,
                                                    self.TEST_PATH)

        self.assertEqual(startup_file, self.TEST_PATH / files[3])

    def test_stm32f439xx_multiple_found(self):
        files = [
            'path/to/stm32f439xx_flash.icf',
            'other/path/to/stm32f439xx_sram.icf',
            'path/gcc/startup_stm32f439xc.s',
            'path/gcc/startup_stm32f439xx.s',
        ]
        with self.assertRaises(ValueError):
            find_files.find_startup_file('stm32f439xc', files, self.TEST_PATH)


class GetSourceAndHeadersTest(unittest.TestCase):
    """test_sources_and_headers tests."""
    def test_sources_and_headers(self):
        files = [
            'random/header.h',
            'random/source.c',
            'cmsis_core/Include/core_cm4.h',
            'cmsis_device/Include/stm32f4xx.h',
            'cmsis_device/Include/stm32f439xx.h',
            'hal_driver/Inc/stm32f4xx_hal_eth.h',
            'hal_driver/Src/stm32f4xx_hal_adc.c',
            'hal_driver/Inc/stm32f4xx_hal.h',
            'hal_driver/Src/stm32f4xx_hal_timebase_tim_template.c',
            'hal_driver/Src/stm32f4xx_hal_eth.c',
        ]
        path = pathlib.Path('/test/path/to/stm32cube')
        sources, headers = find_files.get_sources_and_headers(files, path)
        self.assertSetEqual(
            set([
                str(path / 'hal_driver/Src/stm32f4xx_hal_adc.c'),
                str(path / 'hal_driver/Src/stm32f4xx_hal_eth.c'),
            ]), set(sources))
        self.assertSetEqual(
            set([
                str(path / 'cmsis_core/Include/core_cm4.h'),
                str(path / 'cmsis_device/Include/stm32f4xx.h'),
                str(path / 'cmsis_device/Include/stm32f439xx.h'),
                str(path / 'hal_driver/Inc/stm32f4xx_hal_eth.h'),
                str(path / 'hal_driver/Inc/stm32f4xx_hal.h'),
            ]), set(headers))


if __name__ == '__main__':
    unittest.main()
