Skip to content

Commit

Permalink
tests: add a tool for mass updates
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
akimd committed Mar 30, 2019
1 parent af99826 commit 75303c6
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 0 deletions.
5 changes: 5 additions & 0 deletions README-hacking
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
93 changes: 93 additions & 0 deletions build-aux/update-test
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 75303c6

Please sign in to comment.