blob: d4b18931ec36b3a596278492993f51c5de544913 [file] [log] [blame]
Guilherme Polocda93aa2009-01-28 13:09:03 +00001"""
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 sys
11import unittest
Guilherme Polob98cb432009-02-02 20:28:59 +000012import importlib
Guilherme Polocda93aa2009-01-28 13:09:03 +000013import test.test_support
14
15this_dir_path = os.path.abspath(os.path.dirname(__file__))
16
17def is_package(path):
18 for name in os.listdir(path):
19 if name in ('__init__.py', '__init__.pyc', '__init.pyo'):
20 return True
21 return False
22
Guilherme Polo6785cf02009-01-28 19:23:28 +000023def get_tests_modules(basepath=this_dir_path, gui=True, packages=None):
Guilherme Polocda93aa2009-01-28 13:09:03 +000024 """This will import and yield modules whose names start with test_
Guilherme Polo6785cf02009-01-28 19:23:28 +000025 and are inside packages found in the path starting at basepath.
26
27 If packages is specified it should contain package names that want
Zachary Ware2460dc82014-05-02 10:33:49 -050028 their tests collected.
Guilherme Polo6785cf02009-01-28 19:23:28 +000029 """
Guilherme Polocda93aa2009-01-28 13:09:03 +000030 py_ext = '.py'
31
32 for dirpath, dirnames, filenames in os.walk(basepath):
33 for dirname in list(dirnames):
34 if dirname[0] == '.':
35 dirnames.remove(dirname)
36
37 if is_package(dirpath) and filenames:
38 pkg_name = dirpath[len(basepath) + len(os.sep):].replace('/', '.')
Guilherme Polo6785cf02009-01-28 19:23:28 +000039 if packages and pkg_name not in packages:
40 continue
41
Guilherme Polocda93aa2009-01-28 13:09:03 +000042 filenames = filter(
43 lambda x: x.startswith('test_') and x.endswith(py_ext),
44 filenames)
45
46 for name in filenames:
47 try:
Guilherme Polob98cb432009-02-02 20:28:59 +000048 yield importlib.import_module(
49 ".%s" % name[:-len(py_ext)], pkg_name)
Guilherme Polocda93aa2009-01-28 13:09:03 +000050 except test.test_support.ResourceDenied:
51 if gui:
52 raise
53
Guilherme Polo6785cf02009-01-28 19:23:28 +000054def get_tests(text=True, gui=True, packages=None):
Guilherme Polocda93aa2009-01-28 13:09:03 +000055 """Yield all the tests in the modules found by get_tests_modules.
56
57 If nogui is True, only tests that do not require a GUI will be
58 returned."""
59 attrs = []
60 if text:
61 attrs.append('tests_nogui')
62 if gui:
63 attrs.append('tests_gui')
Guilherme Polo6785cf02009-01-28 19:23:28 +000064 for module in get_tests_modules(gui=gui, packages=packages):
Guilherme Polocda93aa2009-01-28 13:09:03 +000065 for attr in attrs:
66 for test in getattr(module, attr, ()):
67 yield test
68
69if __name__ == "__main__":
Guilherme Polocda93aa2009-01-28 13:09:03 +000070 test.test_support.run_unittest(*get_tests())