14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport __future__
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport distutils.dir_util
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport tempfile
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry: set
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept NameError: from sets import Set as set
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport modulefinder
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Note: To test modulefinder with Python 2.2, sets.py and
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# modulefinder.py must be available - they are not in the standard
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# library.
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTEST_DIR = tempfile.mkdtemp()
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmTEST_PATH = [TEST_DIR, os.path.dirname(__future__.__file__)]
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Each test description is a list of 5 items:
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 1. a module name that will be imported by modulefinder
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 2. a list of module names that modulefinder is required to find
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 3. a list of module names that modulefinder should complain
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#    about because they are not found
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 4. a list of module names that modulefinder should complain
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#    about because they MAY be not found
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 5. a string specifying packages to create; the format is obvious imo.
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm#
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Each package will be created in TEST_DIR, and TEST_DIR will be
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# removed after the tests again.
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Modulefinder searches in a path that contains TEST_DIR, plus
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# the standard Lib directory.
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmaybe_test = [
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "a.module",
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["a", "a.module", "sys",
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "b"],
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["c"], ["b.something"],
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """\
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/__init__.py
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/module.py
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from b import something
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from c import something
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmb/__init__.py
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from sys import *
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""]
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmaybe_test_new = [
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "a.module",
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["a", "a.module", "sys",
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "b", "__future__"],
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["c"], ["b.something"],
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """\
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/__init__.py
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/module.py
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from b import something
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from c import something
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmb/__init__.py
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from __future__ import absolute_import
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from sys import *
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""]
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmpackage_test = [
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "a.module",
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["a", "a.b", "a.c", "a.module", "mymodule", "sys"],
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["blahblah"], [],
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """\
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmymodule.py
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/__init__.py
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import blahblah
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from a import b
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import c
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/module.py
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import sys
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from a import b as x
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from a.c import sillyname
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b.py
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/c.py
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from a.module import x
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import mymodule as sillyname
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from sys import version_info
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""]
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmabsolute_import_test = [
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "a.module",
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["a", "a.module",
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "b", "b.x", "b.y", "b.z",
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "__future__", "sys", "exceptions"],
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["blahblah"], [],
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """\
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmymodule.py
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/__init__.py
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/module.py
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from __future__ import absolute_import
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import sys # sys
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import blahblah # fails
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import exceptions # exceptions
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import b.x # b.x
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from b import y # b.y
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from b.z import * # b.z.*
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/exceptions.py
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/sys.py
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import mymodule
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/__init__.py
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/x.py
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/y.py
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/z.py
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmb/__init__.py
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import z
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmb/unused.py
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmb/x.py
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmb/y.py
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmb/z.py
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""]
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrelative_import_test = [
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "a.module",
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["__future__",
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a", "a.module",
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.b", "a.b.y", "a.b.z",
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.b.c", "a.b.c.moduleC",
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.b.c.d", "a.b.c.e",
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.b.x",
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "exceptions"],
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    [], [],
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """\
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmymodule.py
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/__init__.py
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from .b import y, z # a.b.y, a.b.z
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/module.py
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from __future__ import absolute_import # __future__
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                import exceptions # exceptions
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/exceptions.py
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/sys.py
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/__init__.py
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from ..b import x # a.b.x
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                #from a.b.c import moduleC
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from .c import moduleC # a.b.moduleC
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/x.py
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/y.py
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/z.py
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/g.py
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/c/__init__.py
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from ..c import e # a.b.c.e
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/c/moduleC.py
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from ..c import d # a.b.c.d
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/c/d.py
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/c/e.py
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/c/x.py
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""]
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrelative_import_test_2 = [
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "a.module",
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["a", "a.module",
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.sys",
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.b", "a.b.y", "a.b.z",
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.b.c", "a.b.c.d",
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.b.c.e",
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.b.c.moduleC",
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.b.c.f",
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.b.x",
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm     "a.another"],
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    [], [],
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """\
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmmymodule.py
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/__init__.py
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from . import sys # a.sys
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/another.py
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/module.py
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from .b import y, z # a.b.y, a.b.z
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/exceptions.py
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/sys.py
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/__init__.py
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from .c import moduleC # a.b.c.moduleC
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from .c import d # a.b.c.d
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/x.py
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/y.py
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/z.py
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/c/__init__.py
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from . import e # a.b.c.e
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/c/moduleC.py
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                #
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from . import f   # a.b.c.f
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from .. import x  # a.b.x
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from ... import another # a.another
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/c/d.py
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/c/e.py
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/b/c/f.py
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""]
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrelative_import_test_3 = [
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    "a.module",
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["a", "a.module"],
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ["a.bar"],
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    [],
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """\
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/__init__.py
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                def foo(): pass
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylma/module.py
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from . import foo
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                                from . import bar
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""]
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef open_file(path):
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ##print "#", os.path.abspath(path)
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    dirname = os.path.dirname(path)
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    distutils.dir_util.mkpath(dirname)
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return open(path, "w")
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef create_package(source):
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    ofi = None
2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    try:
2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for line in source.splitlines():
2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if line.startswith(" ") or line.startswith("\t"):
2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ofi.write(line.strip() + "\n")
2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            else:
2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if ofi:
2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    ofi.close()
2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                ofi = open_file(os.path.join(TEST_DIR, line.strip()))
2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    finally:
2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        if ofi:
2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            ofi.close()
2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass ModuleFinderTest(unittest.TestCase):
2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def _do_test(self, info, report=False):
2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        import_this, modules, missing, maybe_missing, source = info
2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        create_package(source)
2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        try:
2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mf = modulefinder.ModuleFinder(path=TEST_PATH)
2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            mf.import_hook(import_this)
2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if report:
2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                mf.report()
2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm##                # This wouldn't work in general when executed several times:
2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm##                opath = sys.path[:]
2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm##                sys.path = TEST_PATH
2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm##                try:
2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm##                    __import__(import_this)
2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm##                except:
2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm##                    import traceback; traceback.print_exc()
2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm##                sys.path = opath
2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm##                return
2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            modules = set(modules)
2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            found = set(mf.modules.keys())
2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            more = list(found - modules)
2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            less = list(modules - found)
2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # check if we found what we expected, not more, not less
2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual((more, less), ([], []))
2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            # check for missing and maybe missing modules
2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            bad, maybe = mf.any_missing_maybe()
2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(bad, missing)
2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.assertEqual(maybe, maybe_missing)
2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        finally:
2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            distutils.dir_util.remove_tree(TEST_DIR)
2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_package(self):
2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._do_test(package_test)
2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_maybe(self):
2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self._do_test(maybe_test)
2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    if getattr(__future__, "absolute_import", None):
2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_maybe_new(self):
2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._do_test(maybe_test_new)
2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_absolute_imports(self):
2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._do_test(absolute_import_test)
2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_relative_imports(self):
2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._do_test(relative_import_test)
2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_relative_imports_2(self):
2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._do_test(relative_import_test_2)
2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        def test_relative_imports_3(self):
2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self._do_test(relative_import_test_3)
2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main():
2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    distutils.log.set_threshold(distutils.log.WARN)
2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_support.run_unittest(ModuleFinderTest)
2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__":
2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    unittest.main()
287