aboutsummaryrefslogtreecommitdiff
path: root/tests/string-parser
diff options
context:
space:
mode:
Diffstat (limited to 'tests/string-parser')
-rw-r--r--tests/string-parser/buildfile7
-rw-r--r--tests/string-parser/driver.cxx93
-rw-r--r--tests/string-parser/testscript42
3 files changed, 142 insertions, 0 deletions
diff --git a/tests/string-parser/buildfile b/tests/string-parser/buildfile
new file mode 100644
index 0000000..9ccf480
--- /dev/null
+++ b/tests/string-parser/buildfile
@@ -0,0 +1,7 @@
+# file : tests/string-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/string-parser/driver.cxx b/tests/string-parser/driver.cxx
new file mode 100644
index 0000000..2aad3a7
--- /dev/null
+++ b/tests/string-parser/driver.cxx
@@ -0,0 +1,93 @@
+// file : tests/string-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 <vector>
+#include <string>
+#include <cassert>
+#include <iostream>
+
+#include <butl/utility> // operator<<(ostream,exception)
+#include <butl/string-parser>
+
+using namespace std;
+using namespace butl;
+
+// Usage: argv[0] [-l] [-u] [-p]
+//
+// Read and parse lines into strings from STDIN and print them to STDOUT.
+//
+// -l output each string on a separate line
+// -u unquote strings
+// -p output positions
+//
+int
+main (int argc, char* argv[])
+try
+{
+ bool spl (false); // Print string per line.
+ bool unquote (false);
+ bool pos (false);
+
+ for (int i (1); i != argc; ++i)
+ {
+ string o (argv[i]);
+
+ if (o == "-l")
+ spl = true;
+ else if (o == "-u")
+ unquote = true;
+ else if (o == "-p")
+ pos = true;
+ else
+ assert (false);
+ }
+
+ // Do not throw when eofbit is set (end of stream reached), and when failbit
+ // is set (getline() failed to extract any character).
+ //
+ cin.exceptions (ios::badbit);
+
+ cout.exceptions (ios::failbit | ios::badbit);
+
+ string l;
+ while (getline (cin, l))
+ {
+ vector<pair<string, size_t>> v (
+ string_parser::parse_quoted_position (l, unquote));
+
+ if (!spl)
+ {
+ for (auto b (v.cbegin ()), i (b), e (v.cend ()); i != e; ++i)
+ {
+ if (i != b)
+ cout << ' ';
+
+ if (pos)
+ cout << i->second << ":";
+
+ cout << i->first;
+ }
+
+ cout << endl;
+ }
+ else
+ {
+ for (const auto& s: v)
+ {
+ if (pos)
+ cout << s.second << ":";
+
+ cout << s.first << endl;
+ }
+ }
+ }
+
+ return 0;
+}
+catch (const invalid_string& e)
+{
+ cerr << e.position << ": " << e << endl;
+ return 1;
+}
diff --git a/tests/string-parser/testscript b/tests/string-parser/testscript
new file mode 100644
index 0000000..83c8346
--- /dev/null
+++ b/tests/string-parser/testscript
@@ -0,0 +1,42 @@
+# file : tests/string-parser/testscript
+# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+: valid
+:
+{
+ test.options += -l
+ sp=' ' # For line-terminating spaces.
+
+ : quoted
+ :
+ {
+ $* -p <<"EOI" >>EOO
+ abc "d 'ef " 'x "y z'$sp
+ EOI
+ 0:abc
+ 5:"d 'ef "
+ 14:'x "y z'
+ EOO
+ }
+
+ : unquoted
+ :
+ {
+ $* -u <<"EOI" >>"EOO"
+ abc "d 'ef " 'x "y z'$sp
+ EOI
+ abc
+ d 'ef$sp
+ x "y z
+ EOO
+ }
+}
+
+: invalid
+:
+{
+ : unterm-quoting
+ :
+ $* <'ab"c' 2>'4: unterminated quoted string' == 1
+}