# HG changeset patch # User Mads Kiilerich # Date 1338510312 -7200 # Node ID a3ea092203a5f575ee4b316f62af36cf3ee8c48b # Parent f2555e89198222dce0565639c9dfcb1532ce8da3 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. diff -r f2555e891982 -r a3ea092203a5 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 diff -r f2555e891982 -r a3ea092203a5 tests/test-commit.t --- a/tests/test-commit.t Wed May 30 14:28:57 2012 +0200 +++ b/tests/test-commit.t Fri Jun 01 02:25:12 2012 +0200 @@ -1,5 +1,3 @@ - $ "$TESTDIR/hghave" symlink || exit 80 - commit date test $ hg init test @@ -75,10 +73,14 @@ $ hg commit -m commit-14 does-not-exist abort: does-not-exist: * (glob) [255] + +#if symlink $ ln -s foo baz $ hg commit -m commit-15 baz abort: baz: file not tracked! [255] +#endif + $ touch quux $ hg commit -m commit-16 quux abort: quux: file not tracked! diff -r f2555e891982 -r a3ea092203a5 tests/test-run-tests.t --- a/tests/test-run-tests.t Wed May 30 14:28:57 2012 +0200 +++ b/tests/test-run-tests.t Fri Jun 01 02:25:12 2012 +0200 @@ -52,6 +52,15 @@ $ echo 'foo (re)' foo (re) +Conditional sections based on hghave: + +#if fifo no-fifo + $ echo skipped +#else + $ echo tested + tested +#endif + Exit code: $ (exit 1)