# 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.
"""Components Tests."""

import pathlib
import unittest
import xml.etree.ElementTree

from pw_build_mcuxpresso import components


class GetComponentTest(unittest.TestCase):
    """get_component tests."""
    def test_without_basepath(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)

        (component, base_path) = components.get_component(root, 'test')

        self.assertIsInstance(component, xml.etree.ElementTree.Element)
        self.assertEqual(component.tag, 'component')
        self.assertEqual(base_path, None)

    def test_with_basepath(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test" package_base_path="test">
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)

        (component, base_path) = components.get_component(root, 'test')

        self.assertIsInstance(component, xml.etree.ElementTree.Element)
        self.assertEqual(component.tag, 'component')
        self.assertEqual(base_path, pathlib.Path('test'))

    def test_component_not_found(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="other">
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)

        (component, base_path) = components.get_component(root, 'test')

        self.assertEqual(component, None)
        self.assertEqual(base_path, None)


class ParseDefinesTest(unittest.TestCase):
    """parse_defines tests."""
    def test_parse_defines(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <defines>
                <define name="TEST_WITH_VALUE" value="1"/>
                <define name="TEST_WITHOUT_VALUE"/>
              </defines>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        defines = components.parse_defines(root, 'test')

        self.assertEqual(defines, ['TEST_WITH_VALUE=1', 'TEST_WITHOUT_VALUE'])

    def test_no_defines(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        defines = components.parse_defines(root, 'test')

        self.assertEqual(defines, [])


class ParseIncludePathsTest(unittest.TestCase):
    """parse_include_paths tests."""
    def test_parse_include_paths(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <include_paths>
                <include_path relative_path="example" type="c_include"/>
                <include_path relative_path="asm" type="asm_include"/>
              </include_paths>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        include_paths = components.parse_include_paths(root, 'test')

        self.assertEqual(include_paths,
                         [pathlib.Path('example'),
                          pathlib.Path('asm')])

    def test_with_base_path(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test" package_base_path="src">
              <include_paths>
                <include_path relative_path="example" type="c_include"/>
                <include_path relative_path="asm" type="asm_include"/>
              </include_paths>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        include_paths = components.parse_include_paths(root, 'test')

        self.assertEqual(
            include_paths,
            [pathlib.Path('src/example'),
             pathlib.Path('src/asm')])

    def test_unknown_type(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test" package_base_path="src">
              <include_paths>
                <include_path relative_path="rust" type="rust_include"/>
              </include_paths>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        include_paths = components.parse_include_paths(root, 'test')

        self.assertEqual(include_paths, [])

    def test_no_include_paths(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        include_paths = components.parse_include_paths(root, 'test')

        self.assertEqual(include_paths, [])


class ParseHeadersTest(unittest.TestCase):
    """parse_headers tests."""
    def test_parse_headers(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <source relative_path="include" type="c_include">
                <files mask="test.h"/>
                <files mask="test_types.h"/>
              </source>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        headers = components.parse_headers(root, 'test')

        self.assertEqual(headers, [
            pathlib.Path('include/test.h'),
            pathlib.Path('include/test_types.h')
        ])

    def test_with_base_path(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test" package_base_path="src">
              <source relative_path="include" type="c_include">
                <files mask="test.h"/>
                <files mask="test_types.h"/>
              </source>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        headers = components.parse_headers(root, 'test')

        self.assertEqual(headers, [
            pathlib.Path('src/include/test.h'),
            pathlib.Path('src/include/test_types.h')
        ])

    def test_multiple_sets(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <source relative_path="include" type="c_include">
                <files mask="test.h"/>
              </source>
              <source relative_path="internal" type="c_include">
                <files mask="test_types.h"/>
              </source>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        headers = components.parse_headers(root, 'test')

        self.assertEqual(headers, [
            pathlib.Path('include/test.h'),
            pathlib.Path('internal/test_types.h')
        ])

    def test_no_headers(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        headers = components.parse_headers(root, 'test')

        self.assertEqual(headers, [])


class ParseSourcesTest(unittest.TestCase):
    """parse_sources tests."""
    def test_parse_sources(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <source relative_path="src" type="src">
                <files mask="main.cc"/>
                <files mask="test.cc"/>
              </source>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        sources = components.parse_sources(root, 'test')

        self.assertEqual(
            sources,
            [pathlib.Path('src/main.cc'),
             pathlib.Path('src/test.cc')])

    def test_with_base_path(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test" package_base_path="src">
              <source relative_path="app" type="src">
                <files mask="main.cc"/>
                <files mask="test.cc"/>
              </source>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        sources = components.parse_sources(root, 'test')

        self.assertEqual(
            sources,
            [pathlib.Path('src/app/main.cc'),
             pathlib.Path('src/app/test.cc')])

    def test_multiple_sets(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <source relative_path="shared" type="src">
                <files mask="test.cc"/>
              </source>
              <source relative_path="lib" type="src_c">
                <files mask="test.c"/>
              </source>
              <source relative_path="app" type="src_cpp">
                <files mask="main.cc"/>
              </source>
              <source relative_path="startup" type="asm_include">
                <files mask="boot.s"/>
              </source>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        sources = components.parse_sources(root, 'test')

        self.assertEqual(sources, [
            pathlib.Path('shared/test.cc'),
            pathlib.Path('lib/test.c'),
            pathlib.Path('app/main.cc'),
            pathlib.Path('startup/boot.s')
        ])

    def test_unknown_type(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
            <source relative_path="src" type="rust">
                <files mask="test.rs"/>
              </source>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        sources = components.parse_sources(root, 'test')

        self.assertEqual(sources, [])

    def test_no_sources(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        sources = components.parse_sources(root, 'test')

        self.assertEqual(sources, [])


class ParseLibsTest(unittest.TestCase):
    """parse_libs tests."""
    def test_parse_libs(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <source relative_path="gcc" type="lib">
                <files mask="libtest.a"/>
                <files mask="libtest_arm.a"/>
              </source>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        libs = components.parse_libs(root, 'test')

        self.assertEqual(
            libs,
            [pathlib.Path('gcc/libtest.a'),
             pathlib.Path('gcc/libtest_arm.a')])

    def test_with_base_path(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test" package_base_path="src">
              <source relative_path="gcc" type="lib">
                <files mask="libtest.a"/>
                <files mask="libtest_arm.a"/>
              </source>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        libs = components.parse_libs(root, 'test')

        self.assertEqual(libs, [
            pathlib.Path('src/gcc/libtest.a'),
            pathlib.Path('src/gcc/libtest_arm.a')
        ])

    def test_multiple_sets(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <source relative_path="gcc" type="lib">
                <files mask="libtest.a"/>
              </source>
              <source relative_path="arm" type="lib">
                <files mask="libtest_arm.a"/>
              </source>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        libs = components.parse_libs(root, 'test')

        self.assertEqual(
            libs,
            [pathlib.Path('gcc/libtest.a'),
             pathlib.Path('arm/libtest_arm.a')])

    def test_no_libs(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        libs = components.parse_libs(root, 'test')

        self.assertEqual(libs, [])


class ParseDependenciesTest(unittest.TestCase):
    """parse_dependencies tests."""
    def test_component_dependency(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <component_dependency value="foo"/>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        dependencies = components.parse_dependencies(root, 'test')

        self.assertEqual(dependencies, ['foo'])

    def test_all(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <all>
                  <component_dependency value="foo"/>
                  <component_dependency value="bar"/>
                  <component_dependency value="baz"/>
                </all>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        dependencies = components.parse_dependencies(root, 'test')

        self.assertEqual(dependencies, ['foo', 'bar', 'baz'])

    def test_any_of_ignored(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <any_of>
                  <component_dependency value="foo"/>
                  <component_dependency value="bar"/>
                  <component_dependency value="baz"/>
                </any_of>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        dependencies = components.parse_dependencies(root, 'test')

        self.assertEqual(dependencies, [])

    def test_any_of_inside_all_ignored(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <all>
                  <component_dependency value="foo"/>
                  <component_dependency value="bar"/>
                  <component_dependency value="baz"/>
                  <any_of>
                    <all>
                      <component_dependency value="frodo"/>
                      <component_dependency value="bilbo"/>
                    </all>
                    <component_dependency value="gandalf"/>
                  </any_of>
                </all>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        dependencies = components.parse_dependencies(root, 'test')

        self.assertEqual(dependencies, ['foo', 'bar', 'baz'])

    def test_no_dependencies(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        dependencies = components.parse_dependencies(root, 'test')

        self.assertEqual(dependencies, [])


class CheckDependenciesTest(unittest.TestCase):
    """check_dependencies tests."""
    def test_any_of_satisfied(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <any_of>
                  <component_dependency value="foo"/>
                  <component_dependency value="bar"/>
                  <component_dependency value="baz"/>
                </any_of>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        satisfied = components.check_dependencies(root,
                                                  'test', ['test', 'foo'],
                                                  exclude=None)

        self.assertEqual(satisfied, True)

    def test_any_of_not_satisfied(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <any_of>
                  <component_dependency value="foo"/>
                  <component_dependency value="bar"/>
                  <component_dependency value="baz"/>
                </any_of>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        satisfied = components.check_dependencies(root,
                                                  'test', ['test'],
                                                  exclude=None)

        self.assertEqual(satisfied, False)

    def test_any_of_satisfied_by_exclude(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <any_of>
                  <component_dependency value="foo"/>
                  <component_dependency value="bar"/>
                  <component_dependency value="baz"/>
                </any_of>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        satisfied = components.check_dependencies(root,
                                                  'test', ['test'],
                                                  exclude=['foo'])

        self.assertEqual(satisfied, True)

    def test_any_of_all_satisfied(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <any_of>
                  <all>
                    <component_dependency value="foo"/>
                    <component_dependency value="bar"/>
                    <component_dependency value="baz"/>
                  </all>
                </any_of>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        satisfied = components.check_dependencies(
            root, 'test', ['test', 'foo', 'bar', 'baz'], exclude=None)

        self.assertEqual(satisfied, True)

    def test_any_of_all_not_satisfied(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <any_of>
                  <all>
                    <component_dependency value="foo"/>
                    <component_dependency value="bar"/>
                    <component_dependency value="baz"/>
                  </all>
                </any_of>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        satisfied = components.check_dependencies(root,
                                                  'test',
                                                  ['test', 'foo', 'bar'],
                                                  exclude=None)

        self.assertEqual(satisfied, False)

    def test_any_of_all_satisfied_by_exclude(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <any_of>
                  <all>
                    <component_dependency value="foo"/>
                    <component_dependency value="bar"/>
                    <component_dependency value="baz"/>
                  </all>
                </any_of>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        satisfied = components.check_dependencies(root,
                                                  'test',
                                                  ['test', 'foo', 'bar'],
                                                  exclude=['baz'])

        self.assertEqual(satisfied, True)

    def test_any_of_all_or_one_satisfied(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <any_of>
                  <all>
                    <component_dependency value="foo"/>
                    <component_dependency value="bar"/>
                    <component_dependency value="baz"/>
                  </all>
                  <component_dependency value="frodo"/>
                </any_of>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        satisfied = components.check_dependencies(root,
                                                  'test', ['test', 'frodo'],
                                                  exclude=None)

        self.assertEqual(satisfied, True)

    def test_any_of_all_or_one_not_satisfied(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <any_of>
                  <all>
                    <component_dependency value="foo"/>
                    <component_dependency value="bar"/>
                    <component_dependency value="baz"/>
                  </all>
                  <component_dependency value="frodo"/>
                </any_of>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        satisfied = components.check_dependencies(root,
                                                  'test', ['test'],
                                                  exclude=None)

        self.assertEqual(satisfied, False)

    def test_any_of_all_or_one_satisfied_by_exclude(self):
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <any_of>
                  <all>
                    <component_dependency value="foo"/>
                    <component_dependency value="bar"/>
                    <component_dependency value="baz"/>
                  </all>
                  <component_dependency value="frodo"/>
                </any_of>
              </dependencies>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        satisfied = components.check_dependencies(root,
                                                  'test', ['test'],
                                                  exclude=['frodo'])

        self.assertEqual(satisfied, True)


class CreateProjectTest(unittest.TestCase):
    """create_project tests."""
    def test_create_project(self):
        """test creating a project."""
        test_manifest_xml = '''
        <manifest>
          <components>
            <component id="test">
              <dependencies>
                <component_dependency value="foo"/>
                <component_dependency value="bar"/>
                <any_of>
                  <component_dependency value="baz"/>
                </any_of>
              </dependencies>
            </component>
            <component id="foo" package_base_path="foo">
              <defines>
                <define name="FOO"/>
              </defines>
              <source relative_path="include" type="c_include">
                <files mask="foo.h"/>
              </source>
              <source relative_path="src" type="src">
                <files mask="foo.cc"/>
              </source>
              <include_paths>
                <include_path relative_path="include" type="c_include"/>
              </include_paths>
            </component>
            <component id="bar" package_base_path="bar">
              <defines>
                <define name="BAR"/>
              </defines>
              <source relative_path="include" type="c_include">
                <files mask="bar.h"/>
              </source>
              <source relative_path="src" type="src">
                <files mask="bar.cc"/>
              </source>
              <include_paths>
                <include_path relative_path="include" type="c_include"/>
              </include_paths>
            </component>
            <!-- baz should not be included in the output -->
            <component id="baz" package_base_path="baz">
              <defines>
                <define name="BAZ"/>
              </defines>
              <source relative_path="include" type="c_include">
                <files mask="baz.h"/>
              </source>
              <source relative_path="src" type="src">
                <files mask="baz.cc"/>
              </source>
              <include_paths>
                <include_path relative_path="include" type="c_include"/>
              </include_paths>
            </component>
            <component id="frodo" package_base_path="frodo">
              <dependencies>
                <component_dependency value="bilbo"/>
              </dependencies>
              <defines>
                <define name="FRODO"/>
              </defines>
              <source relative_path="include" type="c_include">
                <files mask="frodo.h"/>
              </source>
              <source relative_path="src" type="src">
                <files mask="frodo.cc"/>
              </source>
              <source relative_path="./" type="lib">
                <files mask="libonering.a"/>
              </source>
              <include_paths>
                <include_path relative_path="include" type="c_include"/>
              </include_paths>
            </component>
            <!-- bilbo should be excluded from the project -->
            <component id="bilbo" package_base_path="bilbo">
              <defines>
                <define name="BILBO"/>
              </defines>
              <source relative_path="include" type="c_include">
                <files mask="bilbo.h"/>
              </source>
              <source relative_path="src" type="src">
                <files mask="bilbo.cc"/>
              </source>
              <include_paths>
                <include_path relative_path="include" type="c_include"/>
              </include_paths>
            </component>
          </components>
        </manifest>
        '''
        root = xml.etree.ElementTree.fromstring(test_manifest_xml)
        (component_ids, defines, include_dirs, headers, sources, libs) = \
            components.create_project(root, ['test', 'frodo'],
                                      exclude=['bilbo'])

        self.assertEqual(component_ids, ['test', 'frodo', 'foo', 'bar'])
        self.assertEqual(defines, ['FRODO', 'FOO', 'BAR'])
        self.assertEqual(include_dirs, [
            pathlib.Path('frodo/include'),
            pathlib.Path('foo/include'),
            pathlib.Path('bar/include')
        ])
        self.assertEqual(headers, [
            pathlib.Path('frodo/include/frodo.h'),
            pathlib.Path('foo/include/foo.h'),
            pathlib.Path('bar/include/bar.h')
        ])
        self.assertEqual(sources, [
            pathlib.Path('frodo/src/frodo.cc'),
            pathlib.Path('foo/src/foo.cc'),
            pathlib.Path('bar/src/bar.cc')
        ])
        self.assertEqual(libs, [pathlib.Path('frodo/libonering.a')])


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