v2 / vlib / v / tests / unsigned_right_shift_test.v
55 lines · 49 sloc · 1.24 KB · 249d835b7b9bde1c0180d14bc1b262f0f82ebd55
Raw
1const answer_u64 = u64(9223372036854775805)
2
3const answer_u32 = u32(2147483645)
4const answer_u16 = u16(32765)
5const answer_u8 = u8(125)
6
7fn test_unsigned_right_shift_expr_isize_usize() {
8 $if x32 {
9 assert isize(-5) >>> 1 == answer_u32
10 assert usize(-5) >>> 1 == answer_u32
11 }
12 $if x64 {
13 assert isize(-5) >>> 1 == answer_u64
14 assert usize(-5) >>> 1 == answer_u64
15 }
16}
17
18fn test_unsigned_right_shift_expr() {
19 assert i64(-5) >>> 1 == answer_u64
20 assert -5 >>> 1 == answer_u32 // because int literal's size defaults to int's size, without an explicit cast
21 $if new_int ? && x64 {
22 assert int(-5) >>> 1 == answer_u64
23 } $else {
24 assert int(-5) >>> 1 == answer_u32
25 }
26 assert i16(-5) >>> 1 == answer_u16
27 assert i8(-5) >>> 1 == answer_u8
28}
29
30fn test_unsigned_right_shift_assignment() {
31 mut x, mut y, mut z := i64(-5), -5, int(-5)
32 x >>>= 1
33 y >>>= 1
34 z >>>= 1
35 assert x == answer_u64
36 $if new_int ? && x64 {
37 assert y == answer_u64
38 assert z == answer_u64
39 } $else {
40 assert y == answer_u32
41 assert z == answer_u32
42 }
43}
44
45fn oversized_unsigned_shift_count() u64 {
46 return u64(64)
47}
48
49fn test_unsigned_right_shift_oversized_count() {
50 shift := oversized_unsigned_shift_count()
51 assert u64(1) >>> shift == u64(0)
52 mut x := u64(1)
53 x >>>= shift
54 assert x == u64(0)
55}
56