diff options
Diffstat (limited to 'tests/t_scan.c')
| -rw-r--r-- | tests/t_scan.c | 124 |
1 files changed, 87 insertions, 37 deletions
diff --git a/tests/t_scan.c b/tests/t_scan.c index 89f1590..aab4413 100644 --- a/tests/t_scan.c +++ b/tests/t_scan.c | |||
| @@ -15,13 +15,13 @@ static void case_plain_numbers(void) { | |||
| 15 | uint64_t value; | 15 | uint64_t value; |
| 16 | 16 | ||
| 17 | test_case("a decimal number is read and its length reported"); | 17 | test_case("a decimal number is read and its length reported"); |
| 18 | CHECK_INT(scan_udec("0", &value, 65535), 1); | 18 | CHECK_INT(scan_uint("0", &value, 65535), 1); |
| 19 | CHECK_INT(value, 0); | 19 | CHECK_INT(value, 0); |
| 20 | CHECK_INT(scan_udec("7", &value, 65535), 1); | 20 | CHECK_INT(scan_uint("7", &value, 65535), 1); |
| 21 | CHECK_INT(value, 7); | 21 | CHECK_INT(value, 7); |
| 22 | CHECK_INT(scan_udec("6969", &value, 65535), 4); | 22 | CHECK_INT(scan_uint("6969", &value, 65535), 4); |
| 23 | CHECK_INT(value, 6969); | 23 | CHECK_INT(value, 6969); |
| 24 | CHECK_INT(scan_udec("65535", &value, 65535), 5); | 24 | CHECK_INT(scan_uint("65535", &value, 65535), 5); |
| 25 | CHECK_INT(value, 65535); | 25 | CHECK_INT(value, 65535); |
| 26 | } | 26 | } |
| 27 | 27 | ||
| @@ -29,11 +29,11 @@ static void case_stops_at_non_digit(void) { | |||
| 29 | uint64_t value; | 29 | uint64_t value; |
| 30 | 30 | ||
| 31 | test_case("scanning stops at the first character that is not a digit"); | 31 | test_case("scanning stops at the first character that is not a digit"); |
| 32 | CHECK_INT(scan_udec("6969:rest", &value, 65535), 4); | 32 | CHECK_INT(scan_uint("6969:rest", &value, 65535), 4); |
| 33 | CHECK_INT(value, 6969); | 33 | CHECK_INT(value, 6969); |
| 34 | CHECK_INT(scan_udec("128/8", &value, 65535), 3); | 34 | CHECK_INT(scan_uint("128/8", &value, 65535), 3); |
| 35 | CHECK_INT(value, 128); | 35 | CHECK_INT(value, 128); |
| 36 | CHECK_INT(scan_udec("42\n", &value, 65535), 2); | 36 | CHECK_INT(scan_uint("42\n", &value, 65535), 2); |
| 37 | CHECK_INT(value, 42); | 37 | CHECK_INT(value, 42); |
| 38 | } | 38 | } |
| 39 | 39 | ||
| @@ -41,9 +41,9 @@ static void case_rejects_whitespace(void) { | |||
| 41 | uint64_t value = 0xdead; | 41 | uint64_t value = 0xdead; |
| 42 | 42 | ||
| 43 | test_case("leading whitespace is not skipped"); | 43 | test_case("leading whitespace is not skipped"); |
| 44 | CHECK_INT(scan_udec(" 1", &value, 65535), 0); | 44 | CHECK_INT(scan_uint(" 1", &value, 65535), 0); |
| 45 | CHECK_INT(scan_udec("\t1", &value, 65535), 0); | 45 | CHECK_INT(scan_uint("\t1", &value, 65535), 0); |
| 46 | CHECK_INT(scan_udec("\n1", &value, 65535), 0); | 46 | CHECK_INT(scan_uint("\n1", &value, 65535), 0); |
| 47 | CHECK_INT(value, 0xdead); | 47 | CHECK_INT(value, 0xdead); |
| 48 | } | 48 | } |
| 49 | 49 | ||
| @@ -51,9 +51,9 @@ static void case_rejects_sign(void) { | |||
| 51 | uint64_t value = 0xdead; | 51 | uint64_t value = 0xdead; |
| 52 | 52 | ||
| 53 | test_case("a sign is not accepted"); | 53 | test_case("a sign is not accepted"); |
| 54 | CHECK_INT(scan_udec("+1", &value, 65535), 0); | 54 | CHECK_INT(scan_uint("+1", &value, 65535), 0); |
| 55 | CHECK_INT(scan_udec("-1", &value, 65535), 0); | 55 | CHECK_INT(scan_uint("-1", &value, 65535), 0); |
| 56 | CHECK_INT(scan_udec("-0", &value, 65535), 0); | 56 | CHECK_INT(scan_uint("-0", &value, 65535), 0); |
| 57 | CHECK_INT(value, 0xdead); | 57 | CHECK_INT(value, 0xdead); |
| 58 | } | 58 | } |
| 59 | 59 | ||
| @@ -61,9 +61,9 @@ static void case_rejects_empty_and_junk(void) { | |||
| 61 | uint64_t value = 0xdead; | 61 | uint64_t value = 0xdead; |
| 62 | 62 | ||
| 63 | test_case("a string with no leading digit yields nothing"); | 63 | test_case("a string with no leading digit yields nothing"); |
| 64 | CHECK_INT(scan_udec("", &value, 65535), 0); | 64 | CHECK_INT(scan_uint("", &value, 65535), 0); |
| 65 | CHECK_INT(scan_udec("x", &value, 65535), 0); | 65 | CHECK_INT(scan_uint("x", &value, 65535), 0); |
| 66 | CHECK_INT(scan_udec(":80", &value, 65535), 0); | 66 | CHECK_INT(scan_uint(":80", &value, 65535), 0); |
| 67 | CHECK_INT(value, 0xdead); | 67 | CHECK_INT(value, 0xdead); |
| 68 | } | 68 | } |
| 69 | 69 | ||
| @@ -71,9 +71,9 @@ static void case_no_alternative_bases(void) { | |||
| 71 | uint64_t value; | 71 | uint64_t value; |
| 72 | 72 | ||
| 73 | test_case("hexadecimal and octal notations are read as plain decimal"); | 73 | test_case("hexadecimal and octal notations are read as plain decimal"); |
| 74 | CHECK_INT(scan_udec("0x10", &value, 65535), 1); | 74 | CHECK_INT(scan_uint("0x10", &value, 65535), 1); |
| 75 | CHECK_INT(value, 0); | 75 | CHECK_INT(value, 0); |
| 76 | CHECK_INT(scan_udec("010", &value, 65535), 3); | 76 | CHECK_INT(scan_uint("010", &value, 65535), 3); |
| 77 | CHECK_INT(value, 10); | 77 | CHECK_INT(value, 10); |
| 78 | } | 78 | } |
| 79 | 79 | ||
| @@ -81,13 +81,13 @@ static void case_refuses_out_of_range(void) { | |||
| 81 | uint64_t value = 0xdead; | 81 | uint64_t value = 0xdead; |
| 82 | 82 | ||
| 83 | test_case("a value above max is refused, not truncated"); | 83 | test_case("a value above max is refused, not truncated"); |
| 84 | CHECK_INT(scan_udec("65536", &value, 65535), 0); | 84 | CHECK_INT(scan_uint("65536", &value, 65535), 0); |
| 85 | CHECK_INT(scan_udec("99999", &value, 65535), 0); | 85 | CHECK_INT(scan_uint("99999", &value, 65535), 0); |
| 86 | CHECK_INT(scan_udec("129", &value, 128), 0); | 86 | CHECK_INT(scan_uint("129", &value, 128), 0); |
| 87 | CHECK_INT(value, 0xdead); | 87 | CHECK_INT(value, 0xdead); |
| 88 | 88 | ||
| 89 | test_case("the boundary itself is accepted"); | 89 | test_case("the boundary itself is accepted"); |
| 90 | CHECK_INT(scan_udec("128", &value, 128), 3); | 90 | CHECK_INT(scan_uint("128", &value, 128), 3); |
| 91 | CHECK_INT(value, 128); | 91 | CHECK_INT(value, 128); |
| 92 | } | 92 | } |
| 93 | 93 | ||
| @@ -95,21 +95,21 @@ static void case_sixty_four_bit_range(void) { | |||
| 95 | uint64_t value; | 95 | uint64_t value; |
| 96 | 96 | ||
| 97 | test_case("the full unsigned 64 bit range is available"); | 97 | test_case("the full unsigned 64 bit range is available"); |
| 98 | CHECK_INT(scan_udec("18446744073709551615", &value, UINT64_MAX), 20); | 98 | CHECK_INT(scan_uint("18446744073709551615", &value, UINT64_MAX), 20); |
| 99 | CHECK(value == UINT64_MAX); | 99 | CHECK(value == UINT64_MAX); |
| 100 | 100 | ||
| 101 | test_case("a number too large for 64 bits is refused"); | 101 | test_case("a number too large for 64 bits is refused"); |
| 102 | CHECK_INT(scan_udec("18446744073709551616", &value, UINT64_MAX), 0); | 102 | CHECK_INT(scan_uint("18446744073709551616", &value, UINT64_MAX), 0); |
| 103 | CHECK_INT(scan_udec("99999999999999999999999999", &value, UINT64_MAX), 0); | 103 | CHECK_INT(scan_uint("99999999999999999999999999", &value, UINT64_MAX), 0); |
| 104 | } | 104 | } |
| 105 | 105 | ||
| 106 | static void case_leading_zeros_allowed(void) { | 106 | static void case_leading_zeros_allowed(void) { |
| 107 | uint64_t value; | 107 | uint64_t value; |
| 108 | 108 | ||
| 109 | test_case("leading zeros are accepted outside bencode"); | 109 | test_case("leading zeros are accepted outside bencode"); |
| 110 | CHECK_INT(scan_udec("007", &value, 65535), 3); | 110 | CHECK_INT(scan_uint("007", &value, 65535), 3); |
| 111 | CHECK_INT(value, 7); | 111 | CHECK_INT(value, 7); |
| 112 | CHECK_INT(scan_udec("0000", &value, 65535), 4); | 112 | CHECK_INT(scan_uint("0000", &value, 65535), 4); |
| 113 | CHECK_INT(value, 0); | 113 | CHECK_INT(value, 0); |
| 114 | } | 114 | } |
| 115 | 115 | ||
| @@ -117,9 +117,9 @@ static void case_bencode_rejects_leading_zeros(void) { | |||
| 117 | uint64_t value = 0xdead; | 117 | uint64_t value = 0xdead; |
| 118 | 118 | ||
| 119 | test_case("bencode refuses a leading zero on anything but zero"); | 119 | test_case("bencode refuses a leading zero on anything but zero"); |
| 120 | CHECK_INT(scan_udec_bencode("007", &value, 65535), 0); | 120 | CHECK_INT(scan_uint_bencode("007", &value, 65535), 0); |
| 121 | CHECK_INT(scan_udec_bencode("0000", &value, 65535), 0); | 121 | CHECK_INT(scan_uint_bencode("0000", &value, 65535), 0); |
| 122 | CHECK_INT(scan_udec_bencode("01", &value, 65535), 0); | 122 | CHECK_INT(scan_uint_bencode("01", &value, 65535), 0); |
| 123 | CHECK_INT(value, 0xdead); | 123 | CHECK_INT(value, 0xdead); |
| 124 | } | 124 | } |
| 125 | 125 | ||
| @@ -127,11 +127,11 @@ static void case_bencode_accepts_canonical(void) { | |||
| 127 | uint64_t value; | 127 | uint64_t value; |
| 128 | 128 | ||
| 129 | test_case("bencode accepts a canonically written number"); | 129 | test_case("bencode accepts a canonically written number"); |
| 130 | CHECK_INT(scan_udec_bencode("0", &value, 65535), 1); | 130 | CHECK_INT(scan_uint_bencode("0", &value, 65535), 1); |
| 131 | CHECK_INT(value, 0); | 131 | CHECK_INT(value, 0); |
| 132 | CHECK_INT(scan_udec_bencode("0:", &value, 65535), 1); | 132 | CHECK_INT(scan_uint_bencode("0:", &value, 65535), 1); |
| 133 | CHECK_INT(value, 0); | 133 | CHECK_INT(value, 0); |
| 134 | CHECK_INT(scan_udec_bencode("160:", &value, 65535), 3); | 134 | CHECK_INT(scan_uint_bencode("160:", &value, 65535), 3); |
| 135 | CHECK_INT(value, 160); | 135 | CHECK_INT(value, 160); |
| 136 | } | 136 | } |
| 137 | 137 | ||
| @@ -139,14 +139,64 @@ static void case_bencode_inherits_the_rest(void) { | |||
| 139 | uint64_t value = 0xdead; | 139 | uint64_t value = 0xdead; |
| 140 | 140 | ||
| 141 | test_case("bencode is no laxer than the plain scanner"); | 141 | test_case("bencode is no laxer than the plain scanner"); |
| 142 | CHECK_INT(scan_udec_bencode(" 1", &value, 65535), 0); | 142 | CHECK_INT(scan_uint_bencode(" 1", &value, 65535), 0); |
| 143 | CHECK_INT(scan_udec_bencode("-1", &value, 65535), 0); | 143 | CHECK_INT(scan_uint_bencode("-1", &value, 65535), 0); |
| 144 | CHECK_INT(scan_udec_bencode("+1", &value, 65535), 0); | 144 | CHECK_INT(scan_uint_bencode("+1", &value, 65535), 0); |
| 145 | CHECK_INT(scan_udec_bencode("65536", &value, 65535), 0); | 145 | CHECK_INT(scan_uint_bencode("65536", &value, 65535), 0); |
| 146 | CHECK_INT(value, 0xdead); | 146 | CHECK_INT(value, 0xdead); |
| 147 | } | 147 | } |
| 148 | 148 | ||
| 149 | /* ------------------------------------------- fixed width signed integers */ | ||
| 150 | |||
| 151 | /* A value lifted out of a query string arrives as a pointer and a length | ||
| 152 | with nothing terminating it, and the whole of it has to be the number. */ | ||
| 153 | |||
| 154 | static void case_int_whole_field(void) { | ||
| 155 | int64_t value = 0; | ||
| 156 | |||
| 157 | test_case("the whole field is read, sign and all"); | ||
| 158 | CHECK_INT(scan_int("123", 3, &value), 0); | ||
| 159 | CHECK_INT(value, 123); | ||
| 160 | CHECK_INT(scan_int("-45", 3, &value), 0); | ||
| 161 | CHECK_INT(value, -45); | ||
| 162 | |||
| 163 | test_case("and only as far as the length given"); | ||
| 164 | CHECK_INT(scan_int("12345", 3, &value), 0); | ||
| 165 | CHECK_INT(value, 123); | ||
| 166 | } | ||
| 167 | |||
| 168 | static void case_int_rejects_the_rest(void) { | ||
| 169 | int64_t value = 4711; | ||
| 170 | |||
| 171 | test_case("anything that is not all digits is refused"); | ||
| 172 | CHECK_INT(scan_int("12a", 3, &value), -1); | ||
| 173 | CHECK_INT(scan_int("", 0, &value), -1); | ||
| 174 | CHECK_INT(scan_int("-", 1, &value), -1); | ||
| 175 | CHECK_INT(scan_int(" 12", 3, &value), -1); | ||
| 176 | CHECK_INT(scan_int("+12", 3, &value), -1); | ||
| 177 | |||
| 178 | test_case("and a refused field leaves the number alone"); | ||
| 179 | CHECK_INT(value, 4711); | ||
| 180 | } | ||
| 181 | |||
| 182 | static void case_int_overflow(void) { | ||
| 183 | int64_t value = 0; | ||
| 184 | |||
| 185 | test_case("a field too long to fit is refused rather than wrapped"); | ||
| 186 | CHECK_INT(scan_int("9223372036854775807", 19, &value), 0); | ||
| 187 | CHECK_INT(value, INT64_MAX); | ||
| 188 | CHECK_INT(scan_int("9223372036854775808", 19, &value), -1); | ||
| 189 | CHECK_INT(scan_int("99999999999999999999", 20, &value), -1); | ||
| 190 | |||
| 191 | test_case("including the negative side"); | ||
| 192 | CHECK_INT(scan_int("-9223372036854775807", 20, &value), 0); | ||
| 193 | CHECK_INT(value, -INT64_MAX); | ||
| 194 | } | ||
| 195 | |||
| 149 | void test_scan(void) { | 196 | void test_scan(void) { |
| 197 | case_int_whole_field(); | ||
| 198 | case_int_rejects_the_rest(); | ||
| 199 | case_int_overflow(); | ||
| 150 | case_plain_numbers(); | 200 | case_plain_numbers(); |
| 151 | case_stops_at_non_digit(); | 201 | case_stops_at_non_digit(); |
| 152 | case_rejects_whitespace(); | 202 | case_rejects_whitespace(); |
