encoder_test.ha (3315B)
1 // SPDX-License-Identifier: MPL-2.0 2 // (c) Hare authors <https://harelang.org> 3 4 use bytes; 5 use io; 6 use memio; 7 use types; 8 9 10 @test fn write_id() void = { 11 let buf = memio::dynamic(); 12 defer io::close(&buf)!; 13 let e = derencoder(&buf); 14 15 write_fixedprim(&e, class::UNIVERSAL, 0x2aa, [0x00])!; 16 encode(&e)!; 17 assert(bytes::equal([0x1f, 0x85, 0x2a, 0x01, 0x00], 18 memio::buffer(&buf))); 19 20 io::seek(&buf, 0, io::whence::SET)!; 21 let d = derdecoder(&buf); 22 let h = peek(&d)!; 23 assert(h.tagid == 0x2aa); 24 25 let buf = memio::dynamic(); 26 defer io::close(&buf)!; 27 let e = derencoder(&buf); 28 29 write_fixedprim(&e, class::UNIVERSAL, types::U32_MAX, [0x00])!; 30 encode(&e)!; 31 assert(bytes::equal([0x1f, 0x8f, 0xff, 0xff, 0xff, 0x7f, 0x01, 0x00], 32 memio::buffer(&buf))); 33 34 io::seek(&buf, 0, io::whence::SET)!; 35 let d = derdecoder(&buf); 36 let h = peek(&d)!; 37 assert(h.tagid == types::U32_MAX); 38 }; 39 40 @test fn write_prim() void = { 41 let buf = memio::dynamic(); 42 defer io::close(&buf)!; 43 let dest = memio::dynamic(); 44 defer io::close(&dest)!; 45 46 let enc = derencoder(&buf); 47 48 create_prim(&enc, class::UNIVERSAL, utag::INTEGER)!; 49 write(&enc, [0x01, 0x05, 0x07])!; 50 finish_prim(&enc); 51 52 assert(encodeto(&enc, &dest)! == 5); 53 54 assert(bytes::equal(memio::buffer(&dest), [ 55 0x02, 0x03, 0x01, 0x05, 0x07 56 ])); 57 }; 58 59 @test fn encode_dsz() void = { 60 assert(bytes::equal([0x7f], encode_dsz(0x7f))); 61 assert(bytes::equal([0x81, 0x8f], encode_dsz(0x8f))); 62 assert(bytes::equal([0x81, 0xff], encode_dsz(0xff))); 63 assert(bytes::equal([0x82, 0x01, 0x00], encode_dsz(0x100))); 64 }; 65 66 @test fn write_seq() void = { 67 let buf = memio::dynamic(); 68 defer io::close(&buf)!; 69 let dest = memio::dynamic(); 70 defer io::close(&dest)!; 71 72 let enc = derencoder(&buf); 73 74 create_seq(&enc)!; 75 write_bool(&enc, false)!; 76 create_seq(&enc)!; 77 write_int(&enc, [0x01, 0x02, 0x03])!; 78 finish_seq(&enc); 79 finish_seq(&enc); 80 assert(encodeto(&enc, &dest)! == 12); 81 82 assert(bytes::equal(memio::buffer(&dest), [ 83 0x30, 0x0a, // seq 84 0x01, 0x01, 0x00, // bool 85 0x30, 0x05, // seq 86 0x02, 0x03, 0x01, 0x02, 0x03, // int 87 ])); 88 }; 89 90 @test fn write_bool() void = { 91 let dest = memio::dynamic(); 92 defer io::close(&dest)!; 93 94 let buf = memio::dynamic(); 95 defer io::close(&buf)!; 96 let enc = derencoder(&buf); 97 98 write_bool(&enc, true)!; 99 encodeto(&enc, &dest)!; 100 101 assert(bytes::equal(memio::buffer(&dest), [0x01, 0x01, 0xff])); 102 }; 103 104 @test fn write_int() void = { 105 let dest = memio::dynamic(); 106 defer io::close(&dest)!; 107 let buf = memio::dynamic(); 108 defer io::close(&buf)!; 109 110 let enc = derencoder(&buf); 111 112 write_int(&enc, [0x00, 0x00, 0x00, 0x00, 0x80])!; 113 encodeto(&enc, &dest)!; 114 115 assert(bytes::equal(memio::buffer(&dest), [0x02, 0x02, 0x00, 0x80])); 116 117 memio::reset(&dest); 118 memio::reset(&buf); 119 let enc = derencoder(&buf); 120 121 write_int(&enc, [0xff, 0xff, 0xff, 0x80, 0x10])!; 122 encodeto(&enc, &dest)!; 123 124 assert(bytes::equal(memio::buffer(&dest), [0x02, 0x02, 0x80, 0x10])); 125 126 memio::reset(&dest); 127 memio::reset(&buf); 128 let enc = derencoder(&buf); 129 130 write_int(&enc, [0x00, 0x00, 0x00])!; 131 encodeto(&enc, &dest)!; 132 133 assert(bytes::equal(memio::buffer(&dest), [0x02, 0x01, 0x00])); 134 135 memio::reset(&dest); 136 memio::reset(&buf); 137 let enc = derencoder(&buf); 138 139 write_uint(&enc, [0x8f, 0x01])!; 140 encodeto(&enc, &dest)!; 141 142 assert(bytes::equal(memio::buffer(&dest), [0x02, 0x03, 0x00, 0x8f, 0x01])); 143 };