parent
c9df91b04a
commit
2ea9737e5d
2 changed files with 128 additions and 1 deletions
@ -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; |
||||
} |
Loading…
Reference in new issue