changeset 21384:a36cc85a5b7b

run-tests: move string escaping to TTest With this patch, TTest is almost fully self-contained and extractable. Only logging functions remain outside of its class.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sun, 20 Apr 2014 10:34:52 -0700
parents 772ed56e2519
children 28414e5ac9ec
files tests/run-tests.py
diffstat 1 files changed, 17 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/tests/run-tests.py	Sun Apr 20 10:28:35 2014 -0700
+++ b/tests/run-tests.py	Sun Apr 20 10:34:52 2014 -0700
@@ -618,21 +618,16 @@
         return run(cmd, testtmp, self._options, replacements, env,
                    self._runner.abort)
 
-
-needescape = re.compile(r'[\x00-\x08\x0b-\x1f\x7f-\xff]').search
-escapesub = re.compile(r'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub
-escapemap = dict((chr(i), r'\x%02x' % i) for i in range(256))
-escapemap.update({'\\': '\\\\', '\r': r'\r'})
-def escapef(m):
-    return escapemap[m.group(0)]
-def stringescape(s):
-    return escapesub(escapef, s)
-
 class TTest(Test):
     """A "t test" is a test backed by a .t file."""
 
     SKIPPED_PREFIX = 'skipped: '
     FAILED_PREFIX = 'hghave check failed: '
+    NEEDESCAPE = re.compile(r'[\x00-\x08\x0b-\x1f\x7f-\xff]').search
+
+    ESCAPESUB = re.compile(r'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub
+    ESCAPEMAP = dict((chr(i), r'\x%02x' % i) for i in range(256)).update(
+                     {'\\': '\\\\', '\r': r'\r'})
 
     def _run(self, testtmp, replacements, env):
         f = open(self._path)
@@ -818,8 +813,9 @@
                 if r:
                     postout.append('  ' + el)
                 else:
-                    if needescape(lout):
-                        lout = stringescape(lout.rstrip('\n')) + ' (esc)\n'
+                    if self.NEEDESCAPE(lout):
+                        lout = TTest.stringescape('%s (esc)\n' %
+                                                  lout.rstrip('\n'))
                     postout.append('  ' + lout) # Let diff deal with it.
                     if r != '': # If line failed.
                         warnonly = 3 # for sure not
@@ -918,6 +914,15 @@
 
         return missing, failed
 
+    @staticmethod
+    def _escapef(m):
+        return TTest.ESCAPEMAP[m.group(0)]
+
+    @staticmethod
+    def _stringescape(s):
+        return TTest.ESCAPESUB(TTest._escapef, s)
+
+
 wifexited = getattr(os, "WIFEXITED", lambda x: False)
 def run(cmd, wd, options, replacements, env, abort):
     """Run command in a sub-process, capturing the output (stdout and stderr).