v2: support -stats for _test.v files
parent
3440d7edd8
commit
07de351546
|
@ -85,20 +85,8 @@ fn (b mut BenchedTests) end_testing() {
|
|||
|
||||
// ///////////////////////////////////////////////////////////////////
|
||||
fn nasserts(n int) string {
|
||||
if n == 0 {
|
||||
return '${n:2d} asserts | '
|
||||
}
|
||||
if n == 1 {
|
||||
return '${n:2d} assert | '
|
||||
}
|
||||
if n < 10 {
|
||||
return '${n:2d} asserts | '
|
||||
}
|
||||
if n < 100 {
|
||||
return '${n:3d} asserts | '
|
||||
}
|
||||
if n < 1000 {
|
||||
return '${n:4d} asserts | '
|
||||
return '${n:5d} assert | '
|
||||
}
|
||||
return '${n:5d} asserts | '
|
||||
}
|
||||
|
|
|
@ -197,7 +197,7 @@ pub fn (b &Benchmark) total_duration() i64 {
|
|||
fn (b &Benchmark) tdiff_in_ms(s string, sticks i64, eticks i64) string {
|
||||
if b.verbose {
|
||||
tdiff := (eticks - sticks)
|
||||
return '${tdiff:6lld} ms $s'
|
||||
return '${tdiff:6d} ms $s'
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
|
|
@ -50,7 +50,7 @@ pub fn (b mut Builder) gen_c(v_files []string) string {
|
|||
exit(1)
|
||||
}
|
||||
// println('starting cgen...')
|
||||
res := gen.cgen(b.parsed_files, b.table)
|
||||
res := gen.cgen(b.parsed_files, b.table, b.pref)
|
||||
t3 := time.ticks()
|
||||
gen_time := t3 - t2
|
||||
println('C GEN: ${gen_time}ms')
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
v.table
|
||||
v.depgraph
|
||||
v.token
|
||||
v.pref
|
||||
term
|
||||
)
|
||||
|
||||
|
@ -24,6 +25,7 @@ struct Gen {
|
|||
definitions strings.Builder // typedefs, defines etc (everything that goes to the top of the file)
|
||||
inits strings.Builder // contents of `void _vinit(){}`
|
||||
table &table.Table
|
||||
pref &pref.Preferences
|
||||
mut:
|
||||
file ast.File
|
||||
fn_decl &ast.FnDecl // pointer to the FnDecl we are currently inside otherwise 0
|
||||
|
@ -53,7 +55,7 @@ const (
|
|||
'\t\t\t\t\t\t\t\t']
|
||||
)
|
||||
|
||||
pub fn cgen(files []ast.File, table &table.Table) string {
|
||||
pub fn cgen(files []ast.File, table &table.Table, pref &pref.Preferences) string {
|
||||
// println('start cgen2')
|
||||
mut g := Gen{
|
||||
out: strings.new_builder(100)
|
||||
|
@ -61,6 +63,7 @@ pub fn cgen(files []ast.File, table &table.Table) string {
|
|||
definitions: strings.new_builder(100)
|
||||
inits: strings.new_builder(100)
|
||||
table: table
|
||||
pref: pref
|
||||
fn_decl: 0
|
||||
autofree: true
|
||||
indent: -1
|
||||
|
@ -554,19 +557,21 @@ fn (g mut Gen) gen_assert_stmt(a ast.AssertStmt) {
|
|||
if g.is_test {
|
||||
g.writeln('{')
|
||||
g.writeln(' g_test_oks++;')
|
||||
g.writeln(' cb_assertion_ok( _STR("${g.file.path}"), ${a.pos.line_nr}, _STR("assert ${s_assertion}"), _STR("${g.fn_decl.name}()") );')
|
||||
// g.writeln(' println(_STR("OK ${g.file.path}:${a.pos.line_nr}: fn ${g.fn_decl.name}(): assert $s_assertion"));')
|
||||
g.writeln('}else{')
|
||||
g.writeln(' g_test_fails++;')
|
||||
g.writeln(' eprintln(_STR("${g.file.path}:${a.pos.line_nr}: FAIL: fn ${g.fn_decl.name}(): assert $s_assertion"));')
|
||||
g.writeln(' cb_assertion_failed( _STR("${g.file.path}"), ${a.pos.line_nr}, _STR("assert ${s_assertion}"), _STR("${g.fn_decl.name}()") );')
|
||||
g.writeln(' exit(1);')
|
||||
g.writeln(' // TODO')
|
||||
g.writeln(' // Maybe print all vars in a test function if it fails?')
|
||||
g.writeln('}')
|
||||
return
|
||||
}
|
||||
else {
|
||||
g.writeln('{}else{')
|
||||
g.writeln(' eprintln(_STR("${g.file.path}:${a.pos.line_nr}: FAIL: fn ${g.fn_decl.name}(): assert $s_assertion"));')
|
||||
g.writeln(' exit(1);')
|
||||
g.writeln('}')
|
||||
}
|
||||
}
|
||||
|
||||
fn (g mut Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
|
||||
|
@ -2491,6 +2496,30 @@ pub fn (g mut Gen) write_tests_main() {
|
|||
g.definitions.writeln('int g_test_fails = 0;')
|
||||
g.writeln('int main() {')
|
||||
g.writeln('\t_vinit();')
|
||||
g.writeln('')
|
||||
all_tfuncs := g.get_all_test_function_names()
|
||||
if g.pref.is_stats {
|
||||
g.writeln('\tBenchedTests bt = start_testing(${all_tfuncs.len}, tos3("$g.pref.path"));')
|
||||
}
|
||||
for t in all_tfuncs {
|
||||
if g.pref.is_stats {
|
||||
g.writeln('\tBenchedTests_testing_step_start(&bt, tos3("$t"));')
|
||||
}
|
||||
g.writeln('\t${t}();')
|
||||
if g.pref.is_stats {
|
||||
g.writeln('\tBenchedTests_testing_step_end(&bt);')
|
||||
}
|
||||
}
|
||||
if g.pref.is_stats {
|
||||
g.writeln('\tBenchedTests_end_testing(&bt);')
|
||||
}
|
||||
g.writeln('')
|
||||
g.writeln('_vcleanup();')
|
||||
g.writeln('\treturn g_test_fails > 0;')
|
||||
g.writeln('}')
|
||||
}
|
||||
|
||||
fn (g &Gen) get_all_test_function_names() []string {
|
||||
mut tfuncs := []string
|
||||
mut tsuite_begin := ''
|
||||
mut tsuite_end := ''
|
||||
|
@ -2506,17 +2535,15 @@ pub fn (g mut Gen) write_tests_main() {
|
|||
}
|
||||
tfuncs << f.name
|
||||
}
|
||||
mut all_tfuncs := []string
|
||||
if tsuite_begin.len > 0 {
|
||||
g.writeln('\t${tsuite_begin}();\n')
|
||||
}
|
||||
for t in tfuncs {
|
||||
g.writeln('\t${t}();')
|
||||
all_tfuncs << tsuite_begin
|
||||
}
|
||||
all_tfuncs << tfuncs
|
||||
if tsuite_end.len > 0 {
|
||||
g.writeln('\t${tsuite_end}();\n')
|
||||
all_tfuncs << tsuite_end
|
||||
}
|
||||
g.writeln('\treturn 0;')
|
||||
g.writeln('}')
|
||||
return all_tfuncs
|
||||
}
|
||||
|
||||
fn (g &Gen) is_importing_os() bool {
|
||||
|
|
|
@ -5,7 +5,7 @@ import (
|
|||
v.gen
|
||||
v.table
|
||||
v.checker
|
||||
v.eval
|
||||
// v.eval
|
||||
v.pref
|
||||
term
|
||||
)
|
||||
|
@ -77,10 +77,11 @@ x := 10
|
|||
8+4
|
||||
'
|
||||
table := &table.Table{}
|
||||
prog := parse_file(s, table, .skip_comments, &pref.Preferences{})
|
||||
vpref := &pref.Preferences{}
|
||||
prog := parse_file(s, table, .skip_comments, vpref)
|
||||
mut checker := checker.new_checker(table)
|
||||
checker.check(prog)
|
||||
res := gen.cgen([prog], table)
|
||||
res := gen.cgen([prog], table, vpref)
|
||||
println(res)
|
||||
}
|
||||
|
||||
|
@ -97,7 +98,8 @@ fn test_one() {
|
|||
]
|
||||
expected := 'int a = 10;int b = -a;int c = 20;'
|
||||
table := table.new_table()
|
||||
mut scope := &ast.Scope{
|
||||
vpref := &pref.Preferences{}
|
||||
scope := &ast.Scope{
|
||||
start_pos: 0
|
||||
parent: 0
|
||||
}
|
||||
|
@ -111,7 +113,7 @@ fn test_one() {
|
|||
}
|
||||
mut checker := checker.new_checker(table)
|
||||
checker.check(program)
|
||||
res := gen.cgen([program], table).replace('\n', '').trim_space().after('#endif')
|
||||
res := gen.cgen([program], table, vpref).replace('\n', '').trim_space().after('#endif')
|
||||
println(res)
|
||||
ok := expected == res
|
||||
println(res)
|
||||
|
@ -193,8 +195,9 @@ fn test_parse_expr() {
|
|||
]
|
||||
mut e := []ast.Stmt
|
||||
table := table.new_table()
|
||||
vpref := &pref.Preferences{}
|
||||
mut checker := checker.new_checker(table)
|
||||
mut scope := &ast.Scope{
|
||||
scope := &ast.Scope{
|
||||
start_pos: 0
|
||||
parent: 0
|
||||
}
|
||||
|
@ -207,7 +210,7 @@ fn test_parse_expr() {
|
|||
scope: scope
|
||||
}
|
||||
checker.check(program)
|
||||
res := gen.cgen([program], table).after('#endif')
|
||||
res := gen.cgen([program], table, vpref).after('#endif')
|
||||
println('========')
|
||||
println(res)
|
||||
println('========')
|
||||
|
|
Loading…
Reference in New Issue