diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/test_env.c | 317 |
1 files changed, 252 insertions, 65 deletions
diff --git a/test/test_env.c b/test/test_env.c index f258beb6..9e60104d 100644 --- a/test/test_env.c +++ b/test/test_env.c @@ -21,6 +21,8 @@ #include <assert.h> #include <string.h> +#define NS_EG "http://example.org/" + static void test_copy(void) { @@ -62,106 +64,279 @@ test_comparison(void) serd_env_free(env); } -static SerdStatus -count_prefixes(void* handle, const SerdEvent* event) -{ - if (event->type == SERD_PREFIX) { - ++*(int*)handle; - } - - return SERD_SUCCESS; -} - static void -test_env(void) +test_null(void) { - static const SerdStringView prefix = SERD_STRING("eg.2"); - static const SerdStringView eg = SERD_STRING("http://example.org/"); + SerdNode* const eg = serd_new_uri(SERD_STRING(NS_EG)); - SerdNodes* nodes = serd_nodes_new(); + // "Copying" NULL returns null + assert(!serd_env_copy(NULL)); - const SerdNode* hello = serd_nodes_string(nodes, SERD_STRING("hello\"")); - const SerdNode* rel = serd_nodes_uri(nodes, SERD_STRING("rel")); + // Accessors are tolerant to a NULL env for convenience + assert(!serd_env_base_uri(NULL)); + assert(!serd_env_expand(NULL, NULL)); + assert(!serd_env_qualify(NULL, eg)); - const SerdNode* foo_u = - serd_nodes_uri(nodes, SERD_STRING("http://example.org/foo")); + // Only null is equal to null + assert(serd_env_equals(NULL, NULL)); - const SerdNode* foo_c = serd_nodes_curie(nodes, SERD_STRING("eg.2:foo")); - const SerdNode* b = serd_nodes_curie(nodes, SERD_STRING("invalid")); + serd_node_free(eg); +} - SerdEnv* env = serd_env_new(SERD_EMPTY_STRING()); +static SerdStatus +count_prefixes(void* handle, const SerdEvent* event) +{ + *(int*)handle += event->type == SERD_PREFIX; - serd_env_set_prefix(env, prefix, eg); + return SERD_SUCCESS; +} - assert(!serd_env_base_uri(NULL)); - assert(!serd_env_expand(NULL, NULL)); - assert(!serd_env_expand(NULL, foo_c)); - assert(!serd_env_expand(env, NULL)); - assert(!serd_env_qualify(NULL, NULL)); - assert(!serd_env_qualify(env, NULL)); - assert(!serd_env_qualify(NULL, foo_u)); +static void +test_base_uri(void) +{ + SerdEnv* const env = serd_env_new(SERD_EMPTY_STRING()); + SerdNode* const eg = serd_new_uri(SERD_STRING(NS_EG)); + // Test that invalid calls work as expected assert(!serd_env_base_uri(env)); assert(!serd_env_set_base_uri(env, SERD_EMPTY_STRING())); assert(!serd_env_base_uri(env)); - serd_env_set_prefix( - env, SERD_STRING("eg.2"), SERD_STRING("http://example.org/")); - + // Try setting a relative prefix with no base URI assert(serd_env_set_prefix(env, SERD_STRING("eg.3"), SERD_STRING("rel")) == SERD_ERR_BAD_ARG); - SerdNode* xnode = serd_env_expand(env, hello); - assert(!xnode); - - assert(!serd_env_expand(env, b)); - assert(!serd_env_expand(env, hello)); + // Set a valid base URI + assert(!serd_env_set_base_uri(env, serd_node_string_view(eg))); + assert(serd_node_equals(serd_env_base_uri(env), eg)); + // Reset the base URI assert(!serd_env_set_base_uri(env, SERD_EMPTY_STRING())); + assert(!serd_env_base_uri(env)); - SerdNode* xu = serd_env_expand(env, foo_c); - assert(!strcmp(serd_node_string(xu), "http://example.org/foo")); - serd_node_free(xu); + serd_env_free(env); + serd_node_free(eg); +} - const SerdNode* badpre = serd_nodes_curie(nodes, SERD_STRING("hm:what")); - SerdNode* xbadpre = serd_env_expand(env, badpre); - assert(!xbadpre); +static void +test_set_prefix(void) +{ + static const SerdStringView eg = SERD_STRING(NS_EG); + static const SerdStringView name1 = SERD_STRING("eg.1"); + static const SerdStringView name2 = SERD_STRING("eg.2"); + static const SerdStringView rel = SERD_STRING("rel"); + static const SerdStringView base = SERD_STRING("http://example.org/"); - SerdNode* xc = serd_env_expand(env, foo_c); - assert(serd_node_equals(xc, foo_u)); - serd_node_free(xc); + SerdEnv* const env = serd_env_new(SERD_EMPTY_STRING()); - const SerdNode* blank = serd_nodes_blank(nodes, SERD_STRING("b1")); - assert(!serd_env_expand(env, blank)); + // Set a valid prefix + assert(!serd_env_set_prefix(env, name1, eg)); + + // Test setting a prefix from a relative URI + assert(serd_env_set_prefix(env, name2, rel) == SERD_ERR_BAD_ARG); + assert(!serd_env_set_base_uri(env, base)); + assert(!serd_env_set_prefix(env, name2, rel)); + + // Test setting a prefix from strings + assert(!serd_env_set_prefix( + env, SERD_STRING("eg.3"), SERD_STRING("http://example.org/three"))); size_t n_prefixes = 0; SerdSink* const count_prefixes_sink = serd_sink_new(&n_prefixes, count_prefixes, NULL); - serd_env_set_prefix(env, prefix, eg); serd_env_write_prefixes(env, count_prefixes_sink); - assert(n_prefixes == 1); + serd_sink_free(count_prefixes_sink); + assert(n_prefixes == 3); + + serd_env_free(env); +} + +static void +test_expand_untyped_literal(void) +{ + SerdNode* const untyped = serd_new_string(SERD_STRING("data")); + SerdEnv* const env = serd_env_new(SERD_EMPTY_STRING()); - SerdNode* qualified = serd_env_qualify(env, foo_u); - assert(serd_node_equals(qualified, foo_c)); - serd_node_free(qualified); + assert(!serd_env_expand(env, untyped)); - const SerdNode* unqualifiable = - serd_nodes_uri(nodes, SERD_STRING("http://drobilla.net/")); + serd_env_free(env); + serd_node_free(untyped); +} - assert(!serd_env_qualify(env, unqualifiable)); +static void +test_expand_bad_uri_datatype(void) +{ + static const SerdStringView type = SERD_STRING("Type"); - assert(!serd_env_expand(env, rel)); - serd_env_set_base_uri(env, SERD_STRING("http://example.org/base/")); - SerdNode* xrel = serd_env_expand(env, rel); - assert(xrel); - assert(!strcmp(serd_node_string(xrel), "http://example.org/base/rel")); - serd_node_free(xrel); + SerdNode* const typed = serd_new_typed_literal(SERD_STRING("data"), type); + SerdEnv* const env = serd_env_new(SERD_EMPTY_STRING()); - serd_sink_free(count_prefixes_sink); - serd_nodes_free(nodes); + assert(!serd_env_expand(env, typed)); serd_env_free(env); + serd_node_free(typed); +} + +static void +test_expand_uri(void) +{ + static const SerdStringView base = SERD_STRING("http://example.org/b/"); + + SerdEnv* const env = serd_env_new(base); + SerdNode* const rel = serd_new_uri(SERD_STRING("rel")); + SerdNode* const rel_out = serd_env_expand(env, rel); + SerdNode* const empty = serd_new_uri(SERD_EMPTY_STRING()); + SerdNode* const empty_out = serd_env_expand(env, empty); + + assert(!strcmp(serd_node_string(rel_out), "http://example.org/b/rel")); + assert(!strcmp(serd_node_string(empty_out), "http://example.org/b/")); + + serd_node_free(empty_out); + serd_node_free(empty); + serd_node_free(rel_out); + serd_node_free(rel); + serd_env_free(env); +} + +static void +test_expand_empty_uri_ref(void) +{ + static const SerdStringView base = SERD_STRING("http://example.org/b/"); + + SerdNode* const rel = serd_new_uri(SERD_STRING("rel")); + SerdEnv* const env = serd_env_new(base); + SerdNode* const rel_out = serd_env_expand(env, rel); + + assert(!strcmp(serd_node_string(rel_out), "http://example.org/b/rel")); + serd_node_free(rel_out); + + serd_env_free(env); + serd_node_free(rel); +} + +static void +test_expand_bad_uri(void) +{ + SerdNode* const bad_uri = serd_new_uri(SERD_STRING("rel")); + SerdEnv* const env = serd_env_new(SERD_EMPTY_STRING()); + + assert(!serd_env_expand(env, bad_uri)); + + serd_env_free(env); + serd_node_free(bad_uri); +} + +static void +test_expand_curie(void) +{ + static const SerdStringView name = SERD_STRING("eg.1"); + static const SerdStringView eg = SERD_STRING(NS_EG); + + SerdNode* const curie = serd_new_curie(SERD_STRING("eg.1:foo")); + SerdEnv* const env = serd_env_new(SERD_EMPTY_STRING()); + + assert(!serd_env_set_prefix(env, name, eg)); + + SerdNode* const curie_out = serd_env_expand(env, curie); + assert(curie_out); + assert(!strcmp(serd_node_string(curie_out), "http://example.org/foo")); + serd_node_free(curie_out); + + serd_env_free(env); + serd_node_free(curie); +} + +static void +test_expand_bad_curie(void) +{ + SerdNode* const curie = serd_new_curie(SERD_STRING("eg.1:foo")); + SerdEnv* const env = serd_env_new(SERD_EMPTY_STRING()); + + assert(!serd_env_expand(env, curie)); + + serd_env_free(env); + serd_node_free(curie); +} + +static void +test_expand_blank(void) +{ + SerdNode* const blank = serd_new_blank(SERD_STRING("b1")); + SerdEnv* const env = serd_env_new(SERD_EMPTY_STRING()); + + assert(!serd_env_expand(env, blank)); + + serd_env_free(env); + serd_node_free(blank); +} + +static void +test_qualify(void) +{ + static const SerdStringView eg = SERD_STRING(NS_EG); + + SerdNodes* const nodes = serd_nodes_new(); + + const SerdNode* const name = serd_nodes_string(nodes, SERD_STRING("eg")); + const SerdNode* const c1 = serd_nodes_curie(nodes, SERD_STRING("eg:foo")); + + const SerdNode* const u1 = + serd_nodes_uri(nodes, SERD_STRING("http://example.org/foo")); + + const SerdNode* const u2 = + serd_nodes_uri(nodes, SERD_STRING("http://drobilla.net/bar")); + + SerdEnv* const env = serd_env_new(SERD_EMPTY_STRING()); + + assert(!serd_env_set_prefix(env, serd_node_string_view(name), eg)); + + assert(!serd_env_expand(env, name)); + + SerdNode* const u1_out = serd_env_qualify(env, u1); + assert(serd_node_equals(u1_out, c1)); + serd_node_free(u1_out); + + assert(!serd_env_qualify(env, u2)); + + serd_env_free(env); + serd_nodes_free(nodes); +} + +static void +test_equals(void) +{ + static const SerdStringView name1 = SERD_STRING("n1"); + static const SerdStringView base1 = SERD_STRING(NS_EG "b1/"); + static const SerdStringView base2 = SERD_STRING(NS_EG "b2/"); + + SerdEnv* const env1 = serd_env_new(base1); + SerdEnv* const env2 = serd_env_new(base2); + + assert(!serd_env_equals(env1, NULL)); + assert(!serd_env_equals(NULL, env1)); + assert(serd_env_equals(NULL, NULL)); + assert(!serd_env_equals(env1, env2)); + + serd_env_set_base_uri(env2, base1); + assert(serd_env_equals(env1, env2)); + + assert(!serd_env_set_prefix(env1, name1, SERD_STRING(NS_EG "n1"))); + assert(!serd_env_equals(env1, env2)); + assert(!serd_env_set_prefix(env2, name1, SERD_STRING(NS_EG "othern1"))); + assert(!serd_env_equals(env1, env2)); + assert(!serd_env_set_prefix(env2, name1, SERD_STRING(NS_EG "n1"))); + assert(serd_env_equals(env1, env2)); + + serd_env_set_base_uri(env2, base2); + assert(!serd_env_equals(env1, env2)); + + SerdEnv* const env3 = serd_env_copy(env2); + assert(serd_env_equals(env3, env2)); + serd_env_free(env3); + + serd_env_free(env1); + serd_env_free(env2); } int @@ -169,6 +344,18 @@ main(void) { test_copy(); test_comparison(); - test_env(); + test_null(); + test_base_uri(); + test_set_prefix(); + test_expand_untyped_literal(); + test_expand_bad_uri_datatype(); + test_expand_uri(); + test_expand_empty_uri_ref(); + test_expand_bad_uri(); + test_expand_curie(); + test_expand_bad_curie(); + test_expand_blank(); + test_qualify(); + test_equals(); return 0; } |