17db96d56Sopenharmony_ci# Test packages (dotted-name import)
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciimport sys
47db96d56Sopenharmony_ciimport os
57db96d56Sopenharmony_ciimport tempfile
67db96d56Sopenharmony_ciimport textwrap
77db96d56Sopenharmony_ciimport unittest
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci# Helpers to create and destroy hierarchies.
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_cidef cleanout(root):
137db96d56Sopenharmony_ci    names = os.listdir(root)
147db96d56Sopenharmony_ci    for name in names:
157db96d56Sopenharmony_ci        fullname = os.path.join(root, name)
167db96d56Sopenharmony_ci        if os.path.isdir(fullname) and not os.path.islink(fullname):
177db96d56Sopenharmony_ci            cleanout(fullname)
187db96d56Sopenharmony_ci        else:
197db96d56Sopenharmony_ci            os.remove(fullname)
207db96d56Sopenharmony_ci    os.rmdir(root)
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_cidef fixdir(lst):
237db96d56Sopenharmony_ci    if "__builtins__" in lst:
247db96d56Sopenharmony_ci        lst.remove("__builtins__")
257db96d56Sopenharmony_ci    if "__initializing__" in lst:
267db96d56Sopenharmony_ci        lst.remove("__initializing__")
277db96d56Sopenharmony_ci    return lst
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci# XXX Things to test
317db96d56Sopenharmony_ci#
327db96d56Sopenharmony_ci# import package without __init__
337db96d56Sopenharmony_ci# import package with __init__
347db96d56Sopenharmony_ci# __init__ importing submodule
357db96d56Sopenharmony_ci# __init__ importing global module
367db96d56Sopenharmony_ci# __init__ defining variables
377db96d56Sopenharmony_ci# submodule importing other submodule
387db96d56Sopenharmony_ci# submodule importing global module
397db96d56Sopenharmony_ci# submodule import submodule via global name
407db96d56Sopenharmony_ci# from package import submodule
417db96d56Sopenharmony_ci# from package import subpackage
427db96d56Sopenharmony_ci# from package import variable (defined in __init__)
437db96d56Sopenharmony_ci# from package import * (defined in __init__)
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ciclass TestPkg(unittest.TestCase):
477db96d56Sopenharmony_ci
487db96d56Sopenharmony_ci    def setUp(self):
497db96d56Sopenharmony_ci        self.root = None
507db96d56Sopenharmony_ci        self.pkgname = None
517db96d56Sopenharmony_ci        self.syspath = list(sys.path)
527db96d56Sopenharmony_ci        self.modules_to_cleanup = set()  # Populated by mkhier().
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ci    def tearDown(self):
557db96d56Sopenharmony_ci        sys.path[:] = self.syspath
567db96d56Sopenharmony_ci        for modulename in self.modules_to_cleanup:
577db96d56Sopenharmony_ci            if modulename in sys.modules:
587db96d56Sopenharmony_ci                del sys.modules[modulename]
597db96d56Sopenharmony_ci        if self.root: # Only clean if the test was actually run
607db96d56Sopenharmony_ci            cleanout(self.root)
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci        # delete all modules concerning the tested hierarchy
637db96d56Sopenharmony_ci        if self.pkgname:
647db96d56Sopenharmony_ci            modules = [name for name in sys.modules
657db96d56Sopenharmony_ci                       if self.pkgname in name.split('.')]
667db96d56Sopenharmony_ci            for name in modules:
677db96d56Sopenharmony_ci                del sys.modules[name]
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci    def run_code(self, code):
707db96d56Sopenharmony_ci        exec(textwrap.dedent(code), globals(), {"self": self})
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci    def mkhier(self, descr):
737db96d56Sopenharmony_ci        root = tempfile.mkdtemp()
747db96d56Sopenharmony_ci        sys.path.insert(0, root)
757db96d56Sopenharmony_ci        if not os.path.isdir(root):
767db96d56Sopenharmony_ci            os.mkdir(root)
777db96d56Sopenharmony_ci        for name, contents in descr:
787db96d56Sopenharmony_ci            comps = name.split()
797db96d56Sopenharmony_ci            self.modules_to_cleanup.add('.'.join(comps))
807db96d56Sopenharmony_ci            fullname = root
817db96d56Sopenharmony_ci            for c in comps:
827db96d56Sopenharmony_ci                fullname = os.path.join(fullname, c)
837db96d56Sopenharmony_ci            if contents is None:
847db96d56Sopenharmony_ci                os.mkdir(fullname)
857db96d56Sopenharmony_ci            else:
867db96d56Sopenharmony_ci                with open(fullname, "w") as f:
877db96d56Sopenharmony_ci                    f.write(contents)
887db96d56Sopenharmony_ci                    if not contents.endswith('\n'):
897db96d56Sopenharmony_ci                        f.write('\n')
907db96d56Sopenharmony_ci        self.root = root
917db96d56Sopenharmony_ci        # package name is the name of the first item
927db96d56Sopenharmony_ci        self.pkgname = descr[0][0]
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci    def test_1(self):
957db96d56Sopenharmony_ci        hier = [("t1", None), ("t1 __init__.py", "")]
967db96d56Sopenharmony_ci        self.mkhier(hier)
977db96d56Sopenharmony_ci        import t1
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci    def test_2(self):
1007db96d56Sopenharmony_ci        hier = [
1017db96d56Sopenharmony_ci         ("t2", None),
1027db96d56Sopenharmony_ci         ("t2 __init__.py", "'doc for t2'"),
1037db96d56Sopenharmony_ci         ("t2 sub", None),
1047db96d56Sopenharmony_ci         ("t2 sub __init__.py", ""),
1057db96d56Sopenharmony_ci         ("t2 sub subsub", None),
1067db96d56Sopenharmony_ci         ("t2 sub subsub __init__.py", "spam = 1"),
1077db96d56Sopenharmony_ci        ]
1087db96d56Sopenharmony_ci        self.mkhier(hier)
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci        import t2.sub
1117db96d56Sopenharmony_ci        import t2.sub.subsub
1127db96d56Sopenharmony_ci        self.assertEqual(t2.__name__, "t2")
1137db96d56Sopenharmony_ci        self.assertEqual(t2.sub.__name__, "t2.sub")
1147db96d56Sopenharmony_ci        self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci        # This exec crap is needed because Py3k forbids 'import *' outside
1177db96d56Sopenharmony_ci        # of module-scope and __import__() is insufficient for what we need.
1187db96d56Sopenharmony_ci        s = """
1197db96d56Sopenharmony_ci            import t2
1207db96d56Sopenharmony_ci            from t2 import *
1217db96d56Sopenharmony_ci            self.assertEqual(dir(), ['self', 'sub', 't2'])
1227db96d56Sopenharmony_ci            """
1237db96d56Sopenharmony_ci        self.run_code(s)
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci        from t2 import sub
1267db96d56Sopenharmony_ci        from t2.sub import subsub
1277db96d56Sopenharmony_ci        from t2.sub.subsub import spam
1287db96d56Sopenharmony_ci        self.assertEqual(sub.__name__, "t2.sub")
1297db96d56Sopenharmony_ci        self.assertEqual(subsub.__name__, "t2.sub.subsub")
1307db96d56Sopenharmony_ci        self.assertEqual(sub.subsub.__name__, "t2.sub.subsub")
1317db96d56Sopenharmony_ci        for name in ['spam', 'sub', 'subsub', 't2']:
1327db96d56Sopenharmony_ci            self.assertTrue(locals()["name"], "Failed to import %s" % name)
1337db96d56Sopenharmony_ci
1347db96d56Sopenharmony_ci        import t2.sub
1357db96d56Sopenharmony_ci        import t2.sub.subsub
1367db96d56Sopenharmony_ci        self.assertEqual(t2.__name__, "t2")
1377db96d56Sopenharmony_ci        self.assertEqual(t2.sub.__name__, "t2.sub")
1387db96d56Sopenharmony_ci        self.assertEqual(t2.sub.subsub.__name__, "t2.sub.subsub")
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci        s = """
1417db96d56Sopenharmony_ci            from t2 import *
1427db96d56Sopenharmony_ci            self.assertEqual(dir(), ['self', 'sub'])
1437db96d56Sopenharmony_ci            """
1447db96d56Sopenharmony_ci        self.run_code(s)
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci    def test_3(self):
1477db96d56Sopenharmony_ci        hier = [
1487db96d56Sopenharmony_ci                ("t3", None),
1497db96d56Sopenharmony_ci                ("t3 __init__.py", ""),
1507db96d56Sopenharmony_ci                ("t3 sub", None),
1517db96d56Sopenharmony_ci                ("t3 sub __init__.py", ""),
1527db96d56Sopenharmony_ci                ("t3 sub subsub", None),
1537db96d56Sopenharmony_ci                ("t3 sub subsub __init__.py", "spam = 1"),
1547db96d56Sopenharmony_ci               ]
1557db96d56Sopenharmony_ci        self.mkhier(hier)
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci        import t3.sub.subsub
1587db96d56Sopenharmony_ci        self.assertEqual(t3.__name__, "t3")
1597db96d56Sopenharmony_ci        self.assertEqual(t3.sub.__name__, "t3.sub")
1607db96d56Sopenharmony_ci        self.assertEqual(t3.sub.subsub.__name__, "t3.sub.subsub")
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci    def test_4(self):
1637db96d56Sopenharmony_ci        hier = [
1647db96d56Sopenharmony_ci        ("t4.py", "raise RuntimeError('Shouldnt load t4.py')"),
1657db96d56Sopenharmony_ci        ("t4", None),
1667db96d56Sopenharmony_ci        ("t4 __init__.py", ""),
1677db96d56Sopenharmony_ci        ("t4 sub.py", "raise RuntimeError('Shouldnt load sub.py')"),
1687db96d56Sopenharmony_ci        ("t4 sub", None),
1697db96d56Sopenharmony_ci        ("t4 sub __init__.py", ""),
1707db96d56Sopenharmony_ci        ("t4 sub subsub.py",
1717db96d56Sopenharmony_ci         "raise RuntimeError('Shouldnt load subsub.py')"),
1727db96d56Sopenharmony_ci        ("t4 sub subsub", None),
1737db96d56Sopenharmony_ci        ("t4 sub subsub __init__.py", "spam = 1"),
1747db96d56Sopenharmony_ci               ]
1757db96d56Sopenharmony_ci        self.mkhier(hier)
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci        s = """
1787db96d56Sopenharmony_ci            from t4.sub.subsub import *
1797db96d56Sopenharmony_ci            self.assertEqual(spam, 1)
1807db96d56Sopenharmony_ci            """
1817db96d56Sopenharmony_ci        self.run_code(s)
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci    def test_5(self):
1847db96d56Sopenharmony_ci        hier = [
1857db96d56Sopenharmony_ci        ("t5", None),
1867db96d56Sopenharmony_ci        ("t5 __init__.py", "import t5.foo"),
1877db96d56Sopenharmony_ci        ("t5 string.py", "spam = 1"),
1887db96d56Sopenharmony_ci        ("t5 foo.py",
1897db96d56Sopenharmony_ci         "from . import string; assert string.spam == 1"),
1907db96d56Sopenharmony_ci         ]
1917db96d56Sopenharmony_ci        self.mkhier(hier)
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci        import t5
1947db96d56Sopenharmony_ci        s = """
1957db96d56Sopenharmony_ci            from t5 import *
1967db96d56Sopenharmony_ci            self.assertEqual(dir(), ['foo', 'self', 'string', 't5'])
1977db96d56Sopenharmony_ci            """
1987db96d56Sopenharmony_ci        self.run_code(s)
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci        import t5
2017db96d56Sopenharmony_ci        self.assertEqual(fixdir(dir(t5)),
2027db96d56Sopenharmony_ci                         ['__cached__', '__doc__', '__file__', '__loader__',
2037db96d56Sopenharmony_ci                          '__name__', '__package__', '__path__', '__spec__',
2047db96d56Sopenharmony_ci                          'foo', 'string', 't5'])
2057db96d56Sopenharmony_ci        self.assertEqual(fixdir(dir(t5.foo)),
2067db96d56Sopenharmony_ci                         ['__cached__', '__doc__', '__file__', '__loader__',
2077db96d56Sopenharmony_ci                          '__name__', '__package__', '__spec__', 'string'])
2087db96d56Sopenharmony_ci        self.assertEqual(fixdir(dir(t5.string)),
2097db96d56Sopenharmony_ci                         ['__cached__', '__doc__', '__file__', '__loader__',
2107db96d56Sopenharmony_ci                          '__name__', '__package__', '__spec__', 'spam'])
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci    def test_6(self):
2137db96d56Sopenharmony_ci        hier = [
2147db96d56Sopenharmony_ci                ("t6", None),
2157db96d56Sopenharmony_ci                ("t6 __init__.py",
2167db96d56Sopenharmony_ci                 "__all__ = ['spam', 'ham', 'eggs']"),
2177db96d56Sopenharmony_ci                ("t6 spam.py", ""),
2187db96d56Sopenharmony_ci                ("t6 ham.py", ""),
2197db96d56Sopenharmony_ci                ("t6 eggs.py", ""),
2207db96d56Sopenharmony_ci               ]
2217db96d56Sopenharmony_ci        self.mkhier(hier)
2227db96d56Sopenharmony_ci
2237db96d56Sopenharmony_ci        import t6
2247db96d56Sopenharmony_ci        self.assertEqual(fixdir(dir(t6)),
2257db96d56Sopenharmony_ci                         ['__all__', '__cached__', '__doc__', '__file__',
2267db96d56Sopenharmony_ci                          '__loader__', '__name__', '__package__', '__path__',
2277db96d56Sopenharmony_ci                          '__spec__'])
2287db96d56Sopenharmony_ci        s = """
2297db96d56Sopenharmony_ci            import t6
2307db96d56Sopenharmony_ci            from t6 import *
2317db96d56Sopenharmony_ci            self.assertEqual(fixdir(dir(t6)),
2327db96d56Sopenharmony_ci                             ['__all__', '__cached__', '__doc__', '__file__',
2337db96d56Sopenharmony_ci                              '__loader__', '__name__', '__package__',
2347db96d56Sopenharmony_ci                              '__path__', '__spec__', 'eggs', 'ham', 'spam'])
2357db96d56Sopenharmony_ci            self.assertEqual(dir(), ['eggs', 'ham', 'self', 'spam', 't6'])
2367db96d56Sopenharmony_ci            """
2377db96d56Sopenharmony_ci        self.run_code(s)
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci    def test_7(self):
2407db96d56Sopenharmony_ci        hier = [
2417db96d56Sopenharmony_ci                ("t7.py", ""),
2427db96d56Sopenharmony_ci                ("t7", None),
2437db96d56Sopenharmony_ci                ("t7 __init__.py", ""),
2447db96d56Sopenharmony_ci                ("t7 sub.py",
2457db96d56Sopenharmony_ci                 "raise RuntimeError('Shouldnt load sub.py')"),
2467db96d56Sopenharmony_ci                ("t7 sub", None),
2477db96d56Sopenharmony_ci                ("t7 sub __init__.py", ""),
2487db96d56Sopenharmony_ci                ("t7 sub .py",
2497db96d56Sopenharmony_ci                 "raise RuntimeError('Shouldnt load subsub.py')"),
2507db96d56Sopenharmony_ci                ("t7 sub subsub", None),
2517db96d56Sopenharmony_ci                ("t7 sub subsub __init__.py",
2527db96d56Sopenharmony_ci                 "spam = 1"),
2537db96d56Sopenharmony_ci               ]
2547db96d56Sopenharmony_ci        self.mkhier(hier)
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci        t7, sub, subsub = None, None, None
2587db96d56Sopenharmony_ci        import t7 as tas
2597db96d56Sopenharmony_ci        self.assertEqual(fixdir(dir(tas)),
2607db96d56Sopenharmony_ci                         ['__cached__', '__doc__', '__file__', '__loader__',
2617db96d56Sopenharmony_ci                          '__name__', '__package__', '__path__', '__spec__'])
2627db96d56Sopenharmony_ci        self.assertFalse(t7)
2637db96d56Sopenharmony_ci        from t7 import sub as subpar
2647db96d56Sopenharmony_ci        self.assertEqual(fixdir(dir(subpar)),
2657db96d56Sopenharmony_ci                         ['__cached__', '__doc__', '__file__', '__loader__',
2667db96d56Sopenharmony_ci                          '__name__', '__package__', '__path__', '__spec__'])
2677db96d56Sopenharmony_ci        self.assertFalse(t7)
2687db96d56Sopenharmony_ci        self.assertFalse(sub)
2697db96d56Sopenharmony_ci        from t7.sub import subsub as subsubsub
2707db96d56Sopenharmony_ci        self.assertEqual(fixdir(dir(subsubsub)),
2717db96d56Sopenharmony_ci                         ['__cached__', '__doc__', '__file__', '__loader__',
2727db96d56Sopenharmony_ci                          '__name__', '__package__', '__path__', '__spec__',
2737db96d56Sopenharmony_ci                          'spam'])
2747db96d56Sopenharmony_ci        self.assertFalse(t7)
2757db96d56Sopenharmony_ci        self.assertFalse(sub)
2767db96d56Sopenharmony_ci        self.assertFalse(subsub)
2777db96d56Sopenharmony_ci        from t7.sub.subsub import spam as ham
2787db96d56Sopenharmony_ci        self.assertEqual(ham, 1)
2797db96d56Sopenharmony_ci        self.assertFalse(t7)
2807db96d56Sopenharmony_ci        self.assertFalse(sub)
2817db96d56Sopenharmony_ci        self.assertFalse(subsub)
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci    @unittest.skipIf(sys.flags.optimize >= 2,
2847db96d56Sopenharmony_ci                     "Docstrings are omitted with -O2 and above")
2857db96d56Sopenharmony_ci    def test_8(self):
2867db96d56Sopenharmony_ci        hier = [
2877db96d56Sopenharmony_ci                ("t8", None),
2887db96d56Sopenharmony_ci                ("t8 __init__"+os.extsep+"py", "'doc for t8'"),
2897db96d56Sopenharmony_ci               ]
2907db96d56Sopenharmony_ci        self.mkhier(hier)
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci        import t8
2937db96d56Sopenharmony_ci        self.assertEqual(t8.__doc__, "doc for t8")
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ciif __name__ == "__main__":
2967db96d56Sopenharmony_ci    unittest.main()
297