From b2effabfc5d02bab56bae00e7aa138a42bd7d3b6 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 25 Dec 2011 02:13:27 +0000 Subject: 100% test coverage. git-svn-id: http://svn.drobilla.net/serd/trunk@276 490d8e77-9747-427b-9fa3-0b8f29cee8a0 --- tests/bad-blank.ttl | 3 + tests/bad-eof-in-escape.ttl | 3 + tests/bad-eof-in-triple-quote.ttl | 3 + tests/bad-escape.ttl | 2 +- tests/bad-hex-escape.ttl | 1 + tests/bad-prefix.ttl | 1 + tests/bad-uri-escape.ttl | 1 + tests/serd_test.c | 173 +++++++++++++++++++++++++++++++++++++- tests/test-bad-utf8.out | 1 + tests/test-bad-utf8.ttl | 1 + tests/test-escapes.out | 2 + tests/test-escapes.ttl | 2 + tests/test-semi-dot.out | 1 + tests/test-semi-dot.ttl | 1 + 14 files changed, 193 insertions(+), 2 deletions(-) create mode 100644 tests/bad-blank.ttl create mode 100644 tests/bad-eof-in-escape.ttl create mode 100644 tests/bad-eof-in-triple-quote.ttl create mode 100644 tests/bad-hex-escape.ttl create mode 100644 tests/bad-prefix.ttl create mode 100644 tests/bad-uri-escape.ttl create mode 100644 tests/test-escapes.out create mode 100644 tests/test-escapes.ttl create mode 100644 tests/test-semi-dot.out create mode 100644 tests/test-semi-dot.ttl (limited to 'tests') diff --git a/tests/bad-blank.ttl b/tests/bad-blank.ttl new file mode 100644 index 00000000..a6543f2d --- /dev/null +++ b/tests/bad-blank.ttl @@ -0,0 +1,3 @@ +@prefix eg: . + +_:.bad a eg:Thing . \ No newline at end of file diff --git a/tests/bad-eof-in-escape.ttl b/tests/bad-eof-in-escape.ttl new file mode 100644 index 00000000..d60acd15 --- /dev/null +++ b/tests/bad-eof-in-escape.ttl @@ -0,0 +1,3 @@ +@prefix eg: . + +<> eg:comment """Hello"" \ No newline at end of file diff --git a/tests/bad-eof-in-triple-quote.ttl b/tests/bad-eof-in-triple-quote.ttl new file mode 100644 index 00000000..d60acd15 --- /dev/null +++ b/tests/bad-eof-in-triple-quote.ttl @@ -0,0 +1,3 @@ +@prefix eg: . + +<> eg:comment """Hello"" \ No newline at end of file diff --git a/tests/bad-escape.ttl b/tests/bad-escape.ttl index 0fd6c5bf..c03f395f 100644 --- a/tests/bad-escape.ttl +++ b/tests/bad-escape.ttl @@ -1 +1 @@ - "\!" . + """\!""" . diff --git a/tests/bad-hex-escape.ttl b/tests/bad-hex-escape.ttl new file mode 100644 index 00000000..ba6ff5b9 --- /dev/null +++ b/tests/bad-hex-escape.ttl @@ -0,0 +1 @@ + "\UFFFFFFFF" . diff --git a/tests/bad-prefix.ttl b/tests/bad-prefix.ttl new file mode 100644 index 00000000..6c286355 --- /dev/null +++ b/tests/bad-prefix.ttl @@ -0,0 +1 @@ +@prefix _invalid . diff --git a/tests/bad-uri-escape.ttl b/tests/bad-uri-escape.ttl new file mode 100644 index 00000000..16c63754 --- /dev/null +++ b/tests/bad-uri-escape.ttl @@ -0,0 +1 @@ + . diff --git a/tests/serd_test.c b/tests/serd_test.c index c5c650da..aca88127 100644 --- a/tests/serd_test.c +++ b/tests/serd_test.c @@ -16,11 +16,14 @@ #include #include +#include #include #include #include "serd/serd.h" +#define USTR(s) ((const uint8_t*)(s)) + static bool test_strtod(double dbl, double max_delta) { @@ -39,6 +42,27 @@ test_strtod(double dbl, double max_delta) return true; } +static SerdStatus +count_prefixes(void* handle, const SerdNode* name, const SerdNode* uri) +{ + ++*(int*)handle; + return SERD_SUCCESS; +} + +static SerdStatus +count_statements(void* handle, + SerdStatementFlags flags, + const SerdNode* graph, + const SerdNode* subject, + const SerdNode* predicate, + const SerdNode* object, + const SerdNode* object_datatype, + const SerdNode* object_lang) +{ + ++*(int*)handle; + return SERD_SUCCESS; +} + int main() { @@ -186,7 +210,154 @@ main() node.buf, node.n_bytes, node.n_chars, node.flags, node.type); return 1; } - + + // Test SerdEnv + + SerdNode u = serd_node_from_string(SERD_URI, USTR("http://example.org/foo")); + SerdNode b = serd_node_from_string(SERD_CURIE, USTR("invalid")); + SerdNode c = serd_node_from_string(SERD_CURIE, USTR("eg:b")); + SerdEnv* env = serd_env_new(NULL); + serd_env_set_prefix_from_strings(env, USTR("eg"), USTR("http://example.org/")); + + SerdChunk prefix, suffix; + if (!serd_env_expand(env, &b, &prefix, &suffix)) { + fprintf(stderr, "Expanded invalid curie %s\n", b.buf); + return 1; + } + + SerdNode xu = serd_env_expand_node(env, &u); + if (strcmp((const char*)xu.buf, "http://example.org/foo")) { + fprintf(stderr, "Expanded %s to %s\n", c.buf, xu.buf); + return 1; + } + serd_node_free(&xu); + + SerdNode xc = serd_env_expand_node(env, &c); + if (strcmp((const char*)xc.buf, "http://example.org/b")) { + fprintf(stderr, "Expanded %s to %s\n", c.buf, xc.buf); + return 1; + } + serd_node_free(&xc); + + if (!serd_env_set_prefix(env, &SERD_NODE_NULL, &SERD_NODE_NULL)) { + fprintf(stderr, "Set NULL prefix\n"); + return 1; + } + + const SerdNode lit = serd_node_from_string(SERD_LITERAL, USTR("hello")); + if (!serd_env_set_prefix(env, &b, &lit)) { + fprintf(stderr, "Set prefix to literal\n"); + return 1; + } + + int n_prefixes = 0; + serd_env_set_prefix_from_strings(env, USTR("eg"), USTR("http://example.org/")); + serd_env_foreach(env, count_prefixes, &n_prefixes); + if (n_prefixes != 1) { + fprintf(stderr, "Bad prefix count %d\n", n_prefixes); + return 1; + } + + // Test SerdReader and SerdWriter + + const char* path = tmpnam(NULL); + FILE* fd = fopen(path, "w"); + if (!fd) { + fprintf(stderr, "Failed to open file %s\n", path); + return 1; + } + + int* n_statements = malloc(sizeof(int)); + *n_statements = 0; + + SerdWriter* writer = serd_writer_new( + SERD_TURTLE, 0, env, NULL, serd_file_sink, fd); + if (!writer) { + fprintf(stderr, "Failed to create writer\n"); + return 1; + } + + if (!serd_writer_end_anon(writer, NULL)) { + fprintf(stderr, "Ended non-existent anonymous node\n"); + return 1; + } + + uint8_t buf[] = { 0x80, 0, 0, 0, 0 }; + SerdNode s = serd_node_from_string(SERD_URI, USTR("")); + SerdNode p = serd_node_from_string(SERD_URI, USTR("http://example.org/pred")); + SerdNode o = serd_node_from_string(SERD_LITERAL, buf); + + // Write 3 invalid statements (should write nothing) + if (!serd_writer_write_statement(writer, 0, NULL, + &s, &p, NULL, NULL, NULL)) { + fprintf(stderr, "Successfully wrote junk statement 1\n"); + return 1; + } + if (!serd_writer_write_statement(writer, 0, NULL, + &s, &p, &SERD_NODE_NULL, NULL, NULL)) { + fprintf(stderr, "Successfully wrote junk statement 1\n"); + return 1; + } + if (!serd_writer_write_statement(writer, 0, NULL, + &s, &o, &o, NULL, NULL)) { + fprintf(stderr, "Successfully wrote junk statement 3\n"); + return 1; + } + + // Write 1 statement with bad UTF-8 (should be replaced) + if (serd_writer_write_statement(writer, 0, NULL, + &s, &p, &o, NULL, NULL)) { + fprintf(stderr, "Failed to write junk UTF-8\n"); + return 1; + } + + // Write 1 valid statement + o = serd_node_from_string(SERD_LITERAL, USTR("hello")); + if (serd_writer_write_statement(writer, 0, NULL, + &s, &p, &o, NULL, NULL)) { + fprintf(stderr, "Failed to write valid statement\n"); + return 1; + } + + serd_writer_free(writer); + fseek(fd, 0, SEEK_SET); + + SerdReader* reader = serd_reader_new( + SERD_TURTLE, n_statements, free, + NULL, NULL, count_statements, NULL); + if (!reader) { + fprintf(stderr, "Failed to create reader\n"); + return 1; + } + if (serd_reader_get_handle(reader) != n_statements) { + fprintf(stderr, "Corrupt reader handle\n"); + return 1; + } + + if (!serd_reader_read_file(reader, USTR("http://notafile"))) { + fprintf(stderr, "Apparently read an http URI\n"); + return 1; + } + if (!serd_reader_read_file(reader, USTR("file:///better/not/exist"))) { + fprintf(stderr, "Apprently read a non-existent file\n"); + return 1; + } + SerdStatus st = serd_reader_read_file(reader, USTR(path)); + if (st) { + fprintf(stderr, "Error reading file (%s)\n", serd_strerror(st)); + return 1; + } + + if (*n_statements != 2) { + fprintf(stderr, "Bad statement count %d\n", *n_statements); + return 1; + } + + serd_reader_free(reader); + fclose(fd); + + serd_env_free(env); + printf("Success\n"); return 0; } diff --git a/tests/test-bad-utf8.out b/tests/test-bad-utf8.out index df2ada0d..6d73993d 100644 --- a/tests/test-bad-utf8.out +++ b/tests/test-bad-utf8.out @@ -1,2 +1,3 @@ "Impossible bytes: \uFFFD \uFFFD" . "2 continuation bytes: \uFFFD" . + "Missing continuation: \uFFFD" . diff --git a/tests/test-bad-utf8.ttl b/tests/test-bad-utf8.ttl index e3c9ae81..2c105f5b 100644 --- a/tests/test-bad-utf8.ttl +++ b/tests/test-bad-utf8.ttl @@ -1,2 +1,3 @@ "Impossible bytes: þ ÿ" . "2 continuation bytes: €¿" . + "Missing continuation: À" . diff --git a/tests/test-escapes.out b/tests/test-escapes.out new file mode 100644 index 00000000..725b832c --- /dev/null +++ b/tests/test-escapes.out @@ -0,0 +1,2 @@ + "\\\r\n\t" . + . diff --git a/tests/test-escapes.ttl b/tests/test-escapes.ttl new file mode 100644 index 00000000..ff306b15 --- /dev/null +++ b/tests/test-escapes.ttl @@ -0,0 +1,2 @@ + "\\\r\n\t" . + > . \ No newline at end of file diff --git a/tests/test-semi-dot.out b/tests/test-semi-dot.out new file mode 100644 index 00000000..aea1655b --- /dev/null +++ b/tests/test-semi-dot.out @@ -0,0 +1 @@ + . diff --git a/tests/test-semi-dot.ttl b/tests/test-semi-dot.ttl new file mode 100644 index 00000000..6d4b4146 --- /dev/null +++ b/tests/test-semi-dot.ttl @@ -0,0 +1 @@ + a ; . \ No newline at end of file -- cgit v1.2.1