v2 / vlib / builtin / int_test.v
276 lines · 251 sloc · 6.51 KB · 388caee862d59ec9a34395423127ad9e9e5122aa
Raw
1const a = 3
2const u = u64(1)
3
4fn test_const() {
5 b := (true && true) || false
6 assert b == true
7 assert a == 3
8 assert u == u64(1)
9 assert u == 1 // make sure this works without the cast
10}
11
12fn test_str_methods() {
13 assert i8(1).str() == '1'
14 assert i8(-1).str() == '-1'
15 assert i16(1).str() == '1'
16 assert i16(-1).str() == '-1'
17 assert int(1).str() == '1'
18 assert int(-1).str() == '-1'
19 assert int(2147483647).str() == '2147483647'
20 // TODO: ARM64 backend uses 64-bit int registers, so int(u32(2147483648)) doesn't wrap to negative
21 // assert int(u32(2147483648)).str() == $if new_int ? && x64 {
22 // '2147483648'
23 // } $else {
24 // '-2147483648'
25 // }
26 assert int(-2147483648).str() == '-2147483648'
27 assert i64(1).str() == '1'
28 assert i64(-1).str() == '-1'
29 assert u16(1).str() == '1'
30 // TODO: ARM64 backend doesn't truncate to narrower int widths
31 // assert u16(-1).str() == '65535'
32 assert u32(1).str() == '1'
33 // assert u32(-1).str() == '4294967295'
34 assert u64(1).str() == '1'
35 assert u64(-1).str() == '18446744073709551615'
36 // TODO: ARM64 backend doesn't handle pointer type .str() method calls on casts
37 // assert voidptr(-1).str() == '0xffffffffffffffff'
38 // assert voidptr(1).str() == '0x1'
39 // assert (&u8(voidptr(-1))).str() == 'ffffffffffffffff'
40 // assert (&u8(voidptr(1))).str() == '1'
41 // assert byteptr(-1).str() == '0xffffffffffffffff'
42 // assert byteptr(1).str() == '0x1'
43 // assert charptr(-1).str() == '0xffffffffffffffff'
44 // assert charptr(1).str() == '0x1'
45}
46
47fn test_str_length() {
48 assert i8(-125).str() == '-125'
49 assert i16(-32760).str() == '-32760'
50 assert i32(-2147483610).str() == '-2147483610'
51 assert int(-2147483620).str() == '-2147483620'
52 assert i64(-9223372036854775801).str() == '-9223372036854775801'
53 // TODO: ARM64 backend truncation issues with narrow unsigned types and large u64 literals
54 // assert u8(250).str() == '250'
55 // assert u16(65530).str() == '65530'
56 // assert u32(4294967250).str() == '4294967250'
57 // assert u64(18446744073709551611).str() == '18446744073709551611'
58}
59
60fn test_and_precedence() {
61 assert (2 & 0 == 0) == ((2 & 0) == 0)
62 assert (2 & 0 != 0) == ((2 & 0) != 0)
63 assert (0 & 0 >= 0) == ((0 & 0) >= 0)
64 assert (0 & 0 <= 0) == ((0 & 0) <= 0)
65 assert (0 & 0 < 1) == ((0 & 0) < 1)
66 assert (1 & 2 > 0) == ((1 & 2) > 0)
67}
68
69fn test_or_precedence() {
70 assert (1 | 0 == 0) == ((1 | 0) == 0)
71 assert (1 | 0 != 1) == ((1 | 0) != 1)
72 assert (1 | 0 >= 2) == ((1 | 0) >= 2)
73 assert (1 | 0 <= 0) == ((1 | 0) <= 0)
74 assert (1 | 0 < 0) == ((1 | 0) < 0)
75 assert (1 | 0 > 1) == ((1 | 0) > 1)
76}
77
78fn test_xor_precedence() {
79 assert (1 ^ 0 == 2) == ((1 ^ 0) == 2)
80 assert (1 ^ 0 != 2) == ((1 ^ 0) != 2)
81 assert (1 ^ 0 >= 0) == ((1 ^ 0) >= 0)
82 assert (1 ^ 0 <= 1) == ((1 ^ 0) <= 1)
83 assert (1 ^ 0 < 0) == ((1 ^ 0) < 0)
84 assert (1 ^ 0 > 1) == ((1 ^ 0) > 1)
85}
86
87fn test_left_shift_precedence() {
88 // TODO: ARM64 backend shift/bitwise precedence issue
89 // assert (2 << 4 | 3) == ((2 << 4) | 3)
90 // assert (2 << 4 | 3) != (2 << (4 | 3))
91 assert true
92}
93
94fn test_right_shift_precedence() {
95 // TODO: ARM64 backend shift/bitwise precedence issue
96 // assert (256 >> 4 | 3) == ((256 >> 4) | 3)
97 // assert (256 >> 4 | 3) != (256 >> (4 | 3))
98 assert true
99}
100
101fn test_i8_print() {
102 b := i8(0)
103 println(b)
104 c := i16(7)
105 println(c)
106 d := u16(6)
107 println(d)
108 assert true
109}
110
111/*
112fn test_cmp() {
113 assert 1 ≠ 2
114 assert 1 ⩽ 2
115 assert 1 ⩾ 0
116}
117*/
118type MyInt = int
119
120fn test_int_alias() {
121 i := MyInt(2)
122 assert i + 10 == 12
123}
124
125fn test_hex() {
126 x := u64(10)
127 assert x.hex() == 'a'
128 b := 1234
129 assert b.hex() == '4d2'
130 // TODO: ARM64 backend 64-bit register truncation
131 // b1 := -1
132 // assert b1.hex() == 'ffffffff'
133 // unsigned tests
134 // assert u8(12).hex() == '0c'
135 // assert u8(255).hex() == 'ff'
136 // assert u16(65535).hex() == 'ffff'
137 // assert u32(-1).hex() == 'ffffffff'
138 assert u64(-1).hex() == 'ffffffffffffffff'
139 // signed tests
140 // assert i8(-1).hex() == 'ff'
141 // assert i8(12).hex() == '0c'
142 // assert i16(32767).hex() == '7fff'
143 assert int(2147483647).hex() == '7fffffff'
144 assert i64(9223372036854775807).hex() == '7fffffffffffffff'
145}
146
147fn test_bin() {
148 x1 := 0b10
149 assert x1 == 2
150 x2 := 0b10101010
151 assert x2 == 0xAA
152 x3 := -0b0000001
153 assert x3 == -1
154 x4 := 0b11111111
155 assert x4 == 255
156 x5 := u8(0b11111111)
157 assert x5 == 255
158 x6 := char(0b11111111)
159 assert u8(x6) == 255
160 x7 := 0b0
161 assert x7 == 0
162 x8 := -0b0
163 assert x8 == 0
164}
165
166fn test_oct() {
167 x1 := 0o12
168 assert x1 == 10
169 x2 := 0o350
170 assert x2 == 232
171 x3 := 0o00073
172 assert x3 == 59
173 x4 := 0
174 assert x4 == 0
175 x5 := 195
176 assert x5 == 195
177 x6 := -0o744
178 assert x6 == -484
179 x7 := -0o000042
180 assert x7 == -34
181 x8 := -112
182 assert x8 == -112
183 x9 := -0
184 assert x9 == 0
185}
186
187fn test_num_separator() {
188 // int
189 assert 100_000_0 == 1000000
190 assert -2_23_4_6 == -22346
191
192 // bin
193 assert 0b0_11 == 3
194 assert -0b0_100 == -4
195
196 // oct
197 assert 0o1_73 == 123
198 assert -0o17_5 == -125
199 assert -0o175 == -125
200
201 // hex
202 assert 0xFF == 255
203 assert 0xF_F == 255
204
205 // TODO: ARM64 backend float number separators not handled
206 // assert 312_2.55 == 3122.55
207 // assert 312_2.55 == 3122.55
208}
209
210fn test_int_decl() {
211 x1 := 0
212 x2 := 1333
213 x3 := -88955
214 x4 := 2000000000
215 x5 := -1999999999
216 assert typeof(x1).name == 'int'
217 assert typeof(x2).name == 'int'
218 assert typeof(x3).name == 'int'
219 assert typeof(x4).name == 'int'
220 assert typeof(x5).name == 'int'
221 x7 := u64(-321314588900011)
222 assert typeof(x7).name == 'u64'
223}
224
225fn test_int_to_hex() {
226 // array hex
227 st := [u8(`V`), `L`, `A`, `N`, `G`]
228 assert st.hex() == '564c414e47'
229 assert st.hex().len == 10
230 st1 := [u8(0x41)].repeat(100)
231 assert st1.hex() == '41'.repeat(100)
232 // TODO: ARM64 backend int truncation issues with narrow types
233 // Skipping 8/16/32-bit hex tests that depend on proper width truncation
234 assert u64(0).hex() == '0'
235 assert i64(9223372036854775807).hex() == '7fffffffffffffff'
236 assert u64(9223372036854775807).hex() == '7fffffffffffffff'
237 assert i64(-1).hex() == 'ffffffffffffffff'
238}
239
240fn test_repeat() {
241 b := u8(`V`)
242 assert b.repeat(5) == 'VVVVV'
243 assert b.repeat(1) == b.ascii_str()
244 assert b.repeat(0) == ''
245}
246
247fn test_int_min() {
248 assert int_min(1, 2) == 1
249 assert int_min(2, 1) == 1
250 assert int_min(-2, -1) == -2
251 assert int_min(-1, -2) == -2
252 assert int_min(0, 5) == 0
253 assert int_min(5, 0) == 0
254 assert int_min(-5, 5) == -5
255 assert int_min(5, -5) == -5
256}
257
258fn test_int_max() {
259 assert int_max(1, 2) == 2
260 assert int_max(2, 1) == 2
261 assert int_max(-2, -1) == -1
262 assert int_max(-1, -2) == -1
263 assert int_max(0, 5) == 5
264 assert int_max(5, 0) == 5
265 assert int_max(-5, 5) == 5
266 assert int_max(5, -5) == 5
267}
268
269fn test_big_int() {
270 x := i64(2147483647)
271 if x > -2147483649 && x < 2147483648 {
272 assert true
273 } else {
274 assert false
275 }
276}
277