Files
Catch2/tests/TestScripts/testRandomOrder.py
T

78 lines
2.6 KiB
Python
Raw Normal View History

2020-04-10 17:25:13 -04:00
#!/usr/bin/env python3
2022-01-29 00:04:49 +01:00
# Copyright Catch2 Authors
# Distributed under the Boost Software License, Version 1.0.
2022-10-28 11:22:53 +02:00
# (See accompanying file LICENSE.txt or copy at
2022-01-29 00:04:49 +01:00
# https://www.boost.org/LICENSE_1_0.txt)
# SPDX-License-Identifier: BSL-1.0
"""
This test script verifies that the random ordering of tests inside
Catch2 is invariant in regards to subsetting. This is done by running
the binary 3 times, once with all tests selected, and twice with smaller
subsets of tests selected, and verifying that the selected tests are in
the same relative order.
"""
2020-04-10 17:25:13 -04:00
import subprocess
import sys
import random
2020-04-10 17:25:13 -04:00
import xml.etree.ElementTree as ET
def none_to_empty_str(e):
if e is None:
return ""
assert type(e) is str
return e
2020-04-10 17:25:13 -04:00
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)
2020-04-10 17:25:13 -04:00
if tags_arg:
cmd.append(tags_arg)
2020-04-10 17:25:13 -04:00
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 = [(none_to_empty_str(tc.find('Name').text),
none_to_empty_str(tc.find('Tags').text),
none_to_empty_str(tc.find('ClassName').text)) for tc in root.findall('./TestCase')]
2020-04-10 17:25:13 -04:00
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:]
# We want a random seed for the test, but want to avoid 0,
# because it has special meaning
seed = random.randint(1, 2 ** 32 - 1)
list_one_tag = list_tests(self_test_exe, ['generators'], seed)
list_two_tags = list_tests(self_test_exe, ['generators', 'matchers'], seed)
list_all = list_tests(self_test_exe, [], seed)
2020-04-10 17:25:13 -04:00
# 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)
if __name__ == '__main__':
sys.exit(main())