v4 / vlib / v3 / tests / operator_result_method_checker_test.v
126 lines · 104 sloc · 3.4 KB · 288feee4702b35beadb4037d02b96b5c8674156b
Raw
1import os
2
3const vexe = @VEXE
4const tests_dir = os.dir(@FILE)
5const v3_dir = os.dir(tests_dir)
6const vlib_dir = os.dir(v3_dir)
7const v3_src = os.join_path(v3_dir, 'v3.v')
8
9fn build_v3() string {
10 v3_bin := os.join_path(os.temp_dir(), 'v3_operator_result_method_checker_test')
11 build :=
12 os.execute('${vexe} -gc none -path "${vlib_dir}|@vlib|@vmodules" -o ${v3_bin} ${v3_src}')
13 assert build.exit_code == 0, build.output
14 return v3_bin
15}
16
17fn write_clock_project(name string, main_src string) string {
18 root := os.join_path(os.temp_dir(), 'v3_operator_result_method_${name}')
19 os.rmdir_all(root) or {}
20 clock_dir := os.join_path(root, 'clock')
21 os.mkdir_all(clock_dir) or { panic(err) }
22 os.write_file(os.join_path(root, 'v.mod'), "Module { name: 'operator_result_method' }\n") or {
23 panic(err)
24 }
25 os.write_file(os.join_path(clock_dir, 'clock.v'), 'module clock
26
27pub struct Moment {
28 value int
29}
30
31pub type Span = i64
32
33pub fn now() Moment {
34 return Moment{
35 value: 1
36 }
37}
38
39pub fn (lhs Moment) - (rhs Moment) Span {
40 return Span(lhs.value - rhs.value)
41}
42
43pub fn (span Span) milliseconds() i64 {
44 return i64(span)
45}
46') or {
47 panic(err)
48 }
49 main_path := os.join_path(root, 'main.v')
50 os.write_file(main_path, main_src) or { panic(err) }
51 return main_path
52}
53
54fn check_to_c(v3_bin string, name string, main_src string) os.Result {
55 main_path := write_clock_project(name, main_src)
56 c_path := os.join_path(os.temp_dir(), 'v3_operator_result_method_${name}.c')
57 os.rm(c_path) or {}
58 return os.execute('${v3_bin} ${main_path} -b c -o ${c_path}')
59}
60
61fn check_standalone_to_c(v3_bin string, name string, main_src string) os.Result {
62 main_path := os.join_path(os.temp_dir(), 'v3_${name}.v')
63 os.write_file(main_path, main_src) or { panic(err) }
64 c_path := os.join_path(os.temp_dir(), 'v3_${name}.c')
65 os.rm(c_path) or {}
66 return os.execute('${v3_bin} ${main_path} -b c -o ${c_path}')
67}
68
69fn test_operator_result_type_is_used_before_method_resolution() {
70 v3_bin := build_v3()
71 good := 'module main
72
73import clock
74
75fn main() {
76 println((clock.now() - clock.now()).milliseconds())
77 println(clock.Span(123000000).milliseconds())
78 span := clock.Span(10)
79 _ := span.milliseconds()
80}
81'
82 good_res := check_to_c(v3_bin, 'good', good)
83 assert good_res.exit_code == 0, good_res.output
84 assert !good_res.output.contains('unknown function `milliseconds`'), good_res.output
85
86 time_good := 'module main
87
88import time
89
90fn main() {
91 println((time.now() - time.now()).milliseconds())
92 println(time.Duration(123000000).milliseconds())
93 d := time.Duration(10)
94 _ := d.milliseconds()
95}
96'
97 time_res := check_to_c(v3_bin, 'time_good', time_good)
98 assert time_res.exit_code == 0, time_res.output
99 assert !time_res.output.contains('unknown function `milliseconds`'), time_res.output
100
101 time_standalone := 'module main
102
103import time
104
105fn main() {
106 d := time.Duration(10); _ := d.milliseconds()
107}
108'
109 time_standalone_res := check_standalone_to_c(v3_bin, 'probe_time_duration_method_clean',
110 time_standalone)
111 assert time_standalone_res.exit_code == 0, time_standalone_res.output
112 assert !time_standalone_res.output.contains('unknown function d.milliseconds'), time_standalone_res.output
113
114 bad := 'module main
115
116import clock
117
118fn main() {
119 println((clock.now() - clock.now()).bogus_method())
120}
121'
122 bad_res := check_to_c(v3_bin, 'bad', bad)
123 assert bad_res.exit_code != 0, bad_res.output
124 assert bad_res.output.contains('unknown function'), bad_res.output
125 assert bad_res.output.contains('bogus_method'), bad_res.output
126}
127