1"""
2Use this module to get and run all tk tests.
3
4tkinter tests should live in a package inside the directory where this file
5lives, like test_tkinter.
6Extensions also should live in packages following the same rule as above.
7"""
8
9import os
10import importlib
11import test.support
12
13this_dir_path = os.path.abspath(os.path.dirname(__file__))
14
15def is_package(path):
16    for name in os.listdir(path):
17        if name in ('__init__.py', '__init__.pyc'):
18            return True
19    return False
20
21def get_tests_modules(basepath=this_dir_path, gui=True, packages=None):
22    """This will import and yield modules whose names start with test_
23    and are inside packages found in the path starting at basepath.
24
25    If packages is specified it should contain package names that
26    want their tests collected.
27    """
28    py_ext = '.py'
29
30    for dirpath, dirnames, filenames in os.walk(basepath):
31        for dirname in list(dirnames):
32            if dirname[0] == '.':
33                dirnames.remove(dirname)
34
35        if is_package(dirpath) and filenames:
36            pkg_name = dirpath[len(basepath) + len(os.sep):].replace('/', '.')
37            if packages and pkg_name not in packages:
38                continue
39
40            filenames = filter(
41                    lambda x: x.startswith('test_') and x.endswith(py_ext),
42                    filenames)
43
44            for name in filenames:
45                try:
46                    yield importlib.import_module(
47                        ".%s.%s" % (pkg_name, name[:-len(py_ext)]),
48                        "tkinter.test")
49                except test.support.ResourceDenied:
50                    if gui:
51                        raise
52
53def get_tests(text=True, gui=True, packages=None):
54    """Yield all the tests in the modules found by get_tests_modules.
55
56    If nogui is True, only tests that do not require a GUI will be
57    returned."""
58    attrs = []
59    if text:
60        attrs.append('tests_nogui')
61    if gui:
62        attrs.append('tests_gui')
63    for module in get_tests_modules(gui=gui, packages=packages):
64        for attr in attrs:
65            for test in getattr(module, attr, ()):
66                yield test
67
68if __name__ == "__main__":
69    test.support.run_unittest(*get_tests())
70