From 2ea9737e5d5b085eef6fe762c7e86a7161b9d231 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Sat, 22 Jan 2011 01:06:19 -0800 Subject: Added test_stream.c for testing upb_stream.h. --- tests/test_stream.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 tests/test_stream.c (limited to 'tests') diff --git a/tests/test_stream.c b/tests/test_stream.c new file mode 100644 index 0000000..b6d511c --- /dev/null +++ b/tests/test_stream.c @@ -0,0 +1,127 @@ + +#undef NDEBUG /* ensure tests always assert. */ +#include "upb_stream.h" +#include "upb_string.h" + +typedef struct { + upb_string *str; + bool should_delegate; +} test_data; + +extern upb_handlerset test_handlers; + +static void strappendf(upb_string *s, const char *format, ...) { + upb_string *str = upb_string_new(); + va_list args; + va_start(args, format); + upb_string_vprintf(str, format, args); + va_end(args); + upb_strcat(s, str); + upb_string_unref(str); +} + +static upb_flow_t startmsg(void *closure) { + test_data *d = closure; + strappendf(d->str, "startmsg\n"); + return UPB_CONTINUE; +} + +static upb_flow_t endmsg(void *closure) { + test_data *d = closure; + strappendf(d->str, "endmsg\n"); + return UPB_CONTINUE; +} + +static upb_flow_t value(void *closure, struct _upb_fielddef *f, upb_value val) { + (void)f; + test_data *d = closure; + strappendf(d->str, "value, %lld\n", upb_value_getint64(val)); + return UPB_CONTINUE; +} + +static upb_flow_t startsubmsg(void *closure, struct _upb_fielddef *f, + upb_handlers *delegate_to) { + (void)f; + test_data *d = closure; + strappendf(d->str, "startsubmsg\n"); + if (d->should_delegate) { + upb_register_handlerset(delegate_to, &test_handlers); + upb_set_handler_closure(delegate_to, closure, NULL); + return UPB_DELEGATE; + } else { + return UPB_CONTINUE; + } +} + +static upb_flow_t endsubmsg(void *closure) { + test_data *d = closure; + strappendf(d->str, "endsubmsg\n"); + return UPB_CONTINUE; +} + +static upb_flow_t unknownval(void *closure, upb_field_number_t fieldnum, + upb_value val) { + (void)val; + test_data *d = closure; + strappendf(d->str, "unknownval, %d\n", fieldnum); + return UPB_CONTINUE; +} + +upb_handlerset test_handlers = { + &startmsg, + &endmsg, + &value, + &startsubmsg, + &endsubmsg, + &unknownval, +}; + +static void test_dispatcher() { + test_data data; + data.should_delegate = false; + data.str = upb_string_new(); + upb_handlers h; + upb_handlers_init(&h); + upb_handlers_reset(&h); + upb_register_handlerset(&h, &test_handlers); + upb_set_handler_closure(&h, &data, NULL); + upb_dispatcher d; + upb_dispatcher_init(&d); + upb_dispatcher_reset(&d, &h); + + upb_dispatch_startmsg(&d); + upb_value val; + upb_value_setint64(&val, 5); + upb_dispatch_value(&d, NULL, val); + upb_dispatch_startsubmsg(&d, NULL); + data.should_delegate = true; + upb_dispatch_startsubmsg(&d, NULL); + data.should_delegate = false; + upb_dispatch_startsubmsg(&d, NULL); + upb_dispatch_value(&d, NULL, val); + upb_dispatch_endsubmsg(&d); + upb_dispatch_endsubmsg(&d); + upb_dispatch_endsubmsg(&d); + upb_dispatch_endmsg(&d); + + upb_string expected = UPB_STACK_STRING( + "startmsg\n" + "value, 5\n" + "startsubmsg\n" + "startsubmsg\n" + "startmsg\n" // Because of the delegation. + "startsubmsg\n" + "value, 5\n" + "endsubmsg\n" + "endmsg\n" // Because of the delegation. + "endsubmsg\n" + "endsubmsg\n" + "endmsg\n"); + assert(upb_streql(data.str, &expected)); + upb_string_unref(data.str); +} + +int main() { + test_dispatcher(); + return 0; +} -- cgit v1.2.3