tests: add a tool for mass updates

When we update some output format, too many adjustements must be made
by hand.  This script updates most tests based on the actual output
made during the tests.

* build-aux/update-test: New.
This commit is contained in:
Akim Demaille
2019-02-16 07:31:36 +01:00
parent af99826ef4
commit 75303c61d8
2 changed files with 98 additions and 0 deletions

View File

@@ -195,6 +195,11 @@ update.
** make check
Use liberally.
** Updating the expectations
Sometimes some changes have a large impact on the test suite (e.g., when we
added the "[-Wother]" part to all the warnings). Part of the update can be
done with a crude tool: tests/update-test. Read it for more information.
** TESTSUITEFLAGS
To run just the testsuite (not the tests related to the examples), run `make

93
build-aux/update-test Executable file
View File

@@ -0,0 +1,93 @@
#! /usr/bin/env python
# usage:
# update-test _build/8d/tests/testsuite.dir/*.testsuite.log
import argparse
import os
import re
def getargs():
p = argparse.ArgumentParser(description='Update test cases.')
opt = p.add_argument
opt('tests', metavar='test', nargs='+', type=str, default=None,
help='test files to update')
opt('-v', '--verbose', action='store_true',
help='Be verbose')
return p.parse_args()
args = getargs()
subst = dict()
def log(*args_):
if args.verbose:
print(*args_)
def contents(file):
'''The contents of a file.'''
log(file)
f = open(file)
return f.read()
def diff_to_re(match):
'''Convert a portion of patch into a regex substitution to perform.
No longer used, we now use the expected/effective parts.
'''
frm = []
to = []
is_diff = False
for l in match.group(1).splitlines():
print(l)
# t in [-+ ]
t = l[0]
l = l[1:]
if t in ['-', ' ']:
is_diff = True
frm.append(l)
if t in ['+', ' ']:
is_diff = True
to.append(l)
if is_diff:
frm = "\n".join(frm)
to = "\n".join(to)
subst[frm] = to
def update(at_file, logfile):
test = contents(at_file)
if os.path.isfile(logfile):
log("LOG: ", logfile)
l = contents(logfile)
log("LOG: ", l)
global subst
subst = {}
re.sub(r'(?:^@@.*\n)((?:^[-+ ].*\n)+)',
diff_to_re, l, flags = re.MULTILINE)
print(subst)
if subst:
# Turn "subst{frm} -> to" into a large RE.
frm = '|'.join([re.escape(x) for x in subst])
log("FROM:", frm)
test = re.sub("(" + frm + ")",
lambda m: subst[m.group(1)],
test, flags=re.MULTILINE)
open(at_file, 'w').write(test)
def process(logfile):
log = contents(logfile)
# Look for the file to update.
m = re.search(r'^\d+\. (\w+\.at):\d+: ', log, re.MULTILINE)
if not m:
return
at_file = 'tests/' + m.group(1)
print(at_file)
update(at_file, logfile)
for t in args.tests:
log("FILE:", t)
process(t)