hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

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 };