| 1 | import strconv |
| 2 | |
| 3 | fn test_common_atoi() { |
| 4 | // test common cases |
| 5 | assert '70zzz'.int() == 70 |
| 6 | assert '2901issue'.int() == 2901 |
| 7 | assert '234232w'.int() == 234232 |
| 8 | assert '-9009x'.int() == -9009 |
| 9 | assert '0y'.int() == 0 |
| 10 | |
| 11 | // test lead zeros |
| 12 | assert '0000012'.int() == 12 |
| 13 | assert '-0000012'.int() == -12 |
| 14 | assert '0x001F'.int() == 31 |
| 15 | assert '-0x001F'.int() == -31 |
| 16 | assert '0x001f'.int() == 31 |
| 17 | assert '0o00011'.int() == 9 |
| 18 | assert '0b00001001'.int() == 9 |
| 19 | |
| 20 | // test underscore in string |
| 21 | assert '-10_000'.int() == -10000 |
| 22 | assert '-0x00_0_f_ff'.int() == -0xfff |
| 23 | assert '10_000_000'.int() == 10000000 |
| 24 | |
| 25 | for n in -10000 .. 100000 { |
| 26 | s := n.str() + 'z' |
| 27 | assert s.int() == n |
| 28 | } |
| 29 | } |
| 30 | |
| 31 | fn test_unsigned_cast() { |
| 32 | // tests for u16 |
| 33 | |
| 34 | // test common cases |
| 35 | assert '70zzz'.u16() == 70 |
| 36 | assert '2901issue'.u16() == 2901 |
| 37 | assert '0y'.u16() == 0 |
| 38 | |
| 39 | // test lead zeros |
| 40 | assert '0000012'.u16() == 12 |
| 41 | assert '0x001F'.u16() == 31 |
| 42 | assert '0x001f'.u16() == 31 |
| 43 | assert '0o00011'.u16() == 9 |
| 44 | assert '0b00001001'.u16() == 9 |
| 45 | |
| 46 | // tests for u32 |
| 47 | |
| 48 | // test common cases |
| 49 | assert '70zzz'.u32() == 70 |
| 50 | assert '2901issue'.u32() == 2901 |
| 51 | assert '234232w'.u32() == 234232 |
| 52 | assert '-9009x'.u32() == 0 |
| 53 | assert '0y'.u32() == 0 |
| 54 | |
| 55 | // test lead zeros |
| 56 | assert '0000012'.u32() == 12 |
| 57 | assert '-0000012'.u32() == 0 |
| 58 | assert '0x001F'.u32() == 31 |
| 59 | assert '-0x001F'.u32() == 0 |
| 60 | assert '0x001f'.u32() == 31 |
| 61 | assert '0o00011'.u32() == 9 |
| 62 | assert '0b00001001'.u32() == 9 |
| 63 | |
| 64 | // test underscore in string |
| 65 | assert '-10_000'.u32() == 0 |
| 66 | assert '-0x00_0_f_ff'.u32() == 0 |
| 67 | assert '10_000_000'.u32() == 10000000 |
| 68 | |
| 69 | for n in 0 .. u32(100) { |
| 70 | s := n.str() + 'z' |
| 71 | assert s.u32() == n |
| 72 | } |
| 73 | |
| 74 | // tests for u64 |
| 75 | |
| 76 | // test common cases |
| 77 | assert '70zzz'.u64() == 70 |
| 78 | assert '2901issue'.u64() == 2901 |
| 79 | assert '234232w'.u64() == 234232 |
| 80 | assert '-9009x'.u64() == 0 |
| 81 | assert '0y'.u64() == 0 |
| 82 | |
| 83 | // test lead zeros |
| 84 | assert '0000012'.u64() == 12 |
| 85 | assert '-0000012'.u64() == 0 |
| 86 | assert '0x001F'.u64() == 31 |
| 87 | assert '-0x001F'.u64() == 0 |
| 88 | assert '0x001f'.u64() == 31 |
| 89 | assert '0o00011'.u64() == 9 |
| 90 | assert '0b00001001'.u64() == 9 |
| 91 | |
| 92 | // test underscore in string |
| 93 | assert '-10_000'.u64() == 0 |
| 94 | assert '-0x00_0_f_ff'.u64() == 0 |
| 95 | assert '10_000_000'.u64() == 10000000 |
| 96 | |
| 97 | for n in 0 .. u64(10000) { |
| 98 | s := n.str() + 'z' |
| 99 | assert s.u64() == n |
| 100 | } |
| 101 | } |
| 102 | |
| 103 | fn test_signed_cast() { |
| 104 | // tests for i64 |
| 105 | |
| 106 | // test common cases |
| 107 | assert '70zzz'.i64() == 70 |
| 108 | assert '2901issue'.i64() == 2901 |
| 109 | assert '234232w'.i64() == 234232 |
| 110 | assert '-9009x'.i64() == -9009 |
| 111 | assert '0y'.i64() == 0 |
| 112 | |
| 113 | // test lead zeros |
| 114 | assert '0000012'.i64() == 12 |
| 115 | assert '-0000012'.i64() == -12 |
| 116 | assert '0x001F'.i64() == 31 |
| 117 | assert '-0x001F'.i64() == -31 |
| 118 | assert '0x001f'.i64() == 31 |
| 119 | assert '0o00011'.i64() == 9 |
| 120 | assert '0b00001001'.i64() == 9 |
| 121 | |
| 122 | // test underscore in string |
| 123 | assert '-10_000'.i64() == -10000 |
| 124 | assert '-0x00_0_f_ff'.i64() == -0xfff |
| 125 | assert '10_000_000'.i64() == 10000000 |
| 126 | |
| 127 | for n in -10000 .. 100000 { |
| 128 | s := n.str() + 'z' |
| 129 | assert s.i64() == n |
| 130 | } |
| 131 | |
| 132 | // tests for i8 |
| 133 | |
| 134 | // test common cases |
| 135 | assert '70zzz'.i8() == 70 |
| 136 | assert '29issue'.i8() == 29 |
| 137 | assert '22w'.i8() == 22 |
| 138 | assert '-90x'.i8() == -90 |
| 139 | assert '0y'.i8() == 0 |
| 140 | |
| 141 | // test lead zeros |
| 142 | assert '0000012'.i8() == 12 |
| 143 | assert '-0000012'.i8() == -12 |
| 144 | assert '0x001F'.i8() == 31 |
| 145 | assert '-0x001F'.i8() == -31 |
| 146 | assert '0x001f'.i8() == 31 |
| 147 | assert '0o00011'.i8() == 9 |
| 148 | assert '0b000011'.i8() == 3 |
| 149 | |
| 150 | // test underscore in string |
| 151 | assert '-10_0'.i8() == -100 |
| 152 | assert '-0x0_0_f'.i8() == -0xf |
| 153 | assert '10_0'.i8() == 100 |
| 154 | |
| 155 | for n in -10 .. 100 { |
| 156 | s := n.str() + 'z' |
| 157 | assert s.i8() == n |
| 158 | } |
| 159 | |
| 160 | // tests for i16 |
| 161 | |
| 162 | // test common cases |
| 163 | assert '70zzz'.i16() == 70 |
| 164 | assert '2901issue'.i16() == 2901 |
| 165 | assert '2342w'.i16() == 2342 |
| 166 | assert '-9009x'.i16() == -9009 |
| 167 | assert '0y'.i16() == 0 |
| 168 | |
| 169 | // test lead zeros |
| 170 | assert '0000012'.i16() == 12 |
| 171 | assert '-0000012'.i16() == -12 |
| 172 | assert '0x001F'.i16() == 31 |
| 173 | assert '-0x001F'.i16() == -31 |
| 174 | assert '0x001f'.i16() == 31 |
| 175 | assert '0o00011'.i16() == 9 |
| 176 | assert '0b00001001'.i16() == 9 |
| 177 | |
| 178 | // test underscore in string |
| 179 | assert '-10_0'.i16() == -100 |
| 180 | assert '-0x00_0_fff'.i16() == -0xfff |
| 181 | assert '10_0'.i16() == 100 |
| 182 | |
| 183 | for n in -100 .. 100 { |
| 184 | s := n.str() + 'z' |
| 185 | assert s.i16() == n |
| 186 | } |
| 187 | |
| 188 | // test g format |
| 189 | unsafe { |
| 190 | mut u := strconv.Float64u{ |
| 191 | u: strconv.double_plus_zero |
| 192 | } |
| 193 | assert '${u.f:g}' == '0.0' |
| 194 | assert '${u.f:G}' == '0.0' |
| 195 | u.u = strconv.double_minus_zero |
| 196 | assert '${u.f:g}' == '0.0' |
| 197 | assert '${u.f:G}' == '0.0' |
| 198 | u.u = strconv.double_plus_infinity |
| 199 | assert '${u.f:g}' == '+inf' |
| 200 | assert '${u.f:G}' == '+INF' |
| 201 | u.u = strconv.double_minus_infinity |
| 202 | assert '${u.f:g}' == '-inf' |
| 203 | assert '${u.f:G}' == '-INF' |
| 204 | } |
| 205 | unsafe { |
| 206 | mut u := strconv.Float32u{ |
| 207 | u: strconv.single_plus_zero |
| 208 | } |
| 209 | assert '${u.f:g}' == '0.0' |
| 210 | assert '${u.f:G}' == '0.0' |
| 211 | u.u = strconv.single_minus_zero |
| 212 | assert '${u.f:g}' == '0.0' |
| 213 | assert '${u.f:G}' == '0.0' |
| 214 | u.u = strconv.single_plus_infinity |
| 215 | assert '${u.f:g}' == '+inf' |
| 216 | assert '${u.f:G}' == '+INF' |
| 217 | u.u = strconv.single_minus_infinity |
| 218 | assert '${u.f:g}' == '-inf' |
| 219 | assert '${u.f:G}' == '-INF' |
| 220 | } |
| 221 | } |
| 222 | |
| 223 | fn test_binary() { |
| 224 | i := i8(127) |
| 225 | u := u8(127) |
| 226 | assert '${i:08b}' == '01111111' |
| 227 | assert '${u:08b}' == '01111111' |
| 228 | assert '${i16(i):08b}' == '01111111' |
| 229 | assert '${u16(u):08b}' == '01111111' |
| 230 | assert '${int(i):08b}' == '01111111' |
| 231 | assert '${u32(u):08b}' == '01111111' |
| 232 | assert '${i64(i):08b}' == '01111111' |
| 233 | assert '${u64(u):08b}' == '01111111' |
| 234 | |
| 235 | n := i8(-1) |
| 236 | assert '${u8(-1):08b}' == '11111111' |
| 237 | assert '${u16(n):08b}' == '1111111111111111' |
| 238 | assert '${u32(n):08b}' == '11111111111111111111111111111111' |
| 239 | assert '${u64(n):08b}' == '1111111111111111111111111111111111111111111111111111111111111111' |
| 240 | } |
| 241 | |
| 242 | fn test_binary32() { |
| 243 | i := int(0x7fff_ffff) |
| 244 | u := u32(0x7fff_ffff) |
| 245 | assert '${i:032b}' == '01111111111111111111111111111111' |
| 246 | assert '${u:032b}' == '01111111111111111111111111111111' |
| 247 | assert '${i64(i):032b}' == '01111111111111111111111111111111' |
| 248 | assert '${u64(u):032b}' == '01111111111111111111111111111111' |
| 249 | } |
| 250 | |
| 251 | fn test_binary64() { |
| 252 | i := i64(0x7fff_ffff_ffff_ffff) |
| 253 | u := u64(0x7fff_ffff_ffff_ffff) |
| 254 | assert '${i:064b}' == '0111111111111111111111111111111111111111111111111111111111111111' |
| 255 | assert '${u:064b}' == '0111111111111111111111111111111111111111111111111111111111111111' |
| 256 | } |
| 257 | |
| 258 | fn test_interpolation_of_negative_numbers_padding_and_width() { |
| 259 | a := -77 |
| 260 | assert ' -77' == '${a:20}' |
| 261 | assert ' -77' == '${a:20d}' |
| 262 | assert ' -4d' == '${a:20x}' |
| 263 | assert ' -1001101' == '${a:20b}' |
| 264 | |
| 265 | assert '-0000000000000000077' == '${a:020}' |
| 266 | assert '-0000000000000000077' == '${a:020d}' |
| 267 | assert '-000000000000000004d' == '${a:020x}' |
| 268 | assert '-0000000000001001101' == '${a:020b}' |
| 269 | |
| 270 | assert ' -77' == '${a:8}' |
| 271 | assert ' -77' == '${a:8d}' |
| 272 | assert ' -4d' == '${a:8x}' |
| 273 | assert '-1001101' == '${a:8b}' |
| 274 | |
| 275 | assert '-0000077' == '${a:08}' |
| 276 | assert '-0000077' == '${a:08d}' |
| 277 | assert '-1001101' == '${a:08b}' |
| 278 | assert '-000004d' == '${a:08x}' |
| 279 | |
| 280 | assert ' -77' == '${a:4}' |
| 281 | assert ' -77' == '${a:4d}' |
| 282 | assert '-1001101' == '${a:4b}' |
| 283 | assert ' -4d' == '${a:4x}' |
| 284 | |
| 285 | assert '-077' == '${a:04}' |
| 286 | assert '-077' == '${a:04d}' |
| 287 | assert '-1001101' == '${a:04b}' |
| 288 | assert '-04d' == '${a:04x}' |
| 289 | |
| 290 | assert '-77' == '${a:2}' |
| 291 | assert '-77' == '${a:2d}' |
| 292 | assert '-1001101' == '${a:2b}' |
| 293 | assert '-4d' == '${a:2x}' |
| 294 | |
| 295 | assert '-77' == '${a:02}' |
| 296 | assert '-77' == '${a:02d}' |
| 297 | assert '-1001101' == '${a:02b}' |
| 298 | assert '-4d' == '${a:02x}' |
| 299 | |
| 300 | bin0 := ~6 |
| 301 | assert bin0 == -7 |
| 302 | assert '-0000111' == '${bin0:08b}' // a minimum of 8 characters for the whole number, including the padding and the sign |
| 303 | assert '-0000111' == '${~6:08b}' |
| 304 | assert ' -111' == '${~6:8b}' |
| 305 | |
| 306 | assert '-0000110' == '${-6:08b}' |
| 307 | assert ' -110' == '${-6:8b}' |
| 308 | } |
| 309 | |
| 310 | fn test_parse() { |
| 311 | assert i64(1) == '1'.parse_int(0, 8) or { 0 } |
| 312 | assert i64(1) == '0b01'.parse_int(0, 8) or { 0 } |
| 313 | assert i64(1) == '01'.parse_int(0, 8) or { 0 } |
| 314 | assert i64(1) == '0o01'.parse_int(0, 8) or { 0 } |
| 315 | assert i64(1) == '0x01'.parse_int(0, 8) or { 0 } |
| 316 | assert i64(1) == '1'.parse_int(2, 8) or { 0 } |
| 317 | assert i64(1) == '1'.parse_int(8, 8) or { 0 } |
| 318 | assert i64(1) == '1'.parse_int(10, 8) or { 0 } |
| 319 | assert i64(1) == '1'.parse_int(16, 8) or { 0 } |
| 320 | |
| 321 | assert u64(1) == '1'.parse_uint(0, 8) or { 0 } |
| 322 | assert u64(1) == '0b01'.parse_uint(0, 8) or { 0 } |
| 323 | assert u64(1) == '01'.parse_uint(0, 8) or { 0 } |
| 324 | assert u64(1) == '0o01'.parse_uint(0, 8) or { 0 } |
| 325 | assert u64(1) == '0x01'.parse_uint(0, 8) or { 0 } |
| 326 | assert u64(1) == '1'.parse_uint(2, 8) or { 0 } |
| 327 | assert u64(1) == '1'.parse_uint(8, 8) or { 0 } |
| 328 | assert u64(1) == '1'.parse_uint(10, 8) or { 0 } |
| 329 | assert u64(1) == '1'.parse_uint(16, 8) or { 0 } |
| 330 | } |
| 331 | |
| 332 | fn test_interpolate_binary_literals() { |
| 333 | assert ' 1 ${i64(u64(0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000))}' == ' 1 -9223372036854775808' |
| 334 | assert ' 2 ${i64(u64(0b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111))}' == ' 2 -1' |
| 335 | assert ' 3 ${i64(0b0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111)}' == ' 3 9223372036854775807' |
| 336 | assert ' 4 ${u64(0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000)}' == ' 4 9223372036854775808' |
| 337 | assert ' 5 ${u64(0b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111)}' == ' 5 18446744073709551615' |
| 338 | assert ' 6 ${u64(0b0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111)}' == ' 6 9223372036854775807' |
| 339 | assert ' 7 ${u32(0b111_1111_1111_1111_1111)}' == ' 7 524287' |
| 340 | } |
| 341 | |
| 342 | fn test_interpolate_literal_limits() { |
| 343 | assert ' 8 ${u32(2147483648)}' == ' 8 2147483648' |
| 344 | assert ' 9 ${u64(0xFF_FF_FF_FF_FF_FF_FF_FF)}' == ' 9 18446744073709551615' |
| 345 | assert '10 ${u32(0o377777_77777)}' == '10 4294967295' |
| 346 | assert '11 ${i64(-2147483647)}' == '11 -2147483647' |
| 347 | } |
| 348 | |
| 349 | fn test_string_repetition() { |
| 350 | a := 'pippo' |
| 351 | assert '${'pera':r}' == '' |
| 352 | assert '${'pera':R}' == '' |
| 353 | assert '${'pera':0r}' == '' |
| 354 | assert '${'pera':0R}' == '' |
| 355 | assert '${'pera':1r}' == 'pera' |
| 356 | assert '${'pera':1R}' == 'PERA' |
| 357 | assert '${'pera':2r}' == 'perapera' |
| 358 | assert '${'pera':2R}' == 'PERAPERA' |
| 359 | assert '${a:2r}' == 'pippopippo' |
| 360 | assert '${a:2R}' == 'PIPPOPIPPO' |
| 361 | } |
| 362 | |