diff options
author | David Robillard <d@drobilla.net> | 2017-12-25 15:14:53 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2019-05-25 11:23:42 +0200 |
commit | bcd7eefa9dc3a55c162c9b701acddd1dee80ce9f (patch) | |
tree | 6019fd181cbd2074708381b33ba6c368b5042082 | |
parent | 6a749755545dfa24d219a109d9df430095bc2a6f (diff) | |
download | serd-jsonld.tar.gz serd-jsonld.tar.bz2 serd-jsonld.zip |
WIP: JSONjsonld
-rw-r--r-- | serd/serd.h | 8 | ||||
-rw-r--r-- | src/jsonld.c | 741 | ||||
-rw-r--r-- | src/reader.c | 6 | ||||
-rw-r--r-- | src/serd_internal.h | 9 | ||||
-rw-r--r-- | src/serdi.c | 5 | ||||
-rw-r--r-- | src/writer.c | 3 | ||||
-rw-r--r-- | tests/JSONLDTests/manifest.ttl | 1584 | ||||
-rw-r--r-- | wscript | 14 |
8 files changed, 1569 insertions, 801 deletions
diff --git a/serd/serd.h b/serd/serd.h index 9eb4dda2..11ce7b4f 100644 --- a/serd/serd.h +++ b/serd/serd.h @@ -121,7 +121,13 @@ typedef enum { TriG - Terse RDF quads (UTF-8). @see <a href="https://www.w3.org/TR/trig/">Trig</a> */ - SERD_TRIG = 4 + SERD_TRIG = 4, + + /** + JSON-LD - JSON-based Linked Data (UTF-8). + @see <a href="https://json-ld.org/spec/latest/json-ld/">JSON-LD</a> + */ + SERD_JSONLD = 5 } SerdSyntax; /** diff --git a/src/jsonld.c b/src/jsonld.c new file mode 100644 index 00000000..f5d4c81a --- /dev/null +++ b/src/jsonld.c @@ -0,0 +1,741 @@ +/* + Copyright 2011-2017 David Robillard <http://drobilla.net> + + 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. +*/ + +#include "serd_internal.h" + +#include "reader.h" + +static SerdStatus read_object(SerdReader* reader, + ReadContext ctx, + Ref* dest, + Ref* datatype, + Ref* lang); + +static SerdStatus read_array(SerdReader* reader, ReadContext ctx, Ref* dest); + +static SerdStatus +read_term(SerdReader* const reader, + const char* const term, + const unsigned len, + Ref* dest) +{ + *dest = push_node(reader, SERD_LITERAL, "", 0); + + SerdStatus st; + for (unsigned i = 0; i < len; ++i) { + const char c = eat_byte(reader); + if (!c || c != term[i]) { + return SERD_ERR_BAD_SYNTAX; + } else if ((st = push_byte(reader, *dest, c))) { + return st; + } + } + + return SERD_SUCCESS; +} + +static SerdStatus +read_hex(SerdReader* const reader, const Ref dest) +{ + SerdStatus st; + if (!(st = push_byte(reader, dest, eat_byte(reader)))) { + for (unsigned i = 0; i < 4; ++i) { + if (!is_xdigit(peek_byte(reader))) { + return SERD_ERR_BAD_SYNTAX; + } + push_byte(reader, dest, eat_byte(reader)); + } + } + return st; +} + +static SerdStatus +read_escape(SerdReader* const reader, const Ref dest) +{ + switch (peek_byte(reader)) { + case '\"': + case '/': + case '\\': + case 'b': + case 'f': + case 'n': + case 'r': + case 't': return push_byte(reader, dest, eat_byte(reader)); + case 'u': return read_hex(reader, dest); + default: return SERD_ERR_BAD_SYNTAX; + } +} + +static SerdStatus +pop_err(SerdReader* const reader, const SerdStatus st, const Ref ref) +{ + pop_node(reader, ref); + return st; +} + +static SerdStatus +read_string(SerdReader* const reader, Ref* dest) +{ + *dest = push_node(reader, SERD_LITERAL, "", 0); + if (!eat_byte_check(reader, '\"')) { + return pop_err(reader, SERD_ERR_BAD_SYNTAX, *dest); + } + + SerdStatus st; + for (char c; (c = eat_byte(reader));) { + switch (c) { + case '\"': return SERD_SUCCESS; + case '\\': + if ((st = push_byte(reader, *dest, c)) || + (st = read_escape(reader, *dest))) { + return pop_err(reader, SERD_ERR_BAD_SYNTAX, *dest); + } + break; + default: + if (c >= 0 && c <= 0x1F) { + return pop_err(reader, SERD_ERR_BAD_SYNTAX, *dest); + } else if ((st = push_byte(reader, *dest, c))) { + return pop_err(reader, st, *dest); + } + } + } + return pop_err(reader, SERD_ERR_BAD_SYNTAX, *dest); +} + +static SerdStatus +expand_uri(SerdReader* const reader, + const SerdNode* const node, + SerdChunk* const uri_prefix, + SerdChunk* const uri_suffix) +{ + if (serd_stack_is_empty(&reader->env_stack)) { + fprintf(stderr, "=> FAILURE\n"); + return SERD_FAILURE; + } + + SerdEnv* env = *(SerdEnv**)(reader->env_stack.buf + reader->env_stack.size - + sizeof(SerdEnv*)); + + return serd_env_expand(env, node, uri_prefix, uri_suffix); +} + +static SerdStatus +expand_term(SerdReader* const reader, + SerdNode* const node, + Ref* kref, + const SerdNode** datatype) +{ + if (serd_stack_is_empty(&reader->env_stack)) { + return SERD_FAILURE; + } + + SerdEnv* env = *(SerdEnv**)(reader->env_stack.buf + reader->env_stack.size - + sizeof(SerdEnv*)); + + SerdChunk prefix = { 0, 0 }; + SerdChunk suffix = { 0, 0 }; + SerdStatus st = serd_env_expand_term(env, node, &prefix, &suffix, datatype); + + *kref = push_node(reader, + *datatype ? SERD_LITERAL : SERD_URI, + (const char*)prefix.buf, + prefix.len); + push_bytes(reader, *kref, suffix.buf, suffix.len); + + return st; +} + +static SerdStatus +read_uri(SerdReader* const reader, Ref* dest) +{ + const SerdStatus st = read_string(reader, dest); + if (!st) { + SerdChunk prefix = { NULL, 0 }; + SerdChunk suffix = { NULL, 0 }; + SerdNode* node = deref(reader, *dest); + + fprintf(stderr, "EXPAND URI %s\n", node->buf); + node->type = SERD_CURIE; + if (!expand_uri(reader, node, &prefix, &suffix)) { + fprintf(stderr, " => EXPAND 1\n"); + return SERD_SUCCESS; + } + + node->type = SERD_URI; + if (!expand_uri(reader, node, &prefix, &suffix)) { + fprintf(stderr, " => EXPAND 2\n"); + return SERD_SUCCESS; + } + + fprintf(stderr, "=> NO EXPAND\n"); + } + return st; +} + +static SerdStatus +read_digit(SerdReader* const reader, const Ref dest) +{ + return (is_digit(peek_byte(reader)) + ? push_byte(reader, dest, eat_byte(reader)) + : SERD_ERR_BAD_SYNTAX); +} + +static SerdStatus +read_digits(SerdReader* const reader, const Ref dest) +{ + SerdStatus st = read_digit(reader, dest); + while (!st) { + if ((st = read_digit(reader, dest)) == SERD_ERR_BAD_SYNTAX) { + return SERD_SUCCESS; + } + } + return st; +} + +static SerdStatus +read_sign(SerdReader* const reader, const Ref dest) +{ + switch (peek_byte(reader)) { + case '\0': return SERD_ERR_BAD_SYNTAX; + case '+': + case '-': return push_byte(reader, dest, eat_byte(reader)); + } + return SERD_SUCCESS; +} + +// Slightly more lax than the JSON standard, tolerates leading 0 and + +static SerdStatus +read_number(SerdReader* const reader, Ref* dest, Ref* datatype) +{ +#define XSD_DOUBLE NS_XSD "double" +#define XSD_INTEGER NS_XSD "integer" + + *dest = push_node(reader, SERD_LITERAL, "", 0); + + SerdStatus st; + bool has_decimal = false; + if ((st = read_sign(reader, *dest))) { + return st; + } + + if (peek_byte(reader) == '0') { + if ((st = push_byte(reader, *dest, eat_byte(reader)))) { + return st; + } else if (peek_byte(reader) != '.' && peek_byte(reader) != 'e') { + return SERD_SUCCESS; + } + } else if ((st = read_digits(reader, *dest))) { + return st; + } + + if (peek_byte(reader) == '.') { + has_decimal = true; + if ((st = push_byte(reader, *dest, eat_byte(reader))) || + (st = read_digits(reader, *dest))) { + return st; + } + } else { + *datatype = push_node( + reader, SERD_URI, XSD_INTEGER, sizeof(XSD_INTEGER) - 1); + } + + if (peek_byte(reader) == 'E' || peek_byte(reader) == 'e') { + if ((st = push_byte(reader, *dest, eat_byte(reader))) || + (st = read_sign(reader, *dest)) || + (st = read_digits(reader, *dest))) { + return st; + } + } + + *datatype = has_decimal ? push_node(reader, + SERD_URI, + XSD_DOUBLE, + sizeof(XSD_DOUBLE) - 1) + : push_node(reader, + SERD_URI, + XSD_INTEGER, + sizeof(XSD_INTEGER) - 1); + + return SERD_SUCCESS; +} + +static void +skip_ws(SerdReader* const reader) +{ + for (char c; (c = peek_byte(reader));) { + switch (c) { + case '\t': + case '\r': + case '\n': + case ' ': eat_byte(reader); break; + default: return; + } + } +} + +static SerdStatus +read_sep(SerdReader* const reader, const char sep) +{ + skip_ws(reader); + if (eat_byte_check(reader, sep) == sep) { + skip_ws(reader); + return SERD_SUCCESS; + } + return SERD_ERR_BAD_SYNTAX; +} + +static SerdStatus +maybe_read_sep(SerdReader* const reader, const char sep) +{ + skip_ws(reader); + if (peek_byte(reader) == sep) { + eat_byte(reader); + skip_ws(reader); + return SERD_SUCCESS; + } + return SERD_FAILURE; +} + +static SerdStatus +read_value(SerdReader* const reader, + ReadContext ctx, + Ref* dest, + Ref* datatype, + Ref* lang) +{ +#define XSD_DECIMAL NS_XSD "decimal" +#define XSD_BOOLEAN NS_XSD "boolean" + skip_ws(reader); + switch (peek_byte(reader)) { + case '\0': return SERD_ERR_BAD_SYNTAX; + case '\"': return read_string(reader, dest); + case '[': return read_array(reader, ctx, dest); + case 'f': + *datatype = push_node( + reader, SERD_URI, XSD_BOOLEAN, sizeof(XSD_BOOLEAN) - 1); + return read_term(reader, "false", 5, dest); + case 'n': return read_term(reader, "null", 4, dest); + case 't': + *datatype = push_node( + reader, SERD_URI, XSD_BOOLEAN, sizeof(XSD_BOOLEAN) - 1); + return read_term(reader, "true", 4, dest); + case '{': return read_object(reader, ctx, dest, datatype, lang); + + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': return read_number(reader, dest, datatype); + + default: return SERD_ERR_BAD_SYNTAX; + } +} + +static SerdStatus +read_array(SerdReader* const reader, ReadContext ctx, Ref* dest) +{ + SerdStatus st; + if ((st = read_sep(reader, '['))) { + return st; + } else if (peek_byte(reader) == ']') { + read_sep(reader, ']'); + return SERD_SUCCESS; + } + + Ref vref = 0; + while (!st) { + if ((st = read_value(reader, ctx, &vref, &ctx.datatype, &ctx.lang))) { + return st; + } + emit_statement(reader, ctx, vref, ctx.datatype, ctx.lang); + skip_ws(reader); + if (peek_byte(reader) == ',') { + read_sep(reader, ','); + } else { + break; + } + } + + return st || read_sep(reader, ']'); +} + +static SerdStatus +read_list(SerdReader* const reader, ReadContext ctx, Ref* dest) +{ + SerdStatus st; + if ((st = read_sep(reader, '['))) { + return st; + } else if (peek_byte(reader) == ']') { + *dest = reader->rdf_nil; + read_sep(reader, ']'); + return SERD_SUCCESS; + } + + // subject predicate _:head + *dest = blank_id(reader); + emit_statement(reader, ctx, *dest, 0, 0); + + /* The order of node allocation here is necessarily not in stack order, + so we create two nodes and recycle them throughout. */ + Ref n1 = push_node_padded(reader, genid_size(reader), SERD_BLANK, "", 0); + Ref n2 = 0; + Ref node = n1; + Ref rest = 0; + + ctx.subject = *dest; + bool end = peek_byte(reader) == ']'; + while (!end) { + // _:node rdf:first object + ctx.predicate = reader->rdf_first; + Ref vref = 0; + if ((st = read_value(reader, ctx, &vref, &ctx.datatype, &ctx.lang))) { + return st; + } + emit_statement(reader, ctx, vref, ctx.datatype, ctx.lang); + + skip_ws(reader); + if (!(end = peek_byte(reader) != ',')) { + read_sep(reader, ','); + /* Give rest a new ID. Done as late as possible to ensure it is + used and > IDs generated by read_object above. */ + if (!rest) { + rest = n2 = blank_id(reader); // First pass, push + } else { + set_blank_id(reader, rest, genid_size(reader)); + } + } + + // _:node rdf:rest _:rest + *ctx.flags |= SERD_LIST_CONT; + ctx.predicate = reader->rdf_rest; + emit_statement(reader, ctx, (end ? reader->rdf_nil : rest), 0, 0); + + ctx.subject = rest; // _:node = _:rest + rest = node; // _:rest = (old)_:node + node = ctx.subject; // invariant + } + + return st || read_sep(reader, ']'); +} + +static SerdStatus +set_term(SerdReader* const reader, + SerdEnv* const env, + const SerdNode* const key, + const SerdNode* const value, + const SerdNode* const type) +{ + fprintf(stderr, + "SET TERM %s %s %s\n", + key->buf, + value->buf, + type ? (const char*)type->buf : "(null)"); + SerdStatus st = serd_env_set_term(env, key, value, type); + if (!st && reader->prefix_sink) { + st = reader->prefix_sink(reader->handle, key, value); + } + + return st; +} + +static SerdStatus +read_context_value(SerdReader* const reader, + SerdEnv* const env, + const SerdNode* const key) +{ + SerdStatus st = SERD_SUCCESS; + if (peek_byte(reader) == '{') { + st = read_sep(reader, '{'); + + Ref idref = 0; + Ref typeref = 0; + while (!st) { + Ref kref = 0; + if ((st = read_string(reader, &kref)) || + (st = read_sep(reader, ':'))) { + return pop_err(reader, st, kref); + } + + Ref vref = 0; + if ((st = read_uri(reader, &vref))) { + return pop_err(reader, st, vref); + } + + SerdNode* ckey = deref(reader, kref); + SerdNode* cvalue = deref(reader, vref); + + fprintf(stderr, "CTX KEY: %s\n", ckey->buf); + fprintf(stderr, "CTX VAL: %s\n", cvalue->buf); + + if (!strcmp((const char*)ckey->buf, "@id")) { + idref = vref; + } else if (!strcmp((const char*)ckey->buf, "@type")) { + if (!strcmp((const char*)cvalue->buf, "@id")) { + typeref = push_node(reader, + SERD_URI, + NS_RDFS "Resource", + strlen(NS_RDFS "Resource")); + } else { + typeref = vref; + } + } + + if (maybe_read_sep(reader, ',')) { + break; + } + } + + if ((st = read_sep(reader, '}'))) { + return st; + } + + set_term( + reader, env, key, deref(reader, idref), deref(reader, typeref)); + + } else { + fprintf(stderr, "SIMPLE\n"); + Ref vref = 0; + if (!(st = read_uri(reader, &vref))) { + SerdNode* value = deref(reader, vref); + + value->type = SERD_URI; + set_term(reader, env, key, value, NULL); + } + } + + return st; +} + +static SerdStatus +read_context(SerdReader* const reader, ReadContext* ctx) +{ + SerdStatus st; + skip_ws(reader); + if (peek_byte(reader) != '{') { + Ref cref = 0; + read_uri(reader, &cref); + pop_node(reader, cref); + return SERD_SUCCESS; // TODO: Context references? + } + + if ((st = read_sep(reader, '{'))) { + return st; + } + + SerdEnv* env = serd_env_new(NULL); + SerdEnv** frame = + (SerdEnv**)serd_stack_push(&reader->env_stack, sizeof(SerdEnv*)); + *frame = env; + + while (true) { + Ref kref = 0; + if ((st = read_string(reader, &kref)) || (st = read_sep(reader, ':'))) { + return pop_err(reader, st, kref); + } + + SerdNode* key = deref(reader, kref); + if ((st = read_context_value(reader, env, key))) { + return pop_err(reader, st, kref); + } + + if (maybe_read_sep(reader, ',')) { + break; + } + } + + if ((st = read_sep(reader, '}'))) { + return st; + } + + return SERD_SUCCESS; +} + +static SerdStatus +start_object(SerdReader* const reader, ReadContext ctx, const Ref ref) +{ + if (deref(reader, ref)->type == SERD_BLANK) { + set_blank_id(reader, ref, genid_size(reader)); + } + if (ctx.subject && ctx.predicate) { + emit_statement(reader, ctx, ref, 0, 0); + } + return SERD_SUCCESS; +} + +static SerdStatus +read_object(SerdReader* const reader, + ReadContext ctx, + Ref* dest, + Ref* datatype, + Ref* lang) +{ + SerdStatus st; + if ((st = read_sep(reader, '{'))) { + return st; + } + + Ref id = push_node_padded(reader, genid_size(reader), SERD_BLANK, "", 0); + Ref kref = 0; // Key + Ref vref = 0; // Value + bool is_literal = false; + + while (true) { + if ((st = read_string(reader, &kref)) || (st = read_sep(reader, ':'))) { + return pop_err(reader, st, kref); + } + + SerdNode* key = deref(reader, kref); + if (!strcmp((const char*)key->buf, "@list")) { + read_list(reader, ctx, dest); + } else if (!strcmp((const char*)key->buf, "@value")) { + is_literal = true; + pop_node(reader, kref); + if ((st = read_string(reader, dest))) { + return pop_err(reader, st, kref); + } + } else if (is_literal) { + if (!strcmp((const char*)key->buf, "@type")) { + if ((st = read_uri(reader, datatype))) { + return pop_err(reader, st, kref); + } + } else if (!strcmp((const char*)key->buf, "@language")) { + if ((st = read_string(reader, lang))) { + return pop_err(reader, st, kref); + } + } else { + r_err(reader, + SERD_ERR_BAD_SYNTAX, + "invalid literal property\n"); + return pop_err(reader, SERD_ERR_BAD_SYNTAX, kref); + } + } else if (!strcmp((const char*)key->buf, "@id")) { + pop_node(reader, kref); + pop_node(reader, id); + if ((st = read_uri(reader, &id))) { + return SERD_ERR_BAD_SYNTAX; + } + } else if (!strcmp((const char*)key->buf, "@context")) { + pop_node(reader, kref); + read_context(reader, &ctx); + } else { + if (ctx.subject != id) { + start_object(reader, ctx, id); + ctx.subject = id; + } + + SerdType vtype = SERD_LITERAL; + if (!strcmp((const char*)key->buf, "@type")) { + pop_node(reader, kref); + kref = push_node(reader, SERD_URI, NS_RDF "type", 47); + vtype = SERD_URI; + } else { + const SerdNode* type = NULL; + Ref expanded_kref = 0; + expand_term(reader, key, &expanded_kref, &type); + if (expanded_kref) { + key = deref(reader, expanded_kref); + key->type = SERD_URI; + fprintf(stderr, "KEY: %s\n", key->buf); + kref = expanded_kref; + } + /* if (!type) { */ + /* vtype = SERD_URI; */ + /* } */ + + if (type) { + fprintf(stderr, "DATATYPE: %s\n", type->buf); + if (!strcmp((const char*)type->buf, NS_RDFS "Resource")) { + vtype = SERD_URI; + } else { + ctx.datatype = push_node(reader, + type->type, + (const char*)type->buf, + type->n_bytes); + } + } else { + fprintf(stderr, "NO DATATYPE\n"); + /* vtype = SERD_URI; */ + } + + key->type = SERD_URI; + /* SerdChunk prefix = { NULL, 0 }; */ + /* SerdChunk suffix = { NULL, 0 }; */ + /* if (!expand_uri(reader, key, &prefix, &suffix)) { */ + /* key->type = SERD_CURIE; */ + /* } else { */ + /* key->type = SERD_URI; */ + /* } */ + } + + ctx.predicate = kref; + if (vtype == SERD_URI) { + st = read_uri(reader, &vref); + } else { + st = read_value(reader, ctx, &vref, &ctx.datatype, &ctx.lang); + } + + if (st) { + pop_node(reader, kref); + return pop_node(reader, ctx.subject); + } + + emit_statement(reader, ctx, vref, ctx.datatype, ctx.lang); + pop_node(reader, vref); + pop_node(reader, kref); + } + + if (maybe_read_sep(reader, ',')) { + break; + } + } + // pop_node(reader, ctx->subject); // FIXME + + if ((st = read_sep(reader, '}'))) { + return st; + } + + return SERD_SUCCESS; +} + +bool +read_js_statement(SerdReader* reader) +{ + return false; +} + +bool +read_js_doc(SerdReader* reader) +{ + SerdStatementFlags flags = 0; + ReadContext ctx = { 0, 0, 0, 0, 0, 0, &flags }; + + reader->env_stack = serd_stack_new(128); + Ref obj = 0; + Ref datatype = 0; + Ref lang = 0; + if (read_object(reader, ctx, &obj, &datatype, &lang)) { + return false; + } + serd_stack_free(&reader->env_stack); + + return true; +} diff --git a/src/reader.c b/src/reader.c index 1a7f58d4..13831b13 100644 --- a/src/reader.c +++ b/src/reader.c @@ -152,7 +152,8 @@ static bool read_statement(SerdReader* reader) { switch (reader->syntax) { - default: return read_n3_statement(reader); + case SERD_JSONLD: return read_js_doc(reader); + default: return read_n3_statement(reader); } } @@ -160,6 +161,7 @@ static bool read_doc(SerdReader* reader) { switch (reader->syntax) { + case SERD_JSONLD: return read_js_doc(reader); case SERD_NQUADS: return read_nquadsDoc(reader); default: return read_turtleTrigDoc(reader); } @@ -184,7 +186,7 @@ serd_reader_new(SerdSyntax syntax, me->default_graph = SERD_NODE_NULL; me->stack = serd_stack_new(SERD_PAGE_SIZE); me->syntax = syntax; - me->next_id = 1; + me->next_id = syntax == SERD_JSONLD ? 0 : 1; me->strict = true; me->rdf_first = push_node(me, SERD_URI, NS_RDF "first", 48); diff --git a/src/serd_internal.h b/src/serd_internal.h index 73c8113b..9281334a 100644 --- a/src/serd_internal.h +++ b/src/serd_internal.h @@ -33,8 +33,9 @@ # include <fcntl.h> #endif -#define NS_XSD "http://www.w3.org/2001/XMLSchema#" -#define NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#" +#define NS_XSD "http://www.w3.org/2001/XMLSchema#" +#define NS_RDF "http://www.w3.org/1999/02/22-rdf-syntax-ns#" +#define NS_RDFS "http://www.w3.org/2000/01/rdf-schema#" #define SERD_PAGE_SIZE 4096 @@ -582,6 +583,7 @@ struct SerdReaderImpl { SerdNode default_graph; SerdByteSource source; SerdStack stack; + SerdStack env_stack; SerdSyntax syntax; unsigned next_id; SerdStatus status; @@ -621,6 +623,9 @@ bool read_n3_statement(SerdReader* reader); bool read_nquadsDoc(SerdReader* reader); bool read_turtleTrigDoc(SerdReader* reader); +bool read_js_statement(SerdReader* reader); +bool read_js_doc(SerdReader* reader); + typedef enum { FIELD_NONE, FIELD_SUBJECT, diff --git a/src/serdi.c b/src/serdi.c index 03de46fd..3a308fae 100644 --- a/src/serdi.c +++ b/src/serdi.c @@ -40,6 +40,7 @@ static const Syntax syntaxes[] = { {SERD_NTRIPLES, "ntriples", ".nt"}, {SERD_NQUADS, "nquads", ".nq"}, {SERD_TRIG, "trig", ".trig"}, + {SERD_JSONLD, "jsonld", ".jsonld"}, {(SerdSyntax)0, NULL, NULL} }; @@ -255,7 +256,9 @@ main(int argc, char** argv) } } - if ((input_syntax == SERD_TURTLE || input_syntax == SERD_TRIG) || + if ((input_syntax == SERD_TURTLE || + input_syntax == SERD_TRIG || + input_syntax == SERD_JSONLD) || (output_style & SERD_STYLE_CURIED)) { // Base URI may change and/or we're abbreviating URIs, so must resolve output_style |= SERD_STYLE_RESOLVED; diff --git a/src/writer.c b/src/writer.c index 8dddf51c..370724af 100644 --- a/src/writer.c +++ b/src/writer.c @@ -565,6 +565,9 @@ write_curie(SerdWriter* const writer, sink(" ;", 2, writer); write_newline(writer); } + return true; + default: + return false; } return true; } diff --git a/tests/JSONLDTests/manifest.ttl b/tests/JSONLDTests/manifest.ttl index 4fa3ec7a..f26e44a4 100644 --- a/tests/JSONLDTests/manifest.ttl +++ b/tests/JSONLDTests/manifest.ttl @@ -324,101 +324,101 @@ mf:name "Test coercion of boolean value" ; mf:result <toRdf-0024-out.nq> . -<#t0025> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Tests that an array with a single element on a property with @list coercion creates an RDF Collection." ; - mf:action <toRdf-0025-in.jsonld> ; - mf:name "Test list coercion with single element" ; - mf:result <toRdf-0025-out.nq> . - -<#t0026> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Tests that @type with an array of types creates multiple types." ; - mf:action <toRdf-0026-in.jsonld> ; - mf:name "Test creation of multiple types" ; - mf:result <toRdf-0026-out.nq> . - -<#t0027> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Using @graph with other keys places triples in a named graph." ; - mf:action <toRdf-0027-in.jsonld> ; - mf:name "Simple named graph (Wikidata)" ; - mf:result <toRdf-0027-out.nq> . - -<#t0028> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Signing a graph." ; - mf:action <toRdf-0028-in.jsonld> ; - mf:name "Simple named graph" ; - mf:result <toRdf-0028-out.nq> . - -<#t0029> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Tests that named graphs containing named graphs flatten to single level of graph naming." ; - mf:action <toRdf-0029-in.jsonld> ; - mf:name "named graph with embedded named graph" ; - mf:result <toRdf-0029-out.nq> . - -<#t0030> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Tests graphs containing subject references as strings." ; - mf:action <toRdf-0030-in.jsonld> ; - mf:name "top-level graph with string subject reference" ; - mf:result <toRdf-0030-out.nq> . - -<#t0031> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Tests conversion of reverse properties." ; - mf:action <toRdf-0031-in.jsonld> ; - mf:name "Reverse property" ; - mf:result <toRdf-0031-out.nq> . - -<#t0032> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Tests that generated triples do not depend on order of @context." ; - mf:action <toRdf-0032-in.jsonld> ; - mf:name "@context reordering" ; - mf:result <toRdf-0032-out.nq> . - -<#t0033> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Tests that generated triples do not depend on order of @id." ; - mf:action <toRdf-0033-in.jsonld> ; - mf:name "@id reordering" ; - mf:result <toRdf-0033-out.nq> . - -<#t0034> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Tests that generated triples do not depend on order of properties inside @context." ; - mf:action <toRdf-0034-in.jsonld> ; - mf:name "context properties reordering" ; - mf:result <toRdf-0034-out.nq> . - -<#t0035> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment """xsd:double's canonical lexical is used when converting numbers without fraction that are coerced to xsd:double""" ; - mf:action <toRdf-0035-in.jsonld> ; - mf:name "non-fractional numbers converted to xsd:double" ; - mf:result <toRdf-0035-out.nq> . - -<#t0036> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "The toRDF algorithm does not relabel blank nodes; it reuses the counter from the nodeMapGeneration to generate new ones" ; - mf:action <toRdf-0036-in.jsonld> ; - mf:name "Use nodeMapGeneration bnode labels" ; - mf:result <toRdf-0036-out.nq> . +# <#t0025> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Tests that an array with a single element on a property with @list coercion creates an RDF Collection." ; +# mf:action <toRdf-0025-in.jsonld> ; +# mf:name "Test list coercion with single element" ; +# mf:result <toRdf-0025-out.nq> . + +# <#t0026> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Tests that @type with an array of types creates multiple types." ; +# mf:action <toRdf-0026-in.jsonld> ; +# mf:name "Test creation of multiple types" ; +# mf:result <toRdf-0026-out.nq> . + +# <#t0027> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Using @graph with other keys places triples in a named graph." ; +# mf:action <toRdf-0027-in.jsonld> ; +# mf:name "Simple named graph (Wikidata)" ; +# mf:result <toRdf-0027-out.nq> . + +# <#t0028> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Signing a graph." ; +# mf:action <toRdf-0028-in.jsonld> ; +# mf:name "Simple named graph" ; +# mf:result <toRdf-0028-out.nq> . + +# <#t0029> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Tests that named graphs containing named graphs flatten to single level of graph naming." ; +# mf:action <toRdf-0029-in.jsonld> ; +# mf:name "named graph with embedded named graph" ; +# mf:result <toRdf-0029-out.nq> . + +# <#t0030> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Tests graphs containing subject references as strings." ; +# mf:action <toRdf-0030-in.jsonld> ; +# mf:name "top-level graph with string subject reference" ; +# mf:result <toRdf-0030-out.nq> . + +# <#t0031> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Tests conversion of reverse properties." ; +# mf:action <toRdf-0031-in.jsonld> ; +# mf:name "Reverse property" ; +# mf:result <toRdf-0031-out.nq> . + +# <#t0032> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Tests that generated triples do not depend on order of @context." ; +# mf:action <toRdf-0032-in.jsonld> ; +# mf:name "@context reordering" ; +# mf:result <toRdf-0032-out.nq> . + +# <#t0033> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Tests that generated triples do not depend on order of @id." ; +# mf:action <toRdf-0033-in.jsonld> ; +# mf:name "@id reordering" ; +# mf:result <toRdf-0033-out.nq> . + +# <#t0034> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Tests that generated triples do not depend on order of properties inside @context." ; +# mf:action <toRdf-0034-in.jsonld> ; +# mf:name "context properties reordering" ; +# mf:result <toRdf-0034-out.nq> . + +# <#t0035> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment """xsd:double's canonical lexical is used when converting numbers without fraction that are coerced to xsd:double""" ; +# mf:action <toRdf-0035-in.jsonld> ; +# mf:name "non-fractional numbers converted to xsd:double" ; +# mf:result <toRdf-0035-out.nq> . + +# <#t0036> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "The toRDF algorithm does not relabel blank nodes; it reuses the counter from the nodeMapGeneration to generate new ones" ; +# mf:action <toRdf-0036-in.jsonld> ; +# mf:name "Use nodeMapGeneration bnode labels" ; +# mf:result <toRdf-0036-out.nq> . <#t0041> a jld:PositiveEvaluationTest , @@ -428,69 +428,69 @@ mf:name "drop free-floating nodes" ; mf:result <toRdf-0041-out.nq> . -<#t0042> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Basic RDF conversion" ; - mf:action <toRdf-0042-in.jsonld> ; - mf:name "basic" ; - mf:result <toRdf-0042-out.nq> . - -<#t0043> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Properties mapped to null or which are never mapped are dropped" ; - mf:action <toRdf-0043-in.jsonld> ; - mf:name "drop null and unmapped properties" ; - mf:result <toRdf-0043-out.nq> . - -<#t0044> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0004" ; - mf:action <toRdf-0044-in.jsonld> ; - mf:name "optimize @set, keep empty arrays" ; - mf:result <toRdf-0044-out.nq> . - -<#t0045> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0005" ; - mf:action <toRdf-0045-in.jsonld> ; - mf:name "do not expand aliased @id/@type" ; - mf:result <toRdf-0045-out.nq> . - -<#t0046> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0006" ; - mf:action <toRdf-0046-in.jsonld> ; - mf:name "alias keywords" ; - mf:result <toRdf-0046-out.nq> . - -<#t0047> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Type-coerced dates generate typed literals" ; - mf:action <toRdf-0047-in.jsonld> ; - mf:name "date type-coercion" ; - mf:result <toRdf-0047-out.nq> . - -<#t0048> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0008" ; - mf:action <toRdf-0048-in.jsonld> ; - mf:name "@value with @language" ; - mf:result <toRdf-0048-out.nq> . - -<#t0049> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0009" ; - mf:action <toRdf-0049-in.jsonld> ; - mf:name "@graph with terms" ; - mf:result <toRdf-0049-out.nq> . +# <#t0042> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Basic RDF conversion" ; +# mf:action <toRdf-0042-in.jsonld> ; +# mf:name "basic" ; +# mf:result <toRdf-0042-out.nq> . + +# <#t0043> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Properties mapped to null or which are never mapped are dropped" ; +# mf:action <toRdf-0043-in.jsonld> ; +# mf:name "drop null and unmapped properties" ; +# mf:result <toRdf-0043-out.nq> . + +# <#t0044> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0004" ; +# mf:action <toRdf-0044-in.jsonld> ; +# mf:name "optimize @set, keep empty arrays" ; +# mf:result <toRdf-0044-out.nq> . + +# <#t0045> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0005" ; +# mf:action <toRdf-0045-in.jsonld> ; +# mf:name "do not expand aliased @id/@type" ; +# mf:result <toRdf-0045-out.nq> . + +# <#t0046> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0006" ; +# mf:action <toRdf-0046-in.jsonld> ; +# mf:name "alias keywords" ; +# mf:result <toRdf-0046-out.nq> . + +# <#t0047> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Type-coerced dates generate typed literals" ; +# mf:action <toRdf-0047-in.jsonld> ; +# mf:name "date type-coercion" ; +# mf:result <toRdf-0047-out.nq> . + +# <#t0048> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0008" ; +# mf:action <toRdf-0048-in.jsonld> ; +# mf:name "@value with @language" ; +# mf:result <toRdf-0048-out.nq> . + +# <#t0049> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0009" ; +# mf:action <toRdf-0049-in.jsonld> ; +# mf:name "@graph with terms" ; +# mf:result <toRdf-0049-out.nq> . <#t0050> a jld:PositiveEvaluationTest , @@ -500,638 +500,638 @@ mf:name "native types" ; mf:result <toRdf-0050-out.nq> . -<#t0051> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0011" ; - mf:action <toRdf-0051-in.jsonld> ; - mf:name "coerced @id" ; - mf:result <toRdf-0051-out.nq> . - -<#t0052> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0012" ; - mf:action <toRdf-0052-in.jsonld> ; - mf:name "@graph with embed" ; - mf:result <toRdf-0052-out.nq> . - -<#t0053> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0013" ; - mf:action <toRdf-0053-in.jsonld> ; - mf:name "expand already expanded" ; - mf:result <toRdf-0053-out.nq> . - -<#t0054> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0014" ; - mf:action <toRdf-0054-in.jsonld> ; - mf:name "@set of @value objects with keyword aliases" ; - mf:result <toRdf-0054-out.nq> . - -<#t0055> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0015" ; - mf:action <toRdf-0055-in.jsonld> ; - mf:name "collapse set of sets, keep empty lists" ; - mf:result <toRdf-0055-out.nq> . - -<#t0056> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0016" ; - mf:action <toRdf-0056-in.jsonld> ; - mf:name "context reset" ; - mf:result <toRdf-0056-out.nq> . - -<#t0057> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0017" ; - mf:action <toRdf-0057-in.jsonld> ; - mf:name "@graph and @id aliased" ; - mf:result <toRdf-0057-out.nq> . - -<#t0058> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0018" ; - mf:action <toRdf-0058-in.jsonld> ; - mf:name "override default @language" ; - mf:result <toRdf-0058-out.nq> . - -<#t0059> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0019" ; - mf:action <toRdf-0059-in.jsonld> ; - mf:name "remove @value = null" ; - mf:result <toRdf-0059-out.nq> . - -<#t0060> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Embedded @graph without @id creates BNode-labeled named graph" ; - mf:action <toRdf-0060-in.jsonld> ; - mf:name "do not remove @graph if not at top-level" ; - mf:result <toRdf-0060-out.nq> . - -<#t0061> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0021" ; - mf:action <toRdf-0061-in.jsonld> ; - mf:name "do not remove @graph at top-level if not only property" ; - mf:result <toRdf-0061-out.nq> . - -<#t0062> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0022" ; - mf:action <toRdf-0062-in.jsonld> ; - mf:name "expand value with default language" ; - mf:result <toRdf-0062-out.nq> . - -<#t0063> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0023" ; - mf:action <toRdf-0063-in.jsonld> ; - mf:name "Lists and sets of properties with list/set coercion" ; - mf:result <toRdf-0063-out.nq> . - -<#t0064> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0024" ; - mf:action <toRdf-0064-in.jsonld> ; - mf:name "Multiple contexts" ; - mf:result <toRdf-0064-out.nq> . - -<#t0065> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0025" ; - mf:action <toRdf-0065-in.jsonld> ; - mf:name "Problematic IRI expansion tests" ; - mf:result <toRdf-0065-out.nq> . - -<#t0066> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0026" ; - mf:action <toRdf-0066-in.jsonld> ; - mf:name "Expanding term mapping to @type uses @type syntax" ; - mf:result <toRdf-0066-out.nq> . - -<#t0067> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0027" ; - mf:action <toRdf-0067-in.jsonld> ; - mf:name "Keep duplicate values in @list and @set" ; - mf:result <toRdf-0067-out.nq> . - -<#t0068> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0028" ; - mf:action <toRdf-0068-in.jsonld> ; - mf:name "Use @vocab in properties and @type but not in @id" ; - mf:result <toRdf-0068-out.nq> . - -<#t0069> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0029" ; - mf:action <toRdf-0069-in.jsonld> ; - mf:name "Relative IRIs" ; - mf:result <toRdf-0069-out.nq> . - -<#t0070> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0030" ; - mf:action <toRdf-0070-in.jsonld> ; - mf:name "Language maps" ; - mf:result <toRdf-0070-out.nq> . - -<#t0071> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0031" ; - mf:action <toRdf-0071-in.jsonld> ; - mf:name "type-coercion of native types" ; - mf:result <toRdf-0071-out.nq> . - -<#t0072> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0032" ; - mf:action <toRdf-0072-in.jsonld> ; - mf:name "Mapping a term to null decouples it from @vocab" ; - mf:result <toRdf-0072-out.nq> . - -<#t0073> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0033" ; - mf:action <toRdf-0073-in.jsonld> ; - mf:name "Using @vocab with with type-coercion" ; - mf:result <toRdf-0073-out.nq> . - -<#t0074> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0034" ; - mf:action <toRdf-0074-in.jsonld> ; - mf:name "Multiple properties expanding to the same IRI" ; - mf:result <toRdf-0074-out.nq> . - -<#t0075> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0035" ; - mf:action <toRdf-0075-in.jsonld> ; - mf:name "Language maps with @vocab, default language, and colliding property" ; - mf:result <toRdf-0075-out.nq> . - -<#t0076> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0036" ; - mf:action <toRdf-0076-in.jsonld> ; - mf:name "Expanding @index" ; - mf:result <toRdf-0076-out.nq> . - -<#t0077> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0037" ; - mf:action <toRdf-0077-in.jsonld> ; - mf:name "Expanding @reverse" ; - mf:result <toRdf-0077-out.nq> . - -<#t0078> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Triples with blank node predicates are dropped by default." ; - mf:action <toRdf-0078-in.jsonld> ; - mf:name "Drop blank node predicates by default" ; - mf:result <toRdf-0078-out.nq> . - -<#t0079> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0039" ; - mf:action <toRdf-0079-in.jsonld> ; - mf:name "Using terms in a reverse-maps" ; - mf:result <toRdf-0079-out.nq> . - -<#t0080> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0040" ; - mf:action <toRdf-0080-in.jsonld> ; - mf:name "language and index expansion on non-objects" ; - mf:result <toRdf-0080-out.nq> . - -<#t0081> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0041" ; - mf:action <toRdf-0081-in.jsonld> ; - mf:name "Reset the default language" ; - mf:result <toRdf-0081-out.nq> . - -<#t0082> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0042" ; - mf:action <toRdf-0082-in.jsonld> ; - mf:name "Expanding reverse properties" ; - mf:result <toRdf-0082-out.nq> . - -<#t0083> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0043" ; - mf:action <toRdf-0083-in.jsonld> ; - mf:name "Using reverse properties inside a @reverse-container" ; - mf:result <toRdf-0083-out.nq> . - -<#t0084> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0044" ; - mf:action <toRdf-0084-in.jsonld> ; - mf:name "Ensure index maps use language mapping" ; - mf:result <toRdf-0084-out.nq> . - -<#t0085> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0045" ; - mf:action <toRdf-0085-in.jsonld> ; - mf:name "Top-level value objects are removed" ; - mf:result <toRdf-0085-out.nq> . - -<#t0086> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0046" ; - mf:action <toRdf-0086-in.jsonld> ; - mf:name "Free-floating nodes are removed" ; - mf:result <toRdf-0086-out.nq> . - -<#t0087> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0047" ; - mf:action <toRdf-0087-in.jsonld> ; - mf:name "Remove free-floating set values and lists" ; - mf:result <toRdf-0087-out.nq> . - -<#t0088> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0048" ; - mf:action <toRdf-0088-in.jsonld> ; - mf:name "Terms are ignored in @id" ; - mf:result <toRdf-0088-out.nq> . - -<#t0089> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0049" ; - mf:action <toRdf-0089-in.jsonld> ; - mf:name "Using strings as value of a reverse property" ; - mf:result <toRdf-0089-out.nq> . - -<#t0090> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0050" ; - mf:action <toRdf-0090-in.jsonld> ; - mf:name "Term definitions with prefix separate from prefix definitions" ; - mf:result <toRdf-0090-out.nq> . - -<#t0091> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0051" ; - mf:action <toRdf-0091-in.jsonld> ; - mf:name "Expansion of keyword aliases in term definitions" ; - mf:result <toRdf-0091-out.nq> . - -<#t0092> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0052" ; - mf:action <toRdf-0092-in.jsonld> ; - mf:name "@vocab-relative IRIs in term definitions" ; - mf:result <toRdf-0092-out.nq> . - -<#t0093> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0053" ; - mf:action <toRdf-0093-in.jsonld> ; - mf:name "Expand absolute IRI with @type: @vocab" ; - mf:result <toRdf-0093-out.nq> . - -<#t0094> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0054" ; - mf:action <toRdf-0094-in.jsonld> ; - mf:name "Expand term with @type: @vocab" ; - mf:result <toRdf-0094-out.nq> . - -<#t0095> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0055" ; - mf:action <toRdf-0095-in.jsonld> ; - mf:name "Expand @vocab-relative term with @type: @vocab" ; - mf:result <toRdf-0095-out.nq> . - -<#t0096> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0056" ; - mf:action <toRdf-0096-in.jsonld> ; - mf:name "Use terms with @type: @vocab but not with @type: @id" ; - mf:result <toRdf-0096-out.nq> . - -<#t0097> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0057" ; - mf:action <toRdf-0097-in.jsonld> ; - mf:name "Expand relative IRI with @type: @vocab" ; - mf:result <toRdf-0097-out.nq> . - -<#t0098> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0058" ; - mf:action <toRdf-0098-in.jsonld> ; - mf:name "Expand compact IRI with @type: @vocab" ; - mf:result <toRdf-0098-out.nq> . - -<#t0099> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0059" ; - mf:action <toRdf-0099-in.jsonld> ; - mf:name "Reset @vocab by setting it to null" ; - mf:result <toRdf-0099-out.nq> . - -<#t0100> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0060" ; - mf:action <toRdf-0100-in.jsonld> ; - mf:name "Overwrite document base with @base and reset it again" ; - mf:result <toRdf-0100-out.nq> . - -<#t0101> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0061" ; - mf:action <toRdf-0101-in.jsonld> ; - mf:name "Coercing native types to arbitrary datatypes" ; - mf:result <toRdf-0101-out.nq> . - -<#t0102> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0062" ; - mf:action <toRdf-0102-in.jsonld> ; - mf:name "Various relative IRIs with with @base" ; - mf:result <toRdf-0102-out.nq> . - -<#t0103> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0063" ; - mf:action <toRdf-0103-in.jsonld> ; - mf:name "Expand a reverse property with an index-container" ; - mf:result <toRdf-0103-out.nq> . - -<#t0104> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0064" ; - mf:action <toRdf-0104-in.jsonld> ; - mf:name "Expand reverse property whose values are unlabeled blank nodes" ; - mf:result <toRdf-0104-out.nq> . - -<#t0105> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0065" ; - mf:action <toRdf-0105-in.jsonld> ; - mf:name "Keys that are not mapped to an IRI in a reverse-map are dropped" ; - mf:result <toRdf-0105-out.nq> . - -<#t0106> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0066" ; - mf:action <toRdf-0106-in.jsonld> ; - mf:name "Use @vocab to expand keys in reverse-maps" ; - mf:result <toRdf-0106-out.nq> . - -<#t0107> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0067" ; - mf:action <toRdf-0107-in.jsonld> ; - mf:name "prefix:://sufffix not a compact IRI" ; - mf:result <toRdf-0107-out.nq> . - -<#t0108> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0068" ; - mf:action <toRdf-0108-in.jsonld> ; - mf:name "_::sufffix not a compact IRI" ; - mf:result <toRdf-0108-out.nq> . - -<#t0109> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0069" ; - mf:action <toRdf-0109-in.jsonld> ; - mf:name "Compact IRI as term with type mapping" ; - mf:result <toRdf-0109-out.nq> . - -<#t0110> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0070" ; - mf:action <toRdf-0110-in.jsonld> ; - mf:name "Redefine compact IRI with itself" ; - mf:result <toRdf-0110-out.nq> . - -<#t0111> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0071" ; - mf:action <toRdf-0111-in.jsonld> ; - mf:name "Redefine terms looking like compact IRIs" ; - mf:result <toRdf-0111-out.nq> . - -<#t0112> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "RDF version of expand-0072" ; - mf:action <toRdf-0112-in.jsonld> ; - mf:name "Redefine term using @vocab, not itself" ; - mf:result <toRdf-0112-out.nq> . - -<#t0113> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Basic use of creating a named graph using an IRI name" ; - mf:action <toRdf-0113-in.jsonld> ; - mf:name "Dataset with a IRI named graph" ; - mf:result <toRdf-0113-out.nq> . - -<#t0114> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Basic use of creating a named graph using a BNode name" ; - mf:action <toRdf-0114-in.jsonld> ; - mf:name "Dataset with a IRI named graph" ; - mf:result <toRdf-0114-out.nq> . - -<#t0115> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Dataset with a default and two named graphs (IRI and BNode)" ; - mf:action <toRdf-0115-in.jsonld> ; - mf:name "Dataset with a default and two named graphs" ; - mf:result <toRdf-0115-out.nq> . - -<#t0116> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Embedding @graph in a node creates a named graph" ; - mf:action <toRdf-0116-in.jsonld> ; - mf:name "Dataset from node with embedded named graph" ; - mf:result <toRdf-0116-out.nq> . - -<#t0117> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Embedding @graph in a node creates a named graph. Graph name is created if there is no subject" ; - mf:action <toRdf-0117-in.jsonld> ; - mf:name "Dataset from node with embedded named graph (bnode)" ; - mf:result <toRdf-0117-out.nq> . - -<#t0118> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Triples with blank node predicates are not dropped if the produce generalized RDF flag is true." ; - mf:action <toRdf-0118-in.jsonld> ; - mf:name "produce generalized RDF flag" ; - mf:result <toRdf-0118-out.nq> ; - jld:option [ - jld:produceGeneralizedRdf true - ] . - -<#t0119> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "Proper (re-)labeling of blank nodes if used with reverse properties." ; - mf:action <toRdf-0119-in.jsonld> ; - mf:name "Blank nodes with reverse properties" ; - mf:result <toRdf-0119-out.nq> . - -<#t0120> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "IRI resolution according to RFC3986." ; - mf:action <toRdf-0120-in.jsonld> ; - mf:name "IRI Resolution (0)" ; - mf:result <toRdf-0120-out.nq> . - -<#t0121> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "IRI resolution according to RFC3986." ; - mf:action <toRdf-0121-in.jsonld> ; - mf:name "IRI Resolution (1)" ; - mf:result <toRdf-0121-out.nq> . - -<#t0122> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "IRI resolution according to RFC3986." ; - mf:action <toRdf-0122-in.jsonld> ; - mf:name "IRI Resolution (2)" ; - mf:result <toRdf-0122-out.nq> . - -<#t0123> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "IRI resolution according to RFC3986." ; - mf:action <toRdf-0123-in.jsonld> ; - mf:name "IRI Resolution (3)" ; - mf:result <toRdf-0123-out.nq> . - -<#t0124> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "IRI resolution according to RFC3986." ; - mf:action <toRdf-0124-in.jsonld> ; - mf:name "IRI Resolution (4)" ; - mf:result <toRdf-0124-out.nq> . - -<#t0125> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "IRI resolution according to RFC3986." ; - mf:action <toRdf-0125-in.jsonld> ; - mf:name "IRI Resolution (5)" ; - mf:result <toRdf-0125-out.nq> . - -<#t0126> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "IRI resolution according to RFC3986." ; - mf:action <toRdf-0126-in.jsonld> ; - mf:name "IRI Resolution (6)" ; - mf:result <toRdf-0126-out.nq> . - -<#t0127> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "IRI resolution according to RFC3986." ; - mf:action <toRdf-0127-in.jsonld> ; - mf:name "IRI Resolution (7)" ; - mf:result <toRdf-0127-out.nq> . - -<#t0128> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "IRI resolution according to RFC3986." ; - mf:action <toRdf-0128-in.jsonld> ; - mf:name "IRI Resolution (8)" ; - mf:result <toRdf-0128-out.nq> . - -<#t0129> - a jld:PositiveEvaluationTest , - jld:ToRDFTest ; - rdfs:comment "IRI resolution according to RFC3986." ; - mf:action <toRdf-0129-in.jsonld> ; - mf:name "IRI Resolution (9)" ; - mf:result <toRdf-0129-out.nq> . +# <#t0051> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0011" ; +# mf:action <toRdf-0051-in.jsonld> ; +# mf:name "coerced @id" ; +# mf:result <toRdf-0051-out.nq> . + +# <#t0052> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0012" ; +# mf:action <toRdf-0052-in.jsonld> ; +# mf:name "@graph with embed" ; +# mf:result <toRdf-0052-out.nq> . + +# <#t0053> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0013" ; +# mf:action <toRdf-0053-in.jsonld> ; +# mf:name "expand already expanded" ; +# mf:result <toRdf-0053-out.nq> . + +# <#t0054> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0014" ; +# mf:action <toRdf-0054-in.jsonld> ; +# mf:name "@set of @value objects with keyword aliases" ; +# mf:result <toRdf-0054-out.nq> . + +# <#t0055> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0015" ; +# mf:action <toRdf-0055-in.jsonld> ; +# mf:name "collapse set of sets, keep empty lists" ; +# mf:result <toRdf-0055-out.nq> . + +# <#t0056> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0016" ; +# mf:action <toRdf-0056-in.jsonld> ; +# mf:name "context reset" ; +# mf:result <toRdf-0056-out.nq> . + +# <#t0057> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0017" ; +# mf:action <toRdf-0057-in.jsonld> ; +# mf:name "@graph and @id aliased" ; +# mf:result <toRdf-0057-out.nq> . + +# <#t0058> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0018" ; +# mf:action <toRdf-0058-in.jsonld> ; +# mf:name "override default @language" ; +# mf:result <toRdf-0058-out.nq> . + +# <#t0059> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0019" ; +# mf:action <toRdf-0059-in.jsonld> ; +# mf:name "remove @value = null" ; +# mf:result <toRdf-0059-out.nq> . + +# <#t0060> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Embedded @graph without @id creates BNode-labeled named graph" ; +# mf:action <toRdf-0060-in.jsonld> ; +# mf:name "do not remove @graph if not at top-level" ; +# mf:result <toRdf-0060-out.nq> . + +# <#t0061> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0021" ; +# mf:action <toRdf-0061-in.jsonld> ; +# mf:name "do not remove @graph at top-level if not only property" ; +# mf:result <toRdf-0061-out.nq> . + +# <#t0062> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0022" ; +# mf:action <toRdf-0062-in.jsonld> ; +# mf:name "expand value with default language" ; +# mf:result <toRdf-0062-out.nq> . + +# <#t0063> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0023" ; +# mf:action <toRdf-0063-in.jsonld> ; +# mf:name "Lists and sets of properties with list/set coercion" ; +# mf:result <toRdf-0063-out.nq> . + +# <#t0064> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0024" ; +# mf:action <toRdf-0064-in.jsonld> ; +# mf:name "Multiple contexts" ; +# mf:result <toRdf-0064-out.nq> . + +# <#t0065> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0025" ; +# mf:action <toRdf-0065-in.jsonld> ; +# mf:name "Problematic IRI expansion tests" ; +# mf:result <toRdf-0065-out.nq> . + +# <#t0066> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0026" ; +# mf:action <toRdf-0066-in.jsonld> ; +# mf:name "Expanding term mapping to @type uses @type syntax" ; +# mf:result <toRdf-0066-out.nq> . + +# <#t0067> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0027" ; +# mf:action <toRdf-0067-in.jsonld> ; +# mf:name "Keep duplicate values in @list and @set" ; +# mf:result <toRdf-0067-out.nq> . + +# <#t0068> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0028" ; +# mf:action <toRdf-0068-in.jsonld> ; +# mf:name "Use @vocab in properties and @type but not in @id" ; +# mf:result <toRdf-0068-out.nq> . + +# <#t0069> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0029" ; +# mf:action <toRdf-0069-in.jsonld> ; +# mf:name "Relative IRIs" ; +# mf:result <toRdf-0069-out.nq> . + +# <#t0070> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0030" ; +# mf:action <toRdf-0070-in.jsonld> ; +# mf:name "Language maps" ; +# mf:result <toRdf-0070-out.nq> . + +# <#t0071> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0031" ; +# mf:action <toRdf-0071-in.jsonld> ; +# mf:name "type-coercion of native types" ; +# mf:result <toRdf-0071-out.nq> . + +# <#t0072> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0032" ; +# mf:action <toRdf-0072-in.jsonld> ; +# mf:name "Mapping a term to null decouples it from @vocab" ; +# mf:result <toRdf-0072-out.nq> . + +# <#t0073> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0033" ; +# mf:action <toRdf-0073-in.jsonld> ; +# mf:name "Using @vocab with with type-coercion" ; +# mf:result <toRdf-0073-out.nq> . + +# <#t0074> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0034" ; +# mf:action <toRdf-0074-in.jsonld> ; +# mf:name "Multiple properties expanding to the same IRI" ; +# mf:result <toRdf-0074-out.nq> . + +# <#t0075> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0035" ; +# mf:action <toRdf-0075-in.jsonld> ; +# mf:name "Language maps with @vocab, default language, and colliding property" ; +# mf:result <toRdf-0075-out.nq> . + +# <#t0076> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0036" ; +# mf:action <toRdf-0076-in.jsonld> ; +# mf:name "Expanding @index" ; +# mf:result <toRdf-0076-out.nq> . + +# <#t0077> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0037" ; +# mf:action <toRdf-0077-in.jsonld> ; +# mf:name "Expanding @reverse" ; +# mf:result <toRdf-0077-out.nq> . + +# <#t0078> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Triples with blank node predicates are dropped by default." ; +# mf:action <toRdf-0078-in.jsonld> ; +# mf:name "Drop blank node predicates by default" ; +# mf:result <toRdf-0078-out.nq> . + +# <#t0079> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0039" ; +# mf:action <toRdf-0079-in.jsonld> ; +# mf:name "Using terms in a reverse-maps" ; +# mf:result <toRdf-0079-out.nq> . + +# <#t0080> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0040" ; +# mf:action <toRdf-0080-in.jsonld> ; +# mf:name "language and index expansion on non-objects" ; +# mf:result <toRdf-0080-out.nq> . + +# <#t0081> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0041" ; +# mf:action <toRdf-0081-in.jsonld> ; +# mf:name "Reset the default language" ; +# mf:result <toRdf-0081-out.nq> . + +# <#t0082> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0042" ; +# mf:action <toRdf-0082-in.jsonld> ; +# mf:name "Expanding reverse properties" ; +# mf:result <toRdf-0082-out.nq> . + +# <#t0083> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0043" ; +# mf:action <toRdf-0083-in.jsonld> ; +# mf:name "Using reverse properties inside a @reverse-container" ; +# mf:result <toRdf-0083-out.nq> . + +# <#t0084> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0044" ; +# mf:action <toRdf-0084-in.jsonld> ; +# mf:name "Ensure index maps use language mapping" ; +# mf:result <toRdf-0084-out.nq> . + +# <#t0085> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0045" ; +# mf:action <toRdf-0085-in.jsonld> ; +# mf:name "Top-level value objects are removed" ; +# mf:result <toRdf-0085-out.nq> . + +# <#t0086> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0046" ; +# mf:action <toRdf-0086-in.jsonld> ; +# mf:name "Free-floating nodes are removed" ; +# mf:result <toRdf-0086-out.nq> . + +# <#t0087> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0047" ; +# mf:action <toRdf-0087-in.jsonld> ; +# mf:name "Remove free-floating set values and lists" ; +# mf:result <toRdf-0087-out.nq> . + +# <#t0088> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0048" ; +# mf:action <toRdf-0088-in.jsonld> ; +# mf:name "Terms are ignored in @id" ; +# mf:result <toRdf-0088-out.nq> . + +# <#t0089> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0049" ; +# mf:action <toRdf-0089-in.jsonld> ; +# mf:name "Using strings as value of a reverse property" ; +# mf:result <toRdf-0089-out.nq> . + +# <#t0090> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0050" ; +# mf:action <toRdf-0090-in.jsonld> ; +# mf:name "Term definitions with prefix separate from prefix definitions" ; +# mf:result <toRdf-0090-out.nq> . + +# <#t0091> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0051" ; +# mf:action <toRdf-0091-in.jsonld> ; +# mf:name "Expansion of keyword aliases in term definitions" ; +# mf:result <toRdf-0091-out.nq> . + +# <#t0092> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0052" ; +# mf:action <toRdf-0092-in.jsonld> ; +# mf:name "@vocab-relative IRIs in term definitions" ; +# mf:result <toRdf-0092-out.nq> . + +# <#t0093> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0053" ; +# mf:action <toRdf-0093-in.jsonld> ; +# mf:name "Expand absolute IRI with @type: @vocab" ; +# mf:result <toRdf-0093-out.nq> . + +# <#t0094> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0054" ; +# mf:action <toRdf-0094-in.jsonld> ; +# mf:name "Expand term with @type: @vocab" ; +# mf:result <toRdf-0094-out.nq> . + +# <#t0095> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0055" ; +# mf:action <toRdf-0095-in.jsonld> ; +# mf:name "Expand @vocab-relative term with @type: @vocab" ; +# mf:result <toRdf-0095-out.nq> . + +# <#t0096> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0056" ; +# mf:action <toRdf-0096-in.jsonld> ; +# mf:name "Use terms with @type: @vocab but not with @type: @id" ; +# mf:result <toRdf-0096-out.nq> . + +# <#t0097> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0057" ; +# mf:action <toRdf-0097-in.jsonld> ; +# mf:name "Expand relative IRI with @type: @vocab" ; +# mf:result <toRdf-0097-out.nq> . + +# <#t0098> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0058" ; +# mf:action <toRdf-0098-in.jsonld> ; +# mf:name "Expand compact IRI with @type: @vocab" ; +# mf:result <toRdf-0098-out.nq> . + +# <#t0099> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0059" ; +# mf:action <toRdf-0099-in.jsonld> ; +# mf:name "Reset @vocab by setting it to null" ; +# mf:result <toRdf-0099-out.nq> . + +# <#t0100> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0060" ; +# mf:action <toRdf-0100-in.jsonld> ; +# mf:name "Overwrite document base with @base and reset it again" ; +# mf:result <toRdf-0100-out.nq> . + +# <#t0101> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0061" ; +# mf:action <toRdf-0101-in.jsonld> ; +# mf:name "Coercing native types to arbitrary datatypes" ; +# mf:result <toRdf-0101-out.nq> . + +# <#t0102> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0062" ; +# mf:action <toRdf-0102-in.jsonld> ; +# mf:name "Various relative IRIs with with @base" ; +# mf:result <toRdf-0102-out.nq> . + +# <#t0103> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0063" ; +# mf:action <toRdf-0103-in.jsonld> ; +# mf:name "Expand a reverse property with an index-container" ; +# mf:result <toRdf-0103-out.nq> . + +# <#t0104> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0064" ; +# mf:action <toRdf-0104-in.jsonld> ; +# mf:name "Expand reverse property whose values are unlabeled blank nodes" ; +# mf:result <toRdf-0104-out.nq> . + +# <#t0105> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0065" ; +# mf:action <toRdf-0105-in.jsonld> ; +# mf:name "Keys that are not mapped to an IRI in a reverse-map are dropped" ; +# mf:result <toRdf-0105-out.nq> . + +# <#t0106> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0066" ; +# mf:action <toRdf-0106-in.jsonld> ; +# mf:name "Use @vocab to expand keys in reverse-maps" ; +# mf:result <toRdf-0106-out.nq> . + +# <#t0107> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0067" ; +# mf:action <toRdf-0107-in.jsonld> ; +# mf:name "prefix:://sufffix not a compact IRI" ; +# mf:result <toRdf-0107-out.nq> . + +# <#t0108> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0068" ; +# mf:action <toRdf-0108-in.jsonld> ; +# mf:name "_::sufffix not a compact IRI" ; +# mf:result <toRdf-0108-out.nq> . + +# <#t0109> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0069" ; +# mf:action <toRdf-0109-in.jsonld> ; +# mf:name "Compact IRI as term with type mapping" ; +# mf:result <toRdf-0109-out.nq> . + +# <#t0110> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0070" ; +# mf:action <toRdf-0110-in.jsonld> ; +# mf:name "Redefine compact IRI with itself" ; +# mf:result <toRdf-0110-out.nq> . + +# <#t0111> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0071" ; +# mf:action <toRdf-0111-in.jsonld> ; +# mf:name "Redefine terms looking like compact IRIs" ; +# mf:result <toRdf-0111-out.nq> . + +# <#t0112> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "RDF version of expand-0072" ; +# mf:action <toRdf-0112-in.jsonld> ; +# mf:name "Redefine term using @vocab, not itself" ; +# mf:result <toRdf-0112-out.nq> . + +# <#t0113> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Basic use of creating a named graph using an IRI name" ; +# mf:action <toRdf-0113-in.jsonld> ; +# mf:name "Dataset with a IRI named graph" ; +# mf:result <toRdf-0113-out.nq> . + +# <#t0114> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Basic use of creating a named graph using a BNode name" ; +# mf:action <toRdf-0114-in.jsonld> ; +# mf:name "Dataset with a IRI named graph" ; +# mf:result <toRdf-0114-out.nq> . + +# <#t0115> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Dataset with a default and two named graphs (IRI and BNode)" ; +# mf:action <toRdf-0115-in.jsonld> ; +# mf:name "Dataset with a default and two named graphs" ; +# mf:result <toRdf-0115-out.nq> . + +# <#t0116> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Embedding @graph in a node creates a named graph" ; +# mf:action <toRdf-0116-in.jsonld> ; +# mf:name "Dataset from node with embedded named graph" ; +# mf:result <toRdf-0116-out.nq> . + +# <#t0117> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Embedding @graph in a node creates a named graph. Graph name is created if there is no subject" ; +# mf:action <toRdf-0117-in.jsonld> ; +# mf:name "Dataset from node with embedded named graph (bnode)" ; +# mf:result <toRdf-0117-out.nq> . + +# <#t0118> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Triples with blank node predicates are not dropped if the produce generalized RDF flag is true." ; +# mf:action <toRdf-0118-in.jsonld> ; +# mf:name "produce generalized RDF flag" ; +# mf:result <toRdf-0118-out.nq> ; +# jld:option [ +# jld:produceGeneralizedRdf true +# ] . + +# <#t0119> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "Proper (re-)labeling of blank nodes if used with reverse properties." ; +# mf:action <toRdf-0119-in.jsonld> ; +# mf:name "Blank nodes with reverse properties" ; +# mf:result <toRdf-0119-out.nq> . + +# <#t0120> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "IRI resolution according to RFC3986." ; +# mf:action <toRdf-0120-in.jsonld> ; +# mf:name "IRI Resolution (0)" ; +# mf:result <toRdf-0120-out.nq> . + +# <#t0121> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "IRI resolution according to RFC3986." ; +# mf:action <toRdf-0121-in.jsonld> ; +# mf:name "IRI Resolution (1)" ; +# mf:result <toRdf-0121-out.nq> . + +# <#t0122> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "IRI resolution according to RFC3986." ; +# mf:action <toRdf-0122-in.jsonld> ; +# mf:name "IRI Resolution (2)" ; +# mf:result <toRdf-0122-out.nq> . + +# <#t0123> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "IRI resolution according to RFC3986." ; +# mf:action <toRdf-0123-in.jsonld> ; +# mf:name "IRI Resolution (3)" ; +# mf:result <toRdf-0123-out.nq> . + +# <#t0124> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "IRI resolution according to RFC3986." ; +# mf:action <toRdf-0124-in.jsonld> ; +# mf:name "IRI Resolution (4)" ; +# mf:result <toRdf-0124-out.nq> . + +# <#t0125> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "IRI resolution according to RFC3986." ; +# mf:action <toRdf-0125-in.jsonld> ; +# mf:name "IRI Resolution (5)" ; +# mf:result <toRdf-0125-out.nq> . + +# <#t0126> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "IRI resolution according to RFC3986." ; +# mf:action <toRdf-0126-in.jsonld> ; +# mf:name "IRI Resolution (6)" ; +# mf:result <toRdf-0126-out.nq> . + +# <#t0127> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "IRI resolution according to RFC3986." ; +# mf:action <toRdf-0127-in.jsonld> ; +# mf:name "IRI Resolution (7)" ; +# mf:result <toRdf-0127-out.nq> . + +# <#t0128> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "IRI resolution according to RFC3986." ; +# mf:action <toRdf-0128-in.jsonld> ; +# mf:name "IRI Resolution (8)" ; +# mf:result <toRdf-0128-out.nq> . + +# <#t0129> +# a jld:PositiveEvaluationTest , +# jld:ToRDFTest ; +# rdfs:comment "IRI resolution according to RFC3986." ; +# mf:action <toRdf-0129-in.jsonld> ; +# mf:name "IRI Resolution (9)" ; +# mf:result <toRdf-0129-out.nq> . @@ -74,6 +74,7 @@ def configure(conf): lib_source = ['src/byte_source.c', 'src/env.c', + 'src/jsonld.c', 'src/n3.c', 'src/node.c', 'src/reader.c', @@ -237,6 +238,9 @@ def earl_assertion(test, passed, asserter): serdi = './serdi_static' def test_thru(check, base, path, check_path, flags, isyntax, osyntax, opts=[]): + if isyntax == 'JSONLD': + return + out_path = path + '.pass' out_cmd = [serdi] + opts + [f for sublist in flags for f in sublist] + [ '-i', isyntax, @@ -269,7 +273,7 @@ def file_uri_to_path(uri): def _test_output_syntax(test_class): if 'NTriples' in test_class or 'Turtle' in test_class: return 'NTriples' - elif 'NQuads' in test_class or 'Trig' in test_class: + elif 'NQuads' in test_class or 'Trig' in test_class or 'json' in test_class: return 'NQuads' raise Exception('Unknown test class <%s>' % test_class) @@ -367,8 +371,10 @@ def test_suite(ctx, base_uri, testdir, report, isyntax, options=[]): expected=None, name=action + ' lax') ns_rdftest = 'http://www.w3.org/ns/rdftest#' + ns_jsonldtest = 'https://json-ld.org/test-suite/vocab#' for test_class, instances in instances.items(): - if test_class.startswith(ns_rdftest): + if (test_class.startswith(ns_rdftest) or + test_class.startswith(ns_jsonldtest)): expected = 1 if 'Negative' in test_class else 0 run_tests(test_class, instances, expected) @@ -376,7 +382,7 @@ def test(tst): import tempfile # Create test output directories - for i in ['bad', 'good', 'TurtleTests', 'NTriplesTests', 'NQuadsTests', 'TriGTests']: + for i in ['bad', 'good', 'TurtleTests', 'NTriplesTests', 'NQuadsTests', 'TriGTests', 'JSONLDTests']: try: test_dir = os.path.join('tests', i) os.makedirs(test_dir) @@ -457,6 +463,8 @@ def test(tst): 'NQuadsTests', report, 'NQuads') test_suite(tst, w3c_base + 'TriGTests/', 'TriGTests', report, 'Trig', ['-a']) + test_suite(tst, 'http://json-ld.org/test-suite/tests/', + 'JSONLDTests', report, 'JSONLD', ['-a']) def posts(ctx): path = str(ctx.path.abspath()) |