On Friday 31 October 2014 18:18:15 mzatko(a)redhat.com wrote:
+#testquoting_LDADD = $(top_builddir)/fish/rl.o
Make sure to not leave commented stuff around.
+# testquoting_CFLAGS = -I$(top_srcdir)
Ditto.
diff --git a/fish/test/testquoting.c b/fish/test/testquoting.c
new file mode 100644
index 0000000..b0b525b
--- /dev/null
+++ b/fish/test/testquoting.c
@@ -0,0 +1,120 @@
+#include <config.h>
Missing copyright/license block here.
+#include <stdlib.h>
+#include <stdio.h>
+#include <memory.h>
memory.h is not needed here.
+#include <guestfs.h>
+#include <guestfs-internal-frontend.h>
+#include <rl.h>
Prefer the "..." form for these.
+int
+eq_bracket (char *(*fn)(char*), char * in, char * out)
+{
+ char * q = fn(in);
+ return (q != NULL) && STREQ(q, out);
While it's just a test, make sure to free 'q' here; this eases
debugging with valgrind for memory leaks in the non-test code.
Also 'out' can be const, since it is passed as const buffer.
+int
+test_empty_escape (void)
+{
+ return eq_bracket(bs_escape_filename, "", "");
+}
+
+int
+test_empty_unescape (void)
+{
+ return eq_bracket(bs_unescape_filename, "", "");
+}
+
+int
+test_singlespace_escape (void)
+{
+ return eq_bracket(bs_escape_filename, " ", "\\ ");
+}
+
+int
+test_singlespace_unescape (void)
+{
+ return eq_bracket(bs_unescape_filename, "\\ ", " ");
+}
+
+int
+test_singleword_escape (void)
+{
+ return eq_bracket(bs_escape_filename, "singleword",
"singleword");
+}
+
+int
+test_singleword_unescape (void)
+{
+ return eq_bracket(bs_unescape_filename, "singleword",
"singleword"); +}
+
+int
+test_multiword_escape (void)
+{
+ return eq_bracket(bs_escape_filename, "more than one word\n",
"more\\ than\\ one\\ word\\n"); +}
+
+int
+test_nonprinting_escape (void)
+{
+ return eq_bracket(bs_escape_filename, "\xac\xec\x8",
"\\xac\\xec\\b"); +}
+
+int
+test_multiword_unescape (void)
+{
+ return eq_bracket(bs_unescape_filename, "more\\ than\\ one\\ word",
"more than one word"); +}
+
+int
+test_nonprinting_unescape (void)
+{
+ return eq_bracket(bs_unescape_filename, "\\xac\\xec\\b",
"\xac\xec\b"); +}
+
+
+
+struct test_t {
+ char *name;
+ int (*fn)(void);
+ int expect;
+};
Hmm there's lot of repetition in the code above; what about providing
the tests in a structure? Something like:
struct string_test_data {
const char *in;
const char *out;
int pass;
}
struct string_test_data escape_tests[] = {
{ "", "", 1 },
{ " ", "\\ ", 1 },
...
}
size_t nr_escape_tests = sizeof(escape_tests) / sizeof(*escape_tests);
(ditto for unescape tests)
then do two iterations, for escape_tests and unescape_tests.
+int
+main (int argc, char *argv[])
+{
+ int nr_failed = 0; // failed test count
+ setbuf(stdout, NULL);
No need to explicitly unbuffer stdout.
+ for (int i = 0; i < nr_tests; i++) {
+ fprintf(stdout, "%s: ", tests[i].name);
+ int r = tests[i].fn() == tests[i].expect;
+ fprintf(stdout, "%s\n", r ? "PASS" : "FAIL");
+ nr_failed += !r;
Just add nr_failed by 1, so the return value of the comparison can
change without affecting the count of failed tests.
--
Pino Toscano