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, 4 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

# User Rev Content
1 schorsch 1.3 #!/usr/bin/env python
2 schorsch 1.6 from __future__ import division, print_function, unicode_literals
3    
4 schorsch 1.3 ''' run_tests.py - Run Radiance test suite
5 schorsch 1.6 2013 - 2018 Georg Mischler
6 schorsch 1.3
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 schorsch 1.4 TESTCATS = ('pyrad','cal','cv','gen','hd','meta','ot','px', 'rt','util',)
21 schorsch 1.3
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 schorsch 1.4 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 schorsch 1.3 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 schorsch 1.1
53 schorsch 1.3 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 schorsch 1.5 for rlib in self.radlib + ['.']:
72 schorsch 1.3 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 schorsch 1.5 suite = loader.discover(fulldir, 'test_*.py',
120 schorsch 1.3 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 schorsch 1.1
144    
145     if __name__ == '__main__':
146 schorsch 1.3 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 schorsch 1.1
154 schorsch 1.3 # vi: set ts=4 sw=4 :