If no full or minimal Python interface is being built, copy the minimal interface into the build directory and use the sys.executable to run it, so the tests that require CTML or CTI conversion can run.
292 lines
13 KiB
Python
292 lines
13 KiB
Python
from buildutils import *
|
|
|
|
Import('env','build','install')
|
|
localenv = env.Clone()
|
|
localenv.Prepend(CPPPATH=['#include', '#src', 'shared'])
|
|
localenv.Append(CCFLAGS=env['warning_flags'])
|
|
|
|
# Turn off optimization to speed up compilation
|
|
ccflags = localenv['CCFLAGS']
|
|
for optimize_flag in ('-O3', '-O2', '/O2'):
|
|
if optimize_flag in ccflags:
|
|
ccflags.remove(optimize_flag)
|
|
localenv['CCFLAGS'] = ccflags
|
|
|
|
# Where possible, link tests against the shared libraries to minimize the sizes
|
|
# of the resulting binaries.
|
|
if localenv['OS'] == 'Linux':
|
|
cantera_libs = localenv['cantera_shared_libs']
|
|
else:
|
|
cantera_libs = localenv['cantera_libs']
|
|
|
|
if localenv['python2_package'] in ('full', 'minimal'):
|
|
localenv['ENV']['PYTHONPATH'] = localenv['pythonpath_build2']
|
|
localenv['ENV']['PYTHON_CMD'] = localenv.subst('$python2_cmd')
|
|
haveConverters = True
|
|
elif localenv['python3_package'] in ('full', 'minimal'):
|
|
localenv['ENV']['PYTHONPATH'] = localenv['pythonpath_build3']
|
|
localenv['ENV']['PYTHON_CMD'] = localenv.subst('$python3_cmd')
|
|
haveConverters = True
|
|
else:
|
|
localenv['ENV']['PYTHONPATH'] = '../../build/python_minimal'
|
|
localenv['ENV']['PYTHON_CMD'] = localenv.subst('$python_cmd')
|
|
haveConverters = True
|
|
|
|
localenv['ENV']['CANTERA_DATA'] = pjoin(os.getcwd(), '..', 'build', 'data')
|
|
|
|
# Add build/lib in order to find Cantera shared library
|
|
if env['OS'] == 'Windows' or env['OS'] == 'Cygwin':
|
|
localenv.PrependENVPath('PATH', Dir('#build/lib').abspath)
|
|
elif env['OS'] == 'Darwin':
|
|
localenv.PrependENVPath('DYLD_LIBRARY_PATH', Dir('#build/lib').abspath)
|
|
else:
|
|
localenv.PrependENVPath('LD_LIBRARY_PATH', Dir('#build/lib').abspath)
|
|
|
|
|
|
PASSED_FILES = {}
|
|
|
|
|
|
class Test(object):
|
|
_validArgs = set(['arguments', 'options', 'artifacts', 'comparisons',
|
|
'tolerance', 'threshold', 'ignoreLines', 'extensions',
|
|
'dependencies'])
|
|
|
|
def __init__(self, testName, subdir, programName, blessedName, **kwargs):
|
|
assert set(kwargs.keys()) <= self._validArgs, kwargs.keys()
|
|
self.subdir = subdir
|
|
self.programName = programName
|
|
arguments = kwargs.get('arguments') or []
|
|
if isinstance(arguments, str):
|
|
arguments = [arguments]
|
|
self.arguments = arguments # file arguments
|
|
self.options = kwargs.get('options') or ''
|
|
self.blessedName = blessedName
|
|
self.artifacts = kwargs.get('artifacts') or ()
|
|
if isinstance(self.artifacts, str):
|
|
self.artifacts = [self.artifacts]
|
|
self.comparisons = kwargs.get('comparisons') or ()
|
|
self.tolerance = kwargs.get('tolerance') or 1e-5 # error tolerance for CSV comparison
|
|
self.threshold = kwargs.get('threshold') or 1e-14 # error threshold for CSV comparison
|
|
|
|
# ignore lines starting with specified strings when comparing output files
|
|
self.ignoreLines = kwargs.get('ignoreLines') or []
|
|
|
|
self.testName = testName
|
|
self.passedFile = '.passed-%s' % testName
|
|
PASSED_FILES[self.testName] = pjoin(self.subdir, self.passedFile)
|
|
|
|
testResults.tests[self.testName] = self
|
|
run = self.run(localenv)
|
|
localenv.Depends(env['test_results'], run)
|
|
localenv.Depends(run, env['build_targets'])
|
|
localenv.Alias('test-clean', self.clean(localenv))
|
|
localenv.Alias('test-%s' % self.testName, run)
|
|
env['testNames'].append(self.testName)
|
|
|
|
# reset: just delete the ".passed" file so that this test will be re-run
|
|
localenv.Alias('test-reset', self.reset(localenv))
|
|
|
|
for dep in kwargs.get('dependencies', []):
|
|
localenv.Depends(run, dep)
|
|
env.Depends(run, localenv.get('cantera_shlib', ()))
|
|
|
|
def run(self, env, *args):
|
|
source = list(args)
|
|
if not source:
|
|
source.append(self.programName)
|
|
|
|
source.extend(pjoin(self.subdir, arg) for arg in self.arguments)
|
|
|
|
test = env.RegressionTest(pjoin(self.subdir, self.passedFile), source,
|
|
active_test_name=self.testName,
|
|
test_blessed_file=self.blessedName,
|
|
test_command_options=self.options,
|
|
test_comparisons=self.comparisons,
|
|
test_csv_threshold=self.threshold,
|
|
test_csv_tolerance=self.tolerance,
|
|
test_ignoreLines=self.ignoreLines)
|
|
return test
|
|
|
|
def reset(self, env, **kwargs):
|
|
f = pjoin(os.getcwd(), self.subdir, self.passedFile)
|
|
if os.path.exists(f):
|
|
uniqueName = 'reset-%s' % self.testName
|
|
target = env.Command(uniqueName, [], [Delete(f)])
|
|
return target
|
|
|
|
def clean(self, env, **kwargs):
|
|
# Name used for the output file
|
|
if self.blessedName is not None and 'blessed' in self.blessedName:
|
|
outName = self.blessedName.replace('blessed', 'output')
|
|
else:
|
|
outName = 'test_output.txt'
|
|
|
|
files = kwargs.get('files') or []
|
|
files += [self.passedFile, outName]
|
|
files += list(self.artifacts)
|
|
files += [comp[1] for comp in self.comparisons]
|
|
files = [pjoin(os.getcwd(), self.subdir, name) for name in files]
|
|
|
|
uniqueName = 'clean-%s-' % self.testName
|
|
target = env.Command(uniqueName, [],
|
|
[Delete(f) for f in files
|
|
if os.path.exists(f)])
|
|
return target
|
|
|
|
class CompileAndTest(Test):
|
|
def __init__(self, testName, subdir, programName, blessedName, libs=(),
|
|
**kwargs):
|
|
self.extensions = kwargs.get('extensions') or ('cpp',)
|
|
self.libs = list(libs)
|
|
Test.__init__(self, testName, subdir, programName, blessedName, **kwargs)
|
|
|
|
def run(self, env):
|
|
prog = env.Program(pjoin(self.subdir, self.programName),
|
|
mglob(env, self.subdir, *self.extensions),
|
|
LIBS=self.libs or cantera_libs)
|
|
source = [prog]
|
|
return Test.run(self, env, *source)
|
|
|
|
def clean(self, env):
|
|
files = [self.programName + ext
|
|
for ext in ['', '.o', '.exe', '.exe.manifest', '.ilk',
|
|
'.obj', '.pdb']]
|
|
return Test.clean(self, env, files=files)
|
|
|
|
|
|
dhGraph = localenv.Program('cathermo/DH_graph_1/DH_graph_1',
|
|
mglob(env, 'cathermo/DH_graph_1', 'cpp'),
|
|
LIBS=cantera_libs)
|
|
dhGraph_name = dhGraph[0].name
|
|
|
|
Test('DH_graph_dilute', 'cathermo/DH_graph_1',
|
|
dhGraph, 'DH_NaCl_dilute_blessed.csv',
|
|
artifacts=['DH_graph_1.log', dhGraph_name],
|
|
arguments='DH_NaCl_dilute.xml')
|
|
Test('DH_graph_acommon', 'cathermo/DH_graph_1',
|
|
dhGraph, 'DH_NaCl_acommon_blessed.csv',
|
|
artifacts=['DH_graph_1.log', dhGraph_name],
|
|
arguments='DH_NaCl_acommon.xml')
|
|
Test('DH_graph_bdotak', 'cathermo/DH_graph_1',
|
|
dhGraph, 'DH_NaCl_bdotak_blessed.csv',
|
|
artifacts=['DH_graph_1.log', dhGraph_name],
|
|
arguments='DH_NaCl_bdotak.xml')
|
|
Test('DH_graph_NM', 'cathermo/DH_graph_1',
|
|
dhGraph, 'DH_NaCl_NM_blessed.csv',
|
|
artifacts=['DH_graph_1.log', dhGraph_name],
|
|
arguments='DH_NaCl_NM.xml')
|
|
Test('DH_graph_Pitzer', 'cathermo/DH_graph_1',
|
|
dhGraph, 'DH_NaCl_Pitzer_blessed.csv',
|
|
artifacts=['DH_graph_1.log', dhGraph_name],
|
|
arguments='DH_NaCl_Pitzer.xml')
|
|
|
|
CompileAndTest('HMW_graph_CpvT', 'cathermo/HMW_graph_CpvT',
|
|
'HMW_graph_CpvT', 'output_blessed.txt',
|
|
extensions=['^HMW_graph_CpvT.cpp'],
|
|
arguments='HMW_NaCl_sp1977_alt.xml')
|
|
CompileAndTest('HMW_graph_GvI', 'cathermo/HMW_graph_GvI',
|
|
'HMW_graph_GvI', None,
|
|
comparisons=[('T298_blessed.csv', 'T298.csv'),
|
|
('T523_blessed.csv', 'T523.csv')],
|
|
artifacts=['T373.csv','T423.csv','T473.csv',
|
|
'T548.csv','T573.csv'])
|
|
CompileAndTest('HMW_graph_GvT', 'cathermo/HMW_graph_GvT',
|
|
'HMW_graph_GvT', 'output_blessed.txt',
|
|
extensions=['^HMW_graph_GvT.cpp'],
|
|
arguments='HMW_NaCl_sp1977_alt.xml')
|
|
CompileAndTest('HMW_graph_HvT', 'cathermo/HMW_graph_HvT',
|
|
'HMW_graph_HvT', 'output_blessed.txt',
|
|
extensions=['^HMW_graph_HvT.cpp'],
|
|
arguments='HMW_NaCl_sp1977_alt.xml')
|
|
CompileAndTest('HMW_graph_VvT', 'cathermo/HMW_graph_VvT',
|
|
'HMW_graph_VvT', 'output_blessed.txt',
|
|
extensions=['^HMW_graph_VvT.cpp'],
|
|
arguments='HMW_NaCl_sp1977_alt.xml')
|
|
CompileAndTest('HMW_test_1', 'cathermo/HMW_test_1',
|
|
'HMW_test_1', 'output_noD_blessed.txt')
|
|
CompileAndTest('HMW_test_3', 'cathermo/HMW_test_3',
|
|
'HMW_test_3', 'output_noD_blessed.txt')
|
|
CompileAndTest('IMSTester', 'cathermo/ims', 'IMSTester', 'output_blessed.txt')
|
|
CompileAndTest('ISSPTester', 'cathermo/issp', 'ISSPTester', 'output_blessed.txt')
|
|
CompileAndTest('stoichSub', 'cathermo/stoichSub',
|
|
'stoichSub', 'output_blessed.txt')
|
|
CompileAndTest('WaterPDSS', 'cathermo/testWaterPDSS',
|
|
'testWaterPDSS', 'output_blessed.txt')
|
|
CompileAndTest('WaterSSTP', 'cathermo/testWaterTP',
|
|
'testWaterSSTP', 'output_blessed.txt')
|
|
CompileAndTest('ISSPTester2', 'cathermo/VPissp',
|
|
'ISSPTester2', 'output_blessed.txt')
|
|
CompileAndTest('wtWater', 'cathermo/wtWater',
|
|
'wtWater', 'output_blessed.txt')
|
|
CompileAndTest('ChemEquil_ionizedGas',
|
|
'ChemEquil_ionizedGas', 'ionizedGasEquil',
|
|
'output_blessed.txt',
|
|
comparisons=[('table_blessed.csv', 'table.csv')])
|
|
#CompileAndTest('CpJump', 'CpJump', 'CpJump', 'output_blessed.txt')
|
|
CompileAndTest('cxx_ex', 'cxx_ex', 'cxx_examples', 'output_blessed.txt',
|
|
comparisons=[('eq1_blessed.csv', 'eq1.csv'),
|
|
('kin1_blessed.csv', 'kin1.csv'),
|
|
('tr1_blessed.csv', 'tr1.csv'),
|
|
('tr2_blessed.csv', 'tr2.csv')],
|
|
tolerance=3e-3,
|
|
threshold=1e-7,
|
|
artifacts=['eq1.dat', 'kin1.dat', 'kin2.dat', 'kin3.csv',
|
|
'kin3.dat', 'tr1.dat', 'tr2.dat'])
|
|
|
|
diamond = localenv.Program('diamondSurf/runDiamond',
|
|
'diamondSurf/runDiamond.cpp',
|
|
LIBS=cantera_libs)
|
|
diamond_name = diamond[0].name
|
|
Test('diamondSurf-xml', 'diamondSurf', diamond, 'runDiamond_blessed.out',
|
|
options='diamond_blessed.xml', artifacts=diamond_name)
|
|
if haveConverters:
|
|
Test('diamondSurf-cti', 'diamondSurf', diamond, 'runDiamond_blessed.out',
|
|
options='diamond.cti', artifacts=diamond_name)
|
|
CompileAndTest('dustyGasTransport', 'dustyGasTransport', 'dustyGasTransport',
|
|
'output_blessed.txt')
|
|
CompileAndTest('mixGasTransport',
|
|
'mixGasTransport', 'mixGasTransport', 'output_blessed.txt')
|
|
CompileAndTest('multiGasTransport',
|
|
'multiGasTransport', 'multiGasTransport', 'output_blessed.txt')
|
|
|
|
CompileAndTest('pureFluid', 'pureFluidTest', 'testPureWater', 'output_blessed.txt')
|
|
if haveConverters:
|
|
CompileAndTest('rankine_democxx', 'rankine_democxx', 'rankine', 'output_blessed.txt')
|
|
CompileAndTest('silane_equil', 'silane_equil', 'silane_equi', 'output_blessed.txt')
|
|
CompileAndTest('stoichSolidKinetics', 'stoichSolidKinetics',
|
|
'stoichSolidKinetics', 'output_blessed.txt')
|
|
CompileAndTest('surfkin', 'surfkin', 'surfdemo', 'output_blessed.txt')
|
|
CompileAndTest('surfSolver', 'surfSolverTest', 'surfaceSolver', None,
|
|
arguments='haca2.cti',
|
|
comparisons=[('results_blessed.txt', 'results.txt')],
|
|
artifacts=['results.txt'],
|
|
extensions=['^surfaceSolver.cpp'])
|
|
CompileAndTest('surfSolver2', 'surfSolverTest', 'surfaceSolver2', None,
|
|
arguments='haca2.cti',
|
|
comparisons=[('results2_blessed.txt', 'results2.txt')],
|
|
artifacts=['results2.txt'],
|
|
extensions=['^surfaceSolver2.cpp'])
|
|
CompileAndTest('VCS-NaCl', 'VCSnonideal/NaCl_equil',
|
|
'nacl_equil', 'good_out.txt',
|
|
options='-d 3',
|
|
artifacts=['vcs_equilibrate_res.csv']), # not testing this file because it's not really csv
|
|
vcs_LiSi = localenv.Program('VCSnonideal/LatticeSolid_LiSi/latsol',
|
|
'VCSnonideal/LatticeSolid_LiSi/latsol.cpp',
|
|
LIBS=cantera_libs)
|
|
vcs_LiSi_name = vcs_LiSi[0].name
|
|
Test('VCS-LiSi', 'VCSnonideal/LatticeSolid_LiSi', vcs_LiSi, 'output_blessed.txt',
|
|
artifacts=['vcs_equilibrate_res.csv', vcs_LiSi_name])
|
|
Test('VCS-LiSi-verbose', 'VCSnonideal/LatticeSolid_LiSi', vcs_LiSi, 'verbose_blessed.txt',
|
|
options='8',
|
|
artifacts=['vcs_equilibrate_res.csv', vcs_LiSi_name])
|
|
CompileAndTest('VPsilane_test', 'VPsilane_test', 'VPsilane_test', 'output_blessed.txt')
|
|
|
|
CompileAndTest('clib', 'clib_test', 'clib_test', 'output_blessed.txt',
|
|
extensions=['^clib_test.c'], libs=['cantera_shared'])
|
|
|
|
# Force explicitly-named tests to run even if SCons thinks they're up to date
|
|
for command in COMMAND_LINE_TARGETS:
|
|
if command.startswith('test-'):
|
|
name = command[5:]
|
|
if name in PASSED_FILES and os.path.exists(PASSED_FILES[name]):
|
|
os.remove(PASSED_FILES[name])
|