vxx2 / vlib / v3 / tests / dump_expr_codegen_test.v
69 lines · 65 sloc · 2.15 KB · 288feee4702b35beadb4037d02b96b5c8674156b
Raw
1import os
2
3const dump_expr_vexe = @VEXE
4const dump_expr_tests_dir = os.dir(@FILE)
5const dump_expr_v3_dir = os.dir(dump_expr_tests_dir)
6const dump_expr_vlib_dir = os.dir(dump_expr_v3_dir)
7const dump_expr_v3_src = os.join_path(dump_expr_v3_dir, 'v3.v')
8
9fn dump_expr_build_v3() string {
10 v3_bin := os.join_path(os.temp_dir(), 'v3_dump_expr_codegen_test_${os.getpid()}')
11 os.rm(v3_bin) or {}
12 build :=
13 os.execute('${dump_expr_vexe} -gc none -path "${dump_expr_vlib_dir}|@vlib|@vmodules" -o ${v3_bin} ${dump_expr_v3_src}')
14 assert build.exit_code == 0, build.output
15 return v3_bin
16}
17
18fn dump_expr_compact_c(s string) string {
19 return s.replace('\t', '').replace(' ', '').replace('\n', '')
20}
21
22fn test_dump_expr_is_transparent_for_c_oracle_output() {
23 v3_bin := dump_expr_build_v3()
24 src := os.join_path(os.temp_dir(), 'v3_dump_expr_codegen_${os.getpid()}.v')
25 source := [
26 'module main',
27 '',
28 'fn f() int {',
29 ' return dump(3)',
30 '}',
31 '',
32 'fn take_int(n int) int {',
33 ' return n + 1',
34 '}',
35 '',
36 "fn bump(n int) int { println('side'); return n + 1 }",
37 '',
38 'fn main() {',
39 ' x := dump(1 + 2)',
40 ' assert x == 3',
41 ' mut n := 4',
42 ' n = dump(n + 2)',
43 ' assert n == 6',
44 ' assert f() == 3',
45 ' y := take_int(dump(6))',
46 ' assert y == 7',
47 ' z := dump(bump(0))',
48 ' assert z == 1',
49 ' println(int_str(x + n + f() + y + z))',
50 '}',
51 ].join('\n')
52 os.write_file(src, source) or { panic(err) }
53 bin := os.join_path(os.temp_dir(), 'v3_dump_expr_codegen_${os.getpid()}')
54 compile := os.execute('${v3_bin} ${src} -b c -o ${bin}')
55 assert compile.exit_code == 0, compile.output
56 run := os.execute(bin)
57 assert run.exit_code == 0, run.output
58 lines := run.output.trim_space().replace('\r\n', '\n').split('\n')
59 assert lines == ['side', '20'], run.output
60 generated := os.read_file(bin + '.c') or { panic(err) }
61 compact := dump_expr_compact_c(generated)
62 assert !generated.contains('dump('), generated
63 assert !generated.contains('= ;'), generated
64 assert compact.count('1+2') == 1, generated
65 assert compact.contains('n=n+2;'), generated
66 assert compact.contains('return3;'), generated
67 assert compact.contains('take_int(6)'), generated
68 assert compact.count('bump(0)') == 1, generated
69}
70