blob: 402c3420dc0bd7dc423cf03790a590f2cb385b80 [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
28 their tests colleted.
29 """
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__":
70 test.test_support.use_resources = ['gui']
71 test.test_support.run_unittest(*get_tests())