v2 / vlib / math / big / array_ops_test.v
232 lines · 188 sloc · 4.98 KB · 1820a5584b9bc606d0b5d12f6a60dfc62e98fe96
Raw
1// vtest build: !do_not_test ?
2module big
3
4fn test_add_digit_array_01() {
5 a := [u64(1), 1, 1]
6 b := [u64(1), 1, 1]
7 mut c := []u64{len: 4}
8 add_digit_array(a, b, mut c)
9
10 assert c == [u64(2), 2, 2]
11}
12
13fn test_add_digit_array_02() {
14 a := [u64(1), u64(1) << (digit_bits - 1), 1]
15 b := [u64(1), u64(1) << (digit_bits - 1), 1]
16 mut c := []u64{len: 4}
17 add_digit_array(a, b, mut c)
18
19 assert c == [u64(2), 0, 3]
20}
21
22fn test_add_digit_array_03() {
23 a := [u64(1), (u64(1) << (digit_bits - 1)) + u64(34), 1]
24 b := [u64(242), u64(1) << (digit_bits - 1), 1]
25 mut c := []u64{len: 4}
26 add_digit_array(a, b, mut c)
27
28 assert c == [u64(243), 34, 3]
29}
30
31fn test_add_digit_array_04() {
32 a := [u64(0)]
33 b := [u64(1), 3, 4]
34 mut c := []u64{len: 4}
35 add_digit_array(a, b, mut c)
36
37 assert c == [u64(1), 3, 4]
38}
39
40fn test_add_digit_array_05() {
41 a := [u64(1), 3, 4]
42 b := [u64(0)]
43 mut c := []u64{len: 4}
44 add_digit_array(a, b, mut c)
45
46 assert c == [u64(1), 3, 4]
47}
48
49fn test_add_digit_array_06() {
50 a := [u64(46), 13, 462, 13]
51 b := [u64(1), 3, 4]
52 mut c := []u64{len: 5}
53 add_digit_array(a, b, mut c)
54
55 assert c == [u64(47), 16, 466, 13]
56}
57
58fn test_subtract_digit_array_01() {
59 a := [u64(2), 2, 2, 2, 2]
60 b := [u64(1), 1, 2, 1, 1]
61 mut c := []u64{len: a.len}
62 subtract_digit_array(a, b, mut c)
63
64 assert c == [u64(1), 1, 0, 1, 1]
65}
66
67fn test_subtract_digit_array_02() {
68 a := [u64(0), 0, 0, 0, 1]
69 b := [u64(0), 0, 1]
70 mut c := []u64{len: a.len}
71 subtract_digit_array(a, b, mut c)
72
73 assert c == [u64(0), 0, u64(-1) & max_digit, u64(-1) & max_digit]
74}
75
76fn test_subtract_digit_array_03() {
77 a := [u64(0), 0, 0, 0, 1, 13]
78 b := [u64(0), 0, 1]
79 mut c := []u64{len: a.len}
80 subtract_digit_array(a, b, mut c)
81
82 assert c == [u64(0), 0, u64(-1) & max_digit, u64(-1) & max_digit, 0, 13]
83}
84
85fn test_subtract_digit_array_04() {
86 a := [u64(0x2), 0x4, 0x5, 0x3]
87 b := [u64(0x0), 0x0, 0x5, 0x3]
88 mut c := []u64{len: a.len}
89 subtract_digit_array(a, b, mut c)
90 assert c == [u64(0x2), 0x4]
91}
92
93fn test_multiply_digit_array_01() {
94 a := [u64(0), 0, 0, 1]
95 b := [u64(0), 0, 1]
96 mut c := []u64{len: a.len + b.len}
97 multiply_digit_array(a, b, mut c)
98
99 assert c == [u64(0), 0, 0, 0, 0, 1]
100}
101
102fn test_multiply_digit_array_02() {
103 a := []u64{len: 0}
104 b := [u64(0), 0, 1]
105 mut c := []u64{len: a.len + b.len}
106 multiply_digit_array(a, b, mut c)
107
108 assert c == []
109
110 c = []u64{len: a.len + b.len}
111 multiply_digit_array(b, a, mut c)
112
113 assert c == []
114}
115
116fn test_compare_digit_array_01() {
117 a := [u64(0), 0, 2]
118 b := [u64(0), 0, 4]
119
120 assert compare_digit_array(a, b) < 0
121 assert compare_digit_array(b, a) > 0
122 assert compare_digit_array(a, a) == 0
123 assert compare_digit_array(b, b) == 0
124}
125
126fn test_compare_digit_array_02() {
127 a := [u64(0), 0, 2324, 0, 124]
128 b := [u64(0), 0, 4, 0, 0, 1]
129
130 assert compare_digit_array(a, b) < 0
131 assert compare_digit_array(b, a) > 0
132 assert compare_digit_array(a, a) == 0
133 assert compare_digit_array(b, b) == 0
134}
135
136fn test_divide_digit_array_01() {
137 a := [u64(14)]
138 b := [u64(2)]
139 mut q := []u64{len: 1}
140 mut r := []u64{len: 1}
141
142 divide_digit_array(a, b, mut q, mut r)
143 assert q == [u64(7)]
144 assert r == []u64{len: 0}
145}
146
147fn test_divide_digit_array_02() {
148 a := [u64(14)]
149 b := [u64(15)]
150 mut q := []u64{len: 1}
151 mut r := []u64{len: 1}
152
153 divide_digit_array(a, b, mut q, mut r)
154 assert q == []u64{len: 0}
155 assert r == a
156}
157
158fn test_divide_digit_array_03() {
159 a := [u64(0), 4]
160 b := [u64(0), 1]
161 mut q := []u64{len: a.len - b.len + 1}
162 mut r := []u64{len: a.len}
163
164 divide_digit_array(a, b, mut q, mut r)
165 assert q == [u64(4)]
166 assert r == []u64{len: 0}
167}
168
169fn test_divide_digit_array_04() {
170 a := [u64(2), 4]
171 b := [u64(0), 1]
172 mut q := []u64{len: a.len - b.len + 1}
173 mut r := []u64{len: a.len}
174
175 divide_digit_array(a, b, mut q, mut r)
176 assert q == [u64(4)]
177 assert r == [u64(2)]
178}
179
180fn test_divide_digit_array_05() {
181 a := [u64(3)]
182 b := [u64(2)]
183 mut q := []u64{len: a.len - b.len + 1}
184 mut r := []u64{len: a.len}
185
186 divide_digit_array(a, b, mut q, mut r)
187 assert q == [u64(1)]
188 assert r == [u64(1)]
189}
190
191fn test_left_and_right_shift() {
192 a := [u64(1), 1, 1]
193 mut r := [u64(2), 2, 2]
194 mut b := []u64{len: 3, init: 0}
195 shift_digits_left(a, 1, mut b)
196 assert r == b
197 shift_digits_right(r, 1, mut r)
198 assert r == a
199 shift_digits_left(r, 1, mut r)
200 assert r == b
201
202 mut c := [u64(0x0fff_ffff_ffff_ffff)]
203 shift_digits_left(c, 16, mut c)
204 assert c == [u64(0x0fff_ffff_ffff_0000), u64(0xffff)]
205 shift_digits_right(c, 8, mut c)
206 assert c == [u64(0x0fff_ffff_ffff_ff00), 0xff]
207 shift_digits_right(c, 16, mut c)
208 assert c == [u64(0x000f_ffff_ffff_ffff)]
209 shift_digits_right(c, 16, mut c)
210 assert c == [u64(0x000f_ffff_ffff)]
211 shift_digits_right(c, 16, mut c)
212 assert c == [u64(0x000f_ffff)]
213 shift_digits_right(c, 40, mut c)
214 assert c == []u64{len: 0}
215}
216
217fn test_or_digit_array() {
218 a := [u64(10), 10, 10]
219 b := [u64(5), 5, 5]
220 mut c := []u64{len: 3, init: 0}
221 bitwise_or_digit_array(a, b, mut c)
222 assert c == [u64(15), 15, 15]
223
224 bitwise_or_digit_array(a, a, mut c)
225 assert c == a
226
227 x := [u64(10), 10, 10, 42, 42]
228 y := [u64(2), 2, 5, 2]
229 mut d := []u64{len: 5, init: 0}
230 bitwise_or_digit_array(y, x, mut d)
231 assert d == [u64(10), 10, 15, 42, 42]
232}
233