v2 / vlib / v / tests / testdata / builtin_overflow / gen_overflow_tests.vsh
236 lines · 223 sloc · 7.61 KB · 7a14eb0f8487fcd5cf5e5773a9f74c667ee209bf
Raw
1module main
2
3import os
4import strings
5
6struct OverflowStruct {
7 name string
8 max [2]string // add by 1 every time, should overflow
9 min [2]string // sub by 1 every time, should overflow
10 mid [2]string // mult by 10 every time, should overflow
11}
12
13// TODO: add tests for `rune`,`int`,`isize`,`usize`.
14const overflows = [
15 OverflowStruct{
16 name: 'u8'
17 max: ['254', '255']!
18 min: ['1', '0']!
19 mid: ['25', '250']!
20 },
21 OverflowStruct{
22 name: 'u16'
23 max: ['65534', '65535']!
24 min: ['1', '0']!
25 mid: ['6553', '65530']!
26 },
27 OverflowStruct{
28 name: 'u32'
29 max: ['4294967294', '4294967295']!
30 min: ['1', '0']!
31 mid: ['429496729', '4294967290']!
32 },
33 OverflowStruct{
34 name: 'u64'
35 max: ['18446744073709551614', '18446744073709551615']!
36 min: ['1', '0']!
37 mid: ['1844674407370955161', '18446744073709551610']!
38 },
39 OverflowStruct{
40 name: 'i8'
41 max: ['126', '127']!
42 min: ['-127', '-128']!
43 mid: ['12', '120']!
44 },
45 OverflowStruct{
46 name: 'i16'
47 max: ['32766', '32767']!
48 min: ['-32767', '-32768']!
49 mid: ['3276', '32760']!
50 },
51 OverflowStruct{
52 name: 'i32'
53 max: ['2147483646', '2147483647']!
54 min: ['-2147483647', '-2147483648']!
55 mid: ['214748364', '2147483640']!
56 },
57 OverflowStruct{
58 name: 'i64'
59 max: ['9223372036854775806', '9223372036854775807']!
60 min: ['-9223372036854775807', '-9223372036854775808']!
61 mid: ['922337203685477580', '9223372036854775800']!
62 },
63]
64
65const ops = ['add', 'add_assign', 'inc', 'sub', 'sub_assign', 'dec', 'mul', 'mul_assign']
66
67fn main() {
68 mut sb := strings.new_builder(1024)
69 for o in overflows {
70 for op in ops {
71 match op {
72 'add' {
73 // vv file
74 sb.writeln('mut x := ${o.name}(${o.max[0]})')
75 sb.writeln('println(x)')
76 sb.writeln('x = x + 1')
77 sb.writeln('println(x)')
78 sb.writeln('x = x + 1')
79 sb.writeln('println(x)')
80 os.write_file('panic_on_${o.name}_${op}_overflow.vv', sb.str())!
81
82 // out file
83 sb.writeln('${o.max[0]}')
84 sb.writeln('${o.max[1]}')
85 sb.writeln('================ V panic ================')
86 sb.writeln(' module: builtin.overflow')
87 sb.writeln(' function: add_${o.name}()')
88 sb.writeln(' message: attempt to add with overflow(${o.name}(${o.max[1]}) + ${o.name}(1))')
89 sb.writeln(' file: vlib/builtin/overflow/overflow.v\n')
90 os.write_file('panic_on_${o.name}_${op}_overflow.out', sb.str())!
91 }
92 'add_assign' {
93 // vv file
94 sb.writeln('mut x := ${o.name}(${o.max[0]})')
95 sb.writeln('println(x)')
96 sb.writeln('x += 1')
97 sb.writeln('println(x)')
98 sb.writeln('x += 1')
99 sb.writeln('println(x)')
100 os.write_file('panic_on_${o.name}_${op}_overflow.vv', sb.str())!
101
102 // out file
103 sb.writeln('${o.max[0]}')
104 sb.writeln('${o.max[1]}')
105 sb.writeln('================ V panic ================')
106 sb.writeln(' module: builtin.overflow')
107 sb.writeln(' function: add_${o.name}()')
108 sb.writeln(' message: attempt to add with overflow(${o.name}(${o.max[1]}) + ${o.name}(1))')
109 sb.writeln(' file: vlib/builtin/overflow/overflow.v\n')
110 os.write_file('panic_on_${o.name}_${op}_overflow.out', sb.str())!
111 }
112 'inc' {
113 // vv file
114 sb.writeln('mut x := ${o.name}(${o.max[0]})')
115 sb.writeln('println(x)')
116 sb.writeln('x ++')
117 sb.writeln('println(x)')
118 sb.writeln('x ++')
119 sb.writeln('println(x)')
120 os.write_file('panic_on_${o.name}_${op}_overflow.vv', sb.str())!
121
122 // out file
123 sb.writeln('${o.max[0]}')
124 sb.writeln('${o.max[1]}')
125 sb.writeln('================ V panic ================')
126 sb.writeln(' module: builtin.overflow')
127 sb.writeln(' function: add_${o.name}()')
128 sb.writeln(' message: attempt to add with overflow(${o.name}(${o.max[1]}) + ${o.name}(1))')
129 sb.writeln(' file: vlib/builtin/overflow/overflow.v\n')
130 os.write_file('panic_on_${o.name}_${op}_overflow.out', sb.str())!
131 }
132 'sub' {
133 // vv file
134 sb.writeln('mut x := ${o.name}(${o.min[0]})')
135 sb.writeln('println(x)')
136 sb.writeln('x = x - 1')
137 sb.writeln('println(x)')
138 sb.writeln('x = x - 1')
139 sb.writeln('println(x)')
140 os.write_file('panic_on_${o.name}_${op}_overflow.vv', sb.str())!
141
142 // out file
143 sb.writeln('${o.min[0]}')
144 sb.writeln('${o.min[1]}')
145 sb.writeln('================ V panic ================')
146 sb.writeln(' module: builtin.overflow')
147 sb.writeln(' function: sub_${o.name}()')
148 sb.writeln(' message: attempt to sub with overflow(${o.name}(${o.min[1]}) - ${o.name}(1))')
149 sb.writeln(' file: vlib/builtin/overflow/overflow.v\n')
150 os.write_file('panic_on_${o.name}_${op}_overflow.out', sb.str())!
151 }
152 'sub_assign' {
153 // vv file
154 sb.writeln('mut x := ${o.name}(${o.min[0]})')
155 sb.writeln('println(x)')
156 sb.writeln('x -= 1')
157 sb.writeln('println(x)')
158 sb.writeln('x -= 1')
159 sb.writeln('println(x)')
160 os.write_file('panic_on_${o.name}_${op}_overflow.vv', sb.str())!
161
162 // out file
163 sb.writeln('${o.min[0]}')
164 sb.writeln('${o.min[1]}')
165 sb.writeln('================ V panic ================')
166 sb.writeln(' module: builtin.overflow')
167 sb.writeln(' function: sub_${o.name}()')
168 sb.writeln(' message: attempt to sub with overflow(${o.name}(${o.min[1]}) - ${o.name}(1))')
169 sb.writeln(' file: vlib/builtin/overflow/overflow.v\n')
170 os.write_file('panic_on_${o.name}_${op}_overflow.out', sb.str())!
171 }
172 'dec' {
173 // vv file
174 sb.writeln('mut x := ${o.name}(${o.min[0]})')
175 sb.writeln('println(x)')
176 sb.writeln('x --')
177 sb.writeln('println(x)')
178 sb.writeln('x --')
179 sb.writeln('println(x)')
180 os.write_file('panic_on_${o.name}_${op}_overflow.vv', sb.str())!
181
182 // out file
183 sb.writeln('${o.min[0]}')
184 sb.writeln('${o.min[1]}')
185 sb.writeln('================ V panic ================')
186 sb.writeln(' module: builtin.overflow')
187 sb.writeln(' function: sub_${o.name}()')
188 sb.writeln(' message: attempt to sub with overflow(${o.name}(${o.min[1]}) - ${o.name}(1))')
189 sb.writeln(' file: vlib/builtin/overflow/overflow.v\n')
190 os.write_file('panic_on_${o.name}_${op}_overflow.out', sb.str())!
191 }
192 'mul' {
193 // vv file
194 sb.writeln('mut x := ${o.name}(${o.mid[0]})')
195 sb.writeln('println(x)')
196 sb.writeln('x = x * 10')
197 sb.writeln('println(x)')
198 sb.writeln('x = x * 10')
199 sb.writeln('println(x)')
200 os.write_file('panic_on_${o.name}_${op}_overflow.vv', sb.str())!
201
202 // out file
203 sb.writeln('${o.mid[0]}')
204 sb.writeln('${o.mid[1]}')
205 sb.writeln('================ V panic ================')
206 sb.writeln(' module: builtin.overflow')
207 sb.writeln(' function: mul_${o.name}()')
208 sb.writeln(' message: attempt to mul with overflow(${o.name}(${o.mid[1]}) * ${o.name}(10))')
209 sb.writeln(' file: vlib/builtin/overflow/overflow.v\n')
210 os.write_file('panic_on_${o.name}_${op}_overflow.out', sb.str())!
211 }
212 'mul_assign' {
213 // vv file
214 sb.writeln('mut x := ${o.name}(${o.mid[0]})')
215 sb.writeln('println(x)')
216 sb.writeln('x *= 10')
217 sb.writeln('println(x)')
218 sb.writeln('x *= 10')
219 sb.writeln('println(x)')
220 os.write_file('panic_on_${o.name}_${op}_overflow.vv', sb.str())!
221
222 // out file
223 sb.writeln('${o.mid[0]}')
224 sb.writeln('${o.mid[1]}')
225 sb.writeln('================ V panic ================')
226 sb.writeln(' module: builtin.overflow')
227 sb.writeln(' function: mul_${o.name}()')
228 sb.writeln(' message: attempt to mul with overflow(${o.name}(${o.mid[1]}) * ${o.name}(10))')
229 sb.writeln(' file: vlib/builtin/overflow/overflow.v\n')
230 os.write_file('panic_on_${o.name}_${op}_overflow.out', sb.str())!
231 }
232 else {}
233 }
234 }
235 }
236}
237