aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2017-03-31 23:29:49 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2017-04-04 13:28:18 +0300
commitd53c8a6ce3d868da66d97a9243365e88d0879343 (patch)
tree7d1268f62808f706c3a4d5631456afb4cbe24fb2 /tests
parentf4f30ed51b9bcd84cf25b601fab0a0064aae7af8 (diff)
Add tab_parser
Diffstat (limited to 'tests')
-rw-r--r--tests/tab-parser/buildfile7
-rw-r--r--tests/tab-parser/driver.cxx67
-rw-r--r--tests/tab-parser/testscript49
3 files changed, 123 insertions, 0 deletions
diff --git a/tests/tab-parser/buildfile b/tests/tab-parser/buildfile
new file mode 100644
index 0000000..4afb691
--- /dev/null
+++ b/tests/tab-parser/buildfile
@@ -0,0 +1,7 @@
+# file : tests/tab-parser/buildfile
+# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+exe{driver}: cxx{driver} ../../butl/lib{butl} test{testscript}
+
+include ../../butl/
diff --git a/tests/tab-parser/driver.cxx b/tests/tab-parser/driver.cxx
new file mode 100644
index 0000000..8b0cc4d
--- /dev/null
+++ b/tests/tab-parser/driver.cxx
@@ -0,0 +1,67 @@
+// file : tests/tab-parser/driver.cxx -*- C++ -*-
+// copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+// license : MIT; see accompanying LICENSE file
+
+#include <ios> // ios::failbit, ios::badbit
+#include <cassert>
+#include <iostream>
+
+#include <butl/utility> // operator<<(ostream,exception)
+#include <butl/tab-parser>
+
+using namespace std;
+using namespace butl;
+
+// Usage: argv[0] [-l]
+//
+// Read and parse tab-file from STDIN and print fields to STDOUT.
+//
+// -l output each field on a separate line
+//
+int
+main (int argc, char* argv[])
+try
+{
+ assert (argc <= 2);
+ bool fpl (false); // Print field per line.
+
+ if (argc == 2)
+ {
+ assert (argv[1] == string ("-l"));
+ fpl = true;
+ }
+
+ cin.exceptions (ios::failbit | ios::badbit);
+ cout.exceptions (ios::failbit | ios::badbit);
+
+ tab_fields tl;
+ tab_parser parser (cin, "cin");
+
+ while (!(tl = parser.next ()).empty ())
+ {
+ if (!fpl)
+ {
+ for (auto b (tl.cbegin ()), i (b), e (tl.cend ()); i != e; ++i)
+ {
+ if (i != b)
+ cout << ' ';
+
+ cout << i->value;
+ }
+
+ cout << '\n';
+ }
+ else
+ {
+ for (const auto& tf: tl)
+ cout << tf.value << '\n';
+ }
+ }
+
+ return 0;
+}
+catch (const tab_parsing& e)
+{
+ cerr << e << endl;
+ return 1;
+}
diff --git a/tests/tab-parser/testscript b/tests/tab-parser/testscript
new file mode 100644
index 0000000..1b0a816
--- /dev/null
+++ b/tests/tab-parser/testscript
@@ -0,0 +1,49 @@
+# file : tests/tab-parser/testscript
+# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+: valid
+:
+: Roundtrip tab-files.
+:
+{
+ : newline-term
+ :
+ $* <<EOF >>EOF
+ abc
+ def xyz
+ fff
+ EOF
+
+ : eos-term
+ :
+ $* <:'abc' >'abc'
+
+ : empty-lines
+ :
+ $* <<EOI >'def'
+ # abc
+
+ # abc
+ def
+
+ EOI
+
+ : quoting
+ :
+ $* -l <<EOI >>EOO
+ def k" l'"'m n"' xyz
+ EOI
+ def
+ k" l'"'m n"'
+ xyz
+ EOO
+}
+
+: invalid
+:
+{
+ : unterm-quoting
+ :
+ $* <'ab"c' 2>'cin:1:5: error: unterminated quoted string' == 1
+}