summaryrefslogtreecommitdiff
path: root/build-aux
diff options
context:
space:
mode:
authorAkim Demaille <akim.demaille@gmail.com>2019-02-16 07:31:36 +0100
committerAkim Demaille <akim.demaille@gmail.com>2019-03-30 08:20:31 +0100
commit75303c61d86606a400a6398aa8f914a1070bdf6d (patch)
tree1b9d561ecce4466513e1138785ef09fa75cb9b43 /build-aux
parentaf99826ef47a5167568fda4fa92b23b7004b366f (diff)
downloadbison-75303c61d86606a400a6398aa8f914a1070bdf6d.tar.gz
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.
Diffstat (limited to 'build-aux')
-rwxr-xr-xbuild-aux/update-test93
1 files changed, 93 insertions, 0 deletions
diff --git a/build-aux/update-test b/build-aux/update-test
new file mode 100755
index 00000000..fc7ed701
--- /dev/null
+++ b/build-aux/update-test
@@ -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)