#include "stream_expectations.h" /* Ordered from 0 to queue_size - 1 */ struct test_assertion assertions_queue[MAX_QUEUE_ITEMS]; size_t queue_size = 0; size_t current_expectation = 0; decoder_t * decoder; void set_decoder(decoder_t * dec) { decoder = dec; } /* Callbacks */ struct test_assertion current() { return assertions_queue[current_expectation]; } /* Assertions builders and matcher callbacks */ <% %w(u neg).each do |type| %> <% [8, 16, 32, 64].each do |width| %> void assert_<%= type %>int<%= width %>_eq(uint<%= width %>_t actual) { assertions_queue[queue_size++] = (struct test_assertion) { <%= type.upcase %>INT<%= width %>_EQ, (union test_expectation_data) { .int<%= width %> = actual } }; } void <%= type %>int<%= width %>_callback(void * context, uint<%= width %>_t actual) { assert_true(current().expectation == <%= type.upcase %>INT<%= width %>_EQ); assert_true(current().data.int<%= width %> == actual); current_expectation++; } <% end %> <% end %> void assert_bstring_mem_eq(cbor_data address, size_t length) { assertions_queue[queue_size++] = (struct test_assertion) { BSTRING_MEM_EQ, (union test_expectation_data) { .string = { address, length } } }; } void byte_string_callback(void * context, cbor_data address, size_t length) { assert_true(current().expectation == BSTRING_MEM_EQ); assert_true(current().data.string.address == address); assert_true(current().data.string.length == length); current_expectation++; } void assert_bstring_indef_start() { assertions_queue[queue_size++] = (struct test_assertion) { .expectation = BSTRING_INDEF_START }; } void byte_string_start_callback(void * context) { assert_true(current().expectation == BSTRING_INDEF_START); current_expectation++; } void assert_indef_break() { assertions_queue[queue_size++] = (struct test_assertion) { .expectation = INDEF_BREAK }; } void indef_break_callback(void * context) { assert_true(current().expectation == INDEF_BREAK); current_expectation++; } <% %w(array map).each do |type| %> void assert_<%= type %>_start(size_t length) { assertions_queue[queue_size++] = (struct test_assertion) { <%= type.upcase %>_START, { .length = length } }; } void <%= type %>_start_callback(void * context, size_t length) { assert_true(current().expectation == <%= type.upcase %>_START); assert_true(current().data.length == length); current_expectation++; } void assert_indef_<%= type %>_start() { assertions_queue[queue_size++] = (struct test_assertion) { .expectation = <%= type.upcase %>_INDEF_START }; } void indef_<%= type %>_start_callback(void * context) { assert_true(current().expectation == <%= type.upcase %>_INDEF_START); current_expectation++; } <% end %> void assert_tag_eq(uint64_t value) { assertions_queue[queue_size++] = (struct test_assertion) { TAG_EQ , { .int64 = value } }; } void tag_callback(void * context, uint64_t value) { assert_true(current().expectation == TAG_EQ); assert_true(current().data.int64 == value); current_expectation++; } <% [['half', 2, 'float'], ['float', 4], ['double', 8]].each do |decimal| %> void assert_<%= decimal[0] %>(<%= decimal[2] || decimal[0] %> value) { assertions_queue[queue_size++] = (struct test_assertion) { <%= decimal[0].upcase %>_EQ, { .float<%= decimal[1] %> = value } }; } void <%= decimal[0] %>_callback(void * context, <%= decimal[2] || decimal[0] %> actual) { assert_true(current().expectation == <%= decimal[0].upcase %>_EQ); assert_true(current().data.float<%= decimal[1] %> == actual); current_expectation++; } <% end %> void assert_bool(bool value) { assertions_queue[queue_size++] = (struct test_assertion) { BOOL_EQ, { .boolean = value } }; } void assert_nil() { assertions_queue[queue_size++] = (struct test_assertion) { .expectation = NIL }; } void assert_undef() { assertions_queue[queue_size++] = (struct test_assertion) { .expectation = UNDEF }; } void bool_callback(void * context, bool actual) { assert_true(current().expectation == BOOL_EQ); assert_true(current().data.boolean == actual); current_expectation++; } void null_callback(void * context) { assert_true(current().expectation == NIL); current_expectation++; } void undef_callback(void * context) { assert_true(current().expectation == UNDEF); current_expectation++; } const struct cbor_callbacks asserting_callbacks = { <% %w(u neg).each do |type| %> <% [8, 16, 32, 64].each do |width| %> .<%= type %>int<%= width %> = &<%= type %>int<%= width %>_callback, <% end %> <% end %> .byte_string = &byte_string_callback, .byte_string_start = &byte_string_start_callback, <% %w(array map).each do |type| %> .<%= type %>_start = &<%= type %>_start_callback, .indef_<%= type %>_start = &indef_<%= type %>_start_callback, <% end %> .tag = &tag_callback, <% [['half', 2], ['float', 4], ['double', 8]].each do |decimal| %> .float<%= decimal[1] %> = &<%= decimal[0] %>_callback, <% end %> .undefined = &undef_callback, .boolean = &bool_callback, .null = &null_callback, .indef_break = &indef_break_callback }; struct cbor_decoder_result decode(cbor_data source, size_t source_size) { struct cbor_decoder_result result = decoder(source, source_size, &asserting_callbacks, NULL); /* Check remaining assertions */ assert_true(current_expectation == queue_size); /* Clean up */ current_expectation = queue_size = 0; return result; }