#include #include #include #include #include "test_scaffold.h" #include #include struct generic_cbor_test : public test_scaffold { std::unique_ptr> store = std::make_unique>(); gp::arena alloc{&*store->begin(), store->size()}; }; struct cbor_test1 : public generic_cbor_test { cbor_test1() { name = __FILE__ ":" "##1"; } virtual int run() { using some_int = gp::fixed_variant; { some_int a{16}; some_int b = 12u; b = a; gp_config::assertion(b.is_a(), "b got wrong type assigned"); } return 0; } }; struct cbor_test2 : public generic_cbor_test { cbor_test2() { name = __FILE__ ":" "##2"; } virtual int run() { using some_int = gp::fixed_variant; { some_int a{16u}; some_int b = a; gp_config::assertion(b.is_a(), "b got wrong type assigned"); gp_config::assertion(b.value() == 16, "b got wrong value assigned"); } return 0; } }; struct cbor_test3 : public generic_cbor_test { cbor_test3() { name = __FILE__ ":" "##3"; } virtual int run() { using some_int = gp::fixed_variant; { some_int a{16u}; some_int b = gp::move(a); gp_config::assertion(b.is_a(), "b got wrong type assigned"); gp_config::assertion(b.value() == 16, "b got wrong value assigned"); } return 0; } }; struct cbor_test4 : public generic_cbor_test { cbor_test4() { name = __FILE__ ":" "##4"; } virtual int run() { using some_int = gp::fixed_variant; { some_int a{16u}; some_int b; new(&b) some_int(a); gp_config::assertion(b.is_a(), "b got wrong type assigned"); gp_config::assertion(b.value() == 16, "b got wrong value assigned"); } return 0; } }; struct cbor_test5 : public generic_cbor_test { cbor_test5() { name = __FILE__ ":" "##5"; } virtual int run() { using some_int = gp::fixed_variant; { some_int a{16u}; some_int b; new(&b) some_int(gp::move(a)); gp_config::assertion(b.is_a(), "b got wrong type assigned"); gp_config::assertion(b.value() == 16, "b got wrong value assigned"); } return 0; } }; struct cbor_test6 : public generic_cbor_test { cbor_test6() { name = __FILE__ ":" "##6"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector vec{alloc}; vec.emplace_back(12u); vec.emplace_back(-16); gp_config::assertion(vec[0].is_a(), "vec0 got wrong type assigned"); gp_config::assertion(vec[1].is_a(), "vec1 got wrong type assigned"); } return 0; } }; struct cbor_test7 : public generic_cbor_test { cbor_test7() { name = __FILE__ ":" "##7"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector serialized(alloc); gp::push_as_cbor(serialized, gp::cbor_associative_array_initiator{2}); gp::push_as_cbor(serialized, gp::make_pair(uint64_t(12), int64_t(-98))); gp::push_as_cbor(serialized, gp::make_pair(uint64_t(13), int64_t(98))); log_segment("serialized[0]", std::to_string((unsigned char)serialized[0]).c_str()); log_segment("serialized[1]", std::to_string((unsigned char)serialized[1]).c_str()); log_segment("serialized[2]", std::to_string((unsigned char)serialized[2]).c_str()); log_segment("serialized[3]", std::to_string((unsigned char)serialized[3]).c_str()); log_segment("serialized[4]", std::to_string((unsigned char)serialized[4]).c_str()); log_segment("serialized[5]", std::to_string((unsigned char)serialized[5]).c_str()); log_segment("serialized[6]", std::to_string((unsigned char)serialized[6]).c_str()); gp::array serialized_manual{ char(0b10100010), char(0b00001100), char(0b00111000), char(98), char(0b00001101), char(0b00011000), char(98) }; gp_config::assertion(serialized.size() == serialized_manual.size(), "could not encode: wrong output size"); for(size_t idx = 0; idx < serialized_manual.size(); idx++) { gp_config::assertion(serialized[idx] == serialized_manual[idx], "data did not serialize correctly"); } auto state = serialized_manual.as_buffer(); size_t count = 0; auto count_handler = [](size_t size){ { std::bitset size_bits{size}; std::stringstream v; v << size_bits; log_segment("size bits", v.str().c_str()); } { std::bitset size_bits{-size}; std::stringstream v; v << size_bits; log_segment("-size bits", v.str().c_str()); } { log_segment("-size value", std::to_string((size_t)-size).c_str()); } gp_config::assertion(size == 2, "could not decode the correct size"); return true; }; auto callback_handler = [&count](gp::parsing_state state, gp::allocator& alloc) { log_segment("state remaining", std::to_string(state.size()).c_str()); count++; switch(count-1) { case 0: { auto [value, new_state] = gp::read_cbor(state, alloc); gp_config::assertion(value.has_value(), "could not decode value 0"); log_segment("value 0", std::to_string(value.value()).c_str()); gp_config::assertion(value.value() == 12, "could not decode the correct size"); return new_state; } case 1:{ auto [value, new_state] = gp::read_cbor(state, alloc); gp_config::assertion(value.has_value(), "could not decode value 1"); log_segment("value 1", std::to_string(value.value()).c_str()); gp_config::assertion(value.value() == -98, "could not decode the correct size"); return new_state; } case 2:{ auto [value, new_state] = gp::read_cbor(state, alloc); gp_config::assertion(value.has_value(), "could not encode value 2"); log_segment("value 2", std::to_string(value.value()).c_str()); gp_config::assertion(value.value() == 13, "could not encode the correct size"); return new_state; } case 3:{ auto [value, new_state] = gp::read_cbor(state, alloc); gp_config::assertion(value.has_value(), "could not encode value 3"); log_segment("value 3", std::to_string(value.value()).c_str()); gp_config::assertion(value.value() == 98, "could not encode the correct size"); return new_state; } default: return state; } }; auto new_state = read_cbor_kv_list( state, alloc, callback_handler, count_handler ); gp_config::assertion(state.size() > new_state.size(), "reading succeeded"); gp_config::assertion(new_state.size() == 0, "something is left in the string"); } return 0; } }; struct cbor_test8 : public generic_cbor_test { cbor_test8() { name = __FILE__ ":" "##8"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector serialized(alloc); gp::array serialized_manual{ char(1) }; gp::push_as_cbor(serialized, 1); gp_config::assertion(serialized.size() == serialized_manual.size(), "could not encode (wrong size)"); gp_config::assertion(serialized[0] == serialized_manual[0], "data did not encode correctly"); auto [value, new_state] = gp::read_cbor(serialized.as_buffer(), alloc); gp_config::assertion(value.has_value(), "could not redecode"); gp_config::assertion(value.value() == 1, "data did not serialize correctly: wrong value decoded"); } return 0; } }; struct cbor_test9 : public generic_cbor_test { cbor_test9() { name = __FILE__ ":" "##9"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector serialized(alloc); gp::array serialized_manual{ char(0b00011001), char(0b00000100), char(0b00000000) }; gp::push_as_cbor(serialized, 1024); gp_config::assertion(serialized_manual.size() == serialized.size(), "could not encode"); for(size_t idx = 0; idx < serialized_manual.size(); idx++) { gp_config::assertion(serialized[idx] == serialized_manual[idx], "data did not serialize correctly"); } auto [value, state] = gp::read_cbor(serialized.as_buffer(), alloc); gp_config::assertion(value.has_value(), "could not decode"); gp_config::assertion(value.value() == 1024, "data did not decode correctly"); } return 0; } }; struct cbor_test10 : public generic_cbor_test { cbor_test10() { name = __FILE__ ":" "##10"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector serialized(alloc); gp::array serialized_manual{ char(0b00011010), char(0xAA), char(0xBB), char(0xCC), char(0xDD) }; gp::push_as_cbor(serialized, 0xAABBCCDD); gp_config::assertion(serialized_manual.size() == serialized.size(), "could not encode"); for(size_t idx = 0; idx < serialized_manual.size(); idx++) { gp_config::assertion(serialized[idx] == serialized_manual[idx], "data did not serialize correctly"); } auto [value, state] = gp::read_cbor(serialized.as_buffer(), alloc); gp_config::assertion(value.has_value(), "could not decode"); gp_config::assertion(value.value() == 0xAABBCCDD, "data did not decode correctly"); } return 0; } }; struct cbor_test11 : public generic_cbor_test { cbor_test11() { name = __FILE__ ":" "##11"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector serialized(alloc); gp::array serialized_manual{ char(0b00011011), char(0xAA), char(0xBB), char(0xCC), char(0xDD), char(0xEE), char(0xFF), char(0x00), char(0x11) }; gp::push_as_cbor(serialized, 0xAABBCCDDEEFF0011ull); gp_config::assertion(serialized_manual.size() == serialized.size(), "could not encode"); for(size_t idx = 0; idx < serialized_manual.size(); idx++) { gp_config::assertion(serialized[idx] == serialized_manual[idx], "data did not serialize correctly"); } auto [value, state] = gp::read_cbor(serialized.as_buffer(), alloc); gp_config::assertion(value.has_value(), "could not decode"); gp_config::assertion(value.value() == 0xAABBCCDDEEFF0011ull, "data did not decode correctly"); } return 0; } }; struct cbor_test12 : public generic_cbor_test { cbor_test12() { name = __FILE__ ":" "##12"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector serialized(alloc); gp::array serialized_manual{ char(0b11100000+22) }; gp::push_as_cbor(serialized, nullptr); gp_config::assertion(serialized.size() == serialized_manual.size(), "could not encode"); gp_config::assertion(serialized[0] == serialized_manual[0], "data did not serialize correctly"); auto [value, state] = gp::read_cbor(serialized.as_buffer(), alloc); gp_config::assertion(value.has_value(), "could not decode"); gp_config::assertion(value.value() == nullptr, "data did not decode correctly"); } return 0; } }; struct cbor_test13 : public generic_cbor_test { cbor_test13() { name = __FILE__ ":" "##13"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector serialized(alloc); gp::array serialized_manual{ char(0b11100000+21) }; gp::push_as_cbor(serialized, true); gp_config::assertion(serialized.size() == serialized_manual.size(), "could not encode"); gp_config::assertion(serialized[0] == serialized_manual[0], "data did not serialize correctly"); auto [value, state] = gp::read_cbor(serialized.as_buffer(), alloc); gp_config::assertion(value.has_value(), "could not encode"); gp_config::assertion(value.value() == true, "data did not decode correctly"); } return 0; } }; struct cbor_test14 : public generic_cbor_test { cbor_test14() { name = __FILE__ ":" "##14"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector serialized(alloc); gp::array serialized_manual{ char(0b11100000+20) }; gp::push_as_cbor(serialized, false); gp_config::assertion(serialized.size() == serialized_manual.size(), "could not encode"); gp_config::assertion(serialized[0] == serialized_manual[0], "data did not serialize correctly"); auto [value, state] = gp::read_cbor(serialized.as_buffer(), alloc); gp_config::assertion(value.has_value(), "could not encode"); gp_config::assertion(value.value() == false, "data did not decode correctly"); } return 0; } }; struct cbor_test15 : public generic_cbor_test { cbor_test15() { name = __FILE__ ":" "##15"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector serialized(alloc); gp::array serialized_manual{ char(0b11100000+23) }; gp::push_as_cbor(serialized, gp::cbor_undefined{}); gp_config::assertion(serialized.size() == serialized_manual.size(), "could not encode"); log_segment("value", std::to_string((uint8_t)serialized[0]).c_str()); gp_config::assertion(serialized[0] == serialized_manual[0], "data did not serialize correctly"); auto [value, state] = gp::read_cbor(serialized.as_buffer(), alloc); gp_config::assertion(value.has_value(), "could not encode"); } return 0; } }; struct cbor_test16 : public generic_cbor_test { cbor_test16() { name = __FILE__ ":" "##16"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector str{alloc}; str.reserve(5); for(auto a : {'h', 'e', 'l', 'l', 'o'}) str.push_back((char)a); gp::vector serialized(alloc); gp::array serialized_manual{ char(0b01000101), char('h'), char('e'), char('l'), char('l'), char('o') }; gp::push_as_cbor(serialized, str.as_buffer()); gp_config::assertion(serialized.size() == serialized_manual.size(), "could not encode"); for(size_t idx = 0; idx < serialized_manual.size(); idx++) { gp_config::assertion(serialized[idx] == serialized_manual[idx], "data did not serialize correctly"); } auto [value, state] = gp::read_cbor>(serialized.as_buffer(), alloc); gp_config::assertion(value.has_value(), "could not decode"); gp_config::assertion(value.value() == str, "data did not decode correctly"); } return 0; } }; struct cbor_test17 : public generic_cbor_test { cbor_test17() { name = __FILE__ ":" "##17"; } virtual int run() { using some_int = gp::fixed_variant; { gp::vector str{alloc}; str.reserve(5); for(auto a : {'h', 'e', 'l', 'l', 'o'}) str.push_back((char)a); gp::vector serialized(alloc); gp::array serialized_manual{ char(0b10000101), char(0b01000101), char('h'), char('e'), char('l'), char('l'), char('o'), char(0b01000101), char('h'), char('e'), char('l'), char('l'), char('o'), char(0b01000101), char('h'), char('e'), char('l'), char('l'), char('o'), char(0b01000101), char('h'), char('e'), char('l'), char('l'), char('o'), char(0b01000101), char('h'), char('e'), char('l'), char('l'), char('o') }; gp::push_as_cbor(serialized, gp::cbor_array_initiator{5}); gp::repeat(5, [&](){ gp::push_as_cbor(serialized, str.as_buffer()); } ); gp_config::assertion(serialized.size() == serialized_manual.size(), "could not encode"); for(size_t idx = 0; idx < serialized_manual.size(); idx++) { gp_config::assertion(serialized[idx] == serialized_manual[idx], "data did not serialize correctly"); } } return 0; } }; append_test dummy_pg5zhr84bv(new cbor_test1{}); append_test dummy_pg5zdhr8bv(new cbor_test2{}); append_test dummy_pg5zhrf8bv(new cbor_test3{}); append_test dummy_pg5zhdr8bv(new cbor_test4{}); append_test dummy_pg5zghr8bv(new cbor_test5{}); append_test dummy_pg5zhfr8bv(new cbor_test6{}); append_test dummy_pg5zhrs8bv(new cbor_test7{}); append_test dummy_pg5zhrj8bv(new cbor_test8{}); append_test dummy_pg5zhrh8bv(new cbor_test9{}); append_test dummy_pg5zhrz8bv(new cbor_test10{}); append_test dummy_pg5zhrg8bv(new cbor_test11{}); append_test dummy_pg5zher8bv(new cbor_test12{}); append_test dummy_pg5zhr8rbv(new cbor_test13{}); append_test dummy_pg5zzhr8bv(new cbor_test14{}); append_test dummy_p78shrg8bv(new cbor_test15{}); append_test dummy_p4sddr8rbv(new cbor_test16{}); append_test dummy_pg5zzdjobv(new cbor_test17{}); /* TODO: REWRITE THOSE BAD BOIS { gp::cbor_value data{alloc}; data = gp::cbor_floating_point(128.5f); gp::array serialized; gp::array serialized_manual{ std::byte(0b11111010), std::byte(0b01000011), std::byte(0b00000000), std::byte(0b10000000), std::byte(0b00000000) }; auto ret_it = data.encode(serialized.as_buffer()); gp_config::assertion(serialized.begin() != ret_it, "could not encode"); gp_config::assertion(serialized == serialized_manual, "data did not serialize correctly"); gp::fill(serialized,(std::byte)0); auto decoded = gp::cbor_value::decode(alloc, serialized_manual.as_buffer()); ret_it = decoded.first.encode(serialized.as_buffer()); gp_config::assertion(serialized.begin() != ret_it, "could not encode"); gp_config::assertion(serialized == serialized_manual, "data did not serialize correctly"); } { gp::cbor_value data{alloc}; data = gp::cbor_floating_point((double)128.5); gp::array serialized; gp::array serialized_manual{ std::byte(0b11111011), std::byte(0b01000000), std::byte(0b01100000), std::byte(0b00010000), std::byte(0b00000000), std::byte(0b00000000), std::byte(0b00000000), std::byte(0b00000000), std::byte(0b00000000) }; auto ret_it = data.encode(serialized.as_buffer()); gp_config::assertion(serialized.begin() != ret_it, "could not encode"); gp_config::assertion(serialized == serialized_manual, "data did not serialize correctly"); gp::fill(serialized,(std::byte)0); auto decoded = gp::cbor_value::decode(alloc, serialized_manual.as_buffer()); ret_it = decoded.first.encode(serialized.as_buffer()); gp_config::assertion(serialized.begin() != ret_it, "could not encode"); gp_config::assertion(serialized == serialized_manual, "data did not serialize correctly"); } { gp::vector str{alloc}; str.reserve(5); for(auto a : {'h', 'e', 'l', 'l', 'o'}) str.push_back((std::byte)a); gp::cbor_value data{alloc}; data = str; gp::vector meta{alloc}; gp::repeat(5, [&](){ meta.push_back(data); }); data = meta; gp::array serialized; gp::array serialized_manual{ std::byte(0b10000101), std::byte(0b01000101), std::byte('h'), std::byte('e'), std::byte('l'), std::byte('l'), std::byte('o'), std::byte(0b01000101), std::byte('h'), std::byte('e'), std::byte('l'), std::byte('l'), std::byte('o'), std::byte(0b01000101), std::byte('h'), std::byte('e'), std::byte('l'), std::byte('l'), std::byte('o'), std::byte(0b01000101), std::byte('h'), std::byte('e'), std::byte('l'), std::byte('l'), std::byte('o'), std::byte(0b01000101), std::byte('h'), std::byte('e'), std::byte('l'), std::byte('l'), std::byte('o') }; auto ret_it = data.encode(serialized.as_buffer()); gp_config::assertion(serialized.begin() != ret_it, "could not encode"); gp_config::assertion(serialized == serialized_manual, "data did not serialize correctly"); gp::fill(serialized,(std::byte)0); auto decoded = gp::cbor_value::decode(alloc, serialized_manual.as_buffer()); ret_it = decoded.first.encode(serialized.as_buffer()); gp_config::assertion(serialized.begin() != ret_it, "could not encode"); gp_config::assertion(serialized == serialized_manual, "data did not serialize correctly"); } { gp::vector str{alloc}; str.reserve(5); for(auto a : {'h', 'e', 'l', 'l', 'o'}) str.push_back((std::byte)a); gp::cbor_value data{alloc}; data = str; gp::vector> meta{alloc}; gp::repeat(2, [&](){ meta.push_back(gp::make_pair(data, data)); }); data = meta; gp::array serialized; gp::array serialized_manual{ std::byte(0b10100010), std::byte(0b01000101), std::byte('h'), std::byte('e'), std::byte('l'), std::byte('l'), std::byte('o'), std::byte(0b01000101), std::byte('h'), std::byte('e'), std::byte('l'), std::byte('l'), std::byte('o'), std::byte(0b01000101), std::byte('h'), std::byte('e'), std::byte('l'), std::byte('l'), std::byte('o'), std::byte(0b01000101), std::byte('h'), std::byte('e'), std::byte('l'), std::byte('l'), std::byte('o') }; auto ret_it = data.encode(serialized.as_buffer()); gp_config::assertion(serialized.begin() != ret_it, "could not encode"); gp_config::assertion(serialized == serialized_manual, "data did not serialize correctly"); gp::fill(serialized,(std::byte)0); auto decoded = gp::cbor_value::decode(alloc, serialized_manual.as_buffer()); ret_it = decoded.first.encode(serialized.as_buffer()); gp_config::assertion(serialized.begin() != ret_it, "could not encode"); gp_config::assertion(serialized == serialized_manual, "data did not serialize correctly"); } */