diff --git a/lib/c/2014/test/test_labcomm.c b/lib/c/2014/test/test_labcomm.c index 7c617f8164690b6028f69f1f6b4f50ff3d476493..1ca14a9181bacd6d627c5d31214fc32aae19dc07 100644 --- a/lib/c/2014/test/test_labcomm.c +++ b/lib/c/2014/test/test_labcomm.c @@ -30,6 +30,44 @@ #include "labcomm_default_scheduler.h" #include "test/gen/test_sample.h" +static struct labcomm_writer writer; + +static struct expect { + char *description; + int result; + int (*trampoline)(struct labcomm_decoder *context); + struct labcomm_decoder *context; +} *expect; + +static void check_expect() +{ + struct expect *p = expect; + + { + int i; + for (i = 0 ; i < writer.pos ; i++) { + fprintf(stderr, "%02x ", writer.data[i]); + } + fprintf(stderr, "\n"); + } + if (p && p->trampoline) { + int err; + + expect = p + 1; + fprintf(stderr, "Checking '%s' expected=%d ", p->description, p->result); + err = p->trampoline(p->context); + fprintf(stderr, "actual=%d\n", err); + if (p->result >= 0 && p->result != err) { + fprintf(stderr, "FAILED\n"); + exit(1); + } else if (err == 0) { + fprintf(stderr, "FAILED (unexpected 0)\n"); + exit(1); + } + writer.pos = 0; + } +} + static unsigned char buffer[512]; static int writer_alloc(struct labcomm_writer *w, @@ -41,6 +79,7 @@ static int writer_alloc(struct labcomm_writer *w, return 0; } + static int writer_start(struct labcomm_writer *w, struct labcomm_writer_action_context *action_context, int index, const struct labcomm_signature *signature, @@ -48,15 +87,27 @@ static int writer_start(struct labcomm_writer *w, { return 0; } + +static int buf_writer_end( + struct labcomm_writer *w, + struct labcomm_writer_action_context *action_context) +{ + check_expect(); + return 0; +} + const struct labcomm_writer_action writer_action = { .alloc = writer_alloc, .start = writer_start, + .end = buf_writer_end, }; + static struct labcomm_writer_action_context writer_action_context = { .next = NULL, .action = &writer_action, .context = NULL }; + static struct labcomm_writer writer = { .action_context = &writer_action_context, .data = buffer, @@ -76,21 +127,25 @@ static int reader_alloc(struct labcomm_reader *r, return 0; } + static int reader_fill(struct labcomm_reader *r, struct labcomm_reader_action_context *action_context) { r->error = -ENOMEM; return r->error; } + const struct labcomm_reader_action reader_action = { .alloc = reader_alloc, .fill = reader_fill, }; + static struct labcomm_reader_action_context reader_action_context = { .next = NULL, .action = &reader_action, .context = NULL }; + static struct labcomm_reader reader = { .action_context = &reader_action_context, .data = buffer, @@ -106,6 +161,7 @@ static test_sample_test_var encoder_var = { .n_2 = 1, .a = encoder_data, }; + static int32_t decoder_data[256]; static test_sample_test_var decoder_var = { .n_0 = 1, @@ -125,12 +181,11 @@ int test_decode_one(struct labcomm_decoder *decoder) for (reader.count = 0 ; reader.count < writer.pos ; reader.count++) { reader.error = 0; reader.pos = 0; - labcomm_decoder_decode_one(decoder); - labcomm_decoder_decode_one(decoder); result = labcomm_decoder_decode_one(decoder); if (result >= 0 ) { - fprintf(stderr, "Got result from buffer with bogus length (%d)\n", - result); + fprintf(stderr, + "Got result from buffer with bogus length (%d, %d != %d)\n", + result, reader.count, writer.pos); exit(1); } } @@ -139,7 +194,7 @@ int test_decode_one(struct labcomm_decoder *decoder) reader.count = writer.pos; result = labcomm_decoder_decode_one(decoder); if (result < 0) { - fprintf(stderr, "Got result from buffer with correct length (%d)\n", + fprintf(stderr, "Got no result from buffer with correct length (%d)\n", result); exit(1); } @@ -177,22 +232,31 @@ static void test_encode_decode(struct labcomm_encoder *encoder, int main(void) { int err, i; - struct labcomm_encoder *encoder = labcomm_encoder_new( - &writer, + struct labcomm_decoder *decoder = labcomm_decoder_new( + &reader, labcomm_default_error_handler, labcomm_default_memory, labcomm_default_scheduler); - struct labcomm_decoder *decoder = labcomm_decoder_new( - &reader, + struct expect expect_version[] = { + { "Version", 1, test_decode_one, decoder }, + { 0, 0, 0 } + }; + expect = expect_version; + struct labcomm_encoder *encoder = labcomm_encoder_new( + &writer, labcomm_default_error_handler, labcomm_default_memory, labcomm_default_scheduler); - err = test_decode_one(decoder); - fprintf(stderr, "decode of version -> index %d\n", err); - writer.pos = 0; labcomm_decoder_register_test_sample_test_var(decoder, handle_test_var, NULL); + struct expect expect_registration[] = { + { "Sampledef", -1, test_decode_one, decoder }, + { "Typedef", -1, test_decode_one, decoder }, + { "Binding", -1, test_decode_one, decoder }, + { 0, 0, 0 } + }; + expect = expect_registration; labcomm_encoder_register_test_sample_test_var(encoder); err = test_decode_one(decoder); fprintf(stderr, "decode of register -> index %d\n", err);