| 1 | // Copyright (c) 2022, 2024 blackshirt. All rights reserved. |
| 2 | // Use of this source code is governed by a MIT License |
| 3 | // that can be found in the LICENSE file. |
| 4 | module asn1 |
| 5 | |
| 6 | struct RByteTest { |
| 7 | inp []u8 |
| 8 | pos int |
| 9 | result u8 |
| 10 | end bool |
| 11 | } |
| 12 | |
| 13 | fn test_simple_read_byte() { |
| 14 | src := [u8(0x16), 0x06, 0x44, 0x05, 0x09, 0x22] |
| 15 | start := 0 |
| 16 | |
| 17 | mut val, mut pos := read_byte(src, 0)! |
| 18 | assert val == src[start] |
| 19 | assert pos == 1 |
| 20 | |
| 21 | val, pos = read_byte(src, pos)! |
| 22 | assert val == src[1] |
| 23 | assert pos == 2 |
| 24 | |
| 25 | val, pos = read_byte(src, pos)! |
| 26 | assert val == src[2] |
| 27 | assert pos == 3 |
| 28 | |
| 29 | val, pos = read_byte(src, pos)! |
| 30 | assert val == src[3] |
| 31 | assert pos == 4 |
| 32 | |
| 33 | val, pos = read_byte(src, pos)! |
| 34 | assert val == src[4] |
| 35 | assert pos == 5 |
| 36 | |
| 37 | // this is the last item in the array |
| 38 | val, pos = read_byte(src, pos)! |
| 39 | assert val == src[5] // the last item, 0x22 |
| 40 | assert pos == 6 |
| 41 | |
| 42 | // read next byte should error |
| 43 | val, pos = read_byte(src, pos) or { |
| 44 | assert err == error('invalid loc or len') |
| 45 | return |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | fn test_read_digit_outside_digit_iserror() ! { |
| 50 | src := [u8(0xff)] |
| 51 | _, _ := read_digit(src, 0) or { |
| 52 | assert err == error('not digit byte') |
| 53 | return |
| 54 | } |
| 55 | } |
| 56 | |
| 57 | fn test_simple_read_digit() ! { |
| 58 | // 0x22 is not digit digit byte |
| 59 | src := [u8(0x32), 0x33, 0x34, 0x35, 0x39, 0x22] |
| 60 | start := 0 |
| 61 | |
| 62 | mut val, mut pos := read_digit(src, start)! |
| 63 | assert val == 2 // (0x32-0x30) |
| 64 | assert pos == 1 |
| 65 | |
| 66 | val, pos = read_digit(src, pos)! |
| 67 | assert val == 3 // 0x33-0x30 |
| 68 | assert pos == 2 |
| 69 | |
| 70 | val, pos = read_digit(src, pos)! |
| 71 | assert val == 4 // 0x34 - 0x30 |
| 72 | assert pos == 3 |
| 73 | |
| 74 | val, pos = read_digit(src, pos)! |
| 75 | assert val == 5 // same principe as above |
| 76 | assert pos == 4 |
| 77 | |
| 78 | val, pos = read_digit(src, pos)! |
| 79 | assert val == 9 |
| 80 | assert pos == 5 |
| 81 | |
| 82 | // the last item was not digit |
| 83 | val, pos = read_digit(src, pos) or { |
| 84 | assert err == error('not digit byte') |
| 85 | return |
| 86 | } |
| 87 | } |
| 88 | |
| 89 | fn test_read_2_digits_single() ! { |
| 90 | src := [u8(0x35)] |
| 91 | start := 0 |
| 92 | read_2_digits(src, start) or { |
| 93 | assert err == error('not enough bytes') |
| 94 | return |
| 95 | } |
| 96 | } |
| 97 | |
| 98 | fn test_read_2_digits_double() ! { |
| 99 | src := [u8(0x35), 0x33] |
| 100 | start := 0 |
| 101 | val, pos := read_2_digits(src, start)! |
| 102 | assert val == 53 // 5*10+3 |
| 103 | assert pos == 2 |
| 104 | } |
| 105 | |
| 106 | fn test_read_2_digits_simple() ! { |
| 107 | // 0x22 is not digit digit byte |
| 108 | src := [u8(0x30), 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x22] // 48,49,50,51,52,53,54,55,56,57, " |
| 109 | start := 0 |
| 110 | |
| 111 | mut val, mut pos := read_2_digits(src, start)! |
| 112 | assert val == 1 // 0*10+1 |
| 113 | assert pos == 2 |
| 114 | |
| 115 | val, pos = read_2_digits(src, pos)! |
| 116 | assert val == 23 // 2*10+3 |
| 117 | assert pos == 4 |
| 118 | |
| 119 | val, pos = read_2_digits(src, pos)! |
| 120 | assert val == 45 // 4*10+5 |
| 121 | assert pos == 6 |
| 122 | |
| 123 | val, pos = read_2_digits(src, pos)! |
| 124 | assert val == 67 // 6*10+7 |
| 125 | assert pos == 8 |
| 126 | |
| 127 | val, pos = read_2_digits(src, pos)! |
| 128 | assert val == 89 // 8*10+9 |
| 129 | assert pos == 10 |
| 130 | |
| 131 | // last item was 0x22, its not digit and not enough |
| 132 | val, pos = read_2_digits(src, pos) or { |
| 133 | assert err == error('not enough bytes') |
| 134 | return |
| 135 | } |
| 136 | } |
| 137 | |
| 138 | fn test_read_4_digits() ! { |
| 139 | src := [u8(0x30), 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x35] // 48,49,50,51,52,53,54,55,56,57 |
| 140 | start := 0 |
| 141 | |
| 142 | mut val, mut pos := read_4_digits(src, start)! |
| 143 | assert val == 123 // 0*1000 + 1*100 + 2*10 + 3 |
| 144 | assert pos == 4 |
| 145 | |
| 146 | val, pos = read_4_digits(src, pos)! |
| 147 | assert val == 4567 // 4*1000 + 5*100 + 6*10 + 7 |
| 148 | assert pos == 8 |
| 149 | |
| 150 | // last read 4 digit was error |
| 151 | val, pos = read_4_digits(src, pos) or { |
| 152 | assert err == error('not enough bytes') |
| 153 | return |
| 154 | } |
| 155 | } |
| 156 | |