diff options
Diffstat (limited to 'test')
44 files changed, 400 insertions, 168 deletions
diff --git a/test/.clang-tidy b/test/.clang-tidy index 99a3264a..80737308 100644 --- a/test/.clang-tidy +++ b/test/.clang-tidy @@ -7,7 +7,6 @@ Checks: > -bugprone-assert-side-effect, -bugprone-easily-swappable-parameters, -cert-err33-c, - -clang-analyzer-nullability.NullableDereferenced, -clang-analyzer-optin.core.EnumCastOutOfRange, -clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling, -concurrency-mt-unsafe, diff --git a/test/extra/bad/bad-lang-start-delete.nt b/test/extra/bad/bad-lang-start-delete.nt new file mode 100644 index 00000000..122625e0 --- /dev/null +++ b/test/extra/bad/bad-lang-start-delete.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> "hello"@bad . diff --git a/test/extra/bad/bad-lang-start-space.nt b/test/extra/bad/bad-lang-start-space.nt new file mode 100644 index 00000000..ff5c12ab --- /dev/null +++ b/test/extra/bad/bad-lang-start-space.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> "hello"@ bad . diff --git a/test/extra/bad/bad-lang-start-tab.nt b/test/extra/bad/bad-lang-start-tab.nt new file mode 100644 index 00000000..ad005c6d --- /dev/null +++ b/test/extra/bad/bad-lang-start-tab.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> "hello"@ bad . diff --git a/test/extra/bad/bad-lang-start-wide.nt b/test/extra/bad/bad-lang-start-wide.nt new file mode 100644 index 00000000..04ca4899 --- /dev/null +++ b/test/extra/bad/bad-lang-start-wide.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> "hello"@βad . diff --git a/test/extra/bad/bad-lang.ttl b/test/extra/bad/bad-lang.ttl index 01e04328..b51df89c 100644 --- a/test/extra/bad/bad-lang.ttl +++ b/test/extra/bad/bad-lang.ttl @@ -1 +1 @@ -<> <http://example.org/pred> "hello"@\bad .
\ No newline at end of file +<> <http://example.org/pred> "hello"@b\ad . diff --git a/test/extra/bad/bad-uri-scheme-start-apostrophe.nt b/test/extra/bad/bad-uri-scheme-start-apostrophe.nt new file mode 100644 index 00000000..265b46d1 --- /dev/null +++ b/test/extra/bad/bad-uri-scheme-start-apostrophe.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> <'http://example.org/o> . diff --git a/test/extra/bad/bad-uri-scheme-start-delete.nt b/test/extra/bad/bad-uri-scheme-start-delete.nt new file mode 100644 index 00000000..70b4962a --- /dev/null +++ b/test/extra/bad/bad-uri-scheme-start-delete.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> <http://example.org/o> . diff --git a/test/extra/bad/bad-uri-scheme-start-space.nt b/test/extra/bad/bad-uri-scheme-start-space.nt new file mode 100644 index 00000000..d396d6dd --- /dev/null +++ b/test/extra/bad/bad-uri-scheme-start-space.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> < http://example.org/o> . diff --git a/test/extra/bad/bad-uri-scheme-start-tab.nt b/test/extra/bad/bad-uri-scheme-start-tab.nt new file mode 100644 index 00000000..458a5743 --- /dev/null +++ b/test/extra/bad/bad-uri-scheme-start-tab.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> < http://example.org/o> . diff --git a/test/extra/bad/bad-uri-scheme-start-wide.nt b/test/extra/bad/bad-uri-scheme-start-wide.nt new file mode 100644 index 00000000..7ddfff60 --- /dev/null +++ b/test/extra/bad/bad-uri-scheme-start-wide.nt @@ -0,0 +1 @@ +<http://example.org/s> <http://example.org/p> <σhttp://example.org/o> . diff --git a/test/extra/bad/bad-uri-scheme-start.nt b/test/extra/bad/bad-uri-scheme-start.nt deleted file mode 100644 index cd3fd70f..00000000 --- a/test/extra/bad/bad-uri-scheme-start.nt +++ /dev/null @@ -1 +0,0 @@ -<2http://example.org/s> <http://example.org/p> <http://example.org/o> . diff --git a/test/extra/bad/manifest.ttl b/test/extra/bad/manifest.ttl index 6611e505..a4bb4b4f 100644 --- a/test/extra/bad/manifest.ttl +++ b/test/extra/bad/manifest.ttl @@ -63,6 +63,10 @@ <#bad-is-of-keywords> <#bad-keywords> <#bad-lang> + <#bad-lang-start-delete> + <#bad-lang-start-space> + <#bad-lang-start-tab> + <#bad-lang-start-wide> <#bad-list> <#bad-list-close-object> <#bad-list2> @@ -92,7 +96,10 @@ <#bad-true-subject> <#bad-uri-escape> <#bad-uri-scheme> - <#bad-uri-scheme-start> + <#bad-uri-scheme-start-delete> + <#bad-uri-scheme-start-space> + <#bad-uri-scheme-start-tab> + <#bad-uri-scheme-start-wide> <#bad-uri-truncated> <#bad-verb> ) . @@ -382,6 +389,26 @@ mf:action <bad-lang.ttl> ; mf:name "bad-lang" . +<#bad-lang-start-delete> + a rdft:TestTurtleNegativeSyntax ; + mf:action <bad-lang-start-delete.nt> ; + mf:name "bad-lang-start-delete" . + +<#bad-lang-start-space> + a rdft:TestTurtleNegativeSyntax ; + mf:action <bad-lang-start-space.nt> ; + mf:name "bad-lang-start-space" . + +<#bad-lang-start-tab> + a rdft:TestTurtleNegativeSyntax ; + mf:action <bad-lang-start-tab.nt> ; + mf:name "bad-lang-start-tab" . + +<#bad-lang-start-wide> + a rdft:TestTurtleNegativeSyntax ; + mf:action <bad-lang-start-wide.nt> ; + mf:name "bad-lang-start-wide" . + <#bad-list> a rdft:TestTurtleNegativeSyntax ; mf:action <bad-list.ttl> ; @@ -527,10 +554,30 @@ mf:action <bad-uri-scheme.nt> ; mf:name "bad-uri-scheme" . -<#bad-uri-scheme-start> +<#bad-uri-scheme-start-apostrophe> + a rdft:TestNTriplesNegativeSyntax ; + mf:action <bad-uri-scheme-start-apostrophe.nt> ; + mf:name "bad-uri-scheme-start-apostrophe" . + +<#bad-uri-scheme-start-delete> + a rdft:TestNTriplesNegativeSyntax ; + mf:action <bad-uri-scheme-start-delete.nt> ; + mf:name "bad-uri-scheme-start-delete" . + +<#bad-uri-scheme-start-space> + a rdft:TestNTriplesNegativeSyntax ; + mf:action <bad-uri-scheme-start-space.nt> ; + mf:name "bad-uri-scheme-start-space" . + +<#bad-uri-scheme-start-tab> + a rdft:TestNTriplesNegativeSyntax ; + mf:action <bad-uri-scheme-start-tab.nt> ; + mf:name "bad-uri-scheme-start-tab" . + +<#bad-uri-scheme-start-wide> a rdft:TestNTriplesNegativeSyntax ; - mf:action <bad-uri-scheme-start.nt> ; - mf:name "bad-uri-scheme-start" . + mf:action <bad-uri-scheme-start-wide.nt> ; + mf:name "bad-uri-scheme-start-wide" . <#bad-uri-truncated> a rdft:TestNTriplesNegativeSyntax ; diff --git a/test/extra/good/manifest.ttl b/test/extra/good/manifest.ttl index 350d7d9c..659f8fd1 100644 --- a/test/extra/good/manifest.ttl +++ b/test/extra/good/manifest.ttl @@ -16,16 +16,21 @@ <#test-blank-node-statement> <#test-blankdot> <#test-bom> + <#test-boolish-prefix> <#test-changing-base> <#test-comment-whitespace> <#test-cr> <#test-digit-start-pname> + <#test-decimal-ends-with-dot> <#test-double> + <#test-double-ends-with-dot> <#test-empty-path-base> <#test-eof-at-page-end> <#test-ext-namedblank-iri> <#test-ext-namedblank-prefix> + <#test-false-ends-with-dot> <#test-id> + <#test-integer-ends-with-dot> <#test-list-in-blank> <#test-list-subject> <#test-local-name-ends-with-dot> @@ -56,6 +61,7 @@ <#test-several-eaten-dots> <#test-string-escapes> <#test-trig-syntax-all-rules> + <#test-true-ends-with-dot> <#test-ttl-syntax-all-rules> <#test-uri> ) . @@ -120,6 +126,18 @@ mf:name "test-bom" ; mf:result <test-bom.nt> . +<#test-bom-only> + a rdft:TestTurtleEval ; + mf:action <test-bom-only.ttl> ; + mf:name "test-bom-only" ; + mf:result <test-bom-only.nt> . + +<#test-boolish-prefix> + a rdft:TestTurtleEval ; + mf:action <test-boolish-prefix.ttl> ; + mf:name "test-boolish-prefix" ; + mf:result <test-boolish-prefix.nt> . + <#test-changing-base> a rdft:TestTurtleEval ; mf:action <test-changing-base.ttl> ; @@ -144,12 +162,24 @@ mf:name "test-digit-start-pname" ; mf:result <test-digit-start-pname.nt> . +<#test-decimal-ends-with-dot> + a rdft:TestTurtleEval ; + mf:action <test-decimal-ends-with-dot.ttl> ; + mf:name "test-decimal-ends-with-dot" ; + mf:result <test-decimal-ends-with-dot.nt> . + <#test-double> a rdft:TestTurtleEval ; mf:action <test-double.ttl> ; mf:name "test-double" ; mf:result <test-double.nt> . +<#test-double-ends-with-dot> + a rdft:TestTurtleEval ; + mf:action <test-double-ends-with-dot.ttl> ; + mf:name "test-double-ends-with-dot" ; + mf:result <test-double-ends-with-dot.nt> . + <#test-empty-path-base> a rdft:TestTurtleEval ; mf:action <test-empty-path-base.ttl> ; @@ -174,12 +204,24 @@ mf:name "test-ext-namedblank-prefix" ; mf:result <test-ext-namedblank-prefix.nt> . +<#test-false-ends-with-dot> + a rdft:TestTurtleEval ; + mf:action <test-false-ends-with-dot.ttl> ; + mf:name "test-false-ends-with-dot" ; + mf:result <test-false-ends-with-dot.nt> . + <#test-id> a rdft:TestTurtleEval ; mf:action <test-id.ttl> ; mf:name "test-id" ; mf:result <test-id.nt> . +<#test-integer-ends-with-dot> + a rdft:TestTurtleEval ; + mf:action <test-integer-ends-with-dot.ttl> ; + mf:name "test-integer-ends-with-dot" ; + mf:result <test-integer-ends-with-dot.nt> . + <#test-list-in-blank> a rdft:TestTurtleEval ; mf:action <test-list-in-blank.ttl> ; @@ -344,6 +386,12 @@ mf:action <test-trig-syntax-all-rules.trig> ; mf:name "test-trig-syntax-all-rules" . +<#test-true-ends-with-dot> + a rdft:TestTurtleEval ; + mf:action <test-true-ends-with-dot.ttl> ; + mf:name "test-true-ends-with-dot" ; + mf:result <test-true-ends-with-dot.nt> . + <#test-ttl-syntax-all-rules> a rdft:TestTurtlePositiveSyntax ; mf:action <test-ttl-syntax-all-rules.ttl> ; diff --git a/test/extra/good/test-bom-only.nt b/test/extra/good/test-bom-only.nt new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/test/extra/good/test-bom-only.nt diff --git a/test/extra/good/test-bom-only.ttl b/test/extra/good/test-bom-only.ttl new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/test/extra/good/test-bom-only.ttl @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/test/extra/good/test-boolish-prefix.nt b/test/extra/good/test-boolish-prefix.nt new file mode 100644 index 00000000..d49eeab2 --- /dev/null +++ b/test/extra/good/test-boolish-prefix.nt @@ -0,0 +1,2 @@ +<http://example.org/s> <http://example.org/p> <http://example.org/falseish#o> . +<http://example.org/s> <http://example.org/p> <http://example.org/trueish#o> . diff --git a/test/extra/good/test-boolish-prefix.ttl b/test/extra/good/test-boolish-prefix.ttl new file mode 100644 index 00000000..81ffdf11 --- /dev/null +++ b/test/extra/good/test-boolish-prefix.ttl @@ -0,0 +1,5 @@ +@prefix false.ish: <http://example.org/falseish#> . +@prefix true.ish: <http://example.org/trueish#> . + +<http://example.org/s> <http://example.org/p> false.ish:o . +<http://example.org/s> <http://example.org/p> true.ish:o . diff --git a/test/extra/good/test-decimal-ends-with-dot.nt b/test/extra/good/test-decimal-ends-with-dot.nt new file mode 100644 index 00000000..be0802bc --- /dev/null +++ b/test/extra/good/test-decimal-ends-with-dot.nt @@ -0,0 +1 @@ +<http://example.org/eg#s> <http://example.org/eg#p> "12.3"^^<http://www.w3.org/2001/XMLSchema#decimal> . diff --git a/test/extra/good/test-decimal-ends-with-dot.ttl b/test/extra/good/test-decimal-ends-with-dot.ttl new file mode 100644 index 00000000..a63970d3 --- /dev/null +++ b/test/extra/good/test-decimal-ends-with-dot.ttl @@ -0,0 +1,4 @@ +@prefix eg: <http://example.org/eg#> . + +eg:s + eg:p 12.3. diff --git a/test/extra/good/test-double-ends-with-dot.nt b/test/extra/good/test-double-ends-with-dot.nt new file mode 100644 index 00000000..20e4395e --- /dev/null +++ b/test/extra/good/test-double-ends-with-dot.nt @@ -0,0 +1 @@ +<http://example.org/eg#s> <http://example.org/eg#p> "12.3e4"^^<http://www.w3.org/2001/XMLSchema#double> . diff --git a/test/extra/good/test-double-ends-with-dot.ttl b/test/extra/good/test-double-ends-with-dot.ttl new file mode 100644 index 00000000..4bd17a0b --- /dev/null +++ b/test/extra/good/test-double-ends-with-dot.ttl @@ -0,0 +1,4 @@ +@prefix eg: <http://example.org/eg#> . + +eg:s + eg:p 12.3e4. diff --git a/test/extra/good/test-false-ends-with-dot.nt b/test/extra/good/test-false-ends-with-dot.nt new file mode 100644 index 00000000..3b811813 --- /dev/null +++ b/test/extra/good/test-false-ends-with-dot.nt @@ -0,0 +1 @@ +<http://example.org/eg#s> <http://example.org/eg#p> "false"^^<http://www.w3.org/2001/XMLSchema#boolean> . diff --git a/test/extra/good/test-false-ends-with-dot.ttl b/test/extra/good/test-false-ends-with-dot.ttl new file mode 100644 index 00000000..14e2aa90 --- /dev/null +++ b/test/extra/good/test-false-ends-with-dot.ttl @@ -0,0 +1,4 @@ +@prefix eg: <http://example.org/eg#> . + +eg:s + eg:p false. diff --git a/test/extra/good/test-integer-ends-with-dot.nt b/test/extra/good/test-integer-ends-with-dot.nt new file mode 100644 index 00000000..7d6ff362 --- /dev/null +++ b/test/extra/good/test-integer-ends-with-dot.nt @@ -0,0 +1 @@ +<http://example.org/eg#s> <http://example.org/eg#p> "12"^^<http://www.w3.org/2001/XMLSchema#integer> . diff --git a/test/extra/good/test-integer-ends-with-dot.ttl b/test/extra/good/test-integer-ends-with-dot.ttl new file mode 100644 index 00000000..350ea41d --- /dev/null +++ b/test/extra/good/test-integer-ends-with-dot.ttl @@ -0,0 +1,4 @@ +@prefix eg: <http://example.org/eg#> . + +eg:s + eg:p 12. diff --git a/test/extra/good/test-nq-syntax-all-rules.nq b/test/extra/good/test-nq-syntax-all-rules.nq index a8b80b9a..f9bffe20 100644 --- a/test/extra/good/test-nq-syntax-all-rules.nq +++ b/test/extra/good/test-nq-syntax-all-rules.nq @@ -2,6 +2,6 @@ _:e.u.s <http://example.org/p> _:o. _:e.u.s <http://example.org/p> "o"@en-gb _:g. _:s <http://example.org/p> "ob\t\b\n\r\f\\\"\'\u0025\U00015678ject" <http://example.org/g> . -_:s <http://example.org/p> "߿ࠀက쿿퀀�𐀀" <http://example.org/g> . +_:Σ <http://example.org/p> "߿ࠀက쿿퀀�𐀀" <http://example.org/g> . _:s <http://example.org/p> "o"^^<http://example.org/T> <http://example.org/g> . _:s <http://example.org/p> "o"@en _:g . diff --git a/test/extra/good/test-nt-syntax-all-rules.nt b/test/extra/good/test-nt-syntax-all-rules.nt index ed84f410..c626a702 100644 --- a/test/extra/good/test-nt-syntax-all-rules.nt +++ b/test/extra/good/test-nt-syntax-all-rules.nt @@ -4,4 +4,4 @@ _:s <http://example.org/p> "߿ࠀက쿿퀀�𐀀 _:s <http://example.org/p> "o"^^<http://example.org/T> . _:s <http://example.org/p> "o"@en . _:e.u.s <http://example.org/p> "o"@en-gb . -_:e.u.s <http://example.org/p> _:o. +_:e.u.s <http://example.org/p> _:Ω. diff --git a/test/extra/good/test-trig-syntax-all-rules.trig b/test/extra/good/test-trig-syntax-all-rules.trig index 97557b86..c824ffae 100644 --- a/test/extra/good/test-trig-syntax-all-rules.trig +++ b/test/extra/good/test-trig-syntax-all-rules.trig @@ -7,13 +7,13 @@ ""string""\t\b\n\r\f\'\u0025\U00015678""" . eg:s eg:p "߿ࠀက쿿퀀�𐀀" . eg:sub%25ject eg:pr\~d "o"^^eg:T . -eg:sub%25ject eg:pr\~d "o"@en . +eg:s\@bject eg:pr\~d "o"@en . _:e.u.s eg:p "o"@en-gb . _:e.u.s eg:p _:o. _:e.u.s eg:p‿r⁀d 2. _:e.u.s eg:prèd 3 . _:e.u.s eg:pͯ 4.5. -eg:s eg:p 0 , .1 , 2.3 , 4E5, 6e07 . +eg:Σ eg:p 0 , .1 , 2.3 , 4E5, 6e07 . eg:s eg:p .7e8 , .9E0 , 1.e2 , 3.E4 . eg:s eg:p .2E3 , .4e5 , 6.7E8 , 9. [ ] eg:p 0.e1, 2.E3. diff --git a/test/extra/good/test-true-ends-with-dot.nt b/test/extra/good/test-true-ends-with-dot.nt new file mode 100644 index 00000000..9938065b --- /dev/null +++ b/test/extra/good/test-true-ends-with-dot.nt @@ -0,0 +1 @@ +<http://example.org/eg#s> <http://example.org/eg#p> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> . diff --git a/test/extra/good/test-true-ends-with-dot.ttl b/test/extra/good/test-true-ends-with-dot.ttl new file mode 100644 index 00000000..ebd3b6e1 --- /dev/null +++ b/test/extra/good/test-true-ends-with-dot.ttl @@ -0,0 +1,4 @@ +@prefix eg: <http://example.org/eg#> . + +eg:s + eg:p true. diff --git a/test/extra/good/test-ttl-syntax-all-rules.ttl b/test/extra/good/test-ttl-syntax-all-rules.ttl index ead2e8a8..dd4fa315 100644 --- a/test/extra/good/test-ttl-syntax-all-rules.ttl +++ b/test/extra/good/test-ttl-syntax-all-rules.ttl @@ -6,13 +6,13 @@ ""string""\t\b\n\r\f\'\u0025\U00015678""" . eg:s eg:p "߿ࠀက쿿퀀�𐀀" . eg:sub%25ject eg:pr\~d "o"^^eg:T . -eg:sub%25ject eg:pr\~d "o"@en . +eg:s\@bject eg:pr\~d "o"@en . _:e.u.s eg:p "o"@en-gb . _:e.u.s eg:p _:o. _:e.u.s eg:p‿r⁀d 2. _:e.u.s eg:prèd 3 . _:e.u.s eg:pͯ 4.5. -eg:s eg:p 0 , .1 , 2.3 , 4E5, 6e07 . +eg:Σ eg:p 0 , .1 , 2.3 , 4E5, 6e07 . eg:s eg:p .7e8 , .9E0 , 1.e2 , 3.E4 . eg:s eg:p .2E3 , .4e5 , 6.7E8 , 9. [ ] eg:p 0.e1, 2.E3. @@ -20,7 +20,7 @@ eg:s eg:p .2E3 , .4e5 , 6.7E8 , 9. eg:s eg:p [] . [ eg:p1 eg:o1 ; - eg:p2 _:o2 ; + eg:p2 _:β2 ; eg:p3 "o3" ; ] a eg:S . diff --git a/test/headers/meson.build b/test/headers/meson.build index 6cb14f6e..b9125d2b 100644 --- a/test/headers/meson.build +++ b/test/headers/meson.build @@ -38,6 +38,7 @@ test( files('test_headers.c'), c_args: header_c_suppressions, dependencies: serd_dep, + implicit_include_directories: false, ), suite: 'unit', ) diff --git a/test/lint/meson.build b/test/lint/meson.build index 7e024cb5..cca43342 100644 --- a/test/lint/meson.build +++ b/test/lint/meson.build @@ -64,7 +64,7 @@ if black.found() black_opts = ['--check', '-q', '-l', '79'] foreach script_path : python_script_paths script = files(script_path) - name = script_path.substring(3).underscorify() + name = 'black_' + script_path.substring(3).underscorify() test(name, black, args: black_opts + [script], suite: 'scripts') endforeach endif diff --git a/test/meson.build b/test/meson.build index db88fa61..223e279d 100644 --- a/test/meson.build +++ b/test/meson.build @@ -37,6 +37,7 @@ foreach name : unit_test_names source, c_args: c_suppressions, dependencies: serd_dep, + implicit_include_directories: false, ), suite: 'unit', ) diff --git a/test/run_suite.py b/test/run_suite.py index 3811a74e..84c74dd1 100755 --- a/test/run_suite.py +++ b/test/run_suite.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# Copyright 2022-2023 David Robillard <d@drobilla.net> +# Copyright 2022-2025 David Robillard <d@drobilla.net> # SPDX-License-Identifier: ISC """Run a "simple" one-pass RDF-based test suite for serd.""" @@ -43,7 +43,7 @@ def run_eval_test(base_uri, command, in_path, good_path, out_path): syntax = util.syntax_from_path(out_path) command = command + ["-o", syntax, in_path, base_uri] - with subprocess.Popen(command, stdout=PIPE, encoding="utf-8") as proc: + with subprocess.Popen(command, encoding="utf-8", stdout=PIPE) as proc: out = list(proc.stdout) with open(good_path, "r", encoding="utf-8") as good: @@ -65,7 +65,9 @@ def run_negative_test(base_uri, command, in_path, ignore): raise RuntimeError("Input file missing: " + in_path) command = command + [in_path, base_uri] - proc = subprocess.run(command, check=False, stderr=PIPE, stdout=DEVNULL) + proc = subprocess.run( + command, check=False, encoding="utf-8", stderr=PIPE, stdout=DEVNULL + ) if not ignore and proc.returncode == 0: util.error("Unexpected successful return: " + in_path) diff --git a/test/serd_test_util/__init__.py b/test/serd_test_util/__init__.py index ad417762..c38100b5 100644 --- a/test/serd_test_util/__init__.py +++ b/test/serd_test_util/__init__.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# Copyright 2022-2023 David Robillard <d@drobilla.net> +# Copyright 2022-2025 David Robillard <d@drobilla.net> # SPDX-License-Identifier: ISC """Utilities for data-driven tests.""" @@ -157,12 +157,14 @@ def load_rdf(filename, base_uri, command_prefix): cmd = command_prefix + [filename, base_uri] proc = subprocess.run( - cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=True + cmd, + encoding="utf-8", + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + check=True, ) for line in proc.stdout.splitlines(): - matches = re.match( - r"<([^ ]*)> <([^ ]*)> <([^ ]*)> \.", line.decode("utf-8") - ) + matches = re.match(r"<([^ ]*)> <([^ ]*)> <([^ ]*)> \.", line) if matches: s, p, o = (matches.group(1), matches.group(2), matches.group(3)) if s not in model: diff --git a/test/test_node.c b/test/test_node.c index eb432c40..c2fccf08 100644 --- a/test/test_node.c +++ b/test/test_node.c @@ -71,8 +71,8 @@ test_double_to_node(void) -16.00001, 5.000000005, 0.0000000001, - NAN, - INFINITY}; + (double)NAN, + (double)INFINITY}; const char* dbl_test_strs[] = {"0.0", "9.0", @@ -123,6 +123,7 @@ test_blob_to_node(void) { for (size_t size = 1; size < 256; ++size) { uint8_t* const data = (uint8_t*)malloc(size); + assert(data); for (size_t i = 0; i < size; ++i) { data[i] = (uint8_t)((size + i) % 256); } diff --git a/test/test_quiet.py b/test/test_quiet.py index 676284bb..ff53e26e 100755 --- a/test/test_quiet.py +++ b/test/test_quiet.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# Copyright 2022 David Robillard <d@drobilla.net> +# Copyright 2022-2025 David Robillard <d@drobilla.net> # SPDX-License-Identifier: ISC """Test quiet command-line option.""" @@ -13,7 +13,11 @@ import serd_test_util as util args = util.wrapper_args(__doc__, True) command = shlex.split(args.wrapper) + [args.serdi, "-q", args.input] proc = subprocess.run( - command, check=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE + command, + encoding="utf-8", + check=False, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, ) assert proc.returncode != 0 diff --git a/test/test_reader.c b/test/test_reader.c index 4db83eee..6c38e447 100644 --- a/test/test_reader.c +++ b/test/test_reader.c @@ -408,6 +408,7 @@ main(void) const size_t nq_name_len = strlen(nq_name); const size_t path_len = tmp_len + 1 + ttl_name_len; char* const path = (char*)calloc(path_len + 1, 1); + assert(path); memcpy(path, tmp, tmp_len + 1); path[tmp_len] = '/'; diff --git a/test/test_reader_writer.c b/test/test_reader_writer.c index 7302fa39..ceaae30f 100644 --- a/test/test_reader_writer.c +++ b/test/test_reader_writer.c @@ -1,4 +1,4 @@ -// Copyright 2011-2024 David Robillard <d@drobilla.net> +// Copyright 2011-2025 David Robillard <d@drobilla.net> // SPDX-License-Identifier: ISC #undef NDEBUG @@ -103,42 +103,58 @@ quiet_error_sink(void* const handle, const SerdError* const e) } static void -test_write_errors(void) +check_write_error_offset(const SerdSyntax syntax, + const size_t offset, + const SerdStatus expected_status) { - ErrorContext ctx = {0U, 0U}; + ErrorContext ctx = {0U, offset}; const SerdStyle style = (SerdStyle)(SERD_STYLE_STRICT | SERD_STYLE_CURIED); + SerdEnv* const env = serd_env_new(NULL); + assert(env); + + SerdWriter* const writer = + serd_writer_new(syntax, style, env, NULL, faulty_sink, &ctx); + assert(writer); + + SerdReader* const reader = + serd_reader_new(SERD_TRIG, + writer, + NULL, + (SerdBaseSink)serd_writer_set_base_uri, + (SerdPrefixSink)serd_writer_set_prefix, + (SerdStatementSink)serd_writer_write_statement, + (SerdEndSink)serd_writer_end_anon); + assert(reader); + + serd_writer_set_error_sink(writer, quiet_error_sink, NULL); + serd_reader_set_error_sink(reader, quiet_error_sink, NULL); + + const SerdStatus rst = serd_reader_read_string(reader, USTR(doc_string)); + const SerdStatus wst = serd_writer_finish(writer); + + serd_reader_free(reader); + serd_writer_free(writer); + serd_env_free(env); - const size_t max_offsets[] = {0, 462, 1911, 2003, 462}; + const SerdStatus st = rst ? rst : wst; + assert(st == expected_status); +} + +static void +test_write_errors(void) +{ + // Syntax-keyed array of output document sizes + static const size_t max_offsets[] = {0, 451, 1911, 2003, 465}; - // Test errors at different offsets to hit different code paths for (unsigned s = 1; s <= (unsigned)SERD_TRIG; ++s) { const SerdSyntax syntax = (SerdSyntax)s; + + // Check successfully writing with enough space + check_write_error_offset(syntax, max_offsets[s], SERD_SUCCESS); + + // Check write error at every offset in the output for (size_t o = 0; o < max_offsets[s]; ++o) { - ctx.n_written = 0; - ctx.error_offset = o; - - SerdEnv* const env = serd_env_new(NULL); - SerdWriter* const writer = - serd_writer_new(syntax, style, env, NULL, faulty_sink, &ctx); - - SerdReader* const reader = - serd_reader_new(SERD_TRIG, - writer, - NULL, - (SerdBaseSink)serd_writer_set_base_uri, - (SerdPrefixSink)serd_writer_set_prefix, - (SerdStatementSink)serd_writer_write_statement, - (SerdEndSink)serd_writer_end_anon); - - serd_reader_set_error_sink(reader, quiet_error_sink, NULL); - serd_writer_set_error_sink(writer, quiet_error_sink, NULL); - - const SerdStatus st = serd_reader_read_string(reader, USTR(doc_string)); - assert(st == SERD_ERR_BAD_WRITE); - - serd_reader_free(reader); - serd_writer_free(writer); - serd_env_free(env); + check_write_error_offset(syntax, o, SERD_ERR_BAD_WRITE); } } } @@ -168,15 +184,19 @@ test_writer(const char* const path) const uint8_t buf[] = {0x80, 0, 0, 0, 0}; - SerdNode s = serd_node_from_string(SERD_URI, USTR("")); - SerdNode p = serd_node_from_string(SERD_URI, USTR("http://example.org/pred")); - SerdNode o = serd_node_from_string(SERD_LITERAL, buf); + const SerdNode s = serd_node_from_string(SERD_URI, USTR("")); + const SerdNode p = + serd_node_from_string(SERD_URI, USTR("http://example.org/pred")); + const SerdNode o = serd_node_from_string(SERD_LITERAL, buf); + const SerdNode t = serd_node_from_string(SERD_URI, USTR("urn:Type")); + const SerdNode l = serd_node_from_string(SERD_LITERAL, USTR("en")); - // Write 3 invalid statements (should write nothing) + // Attempt to write invalid statements (should write nothing) const SerdNode* junk[][5] = {{&s, &p, &SERD_NODE_NULL, NULL, NULL}, {&s, &SERD_NODE_NULL, &o, NULL, NULL}, {&SERD_NODE_NULL, &p, &o, NULL, NULL}, {&s, &o, &o, NULL, NULL}, + {&s, &o, &o, &t, &l}, {&o, &p, &o, NULL, NULL}, {&s, &p, &SERD_NODE_NULL, NULL, NULL}}; for (size_t i = 0; i < sizeof(junk) / (sizeof(SerdNode*) * 5); ++i) { @@ -190,13 +210,12 @@ test_writer(const char* const path) junk[i][4])); } - const SerdNode t = serd_node_from_string(SERD_URI, USTR("urn:Type")); - const SerdNode l = serd_node_from_string(SERD_LITERAL, USTR("en")); + // Write some valid statements const SerdNode* good[][5] = {{&s, &p, &o, NULL, NULL}, + {&s, &p, &lit, NULL, NULL}, {&s, &p, &o, &SERD_NODE_NULL, &SERD_NODE_NULL}, {&s, &p, &o, &t, NULL}, {&s, &p, &o, NULL, &l}, - {&s, &p, &o, &t, &l}, {&s, &p, &o, &t, &SERD_NODE_NULL}, {&s, &p, &o, &SERD_NODE_NULL, &l}, {&s, &p, &o, NULL, &SERD_NODE_NULL}, @@ -222,46 +241,7 @@ test_writer(const char* const path) assert(!serd_writer_write_statement( writer, 0, NULL, &s, &p, &bad_uri, NULL, NULL)); - // Write 1 valid statement - o = serd_node_from_string(SERD_LITERAL, USTR("hello")); - assert(!serd_writer_write_statement(writer, 0, NULL, &s, &p, &o, NULL, NULL)); - serd_writer_free(writer); - - // Test chunk sink - SerdChunk chunk = {NULL, 0}; - writer = serd_writer_new( - SERD_TURTLE, (SerdStyle)0, env, NULL, serd_chunk_sink, &chunk); - - o = serd_node_from_string(SERD_URI, USTR("http://example.org/base")); - assert(!serd_writer_set_base_uri(writer, &o)); - - serd_writer_free(writer); - uint8_t* out = serd_chunk_sink_finish(&chunk); - - assert(!strcmp((const char*)out, "@base <http://example.org/base> .\n")); - serd_free(out); - - // Test writing empty node - SerdNode nothing = serd_node_from_string(SERD_NOTHING, USTR("")); - - chunk.buf = NULL; - chunk.len = 0; - writer = serd_writer_new( - SERD_TURTLE, (SerdStyle)0, env, NULL, serd_chunk_sink, &chunk); - - assert(!serd_writer_write_statement( - writer, 0, NULL, &s, &p, ¬hing, NULL, NULL)); - - assert( - !strncmp((const char*)chunk.buf, "<>\n\t<http://example.org/pred> ", 30)); - - serd_writer_free(writer); - out = serd_chunk_sink_finish(&chunk); - - assert(!strcmp((const char*)out, "<>\n\t<http://example.org/pred> .\n")); - serd_free(out); - serd_env_free(env); assert(!fclose(fd)); } @@ -269,7 +249,9 @@ test_writer(const char* const path) static void test_reader(const char* const path) { - ReaderTest* rt = (ReaderTest*)calloc(1, sizeof(ReaderTest)); + ReaderTest* const rt = (ReaderTest*)calloc(1, sizeof(ReaderTest)); + assert(rt); + SerdReader* reader = serd_reader_new( SERD_TURTLE, rt, free, NULL, NULL, test_statement_sink, NULL); @@ -297,7 +279,7 @@ test_reader(const char* const path) const SerdStatus st = serd_reader_read_file(reader, USTR(path)); assert(!st); - assert(rt->n_statement == 13); + assert(rt->n_statement == 12); assert(rt->graph && rt->graph->buf && !strcmp((const char*)rt->graph->buf, "http://example.org/")); @@ -322,6 +304,7 @@ main(void) const size_t ttl_name_len = strlen(ttl_name); const size_t path_len = tmp_len + 1 + ttl_name_len; char* const path = (char*)calloc(path_len + 1, 1); + assert(path); memcpy(path, tmp, tmp_len + 1); path[tmp_len] = '/'; diff --git a/test/test_uri.c b/test/test_uri.c index 5177359c..96fde600 100644 --- a/test/test_uri.c +++ b/test/test_uri.c @@ -52,6 +52,7 @@ check_file_uri(const char* const hostname, uint8_t* out_path = serd_file_uri_parse((const uint8_t*)node.buf, &out_hostname); + assert(out_path); assert(!strcmp((const char*)node.buf, expected_uri)); assert((hostname && out_hostname) || (!hostname && !out_hostname)); assert(!hostname || !strcmp(hostname, (const char*)out_hostname)); @@ -68,40 +69,27 @@ check_file_uri(const char* const hostname, #endif static void -test_uri_to_path(void) +check_uri_to_path(const char* const uri, const char* const expected_path) { - assert(!strcmp( - (const char*)serd_uri_to_path((const uint8_t*)"file:///home/user/foo.ttl"), - "/home/user/foo.ttl")); - - assert(!strcmp((const char*)serd_uri_to_path( - (const uint8_t*)"file://localhost/home/user/foo.ttl"), - "/home/user/foo.ttl")); - - assert(!serd_uri_to_path((const uint8_t*)"file:illegal/file/uri")); - - assert(!strcmp( - (const char*)serd_uri_to_path((const uint8_t*)"file:///c:/awful/system"), - "c:/awful/system")); - - assert(!strcmp( - (const char*)serd_uri_to_path((const uint8_t*)"file:///c:awful/system"), - "/c:awful/system")); - - assert(!strcmp((const char*)serd_uri_to_path((const uint8_t*)"file:///0/1"), - "/0/1")); - - assert( - !strcmp((const char*)serd_uri_to_path((const uint8_t*)"C:\\Windows\\Sucks"), - "C:\\Windows\\Sucks")); - - assert( - !strcmp((const char*)serd_uri_to_path((const uint8_t*)"C|/Windows/Sucks"), - "C|/Windows/Sucks")); + const uint8_t* const path = serd_uri_to_path((const uint8_t*)uri); + assert(path); + assert(!strcmp((const char*)path, expected_path)); +} +static void +test_uri_to_path(void) +{ + assert(!serd_uri_to_path((const uint8_t*)"file:invalid/file/uri")); assert(!serd_uri_to_path((const uint8_t*)"http://example.org/path")); - assert(!strcmp((const char*)serd_uri_to_path((const uint8_t*)"rel"), "rel")); + check_uri_to_path("file:///home/user/foo.ttl", "/home/user/foo.ttl"); + check_uri_to_path("file://localhost/home/user/foo.ttl", "/home/user/foo.ttl"); + check_uri_to_path("file:///c:/awful/system", "c:/awful/system"); + check_uri_to_path("file:///c:awful/system", "/c:awful/system"); + check_uri_to_path("file:///0/1", "/0/1"); + check_uri_to_path("C:\\Windows\\Sucks", "C:\\Windows\\Sucks"); + check_uri_to_path("C|/Windows/Sucks", "C|/Windows/Sucks"); + check_uri_to_path("rel", "rel"); } #if defined(__GNUC__) @@ -171,16 +159,19 @@ test_uri_parsing(void) // Test tolerance of NULL hostname parameter uint8_t* const hosted = serd_file_uri_parse(USTR("file://host/path"), NULL); + assert(hosted); assert(!strcmp((const char*)hosted, "/path")); serd_free(hosted); // Test tolerance of parsing junk URI escapes uint8_t* const junk1 = serd_file_uri_parse(USTR("file:///foo/%0Xbar"), NULL); + assert(junk1); assert(!strcmp((const char*)junk1, "/foo/bar")); serd_free(junk1); uint8_t* const junk2 = serd_file_uri_parse(USTR("file:///foo/%X0bar"), NULL); + assert(junk2); assert(!strcmp((const char*)junk2, "/foo/bar")); serd_free(junk2); } @@ -206,7 +197,7 @@ test_uri_from_string(void) serd_node_free(&base); } -static inline bool +static bool chunk_equals(const SerdChunk* const a, const SerdChunk* const b) { return (!a->len && !b->len && !a->buf && !b->buf) || diff --git a/test/test_write_error.py b/test/test_write_error.py index b62f981a..93b0249a 100755 --- a/test/test_write_error.py +++ b/test/test_write_error.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 -# Copyright 2022-2023 David Robillard <d@drobilla.net> +# Copyright 2022-2025 David Robillard <d@drobilla.net> # SPDX-License-Identifier: ISC """Test errors writing to a file.""" @@ -18,11 +18,15 @@ command = shlex.split(args.wrapper) + [args.serdi, args.input] if os.path.exists("/dev/full"): with open("/dev/full", "w", encoding="utf-8") as out: proc = subprocess.run( - command, check=False, stdout=out, stderr=subprocess.PIPE + command, + encoding="utf-8", + check=False, + stdout=out, + stderr=subprocess.PIPE, ) assert proc.returncode != 0 - assert "error" in proc.stderr.decode("utf-8") + assert "error" in proc.stderr else: sys.stderr.write("warning: /dev/full not present, skipping test") diff --git a/test/test_writer.c b/test/test_writer.c index 28c8e117..51f5d9ed 100644 --- a/test/test_writer.c +++ b/test/test_writer.c @@ -1,4 +1,4 @@ -// Copyright 2011-2023 David Robillard <d@drobilla.net> +// Copyright 2011-2025 David Robillard <d@drobilla.net> // SPDX-License-Identifier: ISC #undef NDEBUG @@ -21,7 +21,6 @@ test_write_long_literal(void) SerdChunk chunk = {NULL, 0}; SerdWriter* writer = serd_writer_new( SERD_TURTLE, (SerdStyle)0, env, NULL, serd_chunk_sink, &chunk); - assert(writer); SerdNode s = serd_node_from_string(SERD_URI, USTR(NS_EG "s")); @@ -30,18 +29,19 @@ test_write_long_literal(void) serd_node_from_string(SERD_LITERAL, USTR("hello \"\"\"world\"\"\"!")); assert(!serd_writer_write_statement(writer, 0, NULL, &s, &p, &o, NULL, NULL)); - - serd_writer_free(writer); - serd_env_free(env); - - uint8_t* out = serd_chunk_sink_finish(&chunk); + assert(!serd_writer_finish(writer)); static const char* const expected = "<http://example.org/s>\n" "\t<http://example.org/p> \"\"\"hello \"\"\\\"world\"\"\\\"!\"\"\" .\n"; + uint8_t* const out = serd_chunk_sink_finish(&chunk); + assert(out); assert(!strcmp((char*)out, expected)); serd_free(out); + + serd_writer_free(writer); + serd_env_free(env); } static void @@ -51,7 +51,6 @@ test_write_nested_anon(void) SerdChunk chunk = {NULL, 0}; SerdWriter* writer = serd_writer_new( SERD_TURTLE, (SerdStyle)0, env, NULL, serd_chunk_sink, &chunk); - assert(writer); SerdNode s0 = serd_node_from_string(SERD_URI, USTR(NS_EG "s0")); @@ -96,11 +95,7 @@ test_write_nested_anon(void) writer, SERD_ANON_CONT, NULL, &b0, &p4, &o4, NULL, NULL)); assert(!serd_writer_end_anon(writer, &b0)); - - serd_writer_free(writer); - serd_env_free(env); - - uint8_t* const out = serd_chunk_sink_finish(&chunk); + assert(!serd_writer_finish(writer)); static const char* const expected = "<http://example.org/s0>\n" @@ -112,8 +107,13 @@ test_write_nested_anon(void) "\t\t<http://example.org/p4> <http://example.org/o4>\n" "\t] .\n"; + uint8_t* const out = serd_chunk_sink_finish(&chunk); + assert(out); assert(!strcmp((char*)out, expected)); serd_free(out); + + serd_writer_free(writer); + serd_env_free(env); } static size_t @@ -132,6 +132,7 @@ test_writer_cleanup(void) SerdEnv* env = serd_env_new(NULL); SerdWriter* writer = serd_writer_new(SERD_TURTLE, (SerdStyle)0U, env, NULL, null_sink, NULL); + assert(writer); SerdNode s = serd_node_from_string(SERD_URI, USTR(NS_EG "s")); SerdNode p = serd_node_from_string(SERD_URI, USTR(NS_EG "p")); @@ -185,6 +186,7 @@ test_write_bad_anon_stack(void) SerdEnv* env = serd_env_new(NULL); SerdWriter* writer = serd_writer_new(SERD_TURTLE, (SerdStyle)0U, env, NULL, null_sink, NULL); + assert(writer); SerdNode s = serd_node_from_string(SERD_URI, USTR(NS_EG "s")); SerdNode p = serd_node_from_string(SERD_URI, USTR(NS_EG "p")); @@ -212,14 +214,9 @@ test_write_bad_anon_stack(void) static void test_strict_write(void) { - const char* const path = "serd_strict_write_test.ttl"; - FILE* const fd = fopen(path, "wb"); - assert(fd); - SerdEnv* const env = serd_env_new(NULL); SerdWriter* const writer = serd_writer_new( - SERD_TURTLE, (SerdStyle)SERD_STYLE_STRICT, env, NULL, null_sink, fd); - + SERD_TURTLE, (SerdStyle)SERD_STYLE_STRICT, env, NULL, null_sink, NULL); assert(writer); const uint8_t bad_str[] = {0xFF, 0x90, 'h', 'i', 0}; @@ -238,9 +235,6 @@ test_strict_write(void) serd_writer_free(writer); serd_env_free(env); - - assert(!fclose(fd)); - assert(!remove(path)); } // Produce a write error without setting errno @@ -256,19 +250,129 @@ error_sink(const void* const buf, const size_t len, void* const stream) static void test_write_error(void) { - SerdEnv* const env = serd_env_new(NULL); - SerdWriter* writer = NULL; - SerdStatus st = SERD_SUCCESS; + SerdEnv* const env = serd_env_new(NULL); - SerdNode u = serd_node_from_string(SERD_URI, USTR("http://example.com/u")); - - writer = + SerdWriter* const writer = serd_writer_new(SERD_TURTLE, (SerdStyle)0, env, NULL, error_sink, NULL); assert(writer); - st = serd_writer_write_statement(writer, 0U, NULL, &u, &u, &u, NULL, NULL); + + SerdNode u = serd_node_from_string(SERD_URI, USTR("http://example.com/u")); + + const SerdStatus st = + serd_writer_write_statement(writer, 0U, NULL, &u, &u, &u, NULL, NULL); assert(st == SERD_ERR_BAD_WRITE); + + serd_writer_free(writer); + serd_env_free(env); +} + +static void +test_chunk_sink(void) +{ + SerdEnv* const env = serd_env_new(NULL); + assert(env); + + SerdChunk chunk = {NULL, 0}; + SerdWriter* const writer = serd_writer_new( + SERD_TURTLE, (SerdStyle)0, env, NULL, serd_chunk_sink, &chunk); + assert(writer); + + const SerdNode base = + serd_node_from_string(SERD_URI, USTR("http://example.org/base")); + assert(!serd_writer_set_base_uri(writer, &base)); + assert(!serd_writer_finish(writer)); + + uint8_t* const out = serd_chunk_sink_finish(&chunk); + assert(out); + assert(!strcmp((const char*)out, "@base <http://example.org/base> .\n")); + serd_free(out); + + serd_writer_free(writer); + serd_env_free(env); +} + +static void +test_write_nothing_node(void) +{ + SerdEnv* const env = serd_env_new(NULL); + assert(env); + + SerdChunk chunk = {NULL, 0}; + SerdWriter* const writer = serd_writer_new( + SERD_TURTLE, (SerdStyle)0, env, NULL, serd_chunk_sink, &chunk); + assert(writer); + + SerdNode s = serd_node_from_string(SERD_URI, USTR("")); + SerdNode p = serd_node_from_string(SERD_URI, USTR("http://example.org/pred")); + SerdNode o = serd_node_from_string(SERD_NOTHING, USTR("")); + assert(serd_writer_write_statement(writer, 0, NULL, &s, &p, &o, NULL, NULL) == + SERD_ERR_BAD_ARG); + + assert(!chunk.buf); serd_writer_free(writer); + serd_env_free(env); +} + +static void +test_write_bad_statement(void) +{ + SerdEnv* const env = serd_env_new(NULL); + assert(env); + + SerdChunk chunk = {NULL, 0}; + SerdWriter* const writer = serd_writer_new( + SERD_TURTLE, (SerdStyle)0, env, NULL, serd_chunk_sink, &chunk); + assert(writer); + + SerdNode s = serd_node_from_string(SERD_URI, USTR("http://example.org/s")); + SerdNode p = serd_node_from_string(SERD_URI, USTR("http://example.org/p")); + SerdNode o = serd_node_from_string(SERD_URI, USTR("http://example.org/o")); + SerdNode l = serd_node_from_string(SERD_LITERAL, USTR("lang")); + assert(serd_writer_write_statement( + writer, + (SerdStatementFlags)(SERD_ANON_S_BEGIN | SERD_LIST_S_BEGIN), + NULL, + &s, + &p, + &o, + NULL, + NULL) == SERD_ERR_BAD_ARG); + + assert(serd_writer_write_statement( + writer, + (SerdStatementFlags)(SERD_EMPTY_S | SERD_LIST_S_BEGIN), + NULL, + &s, + &p, + &o, + NULL, + NULL) == SERD_ERR_BAD_ARG); + + assert(serd_writer_write_statement( + writer, + (SerdStatementFlags)(SERD_ANON_O_BEGIN | SERD_LIST_O_BEGIN), + NULL, + &s, + &p, + &o, + NULL, + NULL) == SERD_ERR_BAD_ARG); + + assert(serd_writer_write_statement( + writer, + (SerdStatementFlags)(SERD_EMPTY_O | SERD_LIST_O_BEGIN), + NULL, + &s, + &p, + &o, + NULL, + NULL) == SERD_ERR_BAD_ARG); + + assert(serd_writer_write_statement(writer, 0U, NULL, &s, &p, &o, &o, &l) == + SERD_ERR_BAD_ARG); + + serd_writer_free(writer); serd_env_free(env); } @@ -281,6 +385,9 @@ main(void) test_write_bad_anon_stack(); test_strict_write(); test_write_error(); + test_chunk_sink(); + test_write_nothing_node(); + test_write_bad_statement(); return 0; } |