ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/test/run_tests.py
Revision: 1.6
Committed: Mon Jan 8 13:38:37 2018 UTC (6 years, 3 months ago) by schorsch
Content type: text/x-python
Branch: MAIN
CVS Tags: rad5R4, rad5R2, rad5R3, HEAD
Changes since 1.5: +3 -2 lines
Log Message:
Updating to SCons 3.x, adding support for Python 3

File Contents

# Content
1 #!/usr/bin/env python
2 from __future__ import division, print_function, unicode_literals
3
4 ''' run_tests.py - Run Radiance test suite
5 2013 - 2018 Georg Mischler
6
7 Invocation:
8 As script, call with -H for instructions.
9 As module, see docstrings in class RadianceTests for instructions.
10 '''
11 from __future__ import division, print_function, unicode_literals
12 __all__ = ['TESTCATS', 'RadianceTests', 'main']
13 import os
14 import sys
15 import types
16 import argparse
17 import unittest
18
19 SHORTPROGN = os.path.splitext(os.path.basename(sys.argv[0]))[0]
20 TESTCATS = ('pyrad','cal','cv','gen','hd','meta','ot','px', 'rt','util',)
21
22 class Error(Exception): pass
23
24 class RadianceTests():
25 '''Test Radiance programs below subdirectory "testcases" recursively.
26
27 This class will create a virtual module "testsupport" with constants
28 and functions for use in individual test cases.
29
30 bindir - list of paths added to PATH
31 path - complete list of paths currently in PATH
32 radlib - list of paths added to RAYPATH
33 raypath - complete list of paths currently in RAYPATH
34 pyradlib - absolute path of python support library directory
35 datadir - absolute path of test data directory
36 datafile([sub, [sub,]] fn) - return absolute file path in
37 data directory or in a subdirectory
38 '''
39 def __init__(self, **args):
40 '''Args are:
41 bindir=[directory ...] - will be prepended to PATH for tests
42 radlib=[directory ...] - will be prepended to RAYPATH for tests
43 cat=[category ...] - only test those categories (else TESTCATS)
44 V=False - if True, verbose listing of executed tests
45 '''
46 self.bindir = args.get('bindir')
47 self.radlib = args.get('radlib')
48 self.testcats = args.get('cat')
49 self.V = 2 if args.get('V') else 1
50 try:
51 old_osenv = os.environ
52
53 thisfile = os.path.abspath(__file__)
54 self.thisdir = os.path.split(thisfile)[0]
55 self.testdir = os.path.join(self.thisdir, 'testcases')
56 old_syspath = sys.path
57 if self.testdir not in sys.path:
58 sys.path.insert(0, self.testdir)
59
60 oldpath = old_osenv.get('PATH', '')
61 pathlist = oldpath.split(os.pathsep)
62 if self.bindir:
63 for bdir in self.bindir:
64 if bdir not in pathlist:
65 pathlist.insert(0, bdir)
66 os.environ['PATH'] = os.pathsep.join(pathlist)
67
68 oldraypath = old_osenv.get('RAYPATH', '')
69 raypathlist = oldraypath.split(os.pathsep)
70 if self.radlib:
71 for rlib in self.radlib + ['.']:
72 if rlib not in raypathlist:
73 raypathlist.insert(0, rlib)
74 os.environ['RAYPATH'] = os.pathsep.join(raypathlist)
75
76 pyradlib = None
77 for rp in raypathlist:
78 prd = os.path.join(rp, 'pyradlib')
79 if os.path.isdir(prd) or os.path.islink(prd):
80 if rp not in sys.path:
81 sys.path.insert(0, rp)
82 pyradlib = prd
83 if not pyradlib:
84 raise Error('Python support library directory "pyradlib" not found on RAYPATH')
85
86 # Since this here is the best place to figure out where
87 # everything is, we create an ad-hoc module to hold directory
88 # paths and functions for creating file paths.
89 # The individual test cases can then "import testsupport" to
90 # get access to the complete information.
91 supmod = types.ModuleType(str('testsupport'))
92 datadir = os.path.join(self.thisdir, 'test data')
93 supmod.bindir = self.bindir
94 supmod.datadir = datadir
95 supmod.datafile = lambda fn,*ffn: os.path.join(datadir, fn, *ffn)
96 supmod.path = pathlist
97 supmod.radlib = self.radlib
98 supmod.raypath = raypathlist
99 supmod.pyradlib = pyradlib
100 sys.modules['testsupport'] = supmod
101
102 self._run_all()
103 finally:
104 if hasattr(sys.modules, 'testsupport'):
105 del sys.modules['testsupport']
106 os.environ = old_osenv
107 sys.path = old_syspath
108
109 def _run_all(self):
110 runner = unittest.TextTestRunner(verbosity=self.V)
111 if self.testcats:
112 cats = self.testcats
113 else: cats = TESTCATS
114 for dir in cats:
115 loader = unittest.defaultTestLoader
116 fulldir = os.path.join(self.testdir, dir)
117 if not os.path.isdir(fulldir):
118 raise Error('No such directory: "%s"' % fulldir)
119 suite = loader.discover(fulldir, 'test_*.py',
120 top_level_dir=self.thisdir)
121 count = suite.countTestCases()
122 if count:
123 print('\n--', dir, '----', file=sys.stderr)
124 runner.run(suite)
125
126
127 def main():
128 '''Main function for invocation as script. See usage instructions with -H'''
129 parser = argparse.ArgumentParser(add_help=False,
130 description='Run Radiance test suite',)
131 parser.add_argument('-V', action='store_true',
132 help='Verbose: Print all executed test cases to stderr')
133 parser.add_argument('-H', action='help',
134 help='Help: print this text to stderr and exit')
135 parser.add_argument('-p', action='store', nargs=1,
136 dest='bindir', metavar='bindir', help='Path to Radiance binaries')
137 parser.add_argument('-l', action='store', nargs=1,
138 dest='radlib', metavar='radlib', help='Path to Radiance library')
139 parser.add_argument('-c', action='store', nargs=1,
140 dest='cat', metavar='cat', help='Category of tests to run (else all)')
141 args = parser.parse_args()
142 RadianceTests(**vars(args))
143
144
145 if __name__ == '__main__':
146 try: main()
147 except KeyboardInterrupt:
148 sys.stderr.write('*cancelled*\n')
149 exit(1)
150 except Error as e:
151 sys.stderr.write('%s: %s\n' % (SHORTPROGN, str(e)))
152 exit(-1)
153
154 # vi: set ts=4 sw=4 :