From dd02840dcb298a63a7fadd5817a71d020786e95e Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 3 Jun 2018 19:24:59 +0200 Subject: Add SerdStatement --- test/meson.build | 1 + test/test_read_chunk.c | 14 ++---- test/test_reader_writer.c | 16 +++--- test/test_sink.c | 44 ++++++++--------- test/test_statement.c | 121 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 151 insertions(+), 45 deletions(-) create mode 100644 test/test_statement.c (limited to 'test') diff --git a/test/meson.build b/test/meson.build index 692bafe4..57163f23 100644 --- a/test/meson.build +++ b/test/meson.build @@ -13,6 +13,7 @@ unit_tests = [ 'read_chunk', 'reader_writer', 'sink', + 'statement', 'string', 'uri', 'world', diff --git a/test/test_read_chunk.c b/test/test_read_chunk.c index db2c210a..f5ba8d93 100644 --- a/test/test_read_chunk.c +++ b/test/test_read_chunk.c @@ -48,19 +48,13 @@ on_prefix(void* handle, const SerdNode* name, const SerdNode* uri) } static SerdStatus -on_statement(void* const handle, - const SerdStatementFlags flags, - const SerdNode* const graph, - const SerdNode* const subject, - const SerdNode* const predicate, - const SerdNode* const object) +on_statement(void* const handle, + const SerdStatementFlags flags, + const SerdStatement* const statement) { (void)handle; (void)flags; - (void)graph; - (void)subject; - (void)predicate; - (void)object; + (void)statement; ++n_statement; return SERD_SUCCESS; diff --git a/test/test_reader_writer.c b/test/test_reader_writer.c index 9a592c3a..bbec9377 100644 --- a/test/test_reader_writer.c +++ b/test/test_reader_writer.c @@ -25,18 +25,12 @@ #include static SerdStatus -test_sink(void* handle, - SerdStatementFlags flags, - const SerdNode* graph, - const SerdNode* subject, - const SerdNode* predicate, - const SerdNode* object) +test_sink(void* handle, + SerdStatementFlags flags, + const SerdStatement* statement) { (void)flags; - (void)subject; - (void)predicate; - (void)object; - (void)graph; + (void)statement; ++*(size_t*)handle; @@ -163,6 +157,8 @@ test_read_string(void) serd_sink_set_statement_func(sink, test_sink); + serd_sink_set_statement_func(sink, test_sink); + // Test reading a string that ends exactly at the end of input (no newline) assert( !serd_reader_start_string(reader, diff --git a/test/test_sink.c b/test/test_sink.c index 982fc1c9..9f029a10 100644 --- a/test/test_sink.c +++ b/test/test_sink.c @@ -26,15 +26,12 @@ #define NS_EG "http://example.org/" typedef struct { - const SerdNode* last_base; - const SerdNode* last_name; - const SerdNode* last_namespace; - const SerdNode* last_end; - const SerdNode* last_subject; - const SerdNode* last_predicate; - const SerdNode* last_object; - const SerdNode* last_graph; - SerdStatus return_status; + const SerdNode* last_base; + const SerdNode* last_name; + const SerdNode* last_namespace; + const SerdNode* last_end; + const SerdStatement* last_statement; + SerdStatus return_status; } State; static SerdStatus @@ -57,21 +54,15 @@ on_prefix(void* handle, const SerdNode* name, const SerdNode* uri) } static SerdStatus -on_statement(void* handle, - SerdStatementFlags flags, - const SerdNode* const graph, - const SerdNode* const subject, - const SerdNode* const predicate, - const SerdNode* const object) +on_statement(void* handle, + SerdStatementFlags flags, + const SerdStatement* const statement) { (void)flags; State* state = (State*)handle; - state->last_subject = subject; - state->last_predicate = predicate; - state->last_object = object; - state->last_graph = graph; + state->last_statement = statement; return state->return_status; } @@ -93,13 +84,17 @@ test_callbacks(void) SerdNode* const uri = serd_new_uri(SERD_STRING(NS_EG "uri")); SerdNode* const blank = serd_new_blank(SERD_STRING("b1")); SerdEnv* env = serd_env_new(serd_node_string_view(base)); - State state = {0, 0, 0, 0, 0, 0, 0, 0, SERD_SUCCESS}; + State state = {0, 0, 0, 0, 0, SERD_SUCCESS}; + + SerdStatement* const statement = + serd_statement_new(base, uri, blank, NULL, NULL); // Call functions on a sink with no functions set SerdSink* null_sink = serd_sink_new(&state, NULL); assert(!serd_sink_write_base(null_sink, base)); assert(!serd_sink_write_prefix(null_sink, name, uri)); + assert(!serd_sink_write_statement(null_sink, 0, statement)); assert(!serd_sink_write(null_sink, 0, base, uri, blank, NULL)); assert(!serd_sink_write_end(null_sink, blank)); serd_sink_free(null_sink); @@ -119,16 +114,15 @@ test_callbacks(void) assert(serd_node_equals(state.last_name, name)); assert(serd_node_equals(state.last_namespace, uri)); - assert(!serd_sink_write(sink, 0, base, uri, blank, NULL)); - assert(serd_node_equals(state.last_subject, base)); - assert(serd_node_equals(state.last_predicate, uri)); - assert(serd_node_equals(state.last_object, blank)); - assert(!state.last_graph); + assert(!serd_sink_write_statement(sink, 0, statement)); + assert(serd_statement_equals(state.last_statement, statement)); assert(!serd_sink_write_end(sink, blank)); assert(serd_node_equals(state.last_end, blank)); serd_sink_free(sink); + + serd_statement_free(statement); serd_env_free(env); serd_node_free(blank); serd_node_free(uri); diff --git a/test/test_statement.c b/test/test_statement.c new file mode 100644 index 00000000..e4219b68 --- /dev/null +++ b/test/test_statement.c @@ -0,0 +1,121 @@ +/* + Copyright 2011-2020 David Robillard + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#undef NDEBUG + +#include "serd/serd.h" + +#include +#include + +#define NS_EG "http://example.org/" + +static void +test_copy(void) +{ + assert(!serd_statement_copy(NULL)); + + SerdNode* const f = serd_new_string(SERD_STRING("file")); + SerdNode* const s = serd_new_uri(SERD_STRING(NS_EG "s")); + SerdNode* const p = serd_new_uri(SERD_STRING(NS_EG "p")); + SerdNode* const o = serd_new_uri(SERD_STRING(NS_EG "o")); + SerdNode* const g = serd_new_uri(SERD_STRING(NS_EG "g")); + + SerdCaret* const caret = serd_caret_new(f, 1, 1); + SerdStatement* const statement = serd_statement_new(s, p, o, g, caret); + SerdStatement* const copy = serd_statement_copy(statement); + + assert(serd_statement_equals(copy, statement)); + assert(serd_caret_equals(serd_statement_caret(copy), caret)); + + serd_statement_free(copy); + serd_caret_free(caret); + serd_statement_free(statement); + serd_node_free(g); + serd_node_free(o); + serd_node_free(p); + serd_node_free(s); + serd_node_free(f); +} + +static void +test_free(void) +{ + serd_statement_free(NULL); +} + +static void +test_fields(void) +{ + SerdNode* const f = serd_new_string(SERD_STRING("file")); + SerdNode* const s = serd_new_uri(SERD_STRING(NS_EG "s")); + SerdNode* const p = serd_new_uri(SERD_STRING(NS_EG "p")); + SerdNode* const o = serd_new_uri(SERD_STRING(NS_EG "o")); + SerdNode* const g = serd_new_uri(SERD_STRING(NS_EG "g")); + + SerdCaret* const caret = serd_caret_new(f, 1, 1); + SerdStatement* const statement = serd_statement_new(s, p, o, g, caret); + + assert(serd_statement_equals(statement, statement)); + assert(!serd_statement_equals(statement, NULL)); + assert(!serd_statement_equals(NULL, statement)); + + assert(serd_statement_node(statement, SERD_SUBJECT) == s); + assert(serd_statement_node(statement, SERD_PREDICATE) == p); + assert(serd_statement_node(statement, SERD_OBJECT) == o); + assert(serd_statement_node(statement, SERD_GRAPH) == g); + + assert(serd_statement_subject(statement) == s); + assert(serd_statement_predicate(statement) == p); + assert(serd_statement_object(statement) == o); + assert(serd_statement_graph(statement) == g); + assert(serd_statement_caret(statement) != caret); + assert(serd_caret_equals(serd_statement_caret(statement), caret)); + + SerdStatement* const diff_s = serd_statement_new(o, p, o, g, caret); + assert(!serd_statement_equals(statement, diff_s)); + serd_statement_free(diff_s); + + SerdStatement* const diff_p = serd_statement_new(s, o, o, g, caret); + assert(!serd_statement_equals(statement, diff_p)); + serd_statement_free(diff_p); + + SerdStatement* const diff_o = serd_statement_new(s, p, s, g, caret); + assert(!serd_statement_equals(statement, diff_o)); + serd_statement_free(diff_o); + + SerdStatement* const diff_g = serd_statement_new(s, p, o, s, caret); + assert(!serd_statement_equals(statement, diff_g)); + serd_statement_free(diff_g); + + serd_statement_free(statement); + serd_caret_free(caret); + serd_node_free(g); + serd_node_free(o); + serd_node_free(p); + serd_node_free(s); + serd_node_free(f); +} + +int +main(void) +{ + test_copy(); + test_free(); + test_fields(); + + return 0; +} -- cgit v1.2.1