Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/projects/TestScripts/testRandomOrder.py
diff options
context:
space:
mode:
authorJohn Bytheway2020-04-10 17:25:13 -0400
committerMartin Hořeňovský2020-04-14 12:47:36 +0200
commitda9e3eec651797301a41f7a7ab5f47241b69dece (patch)
treeb0d335eed4c8df38a5a9ed82079203abbb4a0e7f /projects/TestScripts/testRandomOrder.py
parentf696ab836b9c7d9ea2f80b64597541cdc67f6821 (diff)
downloadcatch3-da9e3eec651797301a41f7a7ab5f47241b69dece.tar.gz
Add test for consistent random ordering
Diffstat (limited to 'projects/TestScripts/testRandomOrder.py')
-rwxr-xr-xprojects/TestScripts/testRandomOrder.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/projects/TestScripts/testRandomOrder.py b/projects/TestScripts/testRandomOrder.py
new file mode 100755
index 00000000..68f53f19
--- /dev/null
+++ b/projects/TestScripts/testRandomOrder.py
@@ -0,0 +1,53 @@
+#!/usr/bin/env python3
+
+import subprocess
+import sys
+
+def list_tests(self_test_exe, tags, rng_seed):
+ cmd = [self_test_exe, '--list-test-names-only', '--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)
+ result = stdout.split(b'\n')
+ result = [s for s in result if s]
+ 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())