# DExTer : Debugging Experience Tester
# ~~~~~~   ~         ~~         ~   ~~
#
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
"""Unit test harness."""

from fnmatch import fnmatch
import os
import unittest

from io import StringIO

from dex.utils import is_native_windows, has_pywin32
from dex.utils import PreserveAutoColors, PrettyOutput
from dex.utils import Timer


class DexTestLoader(unittest.TestLoader):
    def _match_path(self, path, full_path, pattern):
        """Don't try to import platform-specific modules for the wrong platform
        during test discovery.
        """
        d = os.path.basename(os.path.dirname(full_path))
        if is_native_windows():
            if d == 'posix':
                return False
            if d == 'windows':
                return has_pywin32()
        else:
            if d == 'windows':
                return False
            elif d == 'dbgeng':
                return False
        return fnmatch(path, pattern)


def unit_tests_ok(context):
    unittest.TestCase.maxDiff = None  # remove size limit from diff output.

    with Timer('unit tests'):
        suite = DexTestLoader().discover(
            context.root_directory, pattern='*.py')
        stream = StringIO()
        result = unittest.TextTestRunner(verbosity=2, stream=stream).run(suite)

        ok = result.wasSuccessful()
        if not ok or context.options.unittest == 'show-all':
            with PreserveAutoColors(context.o):
                context.o.auto_reds.extend(
                    [r'FAIL(ED|\:)', r'\.\.\.\s(FAIL|ERROR)$'])
                context.o.auto_greens.extend([r'^OK$', r'\.\.\.\sok$'])
                context.o.auto_blues.extend([r'^Ran \d+ test'])
                context.o.default('\n')
                for line in stream.getvalue().splitlines(True):
                    context.o.auto(line, stream=PrettyOutput.stderr)

        return ok


class TestUnitTests(unittest.TestCase):
    def test_sanity(self):
        self.assertEqual(1, 1)
