aboutsummaryrefslogtreecommitdiff
path: root/tests/test/script
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-11-04 08:50:12 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-11-04 09:26:34 +0200
commit89424b41ef62430a49012c5c57b1979f29029505 (patch)
tree04b5b8e9ed16c4801b55d416e2b11bf7813a9853 /tests/test/script
parent89a997464b9ffd02580c5316b471dbd0779d86b9 (diff)
Implement concurrent_runner
Diffstat (limited to 'tests/test/script')
-rw-r--r--tests/test/script/buildfile7
-rw-r--r--tests/test/script/driver.cxx76
-rw-r--r--tests/test/script/testscript42
3 files changed, 125 insertions, 0 deletions
diff --git a/tests/test/script/buildfile b/tests/test/script/buildfile
new file mode 100644
index 0000000..bf69e27
--- /dev/null
+++ b/tests/test/script/buildfile
@@ -0,0 +1,7 @@
+# file : tests/test/script/buildfile
+# copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+exe{driver}: cxx{driver} test{testscript}
+
+include ../../../../build2/
diff --git a/tests/test/script/driver.cxx b/tests/test/script/driver.cxx
new file mode 100644
index 0000000..b81172e
--- /dev/null
+++ b/tests/test/script/driver.cxx
@@ -0,0 +1,76 @@
+// file : tests/test/script/driver.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <limits> // numeric_limits
+#include <string>
+#include <cassert>
+#include <ostream> // endl, *bit
+#include <iostream>
+#include <exception>
+
+using namespace std;
+
+int
+main (int argc, char* argv[])
+{
+ // Usage: driver [-i <int>] [-s <int>] (-o <string>)* (-e <string>)*
+ //
+ int status (256);
+ int ifd (3);
+
+ cout.exceptions (ostream::failbit | ostream::badbit);
+ cerr.exceptions (ostream::failbit | ostream::badbit);
+
+ for (int i (1); i < argc; ++i)
+ {
+ string o (argv[i++]);
+ assert (i < argc);
+
+ string v (argv[i]);
+
+ auto toi = [] (const string& s) -> int
+ {
+ try
+ {
+ return stoi (s);
+ }
+ catch (const exception&)
+ {
+ assert (false);
+ }
+ };
+
+ if (o == "-i")
+ {
+ assert (ifd == 3); // Make sure is not set yet.
+
+ ifd = toi (v);
+ assert (ifd >= 0 && ifd < 3);
+
+ if (ifd == 0)
+ cin.ignore (numeric_limits<streamsize>::max ());
+ else
+ (ifd == 1 ? cout : cerr) << cin.rdbuf ();
+ }
+ else if (o == "-o")
+ {
+ cout << v << endl;
+ }
+ else if (o == "-e")
+ {
+ cerr << v << endl;
+ }
+ else if (o == "-s")
+ {
+ assert (status == 256); // Make sure is not set yet.
+
+ status = toi (v);
+ assert (status >= 0 && status < 256);
+ }
+ else
+ assert (false);
+ }
+
+ return status == 256 ? 0 : status;
+}
diff --git a/tests/test/script/testscript b/tests/test/script/testscript
new file mode 100644
index 0000000..b1cf0a5
--- /dev/null
+++ b/tests/test/script/testscript
@@ -0,0 +1,42 @@
+$*
+$* -i 0 <foo
+$* -o foo >foo
+$* -o foo >!
+$* -e foo 2>!
+
+$* -o foo -o bar >>EOO
+foo
+bar
+EOO
+
+$* -i 1 <<EOI >>EOO
+foo
+bar
+EOI
+foo
+bar
+EOO
+
+$* -i 2 <<EOI 2>>EOE
+foo
+bar
+EOI
+foo
+bar
+EOE
+
+$* -i 2 -s 1 <<EOI 2>>EOE != 0
+foo
+bar
+EOI
+foo
+bar
+EOE
+
+$* -i 2 -o baz -s 10 <<EOI 1>baz 2>>EOE == 10
+foo
+bar
+EOI
+foo
+bar
+EOE