aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2025-03-16 14:51:40 -0400
committerDavid Robillard <d@drobilla.net>2025-03-16 20:26:27 -0400
commit269a0192b68ca653bcc1e9d1990453ba3edc564c (patch)
tree3d85334649266b4e71641101c0aa324afb9f7363
parent81602f6c59ef8b9595f8fc6ad5065a22ab536858 (diff)
downloadserd-269a0192b68ca653bcc1e9d1990453ba3edc564c.tar.gz
serd-269a0192b68ca653bcc1e9d1990453ba3edc564c.tar.bz2
serd-269a0192b68ca653bcc1e9d1990453ba3edc564c.zip
Strengthen exhaustive write error test
Factor out the check, then also check that writing with enough space succeeds. This makes the test more future-proof since it will fail if the maximum sizes aren't updated (meaning errors near the end of the document aren't covered). Strengthen the check itself by including the status of serd_writer_finish(), and bump the Turtle and TriG sizes by the three corresponding trailing bytes.
-rw-r--r--test/test_reader_writer.c74
1 files changed, 45 insertions, 29 deletions
diff --git a/test/test_reader_writer.c b/test/test_reader_writer.c
index 8f432767..49821242 100644
--- a/test/test_reader_writer.c
+++ b/test/test_reader_writer.c
@@ -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 size_t max_offsets[] = {0, 462, 1911, 2003, 462};
+ 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 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, 465, 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);
}
}
}