v / vlib / builtin
Raw file | 352 loc (301 sloc) | 9.47 KB | Latest commit hash a8f6f9ed6
1import strconv
2
3fn 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
31fn 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
103fn 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
223fn 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
242fn 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
251fn 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
258fn 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 //
271 assert ' -77' == '${a:8}'
272 assert ' -77' == '${a:8d}'
273 assert ' -4d' == '${a:8x}'
274 assert '-1001101' == '${a:8b}'
275
276 assert '-0000077' == '${a:08}'
277 assert '-0000077' == '${a:08d}'
278 assert '-1001101' == '${a:08b}'
279 assert '-000004d' == '${a:08x}'
280
281 //
282 assert ' -77' == '${a:4}'
283 assert ' -77' == '${a:4d}'
284 assert '-1001101' == '${a:4b}'
285 assert ' -4d' == '${a:4x}'
286
287 assert '-077' == '${a:04}'
288 assert '-077' == '${a:04d}'
289 assert '-1001101' == '${a:04b}'
290 assert '-04d' == '${a:04x}'
291
292 //
293 assert '-77' == '${a:2}'
294 assert '-77' == '${a:2d}'
295 assert '-1001101' == '${a:2b}'
296 assert '-4d' == '${a:2x}'
297
298 assert '-77' == '${a:02}'
299 assert '-77' == '${a:02d}'
300 assert '-1001101' == '${a:02b}'
301 assert '-4d' == '${a:02x}'
302
303 //
304 bin0 := ~6
305 assert bin0 == -7
306 assert '-0000111' == '${bin0:08b}' // a minimum of 8 characters for the whole number, including the padding and the sign
307 assert '-0000111' == '${~6:08b}'
308 assert ' -111' == '${~6:8b}'
309
310 //
311 assert '-0000110' == '${-6:08b}'
312 assert ' -110' == '${-6:8b}'
313}
314
315fn test_parse() {
316 assert i64(1) == '1'.parse_int(0, 8) or { 0 }
317 assert i64(1) == '0b01'.parse_int(0, 8) or { 0 }
318 assert i64(1) == '01'.parse_int(0, 8) or { 0 }
319 assert i64(1) == '0o01'.parse_int(0, 8) or { 0 }
320 assert i64(1) == '0x01'.parse_int(0, 8) or { 0 }
321 assert i64(1) == '1'.parse_int(2, 8) or { 0 }
322 assert i64(1) == '1'.parse_int(8, 8) or { 0 }
323 assert i64(1) == '1'.parse_int(10, 8) or { 0 }
324 assert i64(1) == '1'.parse_int(16, 8) or { 0 }
325
326 assert u64(1) == '1'.parse_uint(0, 8) or { 0 }
327 assert u64(1) == '0b01'.parse_uint(0, 8) or { 0 }
328 assert u64(1) == '01'.parse_uint(0, 8) or { 0 }
329 assert u64(1) == '0o01'.parse_uint(0, 8) or { 0 }
330 assert u64(1) == '0x01'.parse_uint(0, 8) or { 0 }
331 assert u64(1) == '1'.parse_uint(2, 8) or { 0 }
332 assert u64(1) == '1'.parse_uint(8, 8) or { 0 }
333 assert u64(1) == '1'.parse_uint(10, 8) or { 0 }
334 assert u64(1) == '1'.parse_uint(16, 8) or { 0 }
335}
336
337fn test_interpolate_binary_literals() {
338 assert ' 1 ${i64(0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000)}' == ' 1 -9223372036854775808'
339 assert ' 2 ${i64(0b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111)}' == ' 2 -1'
340 assert ' 3 ${i64(0b0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111)}' == ' 3 9223372036854775807'
341 assert ' 4 ${u64(0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000)}' == ' 4 9223372036854775808'
342 assert ' 5 ${u64(0b1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111)}' == ' 5 18446744073709551615'
343 assert ' 6 ${u64(0b0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111)}' == ' 6 9223372036854775807'
344 assert ' 7 ${u32(0b111_1111_1111_1111_1111)}' == ' 7 524287'
345}
346
347fn test_interpolate_literal_limits() {
348 assert ' 8 ${u32(2147483648)}' == ' 8 2147483648'
349 assert ' 9 ${u64(0xFF_FF_FF_FF_FF_FF_FF_FF)}' == ' 9 18446744073709551615'
350 assert '10 ${u32(0o377777_77777)}' == '10 4294967295'
351 assert '11 ${i64(-2147483647)}' == '11 -2147483647'
352}