#!/usr/bin/env vpython3

# Copyright 2024 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests of BundledTestRunner."""

import unittest

from bundled_test_runner import _BundledTestRunner, TestCase

# Test names should be self-explained, no point of adding function docstring.
# pylint: disable=missing-function-docstring, protected-access


class BundledTestRunnerTests(unittest.TestCase):
    """Test class."""

    @staticmethod
    def _default_test_case() -> TestCase:
        return TestCase(
            package='fuchsia-pkg://fuchsia.com/dart_runner_tests#meta/'
            + 'dart_runner_tests.cm'
        )

    def test_resolve_test_package_into_far(self):
        runner = _BundledTestRunner(
            'out/put',
            [BundledTestRunnerTests._default_test_case()],
            'target-id',
            None,
            '/tmp/log',
            [],
            None,
        )
        self.assertEqual(
            runner._package_deps,
            {'dart_runner_tests': 'out/put/dart_runner_tests.far'},
        )

    def test_dedupe_fars(self):
        runner = _BundledTestRunner(
            'out/put',
            [BundledTestRunnerTests._default_test_case()],
            'target-id',
            None,
            '/tmp/log',
            ['dart_runner_tests.far'],
            None,
        )
        self.assertEqual(
            runner._package_deps,
            {'dart_runner_tests': 'out/put/dart_runner_tests.far'},
        )

    def test_absolute_path(self):
        runner = _BundledTestRunner(
            'out/put',
            [BundledTestRunnerTests._default_test_case()],
            'target-id',
            None,
            '/tmp/log',
            ['/tmp/packages/dart_runner_tests.far'],
            None,
        )
        self.assertEqual(
            runner._package_deps,
            {'dart_runner_tests': '/tmp/packages/dart_runner_tests.far'},
        )

    def test_different_cm(self):
        runner = _BundledTestRunner(
            'out/put',
            [
                TestCase(
                    package=(
                        'fuchsia-pkg://fuchsia.com/dart_runner_tests'
                        '#meta/meta.cm'
                    )
                )
            ],
            'target-id',
            None,
            '/tmp/log',
            [],
            None,
        )
        self.assertEqual(
            runner._package_deps,
            {'dart_runner_tests': 'out/put/dart_runner_tests.far'},
        )

    def test_join_relative_path(self):
        runner = _BundledTestRunner(
            'out/default',
            [BundledTestRunnerTests._default_test_case()],
            'target-id',
            None,
            '/tmp/log',
            ['gen/dart_runner_tests.far'],
            None,
        )
        self.assertEqual(
            runner._package_deps,
            {'dart_runner_tests': 'out/default/gen/dart_runner_tests.far'},
        )

    def test_current_dir_as_out_dir(self):
        runner = _BundledTestRunner(
            '.',
            [BundledTestRunnerTests._default_test_case()],
            'target-id',
            None,
            '/tmp/log',
            ['out/default/bin/dart_runner_tests.far'],
            None,
        )
        self.assertEqual(
            runner._package_deps,
            {'dart_runner_tests': './out/default/bin/dart_runner_tests.far'},
        )

    def test_empty_out_dir(self):
        runner = _BundledTestRunner(
            '',
            [BundledTestRunnerTests._default_test_case()],
            'target-id',
            None,
            '/tmp/log',
            ['out/default/bin/dart_runner_tests.far'],
            None,
        )
        self.assertEqual(
            runner._package_deps,
            {'dart_runner_tests': 'out/default/bin/dart_runner_tests.far'},
        )

    def test_none_out_dir(self):
        with self.assertRaises(TypeError):
            _BundledTestRunner(
                None,
                [BundledTestRunnerTests._default_test_case()],
                'target-id',
                None,
                '/tmp/log',
                ['out/default/bin/dart_runner_tests.far'],
                None,
            )

    def test_conflict_fars(self):
        with self.assertRaises(AssertionError):
            _BundledTestRunner(
                '',
                [BundledTestRunnerTests._default_test_case()],
                'target-id',
                None,
                '/tmp/log',
                [
                    'out/default/bin/dart_runner_tests.far',
                    'not/out/default/bin/dart_runner_tests.far',
                ],
                None,
            )


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