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