mirror of https://github.com/QMCPACK/qmcpack.git
2500 lines
61 KiB
Python
Executable File
2500 lines
61 KiB
Python
Executable File
#! /usr/bin/env python3
|
|
|
|
import os
|
|
import sys
|
|
import shutil
|
|
import traceback
|
|
from optparse import OptionParser
|
|
|
|
# find the path to the nxs-test executable and its parent directory
|
|
scriptpath=os.path.realpath(__file__)
|
|
parent_dir=os.path.dirname(os.path.dirname(scriptpath))
|
|
|
|
# allow override during install
|
|
host_dir = None
|
|
if host_dir is not None:
|
|
parent_dir = host_dir
|
|
#end if
|
|
|
|
# save nexus directories
|
|
library_dir = os.path.join(parent_dir,'lib')
|
|
test_dir = os.path.join(parent_dir,'tests')
|
|
reference_dir = os.path.join(parent_dir,'tests/reference')
|
|
example_dir = os.path.join(parent_dir,'examples')
|
|
|
|
# ensure that nxs-test executable is resident in a nexus directory tree
|
|
dirs_check = ['examples','bin','lib','tests','tests/reference']
|
|
for d in dirs_check:
|
|
pd = os.path.join(parent_dir,d)
|
|
if not os.path.exists(pd):
|
|
print('nxs-test executable is not run within a Nexus directory tree\nthe following directories must be present: {0}\nthe following directories are present: {1}\nexecutable launched from path: {2}'.format(dirs_check,os.listdir(parent_dir),parent_dir))
|
|
exit(1)
|
|
#end if
|
|
#end for
|
|
|
|
# enforce association between nxs-test executable and Nexus library
|
|
sys.path.insert(0,library_dir)
|
|
|
|
from generic import generic_settings,object_interface,NexusError
|
|
|
|
generic_settings.raise_error = True
|
|
|
|
|
|
|
|
# add unit test modules
|
|
sys.path.append(os.path.abspath(os.path.join(__file__,'..','..','tests','unit')))
|
|
|
|
unit_test_module_lists = dict()
|
|
unit_test_modules = dict()
|
|
|
|
import inspect
|
|
import importlib
|
|
|
|
def import_unit_test_module_list(module_name):
|
|
if module_name not in unit_test_module_lists:
|
|
module = importlib.import_module(module_name)
|
|
unit_test_list = []
|
|
for name,member in inspect.getmembers(module):
|
|
if name.startswith('test_') and inspect.isfunction(member):
|
|
unit_test = member
|
|
unit_test_list.append((name,unit_test))
|
|
#end if
|
|
#end for
|
|
unit_test_module_lists[module_name] = unit_test_list
|
|
#end if
|
|
return unit_test_module_lists[module_name]
|
|
#end def import unit_test_module_list
|
|
|
|
|
|
def import_unit_test_module(module_name):
|
|
if module_name not in unit_test_modules:
|
|
unit_test_list = import_unit_test_module_list(module_name)
|
|
unit_test_modules[module_name] = dict(unit_test_list)
|
|
#end if
|
|
return unit_test_modules[module_name]
|
|
#end def import unit_test_module
|
|
|
|
|
|
def import_from_unit_test_module(module_name,test_name):
|
|
module = import_unit_test_module(module_name)
|
|
if test_name not in module:
|
|
print('function "{}" is not in module "{}"\nfunctions present: {}'.format(test_name,module_name,sorted(module.keys())))
|
|
exit(1)
|
|
#end if
|
|
return module[test_name]
|
|
#end def import_from_unit_test_module
|
|
|
|
|
|
# import core testing functions (shared between nxs-test and unit tests)
|
|
from testing import *
|
|
import testing as nexus_testing
|
|
|
|
|
|
|
|
# exception indicating test failure
|
|
class NexusTestFail(Exception):
|
|
None
|
|
#end class NexusTestFail
|
|
|
|
# exception indicating that developer constructed test incorrectly
|
|
class NexusTestMisconstructed(Exception):
|
|
None
|
|
#end class NexusTestMisconstructed
|
|
|
|
# exception used during detailed developer checks of the testing system
|
|
class NexusTestTripped(Exception):
|
|
None
|
|
#end class NexusTestTripped
|
|
|
|
|
|
|
|
|
|
class NexusTestBase(object):
|
|
nexus_test_dir = '.nexus_test' # nxs-test directory
|
|
|
|
launch_path = None # path from which nxs-test exe was launched
|
|
current_test = None # current NexusTest
|
|
current_label = '' # current nlabel()
|
|
test_count = 0 # current test count
|
|
label_count = 0 # current label count in NexusTest.operation()
|
|
current_assert = 0 # current assert count
|
|
|
|
assert_trip = -1 # developer tool to trip assert's one by one
|
|
# if set to n, an exception will be raised for the
|
|
# n-th assert call
|
|
|
|
# keep a running count of assert calls
|
|
@staticmethod
|
|
def assert_called():
|
|
NexusTestBase.current_assert+=1
|
|
ca = NexusTestBase.current_assert
|
|
if ca==NexusTestBase.assert_trip:
|
|
raise NexusTestTripped
|
|
#end if
|
|
#end def assert_called
|
|
|
|
# provide a directory path to place test output data in
|
|
@staticmethod
|
|
def test_path():
|
|
test = NexusTestBase.current_test
|
|
label = NexusTestBase.current_label
|
|
label = label.replace(' ','_').replace('-','_')
|
|
tcount = str(NexusTestBase.test_count).zfill(2)
|
|
lcount = str(NexusTestBase.label_count).zfill(2)
|
|
if test.test_dir is None:
|
|
test_dir = '{0}_{1}'.format(tcount,test.name)
|
|
else:
|
|
test_dir = test.test_dir
|
|
#end if
|
|
label_dir = '{0}_{1}'.format(lcount,label)
|
|
ntdir = NexusTestBase.nexus_test_dir
|
|
nlpath = NexusTestBase.launch_path
|
|
if len(label)==0:
|
|
testpath = os.path.join(nlpath,ntdir,test_dir)
|
|
else:
|
|
testpath = os.path.join(nlpath,ntdir,test_dir,label_dir)
|
|
#end if
|
|
return testpath
|
|
#end def test_path
|
|
|
|
@staticmethod
|
|
def test_path_from_dir(test_dir):
|
|
ntdir = NexusTestBase.nexus_test_dir
|
|
nlpath = NexusTestBase.launch_path
|
|
return os.path.join(nlpath,ntdir,test_dir)
|
|
#end def test_path_from_dir
|
|
#end class NexusTestBase
|
|
|
|
|
|
|
|
# class used to divert log output when desired
|
|
class FakeLog:
|
|
def __init__(self):
|
|
self.reset()
|
|
#end def __init__
|
|
|
|
def reset(self):
|
|
self.s = ''
|
|
#end def reset
|
|
|
|
def write(self,s):
|
|
self.s+=s
|
|
#end def write
|
|
|
|
def close(self):
|
|
None
|
|
#end def close
|
|
#end class FakeLog
|
|
|
|
|
|
# dict to temporarily store logger when log output is diverted
|
|
logging_storage = dict()
|
|
|
|
|
|
# developer function interface for test creation below
|
|
|
|
# label a section of tests
|
|
def nlabel(label):
|
|
os.chdir(NexusTestBase.launch_path)
|
|
NexusTestBase.current_label = label
|
|
NexusTestBase.label_count += 1
|
|
NexusTestBase.current_test.subtests.append(label)
|
|
#end def nlabel
|
|
|
|
|
|
# divert nexus log output
|
|
def nlog_divert():
|
|
logging_storage['devlog'] = generic_settings.devlog
|
|
logging_storage['objlog'] = object_interface._logfile
|
|
logfile = FakeLog()
|
|
generic_settings.devlog = logfile
|
|
object_interface._logfile = logfile
|
|
#end def nlog_divert
|
|
|
|
|
|
# restore nexus log output
|
|
def nlog_restore():
|
|
generic_settings.devlog = logging_storage['devlog']
|
|
object_interface._logfile = logging_storage['devlog']
|
|
#end def nlog_restore
|
|
|
|
|
|
# logging functions for tests
|
|
def nlog(msg,n=0,indent=' '):
|
|
if len(msg)>0:
|
|
indent = n*indent
|
|
msg=indent+msg.replace('\n','\n'+indent)+'\n'
|
|
#end if
|
|
sys.stdout.write(msg)
|
|
#end def nlog
|
|
|
|
def nmessage(msg,header=None,n=0):
|
|
if header is None:
|
|
nlog(msg,n=n)
|
|
else:
|
|
nlog(header,n=n)
|
|
nlog(msg,n=n+1)
|
|
#end if
|
|
#end def nmessage
|
|
|
|
def nerror(msg,header='nexus test',n=0):
|
|
nmessage(msg,header+' error:',n=n)
|
|
sys.exit(1)
|
|
#end def nerror
|
|
|
|
|
|
# enter the current testing directory
|
|
def nenter(path=None,preserve=False,relative=False):
|
|
if not relative:
|
|
testpath = NexusTestBase.test_path()
|
|
if path is None:
|
|
path = testpath
|
|
else:
|
|
path = os.path.join(testpath,path)
|
|
#end if
|
|
#end if
|
|
if not preserve and os.path.exists(path):
|
|
try:
|
|
shutil.rmtree(path)
|
|
except Exception as e:
|
|
if os.path.exists(path):
|
|
raise e
|
|
#end if
|
|
#end try
|
|
#end if
|
|
if not os.path.exists(path):
|
|
os.makedirs(path)
|
|
#end if
|
|
os.chdir(path)
|
|
NexusTestBase.entered = True
|
|
return path
|
|
#end def nenter
|
|
|
|
|
|
# leave the current testing directory
|
|
def nleave():
|
|
os.chdir(NexusTestBase.launch_path)
|
|
NexusTestBase.entered = False
|
|
#end def nleave
|
|
|
|
|
|
# create multiple directories in the local test directory
|
|
def ncreate_dirs(*dirs):
|
|
if not NexusTestBase.entered:
|
|
raise NexusTestMisconstructed
|
|
#end if
|
|
for dir in dirs:
|
|
if not os.path.exists(dir):
|
|
os.makedirs(dir)
|
|
#end if
|
|
#end for
|
|
#end def ncreate_dirs
|
|
|
|
|
|
# create a single directory, optionally filled with files
|
|
def ncreate_dir(dir,files):
|
|
ncreate_dirs(dir)
|
|
filepaths = [os.path.join(dir,file) for file in files]
|
|
ncreate_files(*filepaths)
|
|
#end def ncreate_dir
|
|
|
|
|
|
# create a set of empty files in the local test directory
|
|
def ncreate_files(*files):
|
|
if not NexusTestBase.entered:
|
|
raise NexusTestMisconstructed
|
|
#end if
|
|
for file in files:
|
|
if not os.path.exists(file):
|
|
open(file,'w').close()
|
|
#end if
|
|
#end for
|
|
#end def ncreate_files
|
|
|
|
|
|
# declare that a test has passed
|
|
def npass():
|
|
None
|
|
#end def npass
|
|
|
|
|
|
# declare that a test has failed
|
|
def nfail(msg=''):
|
|
exception = NexusTestFail(msg)
|
|
raise exception
|
|
#end def nfail
|
|
|
|
|
|
# check an assertion
|
|
def nassert(result):
|
|
if not isinstance(result,bool):
|
|
raise NexusTestMisconstructed
|
|
elif not result:
|
|
nfail()
|
|
else:
|
|
npass()
|
|
#end if
|
|
NexusTestBase.assert_called()
|
|
#end def nassert
|
|
|
|
|
|
# run a unit test from an external file
|
|
def nunit(test_name):
|
|
module_name = 'test_'+NexusTestBase.current_test.name
|
|
if not test_name.startswith('test_'):
|
|
test_name = 'test_'+test_name
|
|
#end if
|
|
unit_test = import_from_unit_test_module(module_name,test_name)
|
|
load_external_unit_tests()
|
|
run_external_unit_test(test_name,unit_test)
|
|
#end def nunit
|
|
|
|
|
|
# run all uncalled unit tests from an external file
|
|
def nunit_all():
|
|
nexus_test = NexusTestBase.current_test
|
|
module_name = 'test_'+NexusTestBase.current_test.name
|
|
module = import_unit_test_module(module_name)
|
|
load_external_unit_tests()
|
|
uncalled_tests = sorted(nexus_test.unit_tests-nexus_test.unit_tests_called)
|
|
for test_name in uncalled_tests:
|
|
unit_test = module[test_name]
|
|
run_external_unit_test(test_name,unit_test)
|
|
#end for
|
|
#end def nunit_all
|
|
|
|
|
|
# ensure all external unit tests are loaded
|
|
def load_external_unit_tests():
|
|
nexus_test = NexusTestBase.current_test
|
|
if len(nexus_test.unit_tests)==0:
|
|
module_name = 'test_'+nexus_test.name
|
|
module = import_unit_test_module(module_name)
|
|
nexus_test.unit_tests = set(module.keys())
|
|
#end if
|
|
#end def load_external_unit_tests
|
|
|
|
|
|
# actually execute the unit test (not to be called directly within a Nexus test)
|
|
def run_external_unit_test(test_name,unit_test):
|
|
nexus_test = NexusTestBase.current_test
|
|
if test_name not in nexus_test.unit_tests:
|
|
raise NexusTestMisconstructed('unit test "{}" does not exist for function "{}"'.format(test_name,nexus_test.name))
|
|
elif test_name in nexus_test.unit_tests_called:
|
|
raise NexusTestMisconstructed('unit test "{}" has already been called in function "{}"'.format(test_name,nexus_test.name))
|
|
#end if
|
|
nlabel(test_name)
|
|
nexus_test.unit_tests_called.add(test_name)
|
|
unit_test()
|
|
#end def run_external_unit_test
|
|
|
|
|
|
# class to represent a test
|
|
# a test is created by writing a single function
|
|
# each test function contains subtests labeled with nlabel
|
|
# each subtest has a collection of assert statements, etc
|
|
class NexusTest(NexusTestBase):
|
|
|
|
status_options = dict(
|
|
unused = 0,
|
|
passed = 1,
|
|
failed = 2,
|
|
)
|
|
|
|
status_map = dict()
|
|
for k,v in status_options.items():
|
|
status_map[v] = k
|
|
#end for
|
|
|
|
test_list = []
|
|
test_dict = {}
|
|
|
|
# capture launch path and clear out any old test data
|
|
# to be called once at user launch
|
|
@staticmethod
|
|
def setup():
|
|
NexusTestBase.launch_path = os.getcwd()
|
|
nexus_test_dir = './'+NexusTestBase.nexus_test_dir
|
|
#end def setup
|
|
|
|
|
|
# register the current test object in the global test list
|
|
def __init__(self,operation,name=None,op_inputs=None,test_dir=None,optional=False):
|
|
if not callable(operation):
|
|
raise NexusTestMisconstructed
|
|
#end if
|
|
if name is None:
|
|
name = operation.__name__
|
|
elif not isinstance(name,str):
|
|
raise NexusTestMisconstructed
|
|
#end if
|
|
if op_inputs is not None and not isinstance(op_inputs,(tuple,dict)):
|
|
raise NexusTestMisconstructed
|
|
#end if
|
|
if test_dir is not None and not isinstance(test_dir,str):
|
|
raise NexusTestMisconstructed
|
|
#end if
|
|
self.name = name
|
|
self.operation = operation
|
|
self.op_inputs = op_inputs
|
|
self.test_dir = test_dir
|
|
self.optional = optional
|
|
self.exception = None
|
|
self.status = NexusTest.status_options['unused']
|
|
self.unit_tests = set() # complete set of unit tests
|
|
self.unit_tests_called = set() # set of unit tests called so far
|
|
self.subtests = [] # list of subtests called
|
|
NexusTest.test_list.append(self)
|
|
NexusTest.test_dict[self.name] = self
|
|
#end def __init__
|
|
|
|
|
|
@property
|
|
def unused(self):
|
|
return self.status==NexusTest.status_options['unused']
|
|
#end def unused
|
|
|
|
@property
|
|
def passed(self):
|
|
return self.status==NexusTest.status_options['passed']
|
|
#end def passed
|
|
|
|
@property
|
|
def failed(self):
|
|
return self.status==NexusTest.status_options['failed']
|
|
#end def failed
|
|
|
|
|
|
# run the current test
|
|
def run(self):
|
|
nleave()
|
|
NexusTestBase.current_test = self
|
|
NexusTestBase.current_label = ''
|
|
NexusTestBase.test_count += 1
|
|
NexusTestBase.label_count = 0
|
|
failed = False
|
|
try:
|
|
if self.op_inputs is None:
|
|
self.operation()
|
|
elif isinstance(self.op_inputs,tuple):
|
|
self.operation(*self.op_inputs)
|
|
elif isinstance(self.op_inputs,dict):
|
|
self.operation(**self.op_inputs)
|
|
else:
|
|
raise NexusTestMisconstructed
|
|
#end if
|
|
check_final_state()
|
|
self.status=NexusTest.status_options['passed']
|
|
except Exception as e:
|
|
t,v,tb = sys.exc_info()
|
|
self.exception = e
|
|
self.traceback = tb
|
|
self.status=NexusTest.status_options['failed']
|
|
failed = True
|
|
#end try
|
|
uncalled_unit_tests = self.unit_tests-self.unit_tests_called
|
|
if not failed and len(uncalled_unit_tests)>0:
|
|
raise NexusTestMisconstructed('not all unit tests were called\n uncalled unit tests: {}\n please add these either by calling "nunit" for each of them\n or by calling "nunit_all" at the end of function "{}"'.format(sorted(uncalled_unit_tests),self.name))
|
|
#end if
|
|
#end def run
|
|
|
|
|
|
# generate a message describing the outcome of the test
|
|
def message(self):
|
|
s = ''
|
|
s+='Test name : {0}\n'.format(self.name)
|
|
status = NexusTest.status_map[self.status]
|
|
if self.failed and self.exception is not None:# and not isinstance(self.exception,NexusTestFail):
|
|
if len(NexusTestBase.current_label)>0:
|
|
s+='Test sublabel : {0}\n'.format(NexusTestBase.current_label)
|
|
#end if
|
|
e = self.exception
|
|
btrace = traceback.format_tb(self.traceback)
|
|
if isinstance(e,NexusTestFail):
|
|
btrace = btrace[:-1]
|
|
msg = str(e)
|
|
if len(msg)>0:
|
|
s+='Test exception: {0}\n'.format('\n '+msg.replace('\n','\n '))
|
|
#end if
|
|
elif isinstance(e,NexusTestMisconstructed):
|
|
btrace = btrace[:-1]
|
|
s+='Test exception: Nexus test is misconstructed. Please contact developers.\n'
|
|
else:
|
|
s+='Test exception: "{0}"\n'.format(e.__class__.__name__+': '+str(e).replace('\n','\n '))
|
|
#end if
|
|
s+='Test backtrace:\n'
|
|
for s2 in btrace:
|
|
s+=s2
|
|
#end for
|
|
#end if
|
|
return s
|
|
#end def message
|
|
#end class NexusTest
|
|
|
|
|
|
|
|
|
|
#===============================================#
|
|
# testing infrastructure above, tests below #
|
|
#===============================================#
|
|
|
|
|
|
|
|
def versions():
|
|
nunit('import')
|
|
|
|
nunit('constants')
|
|
|
|
nunit('time')
|
|
|
|
nunit('version_processing')
|
|
|
|
nunit('versions_object')
|
|
|
|
nunit_all()
|
|
#end def versions
|
|
|
|
|
|
|
|
def required_dependencies():
|
|
nunit('numpy_available')
|
|
|
|
nunit_all()
|
|
#end def required_dependencies
|
|
|
|
|
|
|
|
def optional_dependencies():
|
|
nunit('scipy_available')
|
|
|
|
nunit('h5py_available')
|
|
|
|
nunit('matplotlib_available')
|
|
|
|
nunit('pydot_available')
|
|
|
|
nunit('spglib_available')
|
|
|
|
nunit('pycifrw_available')
|
|
|
|
nunit('seekpath_available')
|
|
|
|
nunit_all()
|
|
#end def optional_dependencies
|
|
|
|
|
|
|
|
def nexus_imports():
|
|
nunit('imports')
|
|
|
|
nunit_all()
|
|
#end def nexus_imports
|
|
|
|
|
|
|
|
def testing():
|
|
nunit('import')
|
|
|
|
nunit('value_checks')
|
|
|
|
nunit('object_checks')
|
|
|
|
nunit('text_checks')
|
|
|
|
nunit_all()
|
|
#end def testing
|
|
|
|
|
|
|
|
def execute():
|
|
nunit('import')
|
|
|
|
nunit('execute')
|
|
|
|
nunit_all()
|
|
#end def execute
|
|
|
|
|
|
|
|
def memory():
|
|
nunit('import')
|
|
|
|
nunit('memory')
|
|
|
|
nunit('resident')
|
|
|
|
nunit('stacksize')
|
|
|
|
nunit_all()
|
|
#end def memory
|
|
|
|
|
|
|
|
def plotting():
|
|
nunit('import')
|
|
|
|
nunit_all()
|
|
#end def plotting
|
|
|
|
|
|
|
|
def superstring():
|
|
nunit('imports')
|
|
|
|
nunit('string2val')
|
|
|
|
nunit('split_delims')
|
|
|
|
nunit('valid_variable_name')
|
|
|
|
nunit('find_matching_pair')
|
|
|
|
nunit('remove_pair_sections')
|
|
|
|
nunit('remove_empty_lines')
|
|
|
|
nunit_all()
|
|
#end def superstring
|
|
|
|
|
|
|
|
def generic_operation():
|
|
nunit('logging')
|
|
|
|
nunit('intrinsics')
|
|
|
|
nunit('extensions')
|
|
|
|
nunit_all()
|
|
#end def generic_operation
|
|
|
|
|
|
|
|
def developer():
|
|
nunit('import')
|
|
|
|
nunit('unavailable')
|
|
|
|
nunit_all()
|
|
#end def developer
|
|
|
|
|
|
|
|
def unit_converter():
|
|
nunit('import')
|
|
|
|
nunit('convert')
|
|
|
|
nunit('convert_scalar_to_all')
|
|
|
|
nunit_all()
|
|
#end def unit_converter
|
|
|
|
|
|
|
|
def periodic_table():
|
|
nunit('import')
|
|
|
|
nunit('periodic_table')
|
|
|
|
nunit('is_element')
|
|
|
|
nunit_all()
|
|
#end def periodic_table
|
|
|
|
|
|
|
|
def numerics():
|
|
nunit('import')
|
|
|
|
nunit('ndgrid')
|
|
|
|
nunit('distance_table')
|
|
|
|
nunit('nearest_neighbors')
|
|
|
|
nunit('simplestats')
|
|
|
|
nunit('simstats')
|
|
|
|
nunit('equilibration_length')
|
|
|
|
nunit('morse')
|
|
|
|
nunit('eos')
|
|
|
|
nunit_all()
|
|
#end def numerics
|
|
|
|
|
|
|
|
def grid_functions():
|
|
nunit('imports')
|
|
|
|
# supporting functions
|
|
nunit('coord_conversion')
|
|
|
|
nunit('unit_grid_points')
|
|
|
|
nunit('parallelotope_grid_points')
|
|
|
|
nunit('spheroid_grid_points')
|
|
|
|
# Grid tests
|
|
nunit('grid_initialization')
|
|
|
|
nunit('parallelotope_grid_initialization')
|
|
|
|
nunit('grid_reset')
|
|
|
|
nunit('grid_set_operations')
|
|
|
|
nunit('grid_copy')
|
|
|
|
nunit('grid_translate')
|
|
|
|
nunit('grid_reshape')
|
|
|
|
nunit('grid_unit_points')
|
|
|
|
nunit('grid_cell_indices')
|
|
|
|
nunit('grid_inside')
|
|
|
|
nunit('grid_project')
|
|
|
|
nunit('grid_radius')
|
|
|
|
nunit('grid_axes_volume')
|
|
|
|
nunit('grid_volume')
|
|
|
|
nunit('grid_cell_volumes')
|
|
|
|
nunit('grid_unit_metric')
|
|
|
|
# GridFunction tests
|
|
|
|
# any remaining tests
|
|
nunit_all()
|
|
#end def grid_functions
|
|
|
|
|
|
|
|
def fileio():
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('textfile')
|
|
|
|
nunit('xsffile')
|
|
|
|
nunit('xsffile_density')
|
|
|
|
nunit('poscar_file')
|
|
|
|
nunit('chgcar_file')
|
|
|
|
nunit_all()
|
|
#end def fileio
|
|
|
|
|
|
|
|
def hdfreader():
|
|
nunit('import')
|
|
|
|
nunit_all()
|
|
#end def hdfreader
|
|
|
|
|
|
|
|
def xmlreader():
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('read')
|
|
|
|
nunit_all()
|
|
#end def xmlreader
|
|
|
|
|
|
|
|
def structure():
|
|
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('reference_inputs')
|
|
|
|
nunit('direct_init')
|
|
|
|
nunit('generate_init')
|
|
|
|
nunit('crystal_init')
|
|
|
|
nunit('diagonal_tiling')
|
|
|
|
nunit('matrix_tiling')
|
|
|
|
nunit('gen_molecule')
|
|
|
|
nunit('gen_diamond_direct')
|
|
|
|
nunit('gen_diamond_lattice')
|
|
|
|
nunit('gen_graphene')
|
|
|
|
nunit('read_write')
|
|
|
|
nunit('bounding_box')
|
|
|
|
nunit('opt_tiling')
|
|
|
|
nunit('unit_coords')
|
|
|
|
nunit('monkhorst_pack_kpoints')
|
|
|
|
nunit('count_kshells')
|
|
|
|
nunit('rinscribe')
|
|
|
|
nunit('rwigner')
|
|
|
|
nunit('volume')
|
|
|
|
nunit('min_image_distances')
|
|
|
|
nunit('freeze')
|
|
|
|
nunit('interpolate')
|
|
|
|
nunit_all()
|
|
#end def structure
|
|
|
|
|
|
|
|
def physical_system():
|
|
nunit('import')
|
|
|
|
nunit('particle_initialization')
|
|
|
|
nunit('physical_system_initialization')
|
|
|
|
nunit('change_units')
|
|
|
|
nunit('rename')
|
|
|
|
nunit('tile')
|
|
|
|
nunit('kf_rpa')
|
|
|
|
nunit_all()
|
|
#end def physical_system
|
|
|
|
|
|
|
|
def basisset():
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('basissets')
|
|
|
|
nunit('process_gaussian_text')
|
|
|
|
nunit('gaussianbasisset')
|
|
|
|
nunit_all()
|
|
#end def basisset
|
|
|
|
|
|
|
|
def pseudopotential():
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('pp_elem_label')
|
|
|
|
nunit('pseudopotentials')
|
|
|
|
nunit('ppset')
|
|
|
|
nunit('pseudopotential_classes')
|
|
|
|
nunit_all()
|
|
#end def pseudopotential
|
|
|
|
|
|
|
|
def nexus_base():
|
|
nunit('import')
|
|
|
|
nunit('namespaces')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('write_splash')
|
|
|
|
nunit('enter_leave')
|
|
|
|
nunit_all()
|
|
#end def nexus_base
|
|
|
|
|
|
|
|
def machines():
|
|
|
|
nunit('import')
|
|
|
|
nunit('cpu_count')
|
|
|
|
nunit('options')
|
|
|
|
nunit('job_init')
|
|
|
|
nunit('job_time')
|
|
|
|
nunit('job_set_id')
|
|
|
|
nunit('job_get_machine')
|
|
|
|
nunit('job_set_environment')
|
|
|
|
nunit('job_clone')
|
|
|
|
nunit('job_serial_clone')
|
|
|
|
nunit('machine_virtuals')
|
|
|
|
nunit('machine_list')
|
|
|
|
nunit('machine_add')
|
|
|
|
nunit('machine_get')
|
|
|
|
nunit('machine_instantiation')
|
|
|
|
nunit('workstation_init')
|
|
|
|
nunit('workstation_scheduling')
|
|
|
|
nunit('supercomputer_init')
|
|
|
|
nunit('supercomputer_scheduling')
|
|
|
|
nunit('process_job')
|
|
|
|
nunit('job_run_command')
|
|
|
|
nunit('write_job')
|
|
|
|
nunit_all()
|
|
#end def machines
|
|
|
|
|
|
|
|
def simulation():
|
|
|
|
nunit('import')
|
|
|
|
nunit('simulation_input')
|
|
|
|
nunit('simulation_analyzer')
|
|
|
|
nunit('simulation_input_template')
|
|
|
|
nunit('simulation_input_multi_template')
|
|
|
|
nunit('code_name')
|
|
|
|
nunit('init')
|
|
|
|
nunit('virtuals')
|
|
|
|
nunit('reset_indicators')
|
|
|
|
nunit('indicator_checks')
|
|
|
|
nunit('create_directories')
|
|
|
|
nunit('file_text')
|
|
|
|
nunit('depends')
|
|
|
|
nunit('undo_depends')
|
|
|
|
nunit('has_generic_input')
|
|
|
|
nunit('check_dependencies')
|
|
|
|
nunit('get_dependencies')
|
|
|
|
nunit('downstream_simids')
|
|
|
|
nunit('copy_file')
|
|
|
|
nunit('save_load_image')
|
|
|
|
nunit('load_analyzer_image')
|
|
|
|
nunit('save_attempt')
|
|
|
|
nunit('write_inputs')
|
|
|
|
nunit('send_files')
|
|
|
|
nunit('submit')
|
|
|
|
nunit('update_process_id')
|
|
|
|
nunit('check_status')
|
|
|
|
nunit('get_output')
|
|
|
|
nunit('analyze')
|
|
|
|
nunit('progress')
|
|
|
|
nunit('execute')
|
|
|
|
nunit('reset_wait_ids')
|
|
|
|
nunit('check_subcascade')
|
|
|
|
nunit('block_dependents')
|
|
|
|
nunit('reconstruct_cascade')
|
|
|
|
nunit('traverse_cascade')
|
|
|
|
nunit('traverse_full_cascade')
|
|
|
|
nunit('test_write_dependents')
|
|
|
|
nunit('generate_simulation')
|
|
|
|
nunit_all()
|
|
#end def simulation
|
|
|
|
|
|
|
|
def bundle():
|
|
nunit('import')
|
|
|
|
nunit('bundle')
|
|
|
|
nunit_all()
|
|
#end def bundle
|
|
|
|
|
|
|
|
def project_manager():
|
|
nunit('import')
|
|
|
|
nunit('init')
|
|
|
|
nunit('add_simulations')
|
|
|
|
nunit('traverse_cascades')
|
|
|
|
nunit('screen_fake_sims')
|
|
|
|
nunit('resolve_file_collisions')
|
|
|
|
nunit('propagate_blockages')
|
|
|
|
nunit('load_cascades')
|
|
|
|
nunit('check_dependencies')
|
|
|
|
nunit('write_simulation_status')
|
|
|
|
nunit('run_project')
|
|
|
|
nunit_all()
|
|
#end def project_manager
|
|
|
|
|
|
|
|
def settings_operation():
|
|
nunit('import')
|
|
|
|
nunit('settings')
|
|
|
|
nunit_all()
|
|
#end def settings_operation
|
|
|
|
|
|
|
|
def vasp_input():
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('keyword_consistency')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('read')
|
|
|
|
nunit('write')
|
|
|
|
nunit('generate')
|
|
|
|
nunit_all()
|
|
#end def vasp_input
|
|
|
|
|
|
|
|
def pwscf_input():
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('input')
|
|
|
|
nunit_all()
|
|
#end def pwscf_input
|
|
|
|
|
|
|
|
def pwscf_postprocessor_input():
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('read')
|
|
|
|
nunit('write')
|
|
|
|
nunit('generate')
|
|
|
|
nunit_all()
|
|
#end def pwscf_postprocessor_input
|
|
|
|
|
|
|
|
def gamess_input():
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('keyspec_groups')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('read')
|
|
|
|
nunit('write')
|
|
|
|
nunit('generate')
|
|
|
|
nunit_all()
|
|
#end def gamess_input
|
|
|
|
|
|
|
|
def pyscf_input():
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('generate')
|
|
|
|
nunit('write')
|
|
|
|
nunit_all()
|
|
#end def pyscf_input
|
|
|
|
|
|
|
|
def quantum_package_input():
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('read')
|
|
|
|
nunit('generate')
|
|
|
|
nunit_all()
|
|
#end def quantum_package_input
|
|
|
|
|
|
|
|
def rmg_input():
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('read')
|
|
|
|
nunit('write')
|
|
|
|
nunit('generate')
|
|
|
|
nunit_all()
|
|
#end def rmg_input
|
|
|
|
|
|
|
|
def qmcpack_converter_input():
|
|
nunit('import')
|
|
|
|
nunit('pw2qmcpack_input_empty_init')
|
|
|
|
nunit('pw2qmcpack_input_read')
|
|
|
|
nunit('pw2qmcpack_input_write')
|
|
|
|
nunit('pw2qmcpack_input_generate')
|
|
|
|
nunit('convert4qmc_input_empty_init')
|
|
|
|
nunit('convert4qmc_input_generate')
|
|
|
|
nunit('convert4qmc_input_write')
|
|
|
|
nunit('pyscf_to_afqmc_input_init')
|
|
|
|
nunit('pyscf_to_afqmc_input_write')
|
|
|
|
nunit_all()
|
|
#end def qmcpack_converter_input
|
|
|
|
|
|
|
|
def qmcpack_input():
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('qixml_class_init')
|
|
|
|
nunit('compose')
|
|
|
|
nunit('generate')
|
|
|
|
nunit('read')
|
|
|
|
nunit('write')
|
|
|
|
nunit('get')
|
|
|
|
nunit('incorporate_system')
|
|
|
|
nunit('generate_kspace_jastrow')
|
|
|
|
nunit('excited_state')
|
|
|
|
nunit_all()
|
|
#end def qmcpack_input
|
|
|
|
|
|
|
|
def vasp_analyzer():
|
|
nunit('files')
|
|
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('analyze')
|
|
|
|
nunit_all()
|
|
#end def vasp_analyzer
|
|
|
|
|
|
|
|
def pwscf_analyzer():
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('analyze')
|
|
|
|
nunit_all()
|
|
#end def pwscf_analyzer
|
|
|
|
|
|
|
|
def pwscf_postprocessor_analyzers():
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('projwfc_analyzer')
|
|
|
|
nunit_all()
|
|
#end def pwscf_postprocessor_analyzers
|
|
|
|
|
|
|
|
def gamess_analyzer():
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('analyze')
|
|
|
|
nunit_all()
|
|
#end def gamess_analyzer
|
|
|
|
|
|
|
|
def pyscf_analyzer():
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit_all()
|
|
#end def pyscf_analyzer
|
|
|
|
|
|
|
|
def quantum_package_analyzer():
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit_all()
|
|
#end def quantum_package_analyzer
|
|
|
|
|
|
|
|
def rmg_analyzer():
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit_all()
|
|
#end def rmg_analyzer
|
|
|
|
|
|
|
|
def qmcpack_converter_analyzers():
|
|
nunit('import')
|
|
|
|
nunit('pw2qmcpack_analyzer_init')
|
|
|
|
nunit('convert4qmc_analyzer_init')
|
|
|
|
nunit('pyscf_to_afqmc_analyzer_init')
|
|
|
|
nunit_all()
|
|
#end def qmcpack_converter_analyzers
|
|
|
|
|
|
|
|
def qmcpack_analyzer():
|
|
nunit('import')
|
|
|
|
nunit('empty_init')
|
|
|
|
nunit('vmc_dmc_analysis')
|
|
|
|
nunit('optimization_analysis')
|
|
|
|
nunit('twist_average_analysis')
|
|
|
|
nunit_all()
|
|
#end def qmcpack_analyzer
|
|
|
|
|
|
|
|
def vasp_simulation():
|
|
nunit('import')
|
|
|
|
nunit('minimal_init')
|
|
|
|
nunit('check_result')
|
|
|
|
nunit('get_result')
|
|
|
|
nunit('incorporate_result')
|
|
|
|
nunit('check_sim_status')
|
|
|
|
nunit('get_output_files')
|
|
|
|
nunit_all()
|
|
#end def vasp_simulation
|
|
|
|
|
|
|
|
def pwscf_simulation():
|
|
nunit('import')
|
|
|
|
nunit('minimal_init')
|
|
|
|
nunit('check_result')
|
|
|
|
nunit('get_result')
|
|
|
|
nunit('incorporate_result')
|
|
|
|
nunit('check_sim_status')
|
|
|
|
nunit_all()
|
|
#end def pwscf_simulation
|
|
|
|
|
|
|
|
def gamess_simulation():
|
|
nunit('import')
|
|
|
|
nunit('minimal_init')
|
|
|
|
nunit('check_result')
|
|
|
|
nunit('get_result')
|
|
|
|
nunit('incorporate_result')
|
|
|
|
nunit('check_sim_status')
|
|
|
|
nunit_all()
|
|
#end def gamess_simulation
|
|
|
|
|
|
|
|
def pyscf_simulation():
|
|
nunit('import')
|
|
|
|
nunit('minimal_init')
|
|
|
|
nunit('check_result')
|
|
|
|
nunit('get_result')
|
|
|
|
nunit('check_sim_status')
|
|
|
|
nunit_all()
|
|
#end def pyscf_simulation
|
|
|
|
|
|
|
|
def quantum_package_simulation():
|
|
nunit('import')
|
|
|
|
nunit('minimal_init')
|
|
|
|
nunit('check_result')
|
|
|
|
nunit('get_result')
|
|
|
|
nunit('incorporate_result')
|
|
|
|
nunit('check_sim_status')
|
|
|
|
nunit_all()
|
|
#end def quantum_package_simulation
|
|
|
|
|
|
|
|
def rmg_simulation():
|
|
nunit('import')
|
|
|
|
#nunit('minimal_init')
|
|
|
|
nunit_all()
|
|
#end def rmg_simulation
|
|
|
|
|
|
|
|
def pwscf_postprocessor_simulations():
|
|
nunit('import')
|
|
|
|
nunit('minimal_init')
|
|
|
|
nunit('check_result')
|
|
|
|
nunit('get_result')
|
|
|
|
nunit('incorporate_result')
|
|
|
|
nunit('check_sim_status')
|
|
|
|
nunit_all()
|
|
#end def pwscf_postprocessor_simulations
|
|
|
|
|
|
|
|
def qmcpack_converter_simulations():
|
|
nunit('pw2qmcpack_import')
|
|
|
|
nunit('pw2qmcpack_minimal_init')
|
|
|
|
nunit('pw2qmcpack_check_result')
|
|
|
|
nunit('pw2qmcpack_get_result')
|
|
|
|
nunit('pw2qmcpack_incorporate_result')
|
|
|
|
nunit('pw2qmcpack_check_sim_status')
|
|
|
|
|
|
nunit('convert4qmc_import')
|
|
|
|
nunit('convert4qmc_minimal_init')
|
|
|
|
nunit('convert4qmc_check_result')
|
|
|
|
nunit('convert4qmc_get_result')
|
|
|
|
nunit('convert4qmc_incorporate_result')
|
|
|
|
nunit('convert4qmc_check_sim_status')
|
|
|
|
|
|
nunit('pyscf_to_afqmc_import')
|
|
|
|
nunit('pyscf_to_afqmc_minimal_init')
|
|
|
|
nunit('pyscf_to_afqmc_check_result')
|
|
|
|
nunit('pyscf_to_afqmc_get_result')
|
|
|
|
nunit('pyscf_to_afqmc_incorporate_result')
|
|
|
|
nunit('pyscf_to_afqmc_check_sim_status')
|
|
|
|
nunit_all()
|
|
#end def qmcpack_converter_simulations
|
|
|
|
|
|
|
|
def qmcpack_simulation():
|
|
nunit('import')
|
|
|
|
nunit('minimal_init')
|
|
|
|
nunit('check_result')
|
|
|
|
nunit('get_result')
|
|
|
|
nunit('incorporate_result')
|
|
|
|
nunit('check_sim_status')
|
|
|
|
nunit_all()
|
|
#end def qmcpack_simulation
|
|
|
|
|
|
|
|
def observables():
|
|
nunit('import')
|
|
|
|
nunit('defined_attribute_base')
|
|
|
|
nunit_all()
|
|
#end def observables
|
|
|
|
|
|
|
|
def nxs_redo():
|
|
nunit('test_redo')
|
|
|
|
nunit_all()
|
|
#end def nxs_redo
|
|
|
|
|
|
|
|
def nxs_sim():
|
|
nunit('sim')
|
|
|
|
nunit_all()
|
|
#end def nxs_sim
|
|
|
|
|
|
|
|
def qmc_fit():
|
|
nunit_all()
|
|
#end def qmc_fit
|
|
|
|
|
|
|
|
def qdens():
|
|
nunit_all()
|
|
#end def qdens
|
|
|
|
|
|
def qdens_radial():
|
|
nunit_all()
|
|
#end def qdens
|
|
|
|
|
|
def qmca():
|
|
nunit('help')
|
|
|
|
nunit('examples')
|
|
|
|
nunit('unit_conversion')
|
|
|
|
nunit('selected_quantities')
|
|
|
|
nunit('all_quantities')
|
|
|
|
nunit('energy_variance')
|
|
|
|
nunit('multiple_equilibration')
|
|
|
|
nunit('join')
|
|
|
|
nunit('multiple_directories')
|
|
|
|
nunit('twist_average')
|
|
|
|
nunit('weighted_twist_average')
|
|
|
|
nunit_all()
|
|
#end def qmca
|
|
|
|
|
|
|
|
|
|
example_information = dict(
|
|
pwscf_relax_Ge_T = dict(
|
|
path = 'quantum_espresso/relax_Ge_T_vs_kpoints',
|
|
scripts = [
|
|
'relax_vs_kpoints_example.py',
|
|
],
|
|
files = [
|
|
('pwscf' ,'input','runs/relax/kgrid_111/relax.in'),
|
|
('pwscf' ,'input','runs/relax/kgrid_222/relax.in'),
|
|
('pwscf' ,'input','runs/relax/kgrid_444/relax.in'),
|
|
('pwscf' ,'input','runs/relax/kgrid_666/relax.in'),
|
|
],
|
|
),
|
|
gamess_H2O = dict(
|
|
path = 'gamess/H2O',
|
|
scripts = [
|
|
'h2o_pp_hf.py',
|
|
'h2o_pp_cisd.py',
|
|
'h2o_pp_casscf.py',
|
|
],
|
|
files = [
|
|
('gamess' ,'input','runs/pp_hf/rhf.inp'),
|
|
('gamess' ,'input','runs/pp_cisd/rhf.inp'),
|
|
('gamess' ,'input','runs/pp_cisd/cisd.inp'),
|
|
('gamess' ,'input','runs/pp_casscf/rhf.inp'),
|
|
('gamess' ,'input','runs/pp_casscf/cas.inp'),
|
|
],
|
|
),
|
|
qmcpack_H2O = dict(
|
|
path = 'qmcpack/rsqmc_misc/H2O',
|
|
scripts = [
|
|
'H2O.py',
|
|
],
|
|
files = [
|
|
('pwscf' ,'input','runs/scf.in'),
|
|
('pw2qmcpack','input','runs/p2q.in'),
|
|
('qmcpack' ,'input','runs/opt.in.xml'),
|
|
('qmcpack' ,'input','runs/dmc.in.xml'),
|
|
],
|
|
),
|
|
qmcpack_LiH = dict(
|
|
path = 'qmcpack/rsqmc_misc/LiH',
|
|
scripts = [
|
|
'LiH.py',
|
|
],
|
|
files = [
|
|
('pwscf' ,'input','runs/scf.in'),
|
|
('pwscf' ,'input','runs/nscf.in'),
|
|
('pw2qmcpack','input','runs/p2q.in'),
|
|
('qmcpack' ,'input','runs/opt.in.xml'),
|
|
('qmcpack' ,'input','runs/dmc.in.xml'),
|
|
],
|
|
),
|
|
qmcpack_c20 = dict(
|
|
path = 'qmcpack/rsqmc_misc/c20',
|
|
scripts = [
|
|
'c20.py',
|
|
],
|
|
files = [
|
|
('pwscf' ,'input','runs/c20/scf/scf.in'),
|
|
('pw2qmcpack','input','runs/c20/nscf/p2q.in'),
|
|
('qmcpack' ,'input','runs/c20/opt/opt.in.xml'),
|
|
('qmcpack' ,'input','runs/c20/qmc/qmc.in.xml'),
|
|
],
|
|
),
|
|
qmcpack_diamond = dict(
|
|
path = 'qmcpack/rsqmc_misc/diamond',
|
|
scripts = [
|
|
'diamond.py',
|
|
'diamond_vacancy.py',
|
|
],
|
|
files = [
|
|
('pwscf' ,'input','runs/diamond/scf/scf.in'),
|
|
('pw2qmcpack','input','runs/diamond/scf/conv.in'),
|
|
('qmcpack' ,'input','runs/diamond/vmc/vmc.in.xml'),
|
|
('pwscf' ,'input','runs/diamond_vacancy/relax/relax.in'),
|
|
('pwscf' ,'input','runs/diamond_vacancy/scf/scf.in'),
|
|
],
|
|
),
|
|
qmcpack_graphene = dict(
|
|
path = 'qmcpack/rsqmc_misc/graphene',
|
|
scripts = [
|
|
'graphene.py',
|
|
],
|
|
files = [
|
|
('pwscf' ,'input','runs/graphene/scf/scf.in'),
|
|
('pwscf' ,'input','runs/graphene/nscf/nscf.in'),
|
|
('pw2qmcpack','input','runs/graphene/nscf/p2q.in'),
|
|
('pwscf' ,'input','runs/graphene/nscf_opt/nscf.in'),
|
|
('pw2qmcpack','input','runs/graphene/nscf_opt/p2q.in'),
|
|
('qmcpack' ,'input','runs/graphene/opt/opt.in.xml'),
|
|
('qmcpack' ,'input','runs/graphene/qmc/qmc.in.xml'),
|
|
],
|
|
),
|
|
qmcpack_oxygen_dimer = dict(
|
|
path = 'qmcpack/rsqmc_misc/oxygen_dimer',
|
|
scripts = [
|
|
'oxygen_dimer.py',
|
|
],
|
|
files = [
|
|
('pwscf' ,'input','scale_1.0/scf.in'),
|
|
('pw2qmcpack','input','scale_1.0/p2q.in'),
|
|
('qmcpack' ,'input','scale_1.0/opt.in.xml'),
|
|
('qmcpack' ,'input','scale_1.0/qmc.in.xml'),
|
|
],
|
|
),
|
|
)
|
|
|
|
user_examples_data = dict()
|
|
|
|
def user_examples(label):
|
|
|
|
from pwscf_input import PwscfInput
|
|
from qmcpack_converters import Pw2qmcpackInput
|
|
from gamess_input import GamessInput
|
|
from qmcpack_input import QmcpackInput
|
|
|
|
# load information for a single user example
|
|
if label not in example_information:
|
|
raise NexusTestMisconstructed
|
|
#end if
|
|
einfo = example_information[label]
|
|
|
|
# create local directory for these tests
|
|
test_dir = nenter(preserve=True)
|
|
|
|
# create a local file to track any test failures
|
|
# this is optionally used when updating reference files automatically
|
|
example_failures_filename = 'test_failures.txt'
|
|
test_failures_file = user_examples_data['failures_file']
|
|
if test_failures_file is None:
|
|
test_failures_file = open(user_examples_data['failures_filepath'],'w')
|
|
user_examples_data['failures_file'] = test_failures_file
|
|
#end if
|
|
|
|
# copy over nexus user examples into reference generation directory
|
|
# only do this the first time as all user example tests share a test directory
|
|
if not os.path.exists(os.path.join(test_dir,'qmcpack')):
|
|
command = 'rsync -av --ignore-existing {0}/* {1}/'.format(example_dir,test_dir)
|
|
out,err,rc = execute(command)
|
|
if rc>0:
|
|
nfail('copying example directory failed\nattempted command:\n'+command)
|
|
#end if
|
|
#end if
|
|
|
|
# execute all example scripts in generate_only mode
|
|
path = einfo['path']
|
|
cwd = os.getcwd()
|
|
tpath = os.path.join(test_dir,path)
|
|
# remove prexisting example files
|
|
nenter(tpath,relative=True)
|
|
# copy over nexus examples files just for this example
|
|
epath = os.path.join(example_dir,path)
|
|
command = 'rsync -av {0}/* ./'.format(epath)
|
|
out,err,rc = execute(command)
|
|
if rc>0:
|
|
nfail('copying example directory failed\nattempted command:\n'+command)
|
|
#end if
|
|
for script in einfo['scripts']:
|
|
# run the example script
|
|
command = sys.executable+' ./'+script+' --generate_only --sleep=0.01'
|
|
out,err,rc = nexus_testing.execute(command)
|
|
#end for
|
|
os.chdir(cwd)
|
|
|
|
# check that generated files match reference files
|
|
ref_example_dir = os.path.join(reference_dir,'user_examples')
|
|
input_classes = dict(
|
|
pwscf = PwscfInput,
|
|
pw2qmcpack = Pw2qmcpackInput,
|
|
gamess = GamessInput,
|
|
qmcpack = QmcpackInput,
|
|
)
|
|
example_path = einfo['path']
|
|
for code,filetype,filepath in einfo['files']:
|
|
ref_filepath = os.path.join(ref_example_dir,example_path,filepath)
|
|
gen_filepath = os.path.join(test_dir,example_path,filepath)
|
|
# check that the reference file exists
|
|
if not os.path.exists(ref_filepath):
|
|
nfail('reference file is missing\nfile should be located at: {0}'.format(ref_filepath))
|
|
#end if
|
|
# check that the generated file exists
|
|
if not os.path.exists(gen_filepath):
|
|
nfail('input file was not generated: {0}'.format(gen_filepath))
|
|
#end if
|
|
# check that the generated file matches the reference file
|
|
# read the files into Nexus' object representation
|
|
# use object_diff to compare object represenations
|
|
# this is needed to compare floats within a tolerance
|
|
if filetype=='input':
|
|
input_class = input_classes[code]
|
|
ref_input = input_class(ref_filepath)
|
|
gen_input = input_class(gen_filepath)
|
|
diff,dgen,dref = object_diff(gen_input,ref_input,full=True)
|
|
if diff:
|
|
# assume failure
|
|
failed = True
|
|
# if difference due to periodically equivalent points
|
|
# then it is not a failure
|
|
check_pbc = False
|
|
if len(dgen)==1 and len(dref)==1:
|
|
kgen = list(dgen.keys())[0].rsplit('/',1)[1]
|
|
kref = list(dref.keys())[0].rsplit('/',1)[1]
|
|
check_pbc |= code=='qmcpack' and kgen==kref=='position'
|
|
check_pbc |= code=='pwscf' and kgen==kref=='positions'
|
|
#end if
|
|
if check_pbc:
|
|
try:
|
|
# extract Structure objects from SimulationInput objects
|
|
rs = ref_input.return_structure()
|
|
gs = gen_input.return_structure()
|
|
# compare minimum image distances of all atomic coordinates
|
|
d = rs.min_image_distances(gs.pos,pairs=False)
|
|
# allow for small deviation due to precision of ascii floats in the text input files
|
|
if d.min()<1e-6:
|
|
failed = False
|
|
#end if
|
|
except:
|
|
None
|
|
#end try
|
|
#end if
|
|
if failed:
|
|
# store failing reference files
|
|
test_failures_file.write(ref_filepath+'\n')
|
|
# report on failures
|
|
from generic import obj
|
|
dgen = obj(dgen)
|
|
dref = obj(dref)
|
|
msg = 'reference and generated input files differ\n'
|
|
msg += 'reference file: '+filepath+'\n'
|
|
msg += 'reference file difference\n'
|
|
msg += 40*'='+'\n'
|
|
msg += str(dref)
|
|
msg += 'generated file difference\n'
|
|
msg += 40*'='+'\n'
|
|
msg += str(dgen)
|
|
nfail(msg)
|
|
#end if
|
|
#end if
|
|
else:
|
|
raise NexusTestMisconstructed
|
|
#end if
|
|
#end for
|
|
#end def user_examples
|
|
|
|
|
|
|
|
# create labeled tests from simple functions above
|
|
|
|
# ordered according to logical dependencies
|
|
NexusTest( versions )
|
|
NexusTest( required_dependencies )
|
|
NexusTest( optional_dependencies , optional=True)
|
|
NexusTest( nexus_imports )
|
|
NexusTest( testing )
|
|
NexusTest( execute )
|
|
NexusTest( memory )
|
|
NexusTest( superstring )
|
|
NexusTest( generic_operation , 'generic' )
|
|
NexusTest( developer )
|
|
NexusTest( plotting )
|
|
NexusTest( unit_converter )
|
|
NexusTest( periodic_table )
|
|
NexusTest( numerics )
|
|
NexusTest( grid_functions )
|
|
NexusTest( fileio )
|
|
NexusTest( hdfreader )
|
|
NexusTest( xmlreader )
|
|
NexusTest( structure )
|
|
NexusTest( physical_system )
|
|
NexusTest( basisset )
|
|
NexusTest( pseudopotential )
|
|
NexusTest( nexus_base )
|
|
NexusTest( machines )
|
|
NexusTest( simulation , 'simulation_module' )
|
|
NexusTest( bundle )
|
|
NexusTest( project_manager )
|
|
NexusTest( settings_operation , 'settings' )
|
|
NexusTest( vasp_input )
|
|
NexusTest( pwscf_input )
|
|
NexusTest( pwscf_postprocessor_input )
|
|
NexusTest( gamess_input )
|
|
NexusTest( pyscf_input )
|
|
NexusTest( quantum_package_input )
|
|
NexusTest( rmg_input )
|
|
NexusTest( qmcpack_converter_input )
|
|
NexusTest( qmcpack_input )
|
|
NexusTest( vasp_analyzer )
|
|
NexusTest( pwscf_analyzer )
|
|
NexusTest( pwscf_postprocessor_analyzers )
|
|
NexusTest( gamess_analyzer )
|
|
NexusTest( pyscf_analyzer )
|
|
NexusTest( quantum_package_analyzer )
|
|
NexusTest( rmg_analyzer )
|
|
NexusTest( qmcpack_converter_analyzers )
|
|
NexusTest( qmcpack_analyzer )
|
|
NexusTest( vasp_simulation )
|
|
NexusTest( pwscf_simulation )
|
|
NexusTest( gamess_simulation )
|
|
NexusTest( pyscf_simulation )
|
|
NexusTest( quantum_package_simulation )
|
|
NexusTest( rmg_simulation )
|
|
NexusTest( pwscf_postprocessor_simulations )
|
|
NexusTest( qmcpack_converter_simulations )
|
|
NexusTest( qmcpack_simulation )
|
|
NexusTest( observables )
|
|
NexusTest( nxs_redo )
|
|
NexusTest( nxs_sim )
|
|
NexusTest( qmca )
|
|
NexusTest( qmc_fit )
|
|
NexusTest( qdens )
|
|
NexusTest( qdens_radial )
|
|
|
|
# ordered alphabetically (pytest order)
|
|
#NexusTest( basisset )
|
|
#NexusTest( bundle )
|
|
#NexusTest( developer )
|
|
#NexusTest( execute )
|
|
#NexusTest( fileio )
|
|
#NexusTest( gamess_analyzer )
|
|
#NexusTest( gamess_input )
|
|
#NexusTest( gamess_simulation )
|
|
#NexusTest( generic_operation , 'generic' )
|
|
#NexusTest( grid_functions )
|
|
#NexusTest( hdfreader )
|
|
#NexusTest( machines )
|
|
#NexusTest( memory )
|
|
#NexusTest( nexus_base )
|
|
#NexusTest( nexus_imports )
|
|
#NexusTest( numerics )
|
|
#NexusTest( nxs_redo )
|
|
#NexusTest( nxs_sim )
|
|
#NexusTest( observables )
|
|
#NexusTest( optional_dependencies , optional=True)
|
|
#NexusTest( periodic_table )
|
|
#NexusTest( physical_system )
|
|
#NexusTest( plotting )
|
|
#NexusTest( project_manager )
|
|
#NexusTest( pseudopotential )
|
|
#NexusTest( pwscf_analyzer )
|
|
#NexusTest( pwscf_input )
|
|
#NexusTest( pwscf_postprocessor_analyzers )
|
|
#NexusTest( pwscf_postprocessor_input )
|
|
#NexusTest( pwscf_postprocessor_simulations )
|
|
#NexusTest( pwscf_simulation )
|
|
#NexusTest( pyscf_analyzer )
|
|
#NexusTest( pyscf_input )
|
|
#NexusTest( pyscf_simulation )
|
|
#NexusTest( qdens )
|
|
#NexusTest( qdens_radial )
|
|
#NexusTest( qmc_fit )
|
|
#NexusTest( qmca )
|
|
#NexusTest( qmcpack_analyzer )
|
|
#NexusTest( qmcpack_converter_analyzers )
|
|
#NexusTest( qmcpack_converter_input )
|
|
#NexusTest( qmcpack_converter_simulations )
|
|
#NexusTest( qmcpack_input )
|
|
#NexusTest( qmcpack_simulation )
|
|
#NexusTest( quantum_package_analyzer )
|
|
#NexusTest( quantum_package_input )
|
|
#NexusTest( quantum_package_simulation )
|
|
#NexusTest( required_dependencies )
|
|
#NexusTest( settings_operation , 'settings' )
|
|
#NexusTest( simulation , 'simulation_module' )
|
|
#NexusTest( structure )
|
|
#NexusTest( superstring )
|
|
#NexusTest( testing )
|
|
#NexusTest( unit_converter )
|
|
#NexusTest( vasp_analyzer )
|
|
#NexusTest( vasp_simulation )
|
|
#NexusTest( vasp_input )
|
|
#NexusTest( versions )
|
|
#NexusTest( xmlreader )
|
|
|
|
for label in sorted(example_information.keys()):
|
|
NexusTest(
|
|
name = 'example_'+label, # individually label tests
|
|
operation = user_examples, # all tests call the same test function
|
|
op_inputs = dict(label=label), # but with different inputs
|
|
test_dir = 'user_examples', # all tests are run in the same base directory
|
|
)
|
|
#end for
|
|
|
|
|
|
|
|
# launch the actual testing framework
|
|
|
|
# Returns failure error code to OS.
|
|
# Explicitly prints 'fail' after an optional message.
|
|
def exit_fail(msg=None):
|
|
if msg!=None:
|
|
print(msg)
|
|
#end if
|
|
print('Test status: fail')
|
|
exit(1)
|
|
#end def exit_fail
|
|
|
|
# Returns success error code to OS.
|
|
# Explicitly prints 'pass' after an optional message.
|
|
def exit_pass(msg=None):
|
|
if msg!=None:
|
|
print(msg)
|
|
#end if
|
|
print('Test status: pass')
|
|
exit(0)
|
|
#end def exit_pass
|
|
|
|
# execute function
|
|
from subprocess import Popen,PIPE
|
|
def execute(command,verbose=False,skip=False):
|
|
out,err = '',''
|
|
if skip:
|
|
if verbose:
|
|
print('Would have executed:\n '+command)
|
|
#end if
|
|
else:
|
|
if verbose:
|
|
print('Executing:\n '+command)
|
|
#end if
|
|
process = Popen(command,shell=True,stdout=PIPE,stderr=PIPE,close_fds=True)
|
|
out,err = process.communicate()
|
|
#end if
|
|
return out,err,process.returncode
|
|
#end def execute
|
|
|
|
|
|
|
|
def regenerate_reference(update=False):
|
|
# create directory for reference file generation
|
|
refgen_dir = './reference_regen'
|
|
if os.path.exists(refgen_dir):
|
|
shutil.rmtree(refgen_dir)
|
|
#end if
|
|
os.makedirs(refgen_dir)
|
|
|
|
nlog('generating reference data in {0}'.format(refgen_dir))
|
|
|
|
# create directory for example reference generation
|
|
exdir = user_examples_data['dir']
|
|
refgen_example_dir = os.path.join(refgen_dir,exdir)
|
|
if not os.path.exists(refgen_example_dir):
|
|
os.makedirs(refgen_example_dir)
|
|
#end if
|
|
|
|
# copy over nexus user examples into reference generation directory
|
|
out,err,rc = execute('rsync -av {0}/* {1}/'.format(example_dir,refgen_example_dir))
|
|
if rc>0:
|
|
nerror('rsync of example directory failed, exiting',n=1)
|
|
#end if
|
|
|
|
# execute all example scripts in generate_only mode
|
|
for label,einfo in example_information.items():
|
|
example_path = einfo['path']
|
|
for script in einfo['scripts']:
|
|
nlog('generating reference data for '+script,n=1)
|
|
path = os.path.join(refgen_example_dir,example_path)
|
|
cwd = os.getcwd()
|
|
nlog('current directory: '+cwd,n=2)
|
|
nlog('entering directory: '+path,n=2)
|
|
os.chdir(path)
|
|
if not os.path.exists('./'+script):
|
|
nerror('script file {} does not exist'.format(script),n=2)
|
|
#end if
|
|
command = sys.executable+' ./'+script+' --generate_only --sleep=0.1'
|
|
nlog('executing command: '+command,n=2)
|
|
out,err,rc = execute(command)
|
|
if rc>0:
|
|
nerror('example script failed to run',n=2)
|
|
#end if
|
|
os.chdir(cwd)
|
|
#end for
|
|
#end for
|
|
|
|
# update the reference set of example files
|
|
if update:
|
|
nlog('\nupdating reference data')
|
|
if options.update_dryrun:
|
|
nlog('performing a dryrun, no files will be updated',n=1)
|
|
#end if
|
|
failures_filepath = user_examples_data['failures_filepath']
|
|
nlog('attempting to load example failures file',n=1)
|
|
nlog('file location: {}'.format(failures_filepath),n=2)
|
|
failures_list = []
|
|
if os.path.exists(failures_filepath):
|
|
f = open(failures_filepath,'r')
|
|
failures_list.extend(f.read().splitlines())
|
|
f.close()
|
|
nlog('file read successfully',n=2)
|
|
nlog('files for previously failed examples:',n=2)
|
|
for filepath in failures_list:
|
|
nlog(filepath,n=3)
|
|
#end for
|
|
else:
|
|
nlog('file does not exist, skipping',n=2)
|
|
#end if
|
|
nlog('collecting file transfer information',n=1)
|
|
new_examples = []
|
|
failed_examples = []
|
|
all_examples = []
|
|
ref_example_dir = os.path.join(reference_dir,exdir)
|
|
for label,einfo in example_information.items():
|
|
example_path = einfo['path']
|
|
for code,filetype,filepath in einfo['files']:
|
|
ref_filepath = os.path.join(ref_example_dir,example_path,filepath)
|
|
gen_filepath = os.path.join(refgen_example_dir,example_path,filepath)
|
|
ref_path,ref_file = os.path.split(ref_filepath)
|
|
transfer = label,gen_filepath,ref_filepath
|
|
if not os.path.exists(ref_filepath):
|
|
new_examples.append(transfer)
|
|
elif ref_filepath in failures_list:
|
|
failed_examples.append(transfer)
|
|
#end if
|
|
all_examples.append(transfer)
|
|
#end for
|
|
#end for
|
|
if options.update_mode=='new':
|
|
nlog('only new examples will be updated',n=1)
|
|
update_examples = new_examples
|
|
elif options.update_mode=='failed':
|
|
nlog('both failed and new examples will be updated',n=1)
|
|
update_examples = failed_examples + new_examples
|
|
elif options.update_mode=='all':
|
|
nlog('all examples will be updated',n=1)
|
|
update_examples = all_examples
|
|
#end if
|
|
if len(update_examples)==0:
|
|
nlog('no examples selected for update!',n=1)
|
|
for label,gen_filepath,ref_filepath in update_examples:
|
|
ref_path,ref_file = os.path.split(ref_filepath)
|
|
nlog('update for '+label,n=2)
|
|
nlog('ref file: '+ref_filepath,n=3)
|
|
nlog('gen file: '+gen_filepath,n=3)
|
|
if options.update_dryrun:
|
|
nlog('reference file not updated',n=3)
|
|
else:
|
|
if not os.path.exists(ref_path):
|
|
os.makedirs(ref_path)
|
|
#end if
|
|
shutil.copy2(gen_filepath,ref_path)
|
|
nlog('reference file updated',n=3)
|
|
#end if
|
|
#end for
|
|
#end if
|
|
|
|
#end def regenerate_reference
|
|
|
|
|
|
|
|
|
|
|
|
def find_nexus_modules():
|
|
import sys
|
|
nexus_lib = os.path.abspath(os.path.join(__file__,'..','..','lib'))
|
|
assert(os.path.exists(nexus_lib))
|
|
sys.path.append(nexus_lib)
|
|
#end def find_nexus_modules
|
|
|
|
|
|
def import_nexus_module(module_name):
|
|
import importlib
|
|
return importlib.import_module(module_name)
|
|
#end def import_nexus_module
|
|
|
|
|
|
# Get Nexus version
|
|
try:
|
|
# Attempt specialized path-based imports.
|
|
# (The executable should still work even if Nexus is not installed)
|
|
find_nexus_modules()
|
|
|
|
versions = import_nexus_module('versions')
|
|
nexus_version = versions.nexus_version
|
|
del versions
|
|
except:
|
|
try:
|
|
from versions import nexus_version
|
|
except:
|
|
nexus_version = 0,0,0
|
|
#end try
|
|
#end try
|
|
|
|
|
|
|
|
if __name__=='__main__':
|
|
import re
|
|
from time import time # used to get user wall clock rather than cpu time
|
|
|
|
tstart_all = time()
|
|
|
|
# read command line input
|
|
regex = None
|
|
ctest = False
|
|
|
|
parser = OptionParser(
|
|
usage='usage: %prog [options]',
|
|
add_help_option=False,
|
|
version='%prog {}.{}.{}'.format(*nexus_version)
|
|
)
|
|
|
|
parser.add_option('-h','--help',dest='help',
|
|
action='store_true',default=False,
|
|
help='Print help information and exit (default=%default).'
|
|
)
|
|
parser.add_option('-v','--verbose',dest='verbose',
|
|
action='store_true',default=False,
|
|
help='Print detailed information (default=%default).'
|
|
)
|
|
parser.add_option('-R','--regex',dest='regex',
|
|
default='none',
|
|
help='Tests with names matching the regular expression (regex) will be run. The default behavior is to run all tests (default=%default).'
|
|
)
|
|
parser.add_option('--list',dest='list',
|
|
action='store_true',default=False,
|
|
help='List tests in human readable format. (default=%default).'
|
|
)
|
|
parser.add_option('--full',dest='full',
|
|
action='store_true',default=False,
|
|
help='Test optional features (default=%default).'
|
|
)
|
|
parser.add_option('--ctestlist',dest='ctestlist',
|
|
action='store_true',default=False,
|
|
help='List tests in CMake format. Intended for use within CTest (default=%default).'
|
|
)
|
|
parser.add_option('--ctest',dest='ctest',
|
|
action='store_true',default=False,
|
|
help='Compatibility mode for calls from the CTest framework (default=%default).'
|
|
)
|
|
parser.add_option('--pythonpath',dest='pythonpath',
|
|
default='none',
|
|
help='Sets PYTHONPATH environment variable for any scripts executed by nxs-test. The default behavior is to use PYTHONPATH as already defined in the host environment.'
|
|
)
|
|
parser.add_option('--trip',dest='trip',
|
|
default='none',
|
|
help='Cause the "trip"-th assertion statement to fail. Useful when to ensure that the CMake script is working properly when interfacing with CTest (default=%default).'
|
|
)
|
|
parser.add_option('--generate_reference',dest='generate_reference',
|
|
action='store_true',default=False,
|
|
help='Regenerate reference data, but do not overwrite existing reference files. Intended for developer use (default=%default).'
|
|
)
|
|
parser.add_option('--update_reference',dest='update_reference',
|
|
action='store_true',default=False,
|
|
help='Regenerate reference data and update existing reference files. Intended for developer use (default=%default).'
|
|
)
|
|
parser.add_option('--update_mode',dest='update_mode',
|
|
default='new',
|
|
help='Modes of operation when updating reference files. Intended for developer use. Options are "new", "failed", "all" (default=%default).'
|
|
)
|
|
parser.add_option('--update_dryrun',dest='update_dryrun',
|
|
action='store_true',default=False,
|
|
help='Perform a dryrun of updating reference files, reporting on files that will be update in a non-dryrun. Intended for developer use (default=%default).'
|
|
)
|
|
parser.add_option('--job_ref_table',dest='job_ref_table',
|
|
action='store_true',default=False,
|
|
help='Print reference data for job run commands on various machines. Intended for developer use (default=%default).'
|
|
)
|
|
|
|
options,files_in = parser.parse_args()
|
|
|
|
if options.help:
|
|
print('\n'+parser.format_help().strip())
|
|
exit()
|
|
#end if
|
|
|
|
global_data['verbose'] = options.verbose
|
|
global_data['job_ref_table'] = options.job_ref_table
|
|
|
|
if options.regex!='none':
|
|
regex = options.regex
|
|
#end if
|
|
ctest = options.ctest
|
|
if options.trip!='none':
|
|
try:
|
|
NexusTestBase.assert_trip = int(options.trip)
|
|
except:
|
|
msg='command line option "--trip" must be an integer, received {0}'.format(options.trip)
|
|
exit_fail(msg)
|
|
#end try
|
|
#end if
|
|
|
|
# clear out old test data
|
|
NexusTest.setup()
|
|
|
|
# initialize user example data
|
|
ued = user_examples_data
|
|
ued['dir'] = 'user_examples'
|
|
ued['test_path'] = NexusTestBase.test_path_from_dir(ued['dir'])
|
|
ued['failures_filename'] = 'test_failures.txt'
|
|
ued['failures_filepath'] = os.path.join(ued['test_path'],ued['failures_filename'])
|
|
ued['failures_file'] = None
|
|
|
|
# If requested, regenerate reference data and exit
|
|
update_modes = ('new','failed','all')
|
|
if options.update_mode not in update_modes:
|
|
msg = 'command line option "--update_mode" must be {}, received {}'.format(update_modes,options.update_mode)
|
|
exit_fail(msg)
|
|
#end if
|
|
if options.generate_reference:
|
|
regenerate_reference(update=False)
|
|
exit()
|
|
#end if
|
|
if options.update_reference:
|
|
#exit_fail('Automatic update of reference data is not yet supported.')
|
|
regenerate_reference(update=True)
|
|
exit()
|
|
#end if
|
|
|
|
# remove failures file prior to testing
|
|
if os.path.exists(ued['failures_filepath']):
|
|
os.remove(ued['failures_filepath'])
|
|
#end if
|
|
del ued
|
|
|
|
# identify test list to run
|
|
tests = []
|
|
for test in NexusTest.test_list:
|
|
if regex is None:
|
|
tests.append(test)
|
|
elif re.search(regex,test.name):
|
|
tests.append(test)
|
|
#end if
|
|
#end for
|
|
if options.list:
|
|
print('Test list:')
|
|
for test in tests:
|
|
print(' ',test.name)
|
|
#end for
|
|
exit()
|
|
#end if
|
|
if len(tests)!=1 and ctest:
|
|
exit_fail('Exactly one test should be selected when using ctest\n tests requested: {0}'.format([test.name for test in tests]))
|
|
#end if
|
|
if options.ctestlist:
|
|
c = ''
|
|
for test in tests:
|
|
c+=test.name+';'
|
|
#end for
|
|
sys.stdout.write(c[:-1])
|
|
exit()
|
|
#end if
|
|
if options.pythonpath!='none':
|
|
os.environ['PYTHONPATH']=options.pythonpath
|
|
#end if
|
|
|
|
# guard against missing numpy (required)
|
|
if len(tests)>0 and not numpy_available:
|
|
print('\nNumPy is required to run the tests.\nPlease install NumPy and try again.\n')
|
|
exit(1)
|
|
#end if
|
|
|
|
# run each test and print the test outcome
|
|
if not ctest:
|
|
print('')
|
|
#end if
|
|
nrunnable = 0
|
|
for test in tests:
|
|
if test.optional and not options.full:
|
|
continue
|
|
#end if
|
|
nrunnable += 1
|
|
#end for
|
|
n=0
|
|
npassed = 0
|
|
nfailed = 0
|
|
nrun = 0
|
|
for test in tests:
|
|
t1 = time()
|
|
|
|
# skip optional tests, unless requested
|
|
if test.optional and not options.full:
|
|
continue
|
|
#end if
|
|
n+=1
|
|
|
|
# run the test
|
|
test.run()
|
|
nrun += 1
|
|
|
|
# print the pass/fail line
|
|
if len(test.name)<40:
|
|
title = test.name+(40-len(test.name))*'.'
|
|
else:
|
|
title = test.name
|
|
#end if
|
|
if test.passed:
|
|
status = 'Passed'
|
|
npassed+=1
|
|
elif test.failed:
|
|
status = 'Failed'
|
|
nfailed+=1
|
|
else:
|
|
status = 'Unknown'
|
|
#end if
|
|
t2 = time()
|
|
if not ctest:
|
|
slt = str(nrunnable)
|
|
sn = str(n)
|
|
if len(sn)<len(slt):
|
|
sn = (len(slt)-len(sn))*' '+sn
|
|
#end if
|
|
print(' {0}/{1} {2} {3} {4:3.2f} sec'.format(sn,slt,title,status,t2-t1))
|
|
if options.verbose:
|
|
pad = (len(sn)+len(slt)+5)*' '
|
|
for subtest in test.subtests:
|
|
print(pad+'subtest: '+subtest)
|
|
#end for
|
|
#end if
|
|
#end if
|
|
|
|
# print more information if failed
|
|
msg = test.message()
|
|
if test.failed:
|
|
if not ctest:
|
|
print(msg)
|
|
else:
|
|
exit_fail(msg)
|
|
#end if
|
|
elif test.passed and ctest:
|
|
exit_pass(msg)
|
|
#end if
|
|
#end for
|
|
|
|
tstop_all = time()
|
|
|
|
# print pass/fail and timing summary
|
|
if not ctest:
|
|
print('')
|
|
print('{0}% tests passed, {1} tests failed out of {2}'.format(int(100*float(npassed)/(1e-16+nrunnable)),nfailed,nrunnable))
|
|
print('')
|
|
print('Total test time = {0:3.2f} sec'.format(tstop_all-tstart_all))
|
|
#end if
|
|
|
|
# cleanup
|
|
if user_examples_data['failures_file'] is not None:
|
|
user_examples_data['failures_file'].close()
|
|
#end if
|
|
#end if
|