17db96d56Sopenharmony_ciimport os
27db96d56Sopenharmony_ciimport errno
37db96d56Sopenharmony_ciimport importlib.machinery
47db96d56Sopenharmony_ciimport py_compile
57db96d56Sopenharmony_ciimport shutil
67db96d56Sopenharmony_ciimport unittest
77db96d56Sopenharmony_ciimport tempfile
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_cifrom test import support
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciimport modulefinder
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci# Each test description is a list of 5 items:
147db96d56Sopenharmony_ci#
157db96d56Sopenharmony_ci# 1. a module name that will be imported by modulefinder
167db96d56Sopenharmony_ci# 2. a list of module names that modulefinder is required to find
177db96d56Sopenharmony_ci# 3. a list of module names that modulefinder should complain
187db96d56Sopenharmony_ci#    about because they are not found
197db96d56Sopenharmony_ci# 4. a list of module names that modulefinder should complain
207db96d56Sopenharmony_ci#    about because they MAY be not found
217db96d56Sopenharmony_ci# 5. a string specifying packages to create; the format is obvious imo.
227db96d56Sopenharmony_ci#
237db96d56Sopenharmony_ci# Each package will be created in test_dir, and test_dir will be
247db96d56Sopenharmony_ci# removed after the tests again.
257db96d56Sopenharmony_ci# Modulefinder searches in a path that contains test_dir, plus
267db96d56Sopenharmony_ci# the standard Lib directory.
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_cimaybe_test = [
297db96d56Sopenharmony_ci    "a.module",
307db96d56Sopenharmony_ci    ["a", "a.module", "sys",
317db96d56Sopenharmony_ci     "b"],
327db96d56Sopenharmony_ci    ["c"], ["b.something"],
337db96d56Sopenharmony_ci    """\
347db96d56Sopenharmony_cia/__init__.py
357db96d56Sopenharmony_cia/module.py
367db96d56Sopenharmony_ci                                from b import something
377db96d56Sopenharmony_ci                                from c import something
387db96d56Sopenharmony_cib/__init__.py
397db96d56Sopenharmony_ci                                from sys import *
407db96d56Sopenharmony_ci""",
417db96d56Sopenharmony_ci]
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_cimaybe_test_new = [
447db96d56Sopenharmony_ci    "a.module",
457db96d56Sopenharmony_ci    ["a", "a.module", "sys",
467db96d56Sopenharmony_ci     "b", "__future__"],
477db96d56Sopenharmony_ci    ["c"], ["b.something"],
487db96d56Sopenharmony_ci    """\
497db96d56Sopenharmony_cia/__init__.py
507db96d56Sopenharmony_cia/module.py
517db96d56Sopenharmony_ci                                from b import something
527db96d56Sopenharmony_ci                                from c import something
537db96d56Sopenharmony_cib/__init__.py
547db96d56Sopenharmony_ci                                from __future__ import absolute_import
557db96d56Sopenharmony_ci                                from sys import *
567db96d56Sopenharmony_ci"""]
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_cipackage_test = [
597db96d56Sopenharmony_ci    "a.module",
607db96d56Sopenharmony_ci    ["a", "a.b", "a.c", "a.module", "mymodule", "sys"],
617db96d56Sopenharmony_ci    ["blahblah", "c"], [],
627db96d56Sopenharmony_ci    """\
637db96d56Sopenharmony_cimymodule.py
647db96d56Sopenharmony_cia/__init__.py
657db96d56Sopenharmony_ci                                import blahblah
667db96d56Sopenharmony_ci                                from a import b
677db96d56Sopenharmony_ci                                import c
687db96d56Sopenharmony_cia/module.py
697db96d56Sopenharmony_ci                                import sys
707db96d56Sopenharmony_ci                                from a import b as x
717db96d56Sopenharmony_ci                                from a.c import sillyname
727db96d56Sopenharmony_cia/b.py
737db96d56Sopenharmony_cia/c.py
747db96d56Sopenharmony_ci                                from a.module import x
757db96d56Sopenharmony_ci                                import mymodule as sillyname
767db96d56Sopenharmony_ci                                from sys import version_info
777db96d56Sopenharmony_ci"""]
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ciabsolute_import_test = [
807db96d56Sopenharmony_ci    "a.module",
817db96d56Sopenharmony_ci    ["a", "a.module",
827db96d56Sopenharmony_ci     "b", "b.x", "b.y", "b.z",
837db96d56Sopenharmony_ci     "__future__", "sys", "gc"],
847db96d56Sopenharmony_ci    ["blahblah", "z"], [],
857db96d56Sopenharmony_ci    """\
867db96d56Sopenharmony_cimymodule.py
877db96d56Sopenharmony_cia/__init__.py
887db96d56Sopenharmony_cia/module.py
897db96d56Sopenharmony_ci                                from __future__ import absolute_import
907db96d56Sopenharmony_ci                                import sys # sys
917db96d56Sopenharmony_ci                                import blahblah # fails
927db96d56Sopenharmony_ci                                import gc # gc
937db96d56Sopenharmony_ci                                import b.x # b.x
947db96d56Sopenharmony_ci                                from b import y # b.y
957db96d56Sopenharmony_ci                                from b.z import * # b.z.*
967db96d56Sopenharmony_cia/gc.py
977db96d56Sopenharmony_cia/sys.py
987db96d56Sopenharmony_ci                                import mymodule
997db96d56Sopenharmony_cia/b/__init__.py
1007db96d56Sopenharmony_cia/b/x.py
1017db96d56Sopenharmony_cia/b/y.py
1027db96d56Sopenharmony_cia/b/z.py
1037db96d56Sopenharmony_cib/__init__.py
1047db96d56Sopenharmony_ci                                import z
1057db96d56Sopenharmony_cib/unused.py
1067db96d56Sopenharmony_cib/x.py
1077db96d56Sopenharmony_cib/y.py
1087db96d56Sopenharmony_cib/z.py
1097db96d56Sopenharmony_ci"""]
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_cirelative_import_test = [
1127db96d56Sopenharmony_ci    "a.module",
1137db96d56Sopenharmony_ci    ["__future__",
1147db96d56Sopenharmony_ci     "a", "a.module",
1157db96d56Sopenharmony_ci     "a.b", "a.b.y", "a.b.z",
1167db96d56Sopenharmony_ci     "a.b.c", "a.b.c.moduleC",
1177db96d56Sopenharmony_ci     "a.b.c.d", "a.b.c.e",
1187db96d56Sopenharmony_ci     "a.b.x",
1197db96d56Sopenharmony_ci     "gc"],
1207db96d56Sopenharmony_ci    [], [],
1217db96d56Sopenharmony_ci    """\
1227db96d56Sopenharmony_cimymodule.py
1237db96d56Sopenharmony_cia/__init__.py
1247db96d56Sopenharmony_ci                                from .b import y, z # a.b.y, a.b.z
1257db96d56Sopenharmony_cia/module.py
1267db96d56Sopenharmony_ci                                from __future__ import absolute_import # __future__
1277db96d56Sopenharmony_ci                                import gc # gc
1287db96d56Sopenharmony_cia/gc.py
1297db96d56Sopenharmony_cia/sys.py
1307db96d56Sopenharmony_cia/b/__init__.py
1317db96d56Sopenharmony_ci                                from ..b import x # a.b.x
1327db96d56Sopenharmony_ci                                #from a.b.c import moduleC
1337db96d56Sopenharmony_ci                                from .c import moduleC # a.b.moduleC
1347db96d56Sopenharmony_cia/b/x.py
1357db96d56Sopenharmony_cia/b/y.py
1367db96d56Sopenharmony_cia/b/z.py
1377db96d56Sopenharmony_cia/b/g.py
1387db96d56Sopenharmony_cia/b/c/__init__.py
1397db96d56Sopenharmony_ci                                from ..c import e # a.b.c.e
1407db96d56Sopenharmony_cia/b/c/moduleC.py
1417db96d56Sopenharmony_ci                                from ..c import d # a.b.c.d
1427db96d56Sopenharmony_cia/b/c/d.py
1437db96d56Sopenharmony_cia/b/c/e.py
1447db96d56Sopenharmony_cia/b/c/x.py
1457db96d56Sopenharmony_ci"""]
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_cirelative_import_test_2 = [
1487db96d56Sopenharmony_ci    "a.module",
1497db96d56Sopenharmony_ci    ["a", "a.module",
1507db96d56Sopenharmony_ci     "a.sys",
1517db96d56Sopenharmony_ci     "a.b", "a.b.y", "a.b.z",
1527db96d56Sopenharmony_ci     "a.b.c", "a.b.c.d",
1537db96d56Sopenharmony_ci     "a.b.c.e",
1547db96d56Sopenharmony_ci     "a.b.c.moduleC",
1557db96d56Sopenharmony_ci     "a.b.c.f",
1567db96d56Sopenharmony_ci     "a.b.x",
1577db96d56Sopenharmony_ci     "a.another"],
1587db96d56Sopenharmony_ci    [], [],
1597db96d56Sopenharmony_ci    """\
1607db96d56Sopenharmony_cimymodule.py
1617db96d56Sopenharmony_cia/__init__.py
1627db96d56Sopenharmony_ci                                from . import sys # a.sys
1637db96d56Sopenharmony_cia/another.py
1647db96d56Sopenharmony_cia/module.py
1657db96d56Sopenharmony_ci                                from .b import y, z # a.b.y, a.b.z
1667db96d56Sopenharmony_cia/gc.py
1677db96d56Sopenharmony_cia/sys.py
1687db96d56Sopenharmony_cia/b/__init__.py
1697db96d56Sopenharmony_ci                                from .c import moduleC # a.b.c.moduleC
1707db96d56Sopenharmony_ci                                from .c import d # a.b.c.d
1717db96d56Sopenharmony_cia/b/x.py
1727db96d56Sopenharmony_cia/b/y.py
1737db96d56Sopenharmony_cia/b/z.py
1747db96d56Sopenharmony_cia/b/c/__init__.py
1757db96d56Sopenharmony_ci                                from . import e # a.b.c.e
1767db96d56Sopenharmony_cia/b/c/moduleC.py
1777db96d56Sopenharmony_ci                                #
1787db96d56Sopenharmony_ci                                from . import f   # a.b.c.f
1797db96d56Sopenharmony_ci                                from .. import x  # a.b.x
1807db96d56Sopenharmony_ci                                from ... import another # a.another
1817db96d56Sopenharmony_cia/b/c/d.py
1827db96d56Sopenharmony_cia/b/c/e.py
1837db96d56Sopenharmony_cia/b/c/f.py
1847db96d56Sopenharmony_ci"""]
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_cirelative_import_test_3 = [
1877db96d56Sopenharmony_ci    "a.module",
1887db96d56Sopenharmony_ci    ["a", "a.module"],
1897db96d56Sopenharmony_ci    ["a.bar"],
1907db96d56Sopenharmony_ci    [],
1917db96d56Sopenharmony_ci    """\
1927db96d56Sopenharmony_cia/__init__.py
1937db96d56Sopenharmony_ci                                def foo(): pass
1947db96d56Sopenharmony_cia/module.py
1957db96d56Sopenharmony_ci                                from . import foo
1967db96d56Sopenharmony_ci                                from . import bar
1977db96d56Sopenharmony_ci"""]
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_cirelative_import_test_4 = [
2007db96d56Sopenharmony_ci    "a.module",
2017db96d56Sopenharmony_ci    ["a", "a.module"],
2027db96d56Sopenharmony_ci    [],
2037db96d56Sopenharmony_ci    [],
2047db96d56Sopenharmony_ci    """\
2057db96d56Sopenharmony_cia/__init__.py
2067db96d56Sopenharmony_ci                                def foo(): pass
2077db96d56Sopenharmony_cia/module.py
2087db96d56Sopenharmony_ci                                from . import *
2097db96d56Sopenharmony_ci"""]
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_cibytecode_test = [
2127db96d56Sopenharmony_ci    "a",
2137db96d56Sopenharmony_ci    ["a"],
2147db96d56Sopenharmony_ci    [],
2157db96d56Sopenharmony_ci    [],
2167db96d56Sopenharmony_ci    ""
2177db96d56Sopenharmony_ci]
2187db96d56Sopenharmony_ci
2197db96d56Sopenharmony_cisyntax_error_test = [
2207db96d56Sopenharmony_ci    "a.module",
2217db96d56Sopenharmony_ci    ["a", "a.module", "b"],
2227db96d56Sopenharmony_ci    ["b.module"], [],
2237db96d56Sopenharmony_ci    """\
2247db96d56Sopenharmony_cia/__init__.py
2257db96d56Sopenharmony_cia/module.py
2267db96d56Sopenharmony_ci                                import b.module
2277db96d56Sopenharmony_cib/__init__.py
2287db96d56Sopenharmony_cib/module.py
2297db96d56Sopenharmony_ci                                ?  # SyntaxError: invalid syntax
2307db96d56Sopenharmony_ci"""]
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_cisame_name_as_bad_test = [
2347db96d56Sopenharmony_ci    "a.module",
2357db96d56Sopenharmony_ci    ["a", "a.module", "b", "b.c"],
2367db96d56Sopenharmony_ci    ["c"], [],
2377db96d56Sopenharmony_ci    """\
2387db96d56Sopenharmony_cia/__init__.py
2397db96d56Sopenharmony_cia/module.py
2407db96d56Sopenharmony_ci                                import c
2417db96d56Sopenharmony_ci                                from b import c
2427db96d56Sopenharmony_cib/__init__.py
2437db96d56Sopenharmony_cib/c.py
2447db96d56Sopenharmony_ci"""]
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_cicoding_default_utf8_test = [
2477db96d56Sopenharmony_ci    "a_utf8",
2487db96d56Sopenharmony_ci    ["a_utf8", "b_utf8"],
2497db96d56Sopenharmony_ci    [], [],
2507db96d56Sopenharmony_ci    """\
2517db96d56Sopenharmony_cia_utf8.py
2527db96d56Sopenharmony_ci                                # use the default of utf8
2537db96d56Sopenharmony_ci                                print('Unicode test A code point 2090 \u2090 that is not valid in cp1252')
2547db96d56Sopenharmony_ci                                import b_utf8
2557db96d56Sopenharmony_cib_utf8.py
2567db96d56Sopenharmony_ci                                # use the default of utf8
2577db96d56Sopenharmony_ci                                print('Unicode test B code point 2090 \u2090 that is not valid in cp1252')
2587db96d56Sopenharmony_ci"""]
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_cicoding_explicit_utf8_test = [
2617db96d56Sopenharmony_ci    "a_utf8",
2627db96d56Sopenharmony_ci    ["a_utf8", "b_utf8"],
2637db96d56Sopenharmony_ci    [], [],
2647db96d56Sopenharmony_ci    """\
2657db96d56Sopenharmony_cia_utf8.py
2667db96d56Sopenharmony_ci                                # coding=utf8
2677db96d56Sopenharmony_ci                                print('Unicode test A code point 2090 \u2090 that is not valid in cp1252')
2687db96d56Sopenharmony_ci                                import b_utf8
2697db96d56Sopenharmony_cib_utf8.py
2707db96d56Sopenharmony_ci                                # use the default of utf8
2717db96d56Sopenharmony_ci                                print('Unicode test B code point 2090 \u2090 that is not valid in cp1252')
2727db96d56Sopenharmony_ci"""]
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_cicoding_explicit_cp1252_test = [
2757db96d56Sopenharmony_ci    "a_cp1252",
2767db96d56Sopenharmony_ci    ["a_cp1252", "b_utf8"],
2777db96d56Sopenharmony_ci    [], [],
2787db96d56Sopenharmony_ci    b"""\
2797db96d56Sopenharmony_cia_cp1252.py
2807db96d56Sopenharmony_ci                                # coding=cp1252
2817db96d56Sopenharmony_ci                                # 0xe2 is not allowed in utf8
2827db96d56Sopenharmony_ci                                print('CP1252 test P\xe2t\xe9')
2837db96d56Sopenharmony_ci                                import b_utf8
2847db96d56Sopenharmony_ci""" + """\
2857db96d56Sopenharmony_cib_utf8.py
2867db96d56Sopenharmony_ci                                # use the default of utf8
2877db96d56Sopenharmony_ci                                print('Unicode test A code point 2090 \u2090 that is not valid in cp1252')
2887db96d56Sopenharmony_ci""".encode('utf-8')]
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_cidef open_file(path):
2917db96d56Sopenharmony_ci    dirname = os.path.dirname(path)
2927db96d56Sopenharmony_ci    try:
2937db96d56Sopenharmony_ci        os.makedirs(dirname)
2947db96d56Sopenharmony_ci    except OSError as e:
2957db96d56Sopenharmony_ci        if e.errno != errno.EEXIST:
2967db96d56Sopenharmony_ci            raise
2977db96d56Sopenharmony_ci    return open(path, 'wb')
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_cidef create_package(test_dir, source):
3017db96d56Sopenharmony_ci    ofi = None
3027db96d56Sopenharmony_ci    try:
3037db96d56Sopenharmony_ci        for line in source.splitlines():
3047db96d56Sopenharmony_ci            if type(line) != bytes:
3057db96d56Sopenharmony_ci                line = line.encode('utf-8')
3067db96d56Sopenharmony_ci            if line.startswith(b' ') or line.startswith(b'\t'):
3077db96d56Sopenharmony_ci                ofi.write(line.strip() + b'\n')
3087db96d56Sopenharmony_ci            else:
3097db96d56Sopenharmony_ci                if ofi:
3107db96d56Sopenharmony_ci                    ofi.close()
3117db96d56Sopenharmony_ci                if type(line) == bytes:
3127db96d56Sopenharmony_ci                    line = line.decode('utf-8')
3137db96d56Sopenharmony_ci                ofi = open_file(os.path.join(test_dir, line.strip()))
3147db96d56Sopenharmony_ci    finally:
3157db96d56Sopenharmony_ci        if ofi:
3167db96d56Sopenharmony_ci            ofi.close()
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ciclass ModuleFinderTest(unittest.TestCase):
3197db96d56Sopenharmony_ci    def setUp(self):
3207db96d56Sopenharmony_ci        self.test_dir = tempfile.mkdtemp()
3217db96d56Sopenharmony_ci        self.test_path = [self.test_dir, os.path.dirname(tempfile.__file__)]
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci    def tearDown(self):
3247db96d56Sopenharmony_ci        shutil.rmtree(self.test_dir)
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci    def _do_test(self, info, report=False, debug=0, replace_paths=[], modulefinder_class=modulefinder.ModuleFinder):
3277db96d56Sopenharmony_ci        import_this, modules, missing, maybe_missing, source = info
3287db96d56Sopenharmony_ci        create_package(self.test_dir, source)
3297db96d56Sopenharmony_ci        mf = modulefinder_class(path=self.test_path, debug=debug,
3307db96d56Sopenharmony_ci                                        replace_paths=replace_paths)
3317db96d56Sopenharmony_ci        mf.import_hook(import_this)
3327db96d56Sopenharmony_ci        if report:
3337db96d56Sopenharmony_ci            mf.report()
3347db96d56Sopenharmony_ci##            # This wouldn't work in general when executed several times:
3357db96d56Sopenharmony_ci##            opath = sys.path[:]
3367db96d56Sopenharmony_ci##            sys.path = self.test_path
3377db96d56Sopenharmony_ci##            try:
3387db96d56Sopenharmony_ci##                __import__(import_this)
3397db96d56Sopenharmony_ci##            except:
3407db96d56Sopenharmony_ci##                import traceback; traceback.print_exc()
3417db96d56Sopenharmony_ci##            sys.path = opath
3427db96d56Sopenharmony_ci##            return
3437db96d56Sopenharmony_ci        modules = sorted(set(modules))
3447db96d56Sopenharmony_ci        found = sorted(mf.modules)
3457db96d56Sopenharmony_ci        # check if we found what we expected, not more, not less
3467db96d56Sopenharmony_ci        self.assertEqual(found, modules)
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ci        # check for missing and maybe missing modules
3497db96d56Sopenharmony_ci        bad, maybe = mf.any_missing_maybe()
3507db96d56Sopenharmony_ci        self.assertEqual(bad, missing)
3517db96d56Sopenharmony_ci        self.assertEqual(maybe, maybe_missing)
3527db96d56Sopenharmony_ci
3537db96d56Sopenharmony_ci    def test_package(self):
3547db96d56Sopenharmony_ci        self._do_test(package_test)
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ci    def test_maybe(self):
3577db96d56Sopenharmony_ci        self._do_test(maybe_test)
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci    def test_maybe_new(self):
3607db96d56Sopenharmony_ci        self._do_test(maybe_test_new)
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci    def test_absolute_imports(self):
3637db96d56Sopenharmony_ci        self._do_test(absolute_import_test)
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ci    def test_relative_imports(self):
3667db96d56Sopenharmony_ci        self._do_test(relative_import_test)
3677db96d56Sopenharmony_ci
3687db96d56Sopenharmony_ci    def test_relative_imports_2(self):
3697db96d56Sopenharmony_ci        self._do_test(relative_import_test_2)
3707db96d56Sopenharmony_ci
3717db96d56Sopenharmony_ci    def test_relative_imports_3(self):
3727db96d56Sopenharmony_ci        self._do_test(relative_import_test_3)
3737db96d56Sopenharmony_ci
3747db96d56Sopenharmony_ci    def test_relative_imports_4(self):
3757db96d56Sopenharmony_ci        self._do_test(relative_import_test_4)
3767db96d56Sopenharmony_ci
3777db96d56Sopenharmony_ci    def test_syntax_error(self):
3787db96d56Sopenharmony_ci        self._do_test(syntax_error_test)
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci    def test_same_name_as_bad(self):
3817db96d56Sopenharmony_ci        self._do_test(same_name_as_bad_test)
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci    def test_bytecode(self):
3847db96d56Sopenharmony_ci        base_path = os.path.join(self.test_dir, 'a')
3857db96d56Sopenharmony_ci        source_path = base_path + importlib.machinery.SOURCE_SUFFIXES[0]
3867db96d56Sopenharmony_ci        bytecode_path = base_path + importlib.machinery.BYTECODE_SUFFIXES[0]
3877db96d56Sopenharmony_ci        with open_file(source_path) as file:
3887db96d56Sopenharmony_ci            file.write('testing_modulefinder = True\n'.encode('utf-8'))
3897db96d56Sopenharmony_ci        py_compile.compile(source_path, cfile=bytecode_path)
3907db96d56Sopenharmony_ci        os.remove(source_path)
3917db96d56Sopenharmony_ci        self._do_test(bytecode_test)
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci    def test_replace_paths(self):
3947db96d56Sopenharmony_ci        old_path = os.path.join(self.test_dir, 'a', 'module.py')
3957db96d56Sopenharmony_ci        new_path = os.path.join(self.test_dir, 'a', 'spam.py')
3967db96d56Sopenharmony_ci        with support.captured_stdout() as output:
3977db96d56Sopenharmony_ci            self._do_test(maybe_test, debug=2,
3987db96d56Sopenharmony_ci                          replace_paths=[(old_path, new_path)])
3997db96d56Sopenharmony_ci        output = output.getvalue()
4007db96d56Sopenharmony_ci        expected = "co_filename %r changed to %r" % (old_path, new_path)
4017db96d56Sopenharmony_ci        self.assertIn(expected, output)
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci    def test_extended_opargs(self):
4047db96d56Sopenharmony_ci        extended_opargs_test = [
4057db96d56Sopenharmony_ci            "a",
4067db96d56Sopenharmony_ci            ["a", "b"],
4077db96d56Sopenharmony_ci            [], [],
4087db96d56Sopenharmony_ci            """\
4097db96d56Sopenharmony_cia.py
4107db96d56Sopenharmony_ci                                %r
4117db96d56Sopenharmony_ci                                import b
4127db96d56Sopenharmony_cib.py
4137db96d56Sopenharmony_ci""" % list(range(2**16))]  # 2**16 constants
4147db96d56Sopenharmony_ci        self._do_test(extended_opargs_test)
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci    def test_coding_default_utf8(self):
4177db96d56Sopenharmony_ci        self._do_test(coding_default_utf8_test)
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci    def test_coding_explicit_utf8(self):
4207db96d56Sopenharmony_ci        self._do_test(coding_explicit_utf8_test)
4217db96d56Sopenharmony_ci
4227db96d56Sopenharmony_ci    def test_coding_explicit_cp1252(self):
4237db96d56Sopenharmony_ci        self._do_test(coding_explicit_cp1252_test)
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci    def test_load_module_api(self):
4267db96d56Sopenharmony_ci        class CheckLoadModuleApi(modulefinder.ModuleFinder):
4277db96d56Sopenharmony_ci            def __init__(self, *args, **kwds):
4287db96d56Sopenharmony_ci                super().__init__(*args, **kwds)
4297db96d56Sopenharmony_ci
4307db96d56Sopenharmony_ci            def load_module(self, fqname, fp, pathname, file_info):
4317db96d56Sopenharmony_ci                # confirm that the fileinfo is a tuple of 3 elements
4327db96d56Sopenharmony_ci                suffix, mode, type = file_info
4337db96d56Sopenharmony_ci                return super().load_module(fqname, fp, pathname, file_info)
4347db96d56Sopenharmony_ci
4357db96d56Sopenharmony_ci        self._do_test(absolute_import_test, modulefinder_class=CheckLoadModuleApi)
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ciif __name__ == "__main__":
4387db96d56Sopenharmony_ci    unittest.main()
439