17db96d56Sopenharmony_ciimport io
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciimport os
47db96d56Sopenharmony_ciimport sys
57db96d56Sopenharmony_ciimport subprocess
67db96d56Sopenharmony_cifrom test import support
77db96d56Sopenharmony_ciimport unittest
87db96d56Sopenharmony_ciimport unittest.test
97db96d56Sopenharmony_cifrom unittest.test.test_result import BufferedWriter
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ciclass Test_TestProgram(unittest.TestCase):
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci    def test_discovery_from_dotted_path(self):
157db96d56Sopenharmony_ci        loader = unittest.TestLoader()
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci        tests = [self]
187db96d56Sopenharmony_ci        expectedPath = os.path.abspath(os.path.dirname(unittest.test.__file__))
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci        self.wasRun = False
217db96d56Sopenharmony_ci        def _find_tests(start_dir, pattern):
227db96d56Sopenharmony_ci            self.wasRun = True
237db96d56Sopenharmony_ci            self.assertEqual(start_dir, expectedPath)
247db96d56Sopenharmony_ci            return tests
257db96d56Sopenharmony_ci        loader._find_tests = _find_tests
267db96d56Sopenharmony_ci        suite = loader.discover('unittest.test')
277db96d56Sopenharmony_ci        self.assertTrue(self.wasRun)
287db96d56Sopenharmony_ci        self.assertEqual(suite._tests, tests)
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci    # Horrible white box test
317db96d56Sopenharmony_ci    def testNoExit(self):
327db96d56Sopenharmony_ci        result = object()
337db96d56Sopenharmony_ci        test = object()
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci        class FakeRunner(object):
367db96d56Sopenharmony_ci            def run(self, test):
377db96d56Sopenharmony_ci                self.test = test
387db96d56Sopenharmony_ci                return result
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_ci        runner = FakeRunner()
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci        oldParseArgs = unittest.TestProgram.parseArgs
437db96d56Sopenharmony_ci        def restoreParseArgs():
447db96d56Sopenharmony_ci            unittest.TestProgram.parseArgs = oldParseArgs
457db96d56Sopenharmony_ci        unittest.TestProgram.parseArgs = lambda *args: None
467db96d56Sopenharmony_ci        self.addCleanup(restoreParseArgs)
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci        def removeTest():
497db96d56Sopenharmony_ci            del unittest.TestProgram.test
507db96d56Sopenharmony_ci        unittest.TestProgram.test = test
517db96d56Sopenharmony_ci        self.addCleanup(removeTest)
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci        program = unittest.TestProgram(testRunner=runner, exit=False, verbosity=2)
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci        self.assertEqual(program.result, result)
567db96d56Sopenharmony_ci        self.assertEqual(runner.test, test)
577db96d56Sopenharmony_ci        self.assertEqual(program.verbosity, 2)
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ci    class FooBar(unittest.TestCase):
607db96d56Sopenharmony_ci        def testPass(self):
617db96d56Sopenharmony_ci            pass
627db96d56Sopenharmony_ci        def testFail(self):
637db96d56Sopenharmony_ci            raise AssertionError
647db96d56Sopenharmony_ci        def testError(self):
657db96d56Sopenharmony_ci            1/0
667db96d56Sopenharmony_ci        @unittest.skip('skipping')
677db96d56Sopenharmony_ci        def testSkipped(self):
687db96d56Sopenharmony_ci            raise AssertionError
697db96d56Sopenharmony_ci        @unittest.expectedFailure
707db96d56Sopenharmony_ci        def testExpectedFailure(self):
717db96d56Sopenharmony_ci            raise AssertionError
727db96d56Sopenharmony_ci        @unittest.expectedFailure
737db96d56Sopenharmony_ci        def testUnexpectedSuccess(self):
747db96d56Sopenharmony_ci            pass
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ci    class FooBarLoader(unittest.TestLoader):
777db96d56Sopenharmony_ci        """Test loader that returns a suite containing FooBar."""
787db96d56Sopenharmony_ci        def loadTestsFromModule(self, module):
797db96d56Sopenharmony_ci            return self.suiteClass(
807db96d56Sopenharmony_ci                [self.loadTestsFromTestCase(Test_TestProgram.FooBar)])
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci        def loadTestsFromNames(self, names, module):
837db96d56Sopenharmony_ci            return self.suiteClass(
847db96d56Sopenharmony_ci                [self.loadTestsFromTestCase(Test_TestProgram.FooBar)])
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci    def test_defaultTest_with_string(self):
877db96d56Sopenharmony_ci        class FakeRunner(object):
887db96d56Sopenharmony_ci            def run(self, test):
897db96d56Sopenharmony_ci                self.test = test
907db96d56Sopenharmony_ci                return True
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci        old_argv = sys.argv
937db96d56Sopenharmony_ci        sys.argv = ['faketest']
947db96d56Sopenharmony_ci        runner = FakeRunner()
957db96d56Sopenharmony_ci        program = unittest.TestProgram(testRunner=runner, exit=False,
967db96d56Sopenharmony_ci                                       defaultTest='unittest.test',
977db96d56Sopenharmony_ci                                       testLoader=self.FooBarLoader())
987db96d56Sopenharmony_ci        sys.argv = old_argv
997db96d56Sopenharmony_ci        self.assertEqual(('unittest.test',), program.testNames)
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci    def test_defaultTest_with_iterable(self):
1027db96d56Sopenharmony_ci        class FakeRunner(object):
1037db96d56Sopenharmony_ci            def run(self, test):
1047db96d56Sopenharmony_ci                self.test = test
1057db96d56Sopenharmony_ci                return True
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci        old_argv = sys.argv
1087db96d56Sopenharmony_ci        sys.argv = ['faketest']
1097db96d56Sopenharmony_ci        runner = FakeRunner()
1107db96d56Sopenharmony_ci        program = unittest.TestProgram(
1117db96d56Sopenharmony_ci            testRunner=runner, exit=False,
1127db96d56Sopenharmony_ci            defaultTest=['unittest.test', 'unittest.test2'],
1137db96d56Sopenharmony_ci            testLoader=self.FooBarLoader())
1147db96d56Sopenharmony_ci        sys.argv = old_argv
1157db96d56Sopenharmony_ci        self.assertEqual(['unittest.test', 'unittest.test2'],
1167db96d56Sopenharmony_ci                          program.testNames)
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci    def test_NonExit(self):
1197db96d56Sopenharmony_ci        stream = BufferedWriter()
1207db96d56Sopenharmony_ci        program = unittest.main(exit=False,
1217db96d56Sopenharmony_ci                                argv=["foobar"],
1227db96d56Sopenharmony_ci                                testRunner=unittest.TextTestRunner(stream=stream),
1237db96d56Sopenharmony_ci                                testLoader=self.FooBarLoader())
1247db96d56Sopenharmony_ci        self.assertTrue(hasattr(program, 'result'))
1257db96d56Sopenharmony_ci        out = stream.getvalue()
1267db96d56Sopenharmony_ci        self.assertIn('\nFAIL: testFail ', out)
1277db96d56Sopenharmony_ci        self.assertIn('\nERROR: testError ', out)
1287db96d56Sopenharmony_ci        self.assertIn('\nUNEXPECTED SUCCESS: testUnexpectedSuccess ', out)
1297db96d56Sopenharmony_ci        expected = ('\n\nFAILED (failures=1, errors=1, skipped=1, '
1307db96d56Sopenharmony_ci                    'expected failures=1, unexpected successes=1)\n')
1317db96d56Sopenharmony_ci        self.assertTrue(out.endswith(expected))
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci    def test_Exit(self):
1347db96d56Sopenharmony_ci        stream = BufferedWriter()
1357db96d56Sopenharmony_ci        self.assertRaises(
1367db96d56Sopenharmony_ci            SystemExit,
1377db96d56Sopenharmony_ci            unittest.main,
1387db96d56Sopenharmony_ci            argv=["foobar"],
1397db96d56Sopenharmony_ci            testRunner=unittest.TextTestRunner(stream=stream),
1407db96d56Sopenharmony_ci            exit=True,
1417db96d56Sopenharmony_ci            testLoader=self.FooBarLoader())
1427db96d56Sopenharmony_ci        out = stream.getvalue()
1437db96d56Sopenharmony_ci        self.assertIn('\nFAIL: testFail ', out)
1447db96d56Sopenharmony_ci        self.assertIn('\nERROR: testError ', out)
1457db96d56Sopenharmony_ci        self.assertIn('\nUNEXPECTED SUCCESS: testUnexpectedSuccess ', out)
1467db96d56Sopenharmony_ci        expected = ('\n\nFAILED (failures=1, errors=1, skipped=1, '
1477db96d56Sopenharmony_ci                    'expected failures=1, unexpected successes=1)\n')
1487db96d56Sopenharmony_ci        self.assertTrue(out.endswith(expected))
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci    def test_ExitAsDefault(self):
1517db96d56Sopenharmony_ci        stream = BufferedWriter()
1527db96d56Sopenharmony_ci        self.assertRaises(
1537db96d56Sopenharmony_ci            SystemExit,
1547db96d56Sopenharmony_ci            unittest.main,
1557db96d56Sopenharmony_ci            argv=["foobar"],
1567db96d56Sopenharmony_ci            testRunner=unittest.TextTestRunner(stream=stream),
1577db96d56Sopenharmony_ci            testLoader=self.FooBarLoader())
1587db96d56Sopenharmony_ci        out = stream.getvalue()
1597db96d56Sopenharmony_ci        self.assertIn('\nFAIL: testFail ', out)
1607db96d56Sopenharmony_ci        self.assertIn('\nERROR: testError ', out)
1617db96d56Sopenharmony_ci        self.assertIn('\nUNEXPECTED SUCCESS: testUnexpectedSuccess ', out)
1627db96d56Sopenharmony_ci        expected = ('\n\nFAILED (failures=1, errors=1, skipped=1, '
1637db96d56Sopenharmony_ci                    'expected failures=1, unexpected successes=1)\n')
1647db96d56Sopenharmony_ci        self.assertTrue(out.endswith(expected))
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ciclass InitialisableProgram(unittest.TestProgram):
1687db96d56Sopenharmony_ci    exit = False
1697db96d56Sopenharmony_ci    result = None
1707db96d56Sopenharmony_ci    verbosity = 1
1717db96d56Sopenharmony_ci    defaultTest = None
1727db96d56Sopenharmony_ci    tb_locals = False
1737db96d56Sopenharmony_ci    testRunner = None
1747db96d56Sopenharmony_ci    testLoader = unittest.defaultTestLoader
1757db96d56Sopenharmony_ci    module = '__main__'
1767db96d56Sopenharmony_ci    progName = 'test'
1777db96d56Sopenharmony_ci    test = 'test'
1787db96d56Sopenharmony_ci    def __init__(self, *args):
1797db96d56Sopenharmony_ci        pass
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ciRESULT = object()
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ciclass FakeRunner(object):
1847db96d56Sopenharmony_ci    initArgs = None
1857db96d56Sopenharmony_ci    test = None
1867db96d56Sopenharmony_ci    raiseError = 0
1877db96d56Sopenharmony_ci
1887db96d56Sopenharmony_ci    def __init__(self, **kwargs):
1897db96d56Sopenharmony_ci        FakeRunner.initArgs = kwargs
1907db96d56Sopenharmony_ci        if FakeRunner.raiseError:
1917db96d56Sopenharmony_ci            FakeRunner.raiseError -= 1
1927db96d56Sopenharmony_ci            raise TypeError
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci    def run(self, test):
1957db96d56Sopenharmony_ci        FakeRunner.test = test
1967db96d56Sopenharmony_ci        return RESULT
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci@support.requires_subprocess()
2007db96d56Sopenharmony_ciclass TestCommandLineArgs(unittest.TestCase):
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci    def setUp(self):
2037db96d56Sopenharmony_ci        self.program = InitialisableProgram()
2047db96d56Sopenharmony_ci        self.program.createTests = lambda: None
2057db96d56Sopenharmony_ci        FakeRunner.initArgs = None
2067db96d56Sopenharmony_ci        FakeRunner.test = None
2077db96d56Sopenharmony_ci        FakeRunner.raiseError = 0
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci    def testVerbosity(self):
2107db96d56Sopenharmony_ci        program = self.program
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci        for opt in '-q', '--quiet':
2137db96d56Sopenharmony_ci            program.verbosity = 1
2147db96d56Sopenharmony_ci            program.parseArgs([None, opt])
2157db96d56Sopenharmony_ci            self.assertEqual(program.verbosity, 0)
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci        for opt in '-v', '--verbose':
2187db96d56Sopenharmony_ci            program.verbosity = 1
2197db96d56Sopenharmony_ci            program.parseArgs([None, opt])
2207db96d56Sopenharmony_ci            self.assertEqual(program.verbosity, 2)
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci    def testBufferCatchFailfast(self):
2237db96d56Sopenharmony_ci        program = self.program
2247db96d56Sopenharmony_ci        for arg, attr in (('buffer', 'buffer'), ('failfast', 'failfast'),
2257db96d56Sopenharmony_ci                      ('catch', 'catchbreak')):
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci            setattr(program, attr, None)
2287db96d56Sopenharmony_ci            program.parseArgs([None])
2297db96d56Sopenharmony_ci            self.assertIs(getattr(program, attr), False)
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci            false = []
2327db96d56Sopenharmony_ci            setattr(program, attr, false)
2337db96d56Sopenharmony_ci            program.parseArgs([None])
2347db96d56Sopenharmony_ci            self.assertIs(getattr(program, attr), false)
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci            true = [42]
2377db96d56Sopenharmony_ci            setattr(program, attr, true)
2387db96d56Sopenharmony_ci            program.parseArgs([None])
2397db96d56Sopenharmony_ci            self.assertIs(getattr(program, attr), true)
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ci            short_opt = '-%s' % arg[0]
2427db96d56Sopenharmony_ci            long_opt = '--%s' % arg
2437db96d56Sopenharmony_ci            for opt in short_opt, long_opt:
2447db96d56Sopenharmony_ci                setattr(program, attr, None)
2457db96d56Sopenharmony_ci                program.parseArgs([None, opt])
2467db96d56Sopenharmony_ci                self.assertIs(getattr(program, attr), True)
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ci                setattr(program, attr, False)
2497db96d56Sopenharmony_ci                with support.captured_stderr() as stderr, \
2507db96d56Sopenharmony_ci                    self.assertRaises(SystemExit) as cm:
2517db96d56Sopenharmony_ci                    program.parseArgs([None, opt])
2527db96d56Sopenharmony_ci                self.assertEqual(cm.exception.args, (2,))
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci                setattr(program, attr, True)
2557db96d56Sopenharmony_ci                with support.captured_stderr() as stderr, \
2567db96d56Sopenharmony_ci                    self.assertRaises(SystemExit) as cm:
2577db96d56Sopenharmony_ci                    program.parseArgs([None, opt])
2587db96d56Sopenharmony_ci                self.assertEqual(cm.exception.args, (2,))
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci    def testWarning(self):
2617db96d56Sopenharmony_ci        """Test the warnings argument"""
2627db96d56Sopenharmony_ci        # see #10535
2637db96d56Sopenharmony_ci        class FakeTP(unittest.TestProgram):
2647db96d56Sopenharmony_ci            def parseArgs(self, *args, **kw): pass
2657db96d56Sopenharmony_ci            def runTests(self, *args, **kw): pass
2667db96d56Sopenharmony_ci        warnoptions = sys.warnoptions[:]
2677db96d56Sopenharmony_ci        try:
2687db96d56Sopenharmony_ci            sys.warnoptions[:] = []
2697db96d56Sopenharmony_ci            # no warn options, no arg -> default
2707db96d56Sopenharmony_ci            self.assertEqual(FakeTP().warnings, 'default')
2717db96d56Sopenharmony_ci            # no warn options, w/ arg -> arg value
2727db96d56Sopenharmony_ci            self.assertEqual(FakeTP(warnings='ignore').warnings, 'ignore')
2737db96d56Sopenharmony_ci            sys.warnoptions[:] = ['somevalue']
2747db96d56Sopenharmony_ci            # warn options, no arg -> None
2757db96d56Sopenharmony_ci            # warn options, w/ arg -> arg value
2767db96d56Sopenharmony_ci            self.assertEqual(FakeTP().warnings, None)
2777db96d56Sopenharmony_ci            self.assertEqual(FakeTP(warnings='ignore').warnings, 'ignore')
2787db96d56Sopenharmony_ci        finally:
2797db96d56Sopenharmony_ci            sys.warnoptions[:] = warnoptions
2807db96d56Sopenharmony_ci
2817db96d56Sopenharmony_ci    def testRunTestsRunnerClass(self):
2827db96d56Sopenharmony_ci        program = self.program
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci        program.testRunner = FakeRunner
2857db96d56Sopenharmony_ci        program.verbosity = 'verbosity'
2867db96d56Sopenharmony_ci        program.failfast = 'failfast'
2877db96d56Sopenharmony_ci        program.buffer = 'buffer'
2887db96d56Sopenharmony_ci        program.warnings = 'warnings'
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci        program.runTests()
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci        self.assertEqual(FakeRunner.initArgs, {'verbosity': 'verbosity',
2937db96d56Sopenharmony_ci                                                'failfast': 'failfast',
2947db96d56Sopenharmony_ci                                                'buffer': 'buffer',
2957db96d56Sopenharmony_ci                                                'tb_locals': False,
2967db96d56Sopenharmony_ci                                                'warnings': 'warnings'})
2977db96d56Sopenharmony_ci        self.assertEqual(FakeRunner.test, 'test')
2987db96d56Sopenharmony_ci        self.assertIs(program.result, RESULT)
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ci    def testRunTestsRunnerInstance(self):
3017db96d56Sopenharmony_ci        program = self.program
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ci        program.testRunner = FakeRunner()
3047db96d56Sopenharmony_ci        FakeRunner.initArgs = None
3057db96d56Sopenharmony_ci
3067db96d56Sopenharmony_ci        program.runTests()
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci        # A new FakeRunner should not have been instantiated
3097db96d56Sopenharmony_ci        self.assertIsNone(FakeRunner.initArgs)
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci        self.assertEqual(FakeRunner.test, 'test')
3127db96d56Sopenharmony_ci        self.assertIs(program.result, RESULT)
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci    def test_locals(self):
3157db96d56Sopenharmony_ci        program = self.program
3167db96d56Sopenharmony_ci
3177db96d56Sopenharmony_ci        program.testRunner = FakeRunner
3187db96d56Sopenharmony_ci        program.parseArgs([None, '--locals'])
3197db96d56Sopenharmony_ci        self.assertEqual(True, program.tb_locals)
3207db96d56Sopenharmony_ci        program.runTests()
3217db96d56Sopenharmony_ci        self.assertEqual(FakeRunner.initArgs, {'buffer': False,
3227db96d56Sopenharmony_ci                                               'failfast': False,
3237db96d56Sopenharmony_ci                                               'tb_locals': True,
3247db96d56Sopenharmony_ci                                               'verbosity': 1,
3257db96d56Sopenharmony_ci                                               'warnings': None})
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci    def testRunTestsOldRunnerClass(self):
3287db96d56Sopenharmony_ci        program = self.program
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ci        # Two TypeErrors are needed to fall all the way back to old-style
3317db96d56Sopenharmony_ci        # runners - one to fail tb_locals, one to fail buffer etc.
3327db96d56Sopenharmony_ci        FakeRunner.raiseError = 2
3337db96d56Sopenharmony_ci        program.testRunner = FakeRunner
3347db96d56Sopenharmony_ci        program.verbosity = 'verbosity'
3357db96d56Sopenharmony_ci        program.failfast = 'failfast'
3367db96d56Sopenharmony_ci        program.buffer = 'buffer'
3377db96d56Sopenharmony_ci        program.test = 'test'
3387db96d56Sopenharmony_ci
3397db96d56Sopenharmony_ci        program.runTests()
3407db96d56Sopenharmony_ci
3417db96d56Sopenharmony_ci        # If initialising raises a type error it should be retried
3427db96d56Sopenharmony_ci        # without the new keyword arguments
3437db96d56Sopenharmony_ci        self.assertEqual(FakeRunner.initArgs, {})
3447db96d56Sopenharmony_ci        self.assertEqual(FakeRunner.test, 'test')
3457db96d56Sopenharmony_ci        self.assertIs(program.result, RESULT)
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ci    def testCatchBreakInstallsHandler(self):
3487db96d56Sopenharmony_ci        module = sys.modules['unittest.main']
3497db96d56Sopenharmony_ci        original = module.installHandler
3507db96d56Sopenharmony_ci        def restore():
3517db96d56Sopenharmony_ci            module.installHandler = original
3527db96d56Sopenharmony_ci        self.addCleanup(restore)
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci        self.installed = False
3557db96d56Sopenharmony_ci        def fakeInstallHandler():
3567db96d56Sopenharmony_ci            self.installed = True
3577db96d56Sopenharmony_ci        module.installHandler = fakeInstallHandler
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci        program = self.program
3607db96d56Sopenharmony_ci        program.catchbreak = True
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci        program.testRunner = FakeRunner
3637db96d56Sopenharmony_ci
3647db96d56Sopenharmony_ci        program.runTests()
3657db96d56Sopenharmony_ci        self.assertTrue(self.installed)
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci    def _patch_isfile(self, names, exists=True):
3687db96d56Sopenharmony_ci        def isfile(path):
3697db96d56Sopenharmony_ci            return path in names
3707db96d56Sopenharmony_ci        original = os.path.isfile
3717db96d56Sopenharmony_ci        os.path.isfile = isfile
3727db96d56Sopenharmony_ci        def restore():
3737db96d56Sopenharmony_ci            os.path.isfile = original
3747db96d56Sopenharmony_ci        self.addCleanup(restore)
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ci    def testParseArgsFileNames(self):
3787db96d56Sopenharmony_ci        # running tests with filenames instead of module names
3797db96d56Sopenharmony_ci        program = self.program
3807db96d56Sopenharmony_ci        argv = ['progname', 'foo.py', 'bar.Py', 'baz.PY', 'wing.txt']
3817db96d56Sopenharmony_ci        self._patch_isfile(argv)
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci        program.createTests = lambda: None
3847db96d56Sopenharmony_ci        program.parseArgs(argv)
3857db96d56Sopenharmony_ci
3867db96d56Sopenharmony_ci        # note that 'wing.txt' is not a Python file so the name should
3877db96d56Sopenharmony_ci        # *not* be converted to a module name
3887db96d56Sopenharmony_ci        expected = ['foo', 'bar', 'baz', 'wing.txt']
3897db96d56Sopenharmony_ci        self.assertEqual(program.testNames, expected)
3907db96d56Sopenharmony_ci
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci    def testParseArgsFilePaths(self):
3937db96d56Sopenharmony_ci        program = self.program
3947db96d56Sopenharmony_ci        argv = ['progname', 'foo/bar/baz.py', 'green\\red.py']
3957db96d56Sopenharmony_ci        self._patch_isfile(argv)
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci        program.createTests = lambda: None
3987db96d56Sopenharmony_ci        program.parseArgs(argv)
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ci        expected = ['foo.bar.baz', 'green.red']
4017db96d56Sopenharmony_ci        self.assertEqual(program.testNames, expected)
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci    def testParseArgsNonExistentFiles(self):
4057db96d56Sopenharmony_ci        program = self.program
4067db96d56Sopenharmony_ci        argv = ['progname', 'foo/bar/baz.py', 'green\\red.py']
4077db96d56Sopenharmony_ci        self._patch_isfile([])
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci        program.createTests = lambda: None
4107db96d56Sopenharmony_ci        program.parseArgs(argv)
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci        self.assertEqual(program.testNames, argv[1:])
4137db96d56Sopenharmony_ci
4147db96d56Sopenharmony_ci    def testParseArgsAbsolutePathsThatCanBeConverted(self):
4157db96d56Sopenharmony_ci        cur_dir = os.getcwd()
4167db96d56Sopenharmony_ci        program = self.program
4177db96d56Sopenharmony_ci        def _join(name):
4187db96d56Sopenharmony_ci            return os.path.join(cur_dir, name)
4197db96d56Sopenharmony_ci        argv = ['progname', _join('foo/bar/baz.py'), _join('green\\red.py')]
4207db96d56Sopenharmony_ci        self._patch_isfile(argv)
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci        program.createTests = lambda: None
4237db96d56Sopenharmony_ci        program.parseArgs(argv)
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci        expected = ['foo.bar.baz', 'green.red']
4267db96d56Sopenharmony_ci        self.assertEqual(program.testNames, expected)
4277db96d56Sopenharmony_ci
4287db96d56Sopenharmony_ci    def testParseArgsAbsolutePathsThatCannotBeConverted(self):
4297db96d56Sopenharmony_ci        program = self.program
4307db96d56Sopenharmony_ci        # even on Windows '/...' is considered absolute by os.path.abspath
4317db96d56Sopenharmony_ci        argv = ['progname', '/foo/bar/baz.py', '/green/red.py']
4327db96d56Sopenharmony_ci        self._patch_isfile(argv)
4337db96d56Sopenharmony_ci
4347db96d56Sopenharmony_ci        program.createTests = lambda: None
4357db96d56Sopenharmony_ci        program.parseArgs(argv)
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci        self.assertEqual(program.testNames, argv[1:])
4387db96d56Sopenharmony_ci
4397db96d56Sopenharmony_ci        # it may be better to use platform specific functions to normalise paths
4407db96d56Sopenharmony_ci        # rather than accepting '.PY' and '\' as file separator on Linux / Mac
4417db96d56Sopenharmony_ci        # it would also be better to check that a filename is a valid module
4427db96d56Sopenharmony_ci        # identifier (we have a regex for this in loader.py)
4437db96d56Sopenharmony_ci        # for invalid filenames should we raise a useful error rather than
4447db96d56Sopenharmony_ci        # leaving the current error message (import of filename fails) in place?
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci    def testParseArgsSelectedTestNames(self):
4477db96d56Sopenharmony_ci        program = self.program
4487db96d56Sopenharmony_ci        argv = ['progname', '-k', 'foo', '-k', 'bar', '-k', '*pat*']
4497db96d56Sopenharmony_ci
4507db96d56Sopenharmony_ci        program.createTests = lambda: None
4517db96d56Sopenharmony_ci        program.parseArgs(argv)
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ci        self.assertEqual(program.testNamePatterns, ['*foo*', '*bar*', '*pat*'])
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci    def testSelectedTestNamesFunctionalTest(self):
4567db96d56Sopenharmony_ci        def run_unittest(args):
4577db96d56Sopenharmony_ci            # Use -E to ignore PYTHONSAFEPATH env var
4587db96d56Sopenharmony_ci            cmd = [sys.executable, '-E', '-m', 'unittest'] + args
4597db96d56Sopenharmony_ci            p = subprocess.Popen(cmd,
4607db96d56Sopenharmony_ci                stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, cwd=os.path.dirname(__file__))
4617db96d56Sopenharmony_ci            with p:
4627db96d56Sopenharmony_ci                _, stderr = p.communicate()
4637db96d56Sopenharmony_ci            return stderr.decode()
4647db96d56Sopenharmony_ci
4657db96d56Sopenharmony_ci        t = '_test_warnings'
4667db96d56Sopenharmony_ci        self.assertIn('Ran 7 tests', run_unittest([t]))
4677db96d56Sopenharmony_ci        self.assertIn('Ran 7 tests', run_unittest(['-k', 'TestWarnings', t]))
4687db96d56Sopenharmony_ci        self.assertIn('Ran 7 tests', run_unittest(['discover', '-p', '*_test*', '-k', 'TestWarnings']))
4697db96d56Sopenharmony_ci        self.assertIn('Ran 2 tests', run_unittest(['-k', 'f', t]))
4707db96d56Sopenharmony_ci        self.assertIn('Ran 7 tests', run_unittest(['-k', 't', t]))
4717db96d56Sopenharmony_ci        self.assertIn('Ran 3 tests', run_unittest(['-k', '*t', t]))
4727db96d56Sopenharmony_ci        self.assertIn('Ran 7 tests', run_unittest(['-k', '*test_warnings.*Warning*', t]))
4737db96d56Sopenharmony_ci        self.assertIn('Ran 1 test', run_unittest(['-k', '*test_warnings.*warning*', t]))
4747db96d56Sopenharmony_ci
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ciif __name__ == '__main__':
4777db96d56Sopenharmony_ci    unittest.main()
478