Mercurial > hg
changeset 16842:a3ea092203a5
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.
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Fri, 01 Jun 2012 02:25:12 +0200 |
parents | f2555e891982 |
children | 61f3ca8e4d39 |
files | tests/run-tests.py tests/test-commit.t tests/test-run-tests.t |
diffstat | 3 files changed, 46 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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!
--- 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)