| 1 | import os |
| 2 | |
| 3 | const dump_expr_vexe = @VEXE |
| 4 | const dump_expr_tests_dir = os.dir(@FILE) |
| 5 | const dump_expr_v3_dir = os.dir(dump_expr_tests_dir) |
| 6 | const dump_expr_vlib_dir = os.dir(dump_expr_v3_dir) |
| 7 | const dump_expr_v3_src = os.join_path(dump_expr_v3_dir, 'v3.v') |
| 8 | |
| 9 | fn 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 | |
| 18 | fn dump_expr_compact_c(s string) string { |
| 19 | return s.replace('\t', '').replace(' ', '').replace('\n', '') |
| 20 | } |
| 21 | |
| 22 | fn 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 | |