# HG changeset patch # User Mads Kiilerich # Date 1338510312 -7200 # Node ID a2e8ccb652249a8ba0a0447894457833c7aeb799 # Parent a2e7456b162e4f8cef6d149387d8c0d46a00d820 tests: introduce c-style conditional sections in .t tests This makes it possible to have conditional sections like: #if windows $ echo foo foo #else $ echo bar bar #endif The directives and skipped sections are treated like comments, so don't interleave them with commands and their output. The parameters to #if are evaluated while preparing the test by passing them over to hghave. Requirements can thus be negated with 'no-' prefix, and multiple requirements must all be true to return true. [ original upstream message ] diff -r a2e7456b162e -r a2e8ccb65224 tests/run-tests.py --- a/tests/run-tests.py Wed May 30 14:28:57 2012 +0200 +++ b/tests/run-tests.py Fri Jun 01 02:25:12 2012 +0200 @@ -594,6 +594,19 @@ # can generate the surrounding doctest magic inpython = False + # True or False when in a true or false conditional section + skipping = None + + def hghave(reqs): + # TODO: do something smarter when all other uses of hghave is gone + proc = Popen4('%s -c "%s/hghave %s"' % + (options.shell, TESTDIR, ' '.join(reqs)), TESTDIR, 0) + proc.communicate() + ret = proc.wait() + if wifexited(ret): + ret = os.WEXITSTATUS(ret) + return ret == 0 + f = open(test) t = f.readlines() f.close() @@ -606,7 +619,24 @@ for n, l in enumerate(t): if not l.endswith('\n'): l += '\n' - if l.startswith(' >>> '): # python inlines + if l.startswith('#if'): + if skipping is not None: + after.setdefault(pos, []).append(' !!! nested #if\n') + skipping = not hghave(l.split()[1:]) + after.setdefault(pos, []).append(l) + elif l.startswith('#else'): + if skipping is None: + after.setdefault(pos, []).append(' !!! missing #if\n') + skipping = not skipping + after.setdefault(pos, []).append(l) + elif l.startswith('#endif'): + if skipping is None: + after.setdefault(pos, []).append(' !!! missing #if\n') + skipping = None + after.setdefault(pos, []).append(l) + elif skipping: + after.setdefault(pos, []).append(l) + elif l.startswith(' >>> '): # python inlines after.setdefault(pos, []).append(l) prepos = pos pos = n @@ -644,6 +674,8 @@ if inpython: script.append("EOF\n") + if skipping is not None: + after.setdefault(pos, []).append(' !!! missing #endif\n') addsalt(n + 1, False) # Write out the script and execute it