97 lines
2.9 KiB
Python
97 lines
2.9 KiB
Python
|
'''
|
||
|
Combine EC profiles from three independent beams
|
||
|
'''
|
||
|
|
||
|
from .. import TestCase, options, load_table, run_gray
|
||
|
|
||
|
from pathlib import Path
|
||
|
|
||
|
import unittest
|
||
|
import shutil
|
||
|
import tempfile
|
||
|
|
||
|
|
||
|
class Test(TestCase):
|
||
|
inputs: Path # directory of the input files
|
||
|
reference: Path # directory of the reference outputs
|
||
|
candidate: Path # directory of the candidate outputs
|
||
|
|
||
|
@classmethod
|
||
|
def setUpClass(cls):
|
||
|
'''
|
||
|
Sets up the test case
|
||
|
'''
|
||
|
# directory of the test case
|
||
|
base = Path().joinpath(*cls.__module__.split('.'))
|
||
|
cls.inputs = base / 'inputs'
|
||
|
cls.reference = base / 'outputs'
|
||
|
|
||
|
# temporary directory holding the candidate outputs
|
||
|
cls._tempdir = tempfile.mkdtemp(prefix=f'gray-test-{base.name}.')
|
||
|
cls.candidate = Path(cls._tempdir)
|
||
|
|
||
|
# replace reference with candidate
|
||
|
if options.update:
|
||
|
print()
|
||
|
print('Setting new reference for ' + cls.__module__)
|
||
|
cls.candidate = cls.reference
|
||
|
|
||
|
# run gray to generate the candidate outputs
|
||
|
proc = run_gray(cls.inputs, cls.candidate, binary=options.binary,
|
||
|
options=['-s', cls.inputs / 'filelist.txt'])
|
||
|
assert proc.returncode == 0, \
|
||
|
f"gray failed with exit code {proc.returncode}"
|
||
|
|
||
|
# store the stderr for manual inspection
|
||
|
with open(str(cls.candidate / 'log'), 'w') as log:
|
||
|
log.write(proc.stderr)
|
||
|
|
||
|
@classmethod
|
||
|
def tearDownClass(cls):
|
||
|
'''
|
||
|
Clean up after all tests
|
||
|
'''
|
||
|
# remove temporary directory
|
||
|
if cls._passed or not options.keep_failed:
|
||
|
shutil.rmtree(cls._tempdir)
|
||
|
else:
|
||
|
print()
|
||
|
print('Some tests failed: preserving outputs in', cls._tempdir)
|
||
|
|
||
|
def run(self, result: unittest.runner.TextTestResult):
|
||
|
'''
|
||
|
Override to store the test results for tearDownClass
|
||
|
'''
|
||
|
TestCase.run(self, result)
|
||
|
self.__class__._passed = result.failures == []
|
||
|
|
||
|
def test_eccd_values(self):
|
||
|
'''
|
||
|
Comparing the ECCD values
|
||
|
'''
|
||
|
from collections import defaultdict
|
||
|
|
||
|
ref = load_table(self.reference / 'sum-summary.txt')
|
||
|
cand = load_table(self.candidate / 'sum-summary.txt')
|
||
|
|
||
|
# precision as number of decimal places
|
||
|
prec = defaultdict(lambda: 3, [
|
||
|
('dPdV_peak', -2), ('dPdV_max', -2),
|
||
|
('J_φ_peak', -2), ('J_φ_max', -2),
|
||
|
])
|
||
|
|
||
|
for val in ref.dtype.names:
|
||
|
with self.subTest(value=val):
|
||
|
self.assertAlmostEqual(ref[val], cand[val], prec[val],
|
||
|
msg=f"{val} changed)")
|
||
|
|
||
|
def test_ec_profiles(self):
|
||
|
'''
|
||
|
Comparing the EC radial profiles
|
||
|
'''
|
||
|
|
||
|
ref = load_table(self.reference / 'sum-ec-profiles.txt')
|
||
|
cand = load_table(self.candidate / 'sum-ec-profiles.txt')
|
||
|
|
||
|
# todo
|