v4 / vlib / v3 / tests / fixed_array_const_materialization_codegen_test.v
68 lines · 59 sloc · 2.18 KB · 288feee4702b35beadb4037d02b96b5c8674156b
Raw
1import os
2
3const fixed_array_const_vexe = @VEXE
4const fixed_array_const_tests_dir = os.dir(@FILE)
5const fixed_array_const_v3_dir = os.dir(fixed_array_const_tests_dir)
6const fixed_array_const_vlib_dir = os.dir(fixed_array_const_v3_dir)
7const fixed_array_const_v3_src = os.join_path(fixed_array_const_v3_dir, 'v3.v')
8
9fn fixed_array_const_build_v3() string {
10 v3_bin := os.join_path(os.temp_dir(), 'v3_fixed_array_const_test_${os.getpid()}')
11 os.rm(v3_bin) or {}
12 build :=
13 os.execute('${fixed_array_const_vexe} -gc none -path "${fixed_array_const_vlib_dir}|@vlib|@vmodules" -o ${v3_bin} ${fixed_array_const_v3_src}')
14 assert build.exit_code == 0, build.output
15 return v3_bin
16}
17
18fn test_fixed_array_const_materialization_and_nested_for_in() {
19 v3_bin := fixed_array_const_build_v3()
20 src := os.join_path(os.temp_dir(), 'v3_fixed_array_const_${os.getpid()}.v')
21 os.write_file(src, 'module main
22
23struct Item {
24 value int
25}
26
27const nums = [[1, 2, 3]!, [4, 5, 6]!]!
28const items = [&Item{value: 7}, &Item{value: 8}]!
29
30fn sum_nums() int {
31 mut total := 0
32 for row in nums {
33 for n in row {
34 total += n
35 }
36 }
37 return total
38}
39
40fn item_sum() int {
41 return items[0].value + items[1].value
42}
43
44fn main() {
45 println(sum_nums().str())
46 println(item_sum().str())
47}
48') or {
49 panic(err)
50 }
51 bin := os.join_path(os.temp_dir(), 'v3_fixed_array_const_${os.getpid()}')
52 compile := os.execute('${v3_bin} ${src} -b c -o ${bin}')
53 assert compile.exit_code == 0, compile.output
54 run := os.execute(bin)
55 assert run.exit_code == 0, run.output
56 assert run.output.trim_space().split_into_lines() == ['21', '15'], run.output
57
58 generated := os.read_file(bin + '.c') or { panic(err) }
59 compact := generated.replace('\t', '').replace(' ', '').replace('\n', '')
60 assert compact.contains('memmove(main__nums,'), generated
61 assert compact.contains('memmove(main__items,'), generated
62 assert compact.contains('introw[3];'), generated
63 assert compact.contains('memmove(row,main__nums['), generated
64 assert !compact.contains('introw=main__nums['), generated
65 assert !compact.contains('<0;'), generated
66 deparenthesized := compact.replace('(', '').replace(')', '')
67 assert deparenthesized.contains('returnmain__items[0]->value+main__items[1]->value;'), generated
68}
69