From 5878f2aeb5e069947761e0c9629b7741b63d78f9 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 10 Mar 2019 22:50:31 +0100 Subject: WIP: Add support for writing terse collections --- tests/terse_write_test.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 tests/terse_write_test.c (limited to 'tests') diff --git a/tests/terse_write_test.c b/tests/terse_write_test.c new file mode 100644 index 00000000..28fc39ac --- /dev/null +++ b/tests/terse_write_test.c @@ -0,0 +1,109 @@ +/* + Copyright 2019 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 +#include +#include + +#define NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#" + +static void +check_output(SerdWriter* writer, SerdBuffer* buffer, const char* expected) +{ + serd_writer_finish(writer); + serd_buffer_sink_finish(buffer); + + const char* output = (const char*)buffer->buf; + const int valid = !strcmp(output, expected); + if (valid) { + fprintf(stderr, "%s", output); + } else { + fprintf(stderr, "error: Invalid output:\n%s", output); + fprintf(stderr, "note: Expected output:\n%s", expected); + } + assert(valid); + buffer->len = 0; +} + +static int +test(void) +{ + SerdBuffer buffer = { NULL, 0 }; + SerdWorld* world = serd_world_new(); + SerdEnv* env = serd_env_new(NULL); + SerdNodes* nodes = serd_nodes_new(); + const SerdNode* b1 = serd_new_blank("b1"); + const SerdNode* l1 = serd_new_blank("l1"); + const SerdNode* l2 = serd_new_blank("l2"); + const SerdNode* s1 = serd_new_string("s1"); + const SerdNode* s2 = serd_new_string("s2"); + const SerdNode* rdf_first = serd_new_uri(NS_RDF "first"); + const SerdNode* rdf_rest = serd_new_uri(NS_RDF "rest"); + const SerdNode* rdf_nil = serd_new_uri(NS_RDF "nil"); + const SerdNode* rdf_value = serd_new_uri(NS_RDF "value"); + + serd_env_set_prefix_from_strings(env, "rdf", NS_RDF); + + SerdWriter* writer = serd_writer_new(world, + SERD_TURTLE, + 0, + env, + (SerdWriteFunc)serd_buffer_sink, + &buffer); + + const SerdSink* sink = serd_writer_get_sink(writer); + + // Simple lone list + serd_sink_write(sink, SERD_TERSE_S | SERD_LIST_S, l1, rdf_first, s1, NULL); + serd_sink_write(sink, 0, l1, rdf_rest, l2, NULL); + serd_sink_write(sink, 0, l2, rdf_first, s2, NULL); + serd_sink_write(sink, 0, l2, rdf_rest, rdf_nil, NULL); + check_output(writer, &buffer, "( \"s1\" \"s2\" ) .\n"); + + // Nested terse lists + serd_sink_write(sink, SERD_TERSE_S|SERD_LIST_S|SERD_TERSE_O|SERD_LIST_O, + l1, rdf_first, l2, NULL); + serd_sink_write(sink, 0, l2, rdf_first, s1, NULL); + serd_sink_write(sink, 0, l1, rdf_rest, rdf_nil, NULL); + serd_sink_write(sink, 0, l2, rdf_rest, rdf_nil, NULL); + check_output(writer, &buffer, "( ( \"s1\" ) ) .\n"); + + // List as object + serd_sink_write(sink, SERD_EMPTY_S|SERD_LIST_O|SERD_TERSE_O, + b1, rdf_value, l1, NULL); + serd_sink_write(sink, 0, l1, rdf_first, s1, NULL); + serd_sink_write(sink, 0, l1, rdf_rest, l2, NULL); + serd_sink_write(sink, 0, l2, rdf_first, s2, NULL); + serd_sink_write(sink, 0, l2, rdf_rest, rdf_nil, NULL); + check_output(writer, &buffer, "[]\n\trdf:value ( \"s1\" \"s2\" ) .\n"); + + serd_buffer_sink_finish(&buffer); + serd_nodes_free(nodes); + serd_writer_free(writer); + + return 0; +} + +int +main(void) +{ + return test(); +} -- cgit v1.2.1