v2 / cmd / tools / vcover / cover_test.v
132 lines · 121 sloc · 5.92 KB · 985843fbc9b935f54c5443617044fcaf39780fd4
Raw
1// vtest retry: 2
2import os
3
4const vexe = @VEXE
5const vroot = os.dir(vexe)
6const tfolder = os.join_path(os.vtmp_dir(), 'cover_test')
7
8const t1 = np(os.join_path(tfolder, 't1'))
9const t2 = np(os.join_path(tfolder, 't2'))
10const t3 = np(os.join_path(tfolder, 't3'))
11
12fn testsuite_begin() {
13 os.setenv('VCOLORS', 'never', true)
14 os.chdir(vroot)!
15 os.rmdir_all(tfolder) or {}
16 os.mkdir(tfolder) or {}
17}
18
19fn testsuite_end() {
20 os.rmdir_all(tfolder) or {}
21}
22
23fn test_help() {
24 res := execute('${os.quoted_path(vexe)} cover -h')
25 assert res.exit_code == 0
26 assert res.output.contains('Usage: v cover')
27 assert res.output.contains('Description: Analyze & make reports')
28 assert res.output.contains('Options:')
29 assert res.output.contains('-h, --help Show this help text.')
30 assert res.output.contains('-v, --verbose Be more verbose while processing the coverages.')
31 assert res.output.contains('-H, --hotspots Show most frequently executed covered lines.')
32 assert res.output.contains('-P, --percentages Show coverage percentage per file.')
33 assert res.output.contains('--lcov <string> Write an LCOV line coverage report')
34 assert res.output.contains('-S, --show_test_files Show `_test.v` files as well (normally filtered).')
35 assert res.output.contains('-A, --absolute Use absolute paths for all files')
36}
37
38fn np(path string) string {
39 return path.replace('\\', '/')
40}
41
42fn test_simple() {
43 assert !os.exists(t1), t1
44 assert !os.exists(t2), t2
45 assert !os.exists(t3), t3
46
47 r1 :=
48 execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t1)} cmd/tools/vcover/testdata/simple/t1_test.v')
49 assert r1.exit_code == 0, r1.str()
50 assert r1.output.trim_space() == '10', r1.str()
51 assert os.exists(t1), t1
52 cmd := '${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/'
53 filter1 := execute(cmd)
54 assert filter1.exit_code == 0, filter1.output
55 assert filter1.output.contains('cmd/tools/vcover/testdata/simple/simple.v'), filter1.output
56 assert filter1.output.trim_space().ends_with('| 4 | 9 | 44.44%'), filter1.output
57 lcov_file := np(os.join_path(tfolder, 'coverage', 'simple.lcov'))
58 os.rm(lcov_file) or {}
59 lcov :=
60 execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/ --lcov ${os.quoted_path(lcov_file)} -P false')
61 assert lcov.exit_code == 0, lcov.str()
62 assert os.exists(lcov_file), lcov_file
63 lcov_content := os.read_file(lcov_file) or { panic(err) }
64 assert lcov_content.contains('SF:${np(os.join_path(vroot,
65 'cmd/tools/vcover/testdata/simple/simple.v'))}')
66 assert lcov_content.contains('DA:4,1')
67 assert lcov_content.contains('DA:12,0')
68 assert lcov_content.contains('LF:9')
69 assert lcov_content.contains('LH:4')
70 assert lcov_content.contains('end_of_record')
71 hfilter1 :=
72 execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t1)} --filter vcover/testdata/simple/ -H -P false')
73 assert hfilter1.exit_code == 0, hfilter1.output
74 assert !hfilter1.output.contains('%'), hfilter1.output
75 houtput1 := hfilter1.output.trim_space().split_into_lines()
76 zeros1 := houtput1.filter(it.starts_with('0 '))
77 nzeros1 := houtput1.filter(!it.starts_with('0 '))
78 assert zeros1.len > 0
79 assert zeros1.any(it.contains('simple.v:12')), zeros1.str()
80 assert zeros1.any(it.contains('simple.v:14')), zeros1.str()
81 assert zeros1.any(it.contains('simple.v:17')), zeros1.str()
82 assert zeros1.any(it.contains('simple.v:18')), zeros1.str()
83 assert zeros1.any(it.contains('simple.v:19')), zeros1.str()
84 assert nzeros1.len > 0
85 assert nzeros1.any(it.contains('simple.v:4')), nzeros1.str()
86 assert nzeros1.any(it.contains('simple.v:6')), nzeros1.str()
87 assert nzeros1.any(it.contains('simple.v:8')), nzeros1.str()
88 assert nzeros1.any(it.contains('simple.v:25')), nzeros1.str()
89
90 r2 :=
91 execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t2)} cmd/tools/vcover/testdata/simple/t2_test.v')
92 assert r2.exit_code == 0, r2.str()
93 assert r2.output.trim_space() == '24', r2.str()
94 assert os.exists(t2), t2
95 filter2 :=
96 execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t2)} --filter vcover/testdata/simple')
97 assert filter2.exit_code == 0, filter2.output
98 assert filter2.output.contains('cmd/tools/vcover/testdata/simple/simple.v')
99 assert filter2.output.trim_space().ends_with('| 6 | 9 | 66.67%'), filter2.output
100 hfilter2 :=
101 execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t2)} --filter testdata/simple -H -P false')
102 assert hfilter2.exit_code == 0, hfilter2.output
103 assert !hfilter2.output.contains('%'), hfilter2.output
104 houtput2 := hfilter2.output.trim_space().split_into_lines()
105 zeros2 := houtput2.filter(it.starts_with('0 '))
106 nzeros2 := houtput2.filter(!it.starts_with('0 '))
107 assert zeros2.len > 0
108 assert zeros2.any(it.contains('simple.v:4')), zeros2.str()
109 assert zeros2.any(it.contains('simple.v:6')), zeros2.str()
110 assert zeros2.any(it.contains('simple.v:8')), zeros2.str()
111 assert nzeros2.len > 0
112 assert nzeros2.any(it.contains('simple.v:17')), nzeros2.str()
113 assert nzeros2.any(it.contains('simple.v:18')), nzeros2.str()
114 assert nzeros2.any(it.contains('simple.v:19')), nzeros2.str()
115 assert nzeros2.any(it.contains('simple.v:25')), nzeros2.str()
116
117 // Run both tests. The coverage should be combined and == 100%
118 r3 :=
119 execute('${os.quoted_path(vexe)} -no-skip-unused -coverage ${os.quoted_path(t3)} test cmd/tools/vcover/testdata/simple/')
120 assert r3.exit_code == 0, r3.str()
121 assert r3.output.trim_space().contains('Summary for all V _test.v files: '), r3.str()
122 assert os.exists(t3), t3
123 filter3 := execute('${os.quoted_path(vexe)} cover ${os.quoted_path(t3)} --filter simple/')
124 assert filter3.exit_code == 0, filter3.str()
125 assert filter3.output.contains('cmd/tools/vcover/testdata/simple/simple.v'), filter3.str()
126 assert filter3.output.trim_space().match_glob('*cmd/tools/vcover/testdata/simple/simple.v *| 9 | 9 | 100.00%'), filter3.str()
127}
128
129fn execute(cmd string) os.Result {
130 eprintln('Executing: ${cmd}')
131 return os.execute(cmd)
132}
133