mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-25 23:06:10 +01:00
Add test for consistent random ordering
-- Fixed up during cherrypicking
This commit is contained in:
parent
26b2c3e7e2
commit
630ba26278
@ -198,6 +198,9 @@ set_tests_properties(TagAlias PROPERTIES
|
|||||||
FAIL_REGULAR_EXPRESSION "0 matching test cases"
|
FAIL_REGULAR_EXPRESSION "0 matching test cases"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_test(NAME RandomTestOrdering COMMAND ${PYTHON_EXECUTABLE}
|
||||||
|
${CATCH_DIR}/tests/TestScripts/testRandomOrder.py $<TARGET_FILE:SelfTest>)
|
||||||
|
|
||||||
if (CATCH_USE_VALGRIND)
|
if (CATCH_USE_VALGRIND)
|
||||||
add_test(NAME ValgrindRunTests COMMAND valgrind --leak-check=full --error-exitcode=1 $<TARGET_FILE:SelfTest>)
|
add_test(NAME ValgrindRunTests COMMAND valgrind --leak-check=full --error-exitcode=1 $<TARGET_FILE:SelfTest>)
|
||||||
add_test(NAME ValgrindListTests COMMAND valgrind --leak-check=full --error-exitcode=1 $<TARGET_FILE:SelfTest> --list-tests --verbosity high)
|
add_test(NAME ValgrindListTests COMMAND valgrind --leak-check=full --error-exitcode=1 $<TARGET_FILE:SelfTest> --list-tests --verbosity high)
|
||||||
|
56
tests/TestScripts/testRandomOrder.py
Executable file
56
tests/TestScripts/testRandomOrder.py
Executable file
@ -0,0 +1,56 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
def list_tests(self_test_exe, tags, rng_seed):
|
||||||
|
cmd = [self_test_exe, '--reporter', 'xml', '--list-tests', '--order', 'rand',
|
||||||
|
'--rng-seed', str(rng_seed)]
|
||||||
|
tags_arg = ','.join('[{}]'.format(t) for t in tags)
|
||||||
|
if tags_arg:
|
||||||
|
cmd.append(tags_arg + '~[.]')
|
||||||
|
process = subprocess.Popen(
|
||||||
|
cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
stdout, stderr = process.communicate()
|
||||||
|
if stderr:
|
||||||
|
raise RuntimeError("Unexpected error output:\n" + process.stderr)
|
||||||
|
|
||||||
|
root = ET.fromstring(stdout)
|
||||||
|
result = [elem.text for elem in root.findall('./TestCase/Name')]
|
||||||
|
|
||||||
|
if len(result) < 2:
|
||||||
|
raise RuntimeError("Unexpectedly few tests listed (got {})".format(
|
||||||
|
len(result)))
|
||||||
|
return result
|
||||||
|
|
||||||
|
def check_is_sublist_of(shorter, longer):
|
||||||
|
assert len(shorter) < len(longer)
|
||||||
|
assert len(set(longer)) == len(longer)
|
||||||
|
|
||||||
|
indexes_in_longer = {s: i for i, s in enumerate(longer)}
|
||||||
|
for s1, s2 in zip(shorter, shorter[1:]):
|
||||||
|
assert indexes_in_longer[s1] < indexes_in_longer[s2], (
|
||||||
|
'{} comes before {} in longer list.\n'
|
||||||
|
'Longer: {}\nShorter: {}'.format(s2, s1, longer, shorter))
|
||||||
|
|
||||||
|
def main():
|
||||||
|
self_test_exe, = sys.argv[1:]
|
||||||
|
|
||||||
|
list_one_tag = list_tests(self_test_exe, ['generators'], 1)
|
||||||
|
list_two_tags = list_tests(self_test_exe, ['generators', 'matchers'], 1)
|
||||||
|
list_all = list_tests(self_test_exe, [], 1)
|
||||||
|
|
||||||
|
# First, verify that restricting to a subset yields the same order
|
||||||
|
check_is_sublist_of(list_two_tags, list_all)
|
||||||
|
check_is_sublist_of(list_one_tag, list_two_tags)
|
||||||
|
|
||||||
|
# Second, verify that different seeds yield different orders
|
||||||
|
num_seeds = 100
|
||||||
|
seeds = range(1, num_seeds + 1) # Avoid zero since that's special
|
||||||
|
lists = {tuple(list_tests(self_test_exe, [], seed)) for seed in seeds}
|
||||||
|
assert len(lists) == num_seeds, (
|
||||||
|
'Got {} distict lists from {} seeds'.format(len(lists), num_seeds))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
sys.exit(main())
|
Loading…
Reference in New Issue
Block a user