diff --git a/JsonLD.Portable/JsonLD.Portable.csproj b/JsonLD.Portable/JsonLD.Portable.csproj
index 8d709c4..dc79ba7 100644
--- a/JsonLD.Portable/JsonLD.Portable.csproj
+++ b/JsonLD.Portable/JsonLD.Portable.csproj
@@ -110,8 +110,9 @@
-
+
..\packages\Newtonsoft.Json.6.0.1\lib\portable-net45+wp80+win8\Newtonsoft.Json.dll
+ True
diff --git a/JsonLD.Portable/packages.config b/JsonLD.Portable/packages.config
index 5626215..97531c7 100644
--- a/JsonLD.Portable/packages.config
+++ b/JsonLD.Portable/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/src/JsonLD/Core/JsonLdProcessor.cs b/src/JsonLD/Core/JsonLdProcessor.cs
index b5a7eab..f383f2c 100644
--- a/src/JsonLD/Core/JsonLdProcessor.cs
+++ b/src/JsonLD/Core/JsonLdProcessor.cs
@@ -66,8 +66,28 @@ public static JArray Expand(JToken input, JsonLdOptions opts)
{
// 1)
// TODO: look into java futures/promises
- // 2) TODO: better verification of DOMString IRI
- if (input.Type == JTokenType.String && ((string)input).Contains(":"))
+
+ // 2) verification of DOMString IRI
+ bool isIriString = input.Type == JTokenType.String;
+ if (isIriString)
+ {
+ bool hasColon = false;
+ foreach (var c in ((string) input))
+ {
+ if (c == ':')
+ {
+ hasColon = true;
+ }
+
+ if (!hasColon && (c == '{' || c == '['))
+ {
+ isIriString = false;
+ break;
+ }
+ }
+ }
+
+ if (isIriString)
{
try
{
diff --git a/src/JsonLD/Core/JsonLdUtils.cs b/src/JsonLD/Core/JsonLdUtils.cs
index e8d466e..b0d61b8 100644
--- a/src/JsonLD/Core/JsonLdUtils.cs
+++ b/src/JsonLD/Core/JsonLdUtils.cs
@@ -199,7 +199,7 @@ internal static void MergeCompactedValue(JObject obj, string
public static bool IsAbsoluteIri(string value)
{
// TODO: this is a bit simplistic!
- return value.Contains(":");
+ return value != null && value.Contains(":");
}
/// Returns true if the given value is a subject with properties.
diff --git a/src/JsonLD/Core/RDFDataset.cs b/src/JsonLD/Core/RDFDataset.cs
index 6823ad3..0652783 100644
--- a/src/JsonLD/Core/RDFDataset.cs
+++ b/src/JsonLD/Core/RDFDataset.cs
@@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using JsonLD.Core;
+using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace JsonLD.Core
@@ -220,7 +222,7 @@ internal virtual JObject ToObject(bool useNativeTypes)
{
try
{
- double d = double.Parse(value);
+ double d = double.Parse(value, CultureInfo.InvariantCulture);
if (!double.IsNaN(d) && !double.IsInfinity(d))
{
if (JSONLDConsts.XsdInteger.Equals(type))
@@ -732,7 +734,8 @@ private RDFDataset.Node ObjectToRDF(JToken item)
// convert to XSD datatype
if (value.Type == JTokenType.Boolean)
{
- return new RDFDataset.Literal(value.ToString(), datatype.IsNull() ? JSONLDConsts.XsdBoolean
+ var serializeObject = JsonConvert.SerializeObject(value, Formatting.None).Trim('"');
+ return new RDFDataset.Literal(serializeObject, datatype.IsNull() ? JSONLDConsts.XsdBoolean
: (string)datatype, null);
}
else
@@ -746,7 +749,7 @@ private RDFDataset.Node ObjectToRDF(JToken item)
value = new JValue((double)number);
}
// canonical double representation
- return new RDFDataset.Literal(string.Format("{0:0.0###############E0}", (double)value), datatype.IsNull() ? JSONLDConsts.XsdDouble
+ return new RDFDataset.Literal(string.Format(CultureInfo.InvariantCulture, "{0:0.0###############E0}", (double)value), datatype.IsNull() ? JSONLDConsts.XsdDouble
: (string)datatype, null);
}
else
@@ -765,7 +768,8 @@ private RDFDataset.Node ObjectToRDF(JToken item)
}
else
{
- return new RDFDataset.Literal((string)value, datatype.IsNull() ? JSONLDConsts.XsdString
+ var serializeObject = JsonConvert.SerializeObject(value, Formatting.None).Trim('"');
+ return new RDFDataset.Literal(serializeObject, datatype.IsNull() ? JSONLDConsts.XsdString
: (string)datatype, null);
}
}
diff --git a/src/JsonLD/Core/RDFDatasetUtils.cs b/src/JsonLD/Core/RDFDatasetUtils.cs
index 7663cc4..df92c92 100644
--- a/src/JsonLD/Core/RDFDatasetUtils.cs
+++ b/src/JsonLD/Core/RDFDatasetUtils.cs
@@ -544,14 +544,19 @@ public static string Escape(string str)
private class Regex
{
- public static readonly Pattern Iri = Pattern.Compile("(?:<([^>]*)>)");
+ public static readonly Pattern HEX = Pattern.Compile("[0-9A-Fa-f]");
- public static readonly Pattern Bnode = Pattern.Compile("(_:(?:[A-Za-z][A-Za-z0-9]*))"
- );
+ public static readonly Pattern UCHAR = Pattern.Compile("\\\\u" + HEX + "{4}|\\\\U" + HEX + "{8}");
+
+ public static readonly Pattern Iri = Pattern.Compile("(?:<((?:[^\\x00-\\x20<>\"{}|^`\\\\]|" + UCHAR + ")*)>)");
- public static readonly Pattern Plain = Pattern.Compile("\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\""
+ public static readonly Pattern Bnode = Pattern.Compile("(_:(?:[A-Za-z0-9](?:[A-Za-z0-9\\-\\.]*[A-Za-z0-9])?))"
);
+ public static readonly Pattern ECHAR = Pattern.Compile("\\\\[tbnrf\"'\\\\]");
+
+ public static readonly Pattern Plain = Pattern.Compile("\"((?:[^\\x22\\x5C\\x0A\\x0D]|" + ECHAR + "|" + UCHAR + ")*)\"");
+
public static readonly Pattern Datatype = Pattern.Compile("(?:\\^\\^" + Iri + ")"
);
@@ -561,19 +566,16 @@ private class Regex
public static readonly Pattern Literal = Pattern.Compile("(?:" + Plain + "(?:" +
Datatype + "|" + Language + ")?)");
- public static readonly Pattern Ws = Pattern.Compile("[ \\t]+");
-
public static readonly Pattern Wso = Pattern.Compile("[ \\t]*");
public static readonly Pattern Eoln = Pattern.Compile("(?:\r\n)|(?:\n)|(?:\r)");
- public static readonly Pattern Empty = Pattern.Compile("^" + Wso + "$");
+ public static readonly Pattern EmptyOrComment = Pattern.Compile("^" + Wso + "(#.*)?$");
public static readonly Pattern Subject = Pattern.Compile("(?:" + Iri + "|" + Bnode
- + ")" + Ws);
+ + ")" + Wso);
- public static readonly Pattern Property = Pattern.Compile(Iri.GetPattern() + Ws.GetPattern
- ());
+ public static readonly Pattern Property = Pattern.Compile(Iri.GetPattern() + Wso);
public static readonly Pattern Object = Pattern.Compile("(?:" + Iri + "|" + Bnode
+ "|" + Literal + ")" + Wso);
@@ -582,7 +584,7 @@ private class Regex
+ Bnode + ")" + Wso + "\\.))");
public static readonly Pattern Quad = Pattern.Compile("^" + Wso + Subject + Property
- + Object + Graph + Wso + "$");
+ + Object + Graph + Wso + "(#.*)?$");
// define partial regexes
// final public static Pattern IRI =
// Pattern.compile("(?:<([^:]+:[^>]*)>)");
@@ -606,7 +608,7 @@ public static RDFDataset ParseNQuads(string input)
{
lineNumber++;
// skip empty lines
- if (RDFDatasetUtils.Regex.Empty.Matcher(line).Matches())
+ if (RDFDatasetUtils.Regex.EmptyOrComment.Matcher(line).Matches())
{
continue;
}
@@ -621,19 +623,25 @@ public static RDFDataset ParseNQuads(string input)
RDFDataset.Node subject;
if (match.Group(1) != null)
{
- subject = new RDFDataset.IRI(Unescape(match.Group(1)));
+ var subjectIri = Unescape(match.Group(1));
+ AssertAbsoluteIri(subjectIri);
+ subject = new RDFDataset.IRI(subjectIri);
}
else
{
subject = new RDFDataset.BlankNode(Unescape(match.Group(2)));
}
// get predicate
- RDFDataset.Node predicate = new RDFDataset.IRI(Unescape(match.Group(3)));
+ var predicateIri = Unescape(match.Group(3));
+ AssertAbsoluteIri(predicateIri);
+ RDFDataset.Node predicate = new RDFDataset.IRI(predicateIri);
// get object
RDFDataset.Node @object;
if (match.Group(4) != null)
{
- @object = new RDFDataset.IRI(Unescape(match.Group(4)));
+ var objectIri = Unescape(match.Group(4));
+ AssertAbsoluteIri(objectIri);
+ @object = new RDFDataset.IRI(objectIri);
}
else
{
@@ -646,6 +654,7 @@ public static RDFDataset ParseNQuads(string input)
string language = Unescape(match.Group(8));
string datatype = match.Group(7) != null ? Unescape(match.Group(7)) : match.Group
(8) != null ? JSONLDConsts.RdfLangstring : JSONLDConsts.XsdString;
+ AssertAbsoluteIri(datatype);
string unescaped = Unescape(match.Group(6));
@object = new RDFDataset.Literal(unescaped, datatype, language);
}
@@ -655,6 +664,7 @@ public static RDFDataset ParseNQuads(string input)
if (match.Group(9) != null)
{
name = Unescape(match.Group(9));
+ AssertAbsoluteIri(name);
}
else
{
@@ -683,5 +693,13 @@ public static RDFDataset ParseNQuads(string input)
}
return dataset;
}
+
+ private static void AssertAbsoluteIri(string iri)
+ {
+ if (Uri.IsWellFormedUriString(Uri.EscapeUriString(iri), UriKind.Absolute) == false)
+ {
+ throw new JsonLdError(JsonLdError.Error.SyntaxError, "Invalid absolute URI <" + iri + ">");
+ }
+ }
}
}
diff --git a/src/JsonLD/JsonLD.csproj b/src/JsonLD/JsonLD.csproj
index 88c5bd9..c5758f7 100644
--- a/src/JsonLD/JsonLD.csproj
+++ b/src/JsonLD/JsonLD.csproj
@@ -36,9 +36,9 @@
false
-
- False
- ..\..\packages\Newtonsoft.Json.4.0.1\lib\40\Newtonsoft.Json.dll
+
+ ..\..\packages\Newtonsoft.Json.6.0.1\lib\net40\Newtonsoft.Json.dll
+ True
diff --git a/src/JsonLD/Util/JavaCompat.cs b/src/JsonLD/Util/JavaCompat.cs
index 3489301..0dc17d6 100644
--- a/src/JsonLD/Util/JavaCompat.cs
+++ b/src/JsonLD/Util/JavaCompat.cs
@@ -67,7 +67,7 @@ public static bool SafeCompare(this JToken token, T val)
{
try
{
- return token.Value().Equals(val);
+ return token == null ? val == null : token.Value().Equals(val);
}
catch
{
diff --git a/src/JsonLD/packages.config b/src/JsonLD/packages.config
index cc24f2e..af4e42b 100644
--- a/src/JsonLD/packages.config
+++ b/src/JsonLD/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/tests/JsonLD.Test/ConformanceTests.cs b/tests/JsonLD.Test/ConformanceTests.cs
index d3ce18b..6b6cbf4 100644
--- a/tests/JsonLD.Test/ConformanceTests.cs
+++ b/tests/JsonLD.Test/ConformanceTests.cs
@@ -230,7 +230,10 @@ private JToken GetJson(JToken j)
if (j.Type == JTokenType.Null) return null;
using ( Stream manifestStream = File.OpenRead("W3C\\" + (string)j))
using (TextReader reader = new StreamReader(manifestStream))
- using (JsonReader jreader = new Newtonsoft.Json.JsonTextReader(reader))
+ using (JsonReader jreader = new Newtonsoft.Json.JsonTextReader(reader)
+ {
+ DateParseHandling = DateParseHandling.None
+ })
{
return JToken.ReadFrom(jreader);
}
diff --git a/tests/JsonLD.Test/JsonLD.Test.csproj b/tests/JsonLD.Test/JsonLD.Test.csproj
index 60b7d2a..a2e9684 100644
--- a/tests/JsonLD.Test/JsonLD.Test.csproj
+++ b/tests/JsonLD.Test/JsonLD.Test.csproj
@@ -36,9 +36,9 @@
false
-
- False
- ..\..\packages\Newtonsoft.Json.4.0.1\lib\40\Newtonsoft.Json.dll
+
+ ..\..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll
+ True
@@ -58,8 +58,14 @@
+
+
+
+ Always
+
+
PreserveNewest
@@ -3005,6 +3011,7 @@
JsonLD
+
diff --git a/tests/JsonLD.Test/NQuads/README b/tests/JsonLD.Test/NQuads/README
new file mode 100644
index 0000000..7aef79d
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/README
@@ -0,0 +1,25 @@
+This README is for the W3C RDF Working Group's N-Quads test suite.
+This test suite contains two kinds of tests:
+
+ Positive syntax (rdft:TestNQuadsPositiveSyntax) - an input N-Quads
+ file with no syntax errors.
+
+ Negative syntax (rdft:TestNQuadsNegativeSyntax) - an input N-Quads
+ file with at least one syntax error.
+
+The manifest.ttl file in this directory lists tests in the
+RDF WG's N-Quads test suite. All
+tests have a name (mf:name) and an input (mf:action).
+
+• An implementation passes a positive syntax test if it parses the
+ input.
+
+• An implementation passes a negative syntax test if it fails to parse
+ the input.
+
+The home of the test suite is .
+
+See http://www.w3.org/2011/rdf-wg/wiki/RDF_Test_Suites for more details.
+
+Eric Prud'hommeaux - 11 June 2013.
+Gregg Kellogg - 26 June 2013.
diff --git a/tests/JsonLD.Test/NQuads/comment_following_triple.nq b/tests/JsonLD.Test/NQuads/comment_following_triple.nq
new file mode 100644
index 0000000..5619459
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/comment_following_triple.nq
@@ -0,0 +1,5 @@
+ . # comment
+ _:o . # comment
+ "o" . # comment
+ "o"^^ . # comment
+ "o"@en . # comment
diff --git a/tests/JsonLD.Test/NQuads/langtagged_string.nq b/tests/JsonLD.Test/NQuads/langtagged_string.nq
new file mode 100644
index 0000000..1bddb04
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/langtagged_string.nq
@@ -0,0 +1 @@
+ "chat"@en .
diff --git a/tests/JsonLD.Test/NQuads/lantag_with_subtag.nq b/tests/JsonLD.Test/NQuads/lantag_with_subtag.nq
new file mode 100644
index 0000000..629cbf4
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/lantag_with_subtag.nq
@@ -0,0 +1 @@
+ "Cheers"@en-UK .
diff --git a/tests/JsonLD.Test/NQuads/literal.nq b/tests/JsonLD.Test/NQuads/literal.nq
new file mode 100644
index 0000000..3aba89e
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal.nq
@@ -0,0 +1 @@
+ "x" .
diff --git a/tests/JsonLD.Test/NQuads/literal_all_controls.nq b/tests/JsonLD.Test/NQuads/literal_all_controls.nq
new file mode 100644
index 0000000..91c8af1
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_all_controls.nq
@@ -0,0 +1 @@
+ "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\t\u000B\u000C\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F" .
diff --git a/tests/JsonLD.Test/NQuads/literal_all_punctuation.nq b/tests/JsonLD.Test/NQuads/literal_all_punctuation.nq
new file mode 100644
index 0000000..c25d818
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_all_punctuation.nq
@@ -0,0 +1 @@
+ " !\"#$%&():;<=>?@[]^_`{|}~" .
diff --git a/tests/JsonLD.Test/NQuads/literal_ascii_boundaries.nq b/tests/JsonLD.Test/NQuads/literal_ascii_boundaries.nq
new file mode 100644
index 0000000..7a4dc71
Binary files /dev/null and b/tests/JsonLD.Test/NQuads/literal_ascii_boundaries.nq differ
diff --git a/tests/JsonLD.Test/NQuads/literal_false.nq b/tests/JsonLD.Test/NQuads/literal_false.nq
new file mode 100644
index 0000000..5bbbae8
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_false.nq
@@ -0,0 +1 @@
+ "false"^^ .
diff --git a/tests/JsonLD.Test/NQuads/literal_true.nq b/tests/JsonLD.Test/NQuads/literal_true.nq
new file mode 100644
index 0000000..054b229
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_true.nq
@@ -0,0 +1 @@
+ "true"^^ .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_2_dquotes.nq b/tests/JsonLD.Test/NQuads/literal_with_2_dquotes.nq
new file mode 100644
index 0000000..3e69dc1
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_2_dquotes.nq
@@ -0,0 +1 @@
+ "x\"\"y" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_2_squotes.nq b/tests/JsonLD.Test/NQuads/literal_with_2_squotes.nq
new file mode 100644
index 0000000..8ddc52e
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_2_squotes.nq
@@ -0,0 +1 @@
+ "x''y" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_BACKSPACE.nq b/tests/JsonLD.Test/NQuads/literal_with_BACKSPACE.nq
new file mode 100644
index 0000000..339013d
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_BACKSPACE.nq
@@ -0,0 +1 @@
+ "\b" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_CARRIAGE_RETURN.nq b/tests/JsonLD.Test/NQuads/literal_with_CARRIAGE_RETURN.nq
new file mode 100644
index 0000000..91b85c8
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_CARRIAGE_RETURN.nq
@@ -0,0 +1 @@
+ "\r" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_CHARACTER_TABULATION.nq b/tests/JsonLD.Test/NQuads/literal_with_CHARACTER_TABULATION.nq
new file mode 100644
index 0000000..a6a9d9f
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_CHARACTER_TABULATION.nq
@@ -0,0 +1 @@
+ "\t" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_FORM_FEED.nq b/tests/JsonLD.Test/NQuads/literal_with_FORM_FEED.nq
new file mode 100644
index 0000000..10d2c6d
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_FORM_FEED.nq
@@ -0,0 +1 @@
+ "\f" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_LINE_FEED.nq b/tests/JsonLD.Test/NQuads/literal_with_LINE_FEED.nq
new file mode 100644
index 0000000..462f97a
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_LINE_FEED.nq
@@ -0,0 +1 @@
+ "\n" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_REVERSE_SOLIDUS.nq b/tests/JsonLD.Test/NQuads/literal_with_REVERSE_SOLIDUS.nq
new file mode 100644
index 0000000..ebc846e
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_REVERSE_SOLIDUS.nq
@@ -0,0 +1 @@
+ "\\" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_REVERSE_SOLIDUS2.nq b/tests/JsonLD.Test/NQuads/literal_with_REVERSE_SOLIDUS2.nq
new file mode 100644
index 0000000..586e364
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_REVERSE_SOLIDUS2.nq
@@ -0,0 +1 @@
+ "test-\\" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_UTF8_boundaries.nq b/tests/JsonLD.Test/NQuads/literal_with_UTF8_boundaries.nq
new file mode 100644
index 0000000..0e1616d
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_UTF8_boundaries.nq
@@ -0,0 +1 @@
+ "߿ࠀက쿿퀀�𐀀" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_dquote.nq b/tests/JsonLD.Test/NQuads/literal_with_dquote.nq
new file mode 100644
index 0000000..05a1fd3
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_dquote.nq
@@ -0,0 +1 @@
+ "x\"y" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_numeric_escape4.nq b/tests/JsonLD.Test/NQuads/literal_with_numeric_escape4.nq
new file mode 100644
index 0000000..16f0a03
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_numeric_escape4.nq
@@ -0,0 +1 @@
+ "\u006F" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_numeric_escape8.nq b/tests/JsonLD.Test/NQuads/literal_with_numeric_escape8.nq
new file mode 100644
index 0000000..e909a79
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_numeric_escape8.nq
@@ -0,0 +1 @@
+ "\U0000006F" .
diff --git a/tests/JsonLD.Test/NQuads/literal_with_squote.nq b/tests/JsonLD.Test/NQuads/literal_with_squote.nq
new file mode 100644
index 0000000..acf7f58
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/literal_with_squote.nq
@@ -0,0 +1 @@
+ "x'y" .
diff --git a/tests/JsonLD.Test/NQuads/manifest.ttl b/tests/JsonLD.Test/NQuads/manifest.ttl
new file mode 100644
index 0000000..2f61f75
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/manifest.ttl
@@ -0,0 +1,695 @@
+# N-Quads Syntax tests
+
+@prefix rdfs: .
+@prefix mf: .
+@prefix qt: .
+
+@prefix rdft: .
+
+<> a mf:Manifest ;
+ mf:name "N-Quads tests" ;
+ mf:entries
+ (
+ <#nq-syntax-uri-01>
+ <#nq-syntax-uri-02>
+ <#nq-syntax-uri-03>
+ <#nq-syntax-uri-04>
+ <#nq-syntax-uri-05>
+ <#nq-syntax-uri-06>
+ <#nq-syntax-bnode-01>
+ <#nq-syntax-bnode-02>
+ <#nq-syntax-bnode-03>
+ <#nq-syntax-bnode-04>
+ <#nq-syntax-bnode-05>
+ <#nq-syntax-bnode-06>
+ <#nq-syntax-bad-literal-01>
+ <#nq-syntax-bad-literal-02>
+ <#nq-syntax-bad-literal-03>
+ <#nq-syntax-bad-uri-01>
+ <#nq-syntax-bad-quint-01>
+ <#nt-syntax-file-01>
+ <#nt-syntax-file-02>
+ <#nt-syntax-file-03>
+ <#nt-syntax-uri-01>
+ <#nt-syntax-uri-02>
+ <#nt-syntax-uri-03>
+ <#nt-syntax-uri-04>
+ <#nt-syntax-string-01>
+ <#nt-syntax-string-02>
+ <#nt-syntax-string-03>
+ <#nt-syntax-str-esc-01>
+ <#nt-syntax-str-esc-02>
+ <#nt-syntax-str-esc-03>
+ <#nt-syntax-bnode-01>
+ <#nt-syntax-bnode-02>
+ <#nt-syntax-bnode-03>
+ <#nt-syntax-datatypes-01>
+ <#nt-syntax-datatypes-02>
+ <#nt-syntax-bad-uri-01>
+ <#nt-syntax-bad-uri-02>
+ <#nt-syntax-bad-uri-03>
+ <#nt-syntax-bad-uri-04>
+ <#nt-syntax-bad-uri-05>
+ <#nt-syntax-bad-uri-06>
+ <#nt-syntax-bad-uri-07>
+ <#nt-syntax-bad-uri-08>
+ <#nt-syntax-bad-uri-09>
+ <#nt-syntax-bad-prefix-01>
+ <#nt-syntax-bad-base-01>
+ <#nt-syntax-bad-struct-01>
+ <#nt-syntax-bad-struct-02>
+ <#nt-syntax-bad-lang-01>
+ <#nt-syntax-bad-esc-01>
+ <#nt-syntax-bad-esc-02>
+ <#nt-syntax-bad-esc-03>
+ <#nt-syntax-bad-string-01>
+ <#nt-syntax-bad-string-02>
+ <#nt-syntax-bad-string-03>
+ <#nt-syntax-bad-string-04>
+ <#nt-syntax-bad-string-05>
+ <#nt-syntax-bad-string-06>
+ <#nt-syntax-bad-string-07>
+ <#nt-syntax-bad-num-01>
+ <#nt-syntax-bad-num-02>
+ <#nt-syntax-bad-num-03>
+ <#nt-syntax-subm-01>
+ <#comment_following_triple>
+ <#literal>
+ <#literal_all_controls>
+ <#literal_all_punctuation>
+ <#literal_ascii_boundaries>
+ <#literal_with_2_dquotes>
+ <#literal_with_2_squotes>
+ <#literal_with_BACKSPACE>
+ <#literal_with_CARRIAGE_RETURN>
+ <#literal_with_CHARACTER_TABULATION>
+ <#literal_with_dquote>
+ <#literal_with_FORM_FEED>
+ <#literal_with_LINE_FEED>
+ <#literal_with_numeric_escape4>
+ <#literal_with_numeric_escape8>
+ <#literal_with_REVERSE_SOLIDUS>
+ <#literal_with_REVERSE_SOLIDUS2>
+ <#literal_with_squote>
+ <#literal_with_UTF8_boundaries>
+ <#langtagged_string>
+ <#lantag_with_subtag>
+ <#minimal_whitespace>
+ ) .
+
+<#nq-syntax-uri-01> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-uri-01" ;
+ rdfs:comment "URI graph with URI triple" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-uri-02> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-uri-02" ;
+ rdfs:comment "URI graph with BNode subject" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-uri-03> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-uri-03" ;
+ rdfs:comment "URI graph with BNode object" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-uri-04> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-uri-04" ;
+ rdfs:comment "URI graph with simple literal" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-uri-05> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-uri-05" ;
+ rdfs:comment "URI graph with language tagged literal" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-uri-06> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-uri-06" ;
+ rdfs:comment "URI graph with datatyped literal" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bnode-01> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-bnode-01" ;
+ rdfs:comment "BNode graph with URI triple" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bnode-02> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-bnode-02" ;
+ rdfs:comment "BNode graph with BNode subject" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bnode-03> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-bnode-03" ;
+ rdfs:comment "BNode graph with BNode object" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bnode-04> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-bnode-04" ;
+ rdfs:comment "BNode graph with simple literal" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bnode-05> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-bnode-05" ;
+ rdfs:comment "BNode graph with language tagged literal" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bnode-06> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nq-syntax-bnode-06" ;
+ rdfs:comment "BNode graph with datatyped literal" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bad-literal-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nq-syntax-bad-literal-01" ;
+ rdfs:comment "Graph name may not be a simple literal (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bad-literal-02> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nq-syntax-bad-literal-02" ;
+ rdfs:comment "Graph name may not be a language tagged literal (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bad-literal-03> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nq-syntax-bad-literal-03" ;
+ rdfs:comment "Graph name may not be a datatyped literal (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bad-uri-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nq-syntax-bad-uri-01" ;
+ rdfs:comment "Graph name URI must be absolute (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nq-syntax-bad-quint-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nq-syntax-bad-quint-01" ;
+ rdfs:comment "N-Quads does not have a fifth element (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-file-01> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-file-01" ;
+ rdfs:comment "Empty file" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-file-02> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-file-02" ;
+ rdfs:comment "Only comment" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-file-03> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-file-03" ;
+ rdfs:comment "One comment, one empty line" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-uri-01> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-uri-01" ;
+ rdfs:comment "Only IRIs" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-uri-02> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-uri-02" ;
+ rdfs:comment "IRIs with Unicode escape" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-uri-03> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-uri-03" ;
+ rdfs:comment "IRIs with long Unicode escape" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-uri-04> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-uri-04" ;
+ rdfs:comment "Legal IRIs" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-string-01> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-string-01" ;
+ rdfs:comment "string literal" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-string-02> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-string-02" ;
+ rdfs:comment "langString literal" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-string-03> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-string-03" ;
+ rdfs:comment "langString literal with region" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-str-esc-01> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-str-esc-01" ;
+ rdfs:comment "string literal with escaped newline" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-str-esc-02> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-str-esc-02" ;
+ rdfs:comment "string literal with Unicode escape" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-str-esc-03> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-str-esc-03" ;
+ rdfs:comment "string literal with long Unicode escape" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bnode-01> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-bnode-01" ;
+ rdfs:comment "bnode subject" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bnode-02> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-bnode-02" ;
+ rdfs:comment "bnode object" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bnode-03> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-bnode-03" ;
+ rdfs:comment "Blank node labels may start with a digit" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-datatypes-01> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-datatypes-01" ;
+ rdfs:comment "xsd:byte literal" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-datatypes-02> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-datatypes-02" ;
+ rdfs:comment "integer as xsd:string" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-uri-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-uri-01" ;
+ rdfs:comment "Bad IRI : space (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-uri-02> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-uri-02" ;
+ rdfs:comment "Bad IRI : bad escape (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-uri-03> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-uri-03" ;
+ rdfs:comment "Bad IRI : bad long escape (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-uri-04> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-uri-04" ;
+ rdfs:comment "Bad IRI : character escapes not allowed (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-uri-05> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-uri-05" ;
+ rdfs:comment "Bad IRI : character escapes not allowed (2) (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-uri-06> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-uri-06" ;
+ rdfs:comment "Bad IRI : relative IRI not allowed in subject (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-uri-07> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-uri-07" ;
+ rdfs:comment "Bad IRI : relative IRI not allowed in predicate (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-uri-08> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-uri-08" ;
+ rdfs:comment "Bad IRI : relative IRI not allowed in object (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-uri-09> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-uri-09" ;
+ rdfs:comment "Bad IRI : relative IRI not allowed in datatype (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-prefix-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-prefix-01" ;
+ rdfs:comment "@prefix not allowed in n-triples (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-base-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-base-01" ;
+ rdfs:comment "@base not allowed in N-Triples (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-struct-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-struct-01" ;
+ rdfs:comment "N-Triples does not have objectList (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-struct-02> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-struct-02" ;
+ rdfs:comment "N-Triples does not have predicateObjectList (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-lang-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-lang-01" ;
+ rdfs:comment "langString with bad lang (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-esc-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-esc-01" ;
+ rdfs:comment "Bad string escape (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-esc-02> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-esc-02" ;
+ rdfs:comment "Bad string escape (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-esc-03> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-esc-03" ;
+ rdfs:comment "Bad string escape (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-string-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-string-01" ;
+ rdfs:comment "mismatching string literal open/close (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-string-02> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-string-02" ;
+ rdfs:comment "mismatching string literal open/close (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-string-03> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-string-03" ;
+ rdfs:comment "single quotes (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-string-04> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-string-04" ;
+ rdfs:comment "long single string literal (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-string-05> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-string-05" ;
+ rdfs:comment "long double string literal (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-string-06> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-string-06" ;
+ rdfs:comment "string literal with no end (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-string-07> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-string-07" ;
+ rdfs:comment "string literal with no start (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-num-01> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-num-01" ;
+ rdfs:comment "no numbers in N-Triples (integer) (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-num-02> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-num-02" ;
+ rdfs:comment "no numbers in N-Triples (decimal) (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-bad-num-03> a rdft:TestNQuadsNegativeSyntax ;
+ mf:name "nt-syntax-bad-num-03" ;
+ rdfs:comment "no numbers in N-Triples (float) (negative test)" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#nt-syntax-subm-01> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "nt-syntax-subm-01" ;
+ rdfs:comment "Submission test from Original RDF Test Cases" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#comment_following_triple> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "comment_following_triple" ;
+ rdfs:comment "Tests comments after a triple" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_ascii_boundaries> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_ascii_boundaries" ;
+ rdfs:comment "literal_ascii_boundaries '\\x00\\x26\\x28...'" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_UTF8_boundaries> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_UTF8_boundaries" ;
+ rdfs:comment "literal_with_UTF8_boundaries '\\x80\\x7ff\\x800\\xfff...'" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_all_controls> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_all_controls" ;
+ rdfs:comment "literal_all_controls '\\x00\\x01\\x02\\x03\\x04...'" ;
+ rdft:approval rdft:Approved ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_all_punctuation> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_all_punctuation" ;
+ rdfs:comment "literal_all_punctuation '!\"#$%&()...'" ;
+ rdft:approval rdft:Approved ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_squote> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_squote" ;
+ rdfs:comment "literal with squote \"x'y\"" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_2_squotes> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_2_squotes" ;
+ rdfs:comment "literal with 2 squotes \"x''y\"" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal" ;
+ rdfs:comment "literal \"\"\"x\"\"\"" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_dquote> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_dquote" ;
+ rdfs:comment 'literal with dquote "x\"y"' ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_2_dquotes> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_2_dquotes" ;
+ rdfs:comment "literal with 2 squotes \"\"\"a\"\"b\"\"\"" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_REVERSE_SOLIDUS2> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_REVERSE_SOLIDUS2" ;
+ rdfs:comment "REVERSE SOLIDUS at end of literal" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_CHARACTER_TABULATION> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_CHARACTER_TABULATION" ;
+ rdfs:comment "literal with CHARACTER TABULATION" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_BACKSPACE> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_BACKSPACE" ;
+ rdfs:comment "literal with BACKSPACE" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_LINE_FEED> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_LINE_FEED" ;
+ rdfs:comment "literal with LINE FEED" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_CARRIAGE_RETURN> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_CARRIAGE_RETURN" ;
+ rdfs:comment "literal with CARRIAGE RETURN" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_FORM_FEED> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_FORM_FEED" ;
+ rdfs:comment "literal with FORM FEED" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_REVERSE_SOLIDUS> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_REVERSE_SOLIDUS" ;
+ rdfs:comment "literal with REVERSE SOLIDUS" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_numeric_escape4> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_numeric_escape4" ;
+ rdfs:comment "literal with numeric escape4 \\u" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#literal_with_numeric_escape8> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "literal_with_numeric_escape8" ;
+ rdfs:comment "literal with numeric escape8 \\U" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#langtagged_string> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "langtagged_string" ;
+ rdfs:comment "langtagged string \"x\"@en" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#lantag_with_subtag> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "lantag_with_subtag" ;
+ rdfs:comment "lantag with subtag \"x\"@en-us" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
+
+<#minimal_whitespace> a rdft:TestNQuadsPositiveSyntax ;
+ mf:name "minimal_whitespace" ;
+ rdfs:comment "tests absense of whitespace between subject, predicate, object and end-of-statement" ;
+ rdft:approval rdft:Approved ;
+ mf:action ;
+ .
diff --git a/tests/JsonLD.Test/NQuads/minimal_whitespace.nq b/tests/JsonLD.Test/NQuads/minimal_whitespace.nq
new file mode 100644
index 0000000..e9e3a80
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/minimal_whitespace.nq
@@ -0,0 +1,6 @@
+.
+"Alice".
+_:o.
+_:s.
+_:s"Alice".
+_:s_:bnode1.
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bad-literal-01.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bad-literal-01.nq
new file mode 100644
index 0000000..bb17eb3
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bad-literal-01.nq
@@ -0,0 +1 @@
+ "o" .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bad-literal-02.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bad-literal-02.nq
new file mode 100644
index 0000000..ea303b2
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bad-literal-02.nq
@@ -0,0 +1 @@
+ "o"@en .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bad-literal-03.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bad-literal-03.nq
new file mode 100644
index 0000000..854b867
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bad-literal-03.nq
@@ -0,0 +1 @@
+ "o"^^ .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bad-quint-01.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bad-quint-01.nq
new file mode 100644
index 0000000..52b7581
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bad-quint-01.nq
@@ -0,0 +1,2 @@
+# N-Quads rejects a quint
+ .
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bad-uri-01.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bad-uri-01.nq
new file mode 100644
index 0000000..3bf4dbd
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bad-uri-01.nq
@@ -0,0 +1,2 @@
+# No relative IRIs in N-Quads
+ .
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bnode-01.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-01.nq
new file mode 100644
index 0000000..b7acbd5
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-01.nq
@@ -0,0 +1 @@
+ _:g .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bnode-02.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-02.nq
new file mode 100644
index 0000000..07c9263
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-02.nq
@@ -0,0 +1 @@
+_:s _:g .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bnode-03.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-03.nq
new file mode 100644
index 0000000..5f89bd9
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-03.nq
@@ -0,0 +1 @@
+ _:o _:g .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bnode-04.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-04.nq
new file mode 100644
index 0000000..f89ca81
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-04.nq
@@ -0,0 +1 @@
+ "o" _:g .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bnode-05.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-05.nq
new file mode 100644
index 0000000..9bb45ce
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-05.nq
@@ -0,0 +1 @@
+ "o"@en _:g .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-bnode-06.nq b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-06.nq
new file mode 100644
index 0000000..194ffdc
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-bnode-06.nq
@@ -0,0 +1 @@
+ "o"^^ _:g .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-uri-01.nq b/tests/JsonLD.Test/NQuads/nq-syntax-uri-01.nq
new file mode 100644
index 0000000..3026e12
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-uri-01.nq
@@ -0,0 +1 @@
+ .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-uri-02.nq b/tests/JsonLD.Test/NQuads/nq-syntax-uri-02.nq
new file mode 100644
index 0000000..1590ab9
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-uri-02.nq
@@ -0,0 +1 @@
+_:s .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-uri-03.nq b/tests/JsonLD.Test/NQuads/nq-syntax-uri-03.nq
new file mode 100644
index 0000000..4592edc
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-uri-03.nq
@@ -0,0 +1 @@
+ _:o .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-uri-04.nq b/tests/JsonLD.Test/NQuads/nq-syntax-uri-04.nq
new file mode 100644
index 0000000..f7b834a
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-uri-04.nq
@@ -0,0 +1 @@
+ "o" .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-uri-05.nq b/tests/JsonLD.Test/NQuads/nq-syntax-uri-05.nq
new file mode 100644
index 0000000..cf5a0ee
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-uri-05.nq
@@ -0,0 +1 @@
+ "o"@en .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nq-syntax-uri-06.nq b/tests/JsonLD.Test/NQuads/nq-syntax-uri-06.nq
new file mode 100644
index 0000000..65e7703
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nq-syntax-uri-06.nq
@@ -0,0 +1 @@
+ "o"^^ .
\ No newline at end of file
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-base-01.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-base-01.nq
new file mode 100644
index 0000000..dff1b3b
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-base-01.nq
@@ -0,0 +1 @@
+@base .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-esc-01.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-esc-01.nq
new file mode 100644
index 0000000..f7a88ad
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-esc-01.nq
@@ -0,0 +1,2 @@
+# Bad string escape
+ "a\zb" .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-esc-02.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-esc-02.nq
new file mode 100644
index 0000000..72711d4
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-esc-02.nq
@@ -0,0 +1,2 @@
+# Bad string escape
+ "\uWXYZ" .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-esc-03.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-esc-03.nq
new file mode 100644
index 0000000..3a4522f
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-esc-03.nq
@@ -0,0 +1,2 @@
+# Bad string escape
+ "\U0000WXYZ" .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-lang-01.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-lang-01.nq
new file mode 100644
index 0000000..a4d952c
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-lang-01.nq
@@ -0,0 +1,2 @@
+# Bad lang tag
+ "string"@1 .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-num-01.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-num-01.nq
new file mode 100644
index 0000000..2be6f51
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-num-01.nq
@@ -0,0 +1 @@
+ 1 .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-num-02.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-num-02.nq
new file mode 100644
index 0000000..e1d5b06
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-num-02.nq
@@ -0,0 +1 @@
+ 1.0 .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-num-03.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-num-03.nq
new file mode 100644
index 0000000..a9be82f
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-num-03.nq
@@ -0,0 +1 @@
+ 1.0e0 .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-prefix-01.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-prefix-01.nq
new file mode 100644
index 0000000..89e08cc
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-prefix-01.nq
@@ -0,0 +1 @@
+@prefix : .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-01.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-01.nq
new file mode 100644
index 0000000..988af87
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-01.nq
@@ -0,0 +1 @@
+ "abc' .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-02.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-02.nq
new file mode 100644
index 0000000..e1d5b06
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-02.nq
@@ -0,0 +1 @@
+ 1.0 .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-03.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-03.nq
new file mode 100644
index 0000000..64d343d
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-03.nq
@@ -0,0 +1 @@
+ 1.0e1 .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-04.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-04.nq
new file mode 100644
index 0000000..af4ff28
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-04.nq
@@ -0,0 +1 @@
+ '''abc''' .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-05.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-05.nq
new file mode 100644
index 0000000..75ad4b2
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-05.nq
@@ -0,0 +1 @@
+ """abc""" .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-06.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-06.nq
new file mode 100644
index 0000000..56dcbc6
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-06.nq
@@ -0,0 +1 @@
+ "abc .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-07.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-07.nq
new file mode 100644
index 0000000..7f1ee80
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-string-07.nq
@@ -0,0 +1 @@
+ abc" .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-struct-01.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-struct-01.nq
new file mode 100644
index 0000000..d546d56
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-struct-01.nq
@@ -0,0 +1 @@
+ , .
diff --git a/tests/JsonLD.Test/NQuads/nt-syntax-bad-struct-02.nq b/tests/JsonLD.Test/NQuads/nt-syntax-bad-struct-02.nq
new file mode 100644
index 0000000..1f388c6
--- /dev/null
+++ b/tests/JsonLD.Test/NQuads/nt-syntax-bad-struct-02.nq
@@ -0,0 +1 @@
+ ; ,