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.
--- 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)