tests: colorize failing tests, improve layout (#8066)
							parent
							
								
									4cd50ed566
								
							
						
					
					
						commit
						a22982d662
					
				|  | @ -129,6 +129,9 @@ pub fn new_test_session(_vargs string) TestSession { | |||
| 	vexe := pref.vexe_path() | ||||
| 	vroot := os.dir(vexe) | ||||
| 	new_vtmp_dir := setup_new_vtmp_folder() | ||||
| 	if term.can_show_color_on_stderr() { | ||||
| 		os.setenv('VCOLORS', 'always', true) | ||||
| 	} | ||||
| 	return TestSession{ | ||||
| 		vexe: vexe | ||||
| 		vroot: vroot | ||||
|  | @ -273,7 +276,8 @@ fn worker_trunner(mut p sync.PoolProcessor, idx int, thread_id int) voidptr { | |||
| 			ts.failed = true | ||||
| 			ts.benchmark.fail() | ||||
| 			tls_bench.fail() | ||||
| 			ts.append_message(.fail, tls_bench.step_message_fail('$relative_file\n$r.output\n')) | ||||
| 			ending_newline := if r.output.ends_with('\n') { '\n' } else { '' } | ||||
| 			ts.append_message(.fail, tls_bench.step_message_fail('$relative_file\n$r.output.trim_space()$ending_newline')) | ||||
| 		} else { | ||||
| 			ts.benchmark.ok() | ||||
| 			tls_bench.ok() | ||||
|  |  | |||
|  | @ -3,6 +3,17 @@ module main | |||
| import os | ||||
| import term | ||||
| 
 | ||||
| const use_color = term.can_show_color_on_stderr() | ||||
| 
 | ||||
| const use_relative_paths = can_use_relative_paths() | ||||
| 
 | ||||
| fn can_use_relative_paths() bool { | ||||
| 	return match os.getenv('VERROR_PATHS') { | ||||
| 		'absolute' { false } | ||||
| 		else { true } | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // //////////////////////////////////////////////////////////////////
 | ||||
| // / This file will get compiled as part of the main program,
 | ||||
| // / for a _test.v file.
 | ||||
|  | @ -13,32 +24,65 @@ import term | |||
| // //////////////////////////////////////////////////////////////////
 | ||||
| // TODO copy pasta builtin.v fn ___print_assert_failure
 | ||||
| fn cb_assertion_failed(i &VAssertMetaInfo) { | ||||
| 	filepath := if use_relative_paths { i.fpath } else { os.real_path(i.fpath) } | ||||
| 	mut final_filepath := filepath + ':${i.line_nr + 1}:' | ||||
| 	if use_color { | ||||
| 		final_filepath = term.gray(final_filepath) | ||||
| 	} | ||||
| 	mut final_funcname := 'fn ' + i.fn_name.replace('main.', '').replace('__', '.') | ||||
| 	if use_color { | ||||
| 		final_funcname = term.red('✗ ' + final_funcname) | ||||
| 	} | ||||
| 	final_src := if use_color { term.dim('assert ${term.bold(i.src)}') } else { 'assert ' + i.src } | ||||
| 	eprintln('$final_filepath $final_funcname') | ||||
| 	if i.op.len > 0 && i.op != 'call' { | ||||
| 		mut lvtitle := '    Left value:' | ||||
| 		mut rvtitle := '    Right value:' | ||||
| 		mut slvalue := '$i.lvalue' | ||||
| 		mut srvalue := '$i.rvalue' | ||||
| 		if use_color { | ||||
| 			slvalue = term.yellow(slvalue) | ||||
| 			srvalue = term.yellow(srvalue) | ||||
| 			lvtitle = term.gray(lvtitle) | ||||
| 			rvtitle = term.gray(rvtitle) | ||||
| 		} | ||||
| 		cutoff_limit := 30 | ||||
| 		if slvalue.len > cutoff_limit || srvalue.len > cutoff_limit { | ||||
| 			eprintln('  > $final_src') | ||||
| 			eprintln(lvtitle) | ||||
| 			eprintln('      $slvalue') | ||||
| 			eprintln(rvtitle) | ||||
| 			eprintln('      $srvalue') | ||||
| 		} else { | ||||
| 			eprintln('   > $final_src') | ||||
| 			eprintln(' $lvtitle $slvalue') | ||||
| 			eprintln('$rvtitle $srvalue') | ||||
| 		} | ||||
| 	} else { | ||||
| 		eprintln('    $final_src') | ||||
| 	} | ||||
| 	eprintln('') | ||||
| } | ||||
| 
 | ||||
| fn cb_assertion_ok(i &VAssertMetaInfo) { | ||||
| 	// prints for every assertion instead of per test function
 | ||||
| 	// TODO: needs to be changed
 | ||||
| 	/* | ||||
| 	use_color := term.can_show_color_on_stderr() | ||||
| 	use_relative_paths := match os.getenv('VERROR_PATHS') { | ||||
| 		'absolute' { false } | ||||
| 		else { true } | ||||
| 	} | ||||
| 	final_filename := if use_relative_paths { i.fpath } else { os.real_path(i.fpath) } | ||||
| 	final_funcname := i.fn_name.replace('main.', '').replace('__', '.') | ||||
| 	final_src := if use_color { term.bold(i.src) } else { i.src } | ||||
| 	eprintln('') | ||||
| 	eprintln('$final_filename:${i.line_nr+1}: failed assert in function $final_funcname') | ||||
| 	eprintln('Source  : `$final_src`') | ||||
| 	if i.op.len > 0 && i.op != 'call' { | ||||
| 		mut slvalue := '$i.lvalue' | ||||
| 		mut srvalue := '$i.rvalue' | ||||
| 		// lpostfix := if slvalue == i.llabel { '.' } else { '<= `$i.llabel`' }
 | ||||
| 		// rpostfix := if srvalue == i.rlabel { '.' } else { '<= `$i.rlabel`' }
 | ||||
| 		if use_color { | ||||
| 			slvalue = term.bold(term.yellow(slvalue)) | ||||
| 			srvalue = term.bold(term.yellow(srvalue)) | ||||
| 		} | ||||
| 		eprintln('	 left value: $slvalue') | ||||
| 		eprintln('	right value: $srvalue') | ||||
| 	filepath := if use_relative_paths { i.fpath } else { os.real_path(i.fpath) } | ||||
| 	final_filepath := if use_color { | ||||
| 		term.gray(filepath + ':${i.line_nr+1}') | ||||
| 	} else { | ||||
| 		filepath + ':${i.line_nr+1}' | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| fn cb_assertion_ok(i &VAssertMetaInfo) { | ||||
| 	// do nothing for now on an OK assertion
 | ||||
| 	// println('OK ${(i.line_nr+1):5d}|${i.src}')
 | ||||
| 	mut final_funcname := i.fn_name.replace('main.', '').replace('__', '.') | ||||
| 	if use_color { | ||||
| 		final_funcname = term.green('✓ ' + final_funcname) | ||||
| 	} | ||||
| 	println('$final_funcname ($final_filepath)') | ||||
| 	*/ | ||||
| } | ||||
|  |  | |||
|  | @ -41,7 +41,7 @@ fn main() { | |||
| 	} | ||||
| 	testing.header('Testing...') | ||||
| 	ts.test() | ||||
| 	println(ts.benchmark.total_message('running V _test.v files')) | ||||
| 	println(ts.benchmark.total_message('Ran all V _test.v files')) | ||||
| 	if ts.failed { | ||||
| 		exit(1) | ||||
| 	} | ||||
|  |  | |||
|  | @ -189,20 +189,20 @@ pub fn (b &Benchmark) step_message_skip(msg string) string { | |||
| 
 | ||||
| // total_message returns a string with total summary of the benchmark run.
 | ||||
| pub fn (b &Benchmark) total_message(msg string) string { | ||||
| 	mut tmsg := '$msg\n                 ok, fail, skip, total = ' + term.ok_message('${b.nok:5d}') + | ||||
| 		', ' + if b.nfail > 0 { term.red('${b.nfail:5d}') } else { '${b.nfail:5d}' } + ', ' + if b.nskip > | ||||
| 		0 { term.bright_yellow('${b.nskip:5d}') } else { '${b.nskip:5d}' } + ', ' + '${b.ntotal:5d}' | ||||
| 	if b.verbose { | ||||
| 		tmsg = '<=== total time spent $tmsg' | ||||
| 	mut tmsg := '${term.bold('Summary:')} ' | ||||
| 	if b.nfail > 0 { | ||||
| 		tmsg += term.bold(term.red('$b.nfail failed')) + ', ' | ||||
| 	} | ||||
| 	mut spaces := '    ' | ||||
| 	if b.nexpected_steps > 1 { | ||||
| 		// NB: the formula below accounts for the progress bar [step/total]
 | ||||
| 		str_steps := '$b.nexpected_steps' | ||||
| 		x := 4 + str_steps.len * 2 + 5 | ||||
| 		spaces = ' '.repeat(x) | ||||
| 	if b.nok > 0 { | ||||
| 		tmsg += term.bold(term.green('$b.nok passed')) + ', ' | ||||
| 	} | ||||
| 	return spaces + b.tdiff_in_ms(tmsg, b.bench_timer.elapsed().microseconds()) | ||||
| 	if b.nskip > 0 { | ||||
| 		tmsg += term.bold(term.yellow('$b.nskip skipped')) + ', ' | ||||
| 	} | ||||
| 	tmsg += '$b.ntotal total. ${term.bold('Runtime:')} ${b.bench_timer.elapsed().microseconds() / | ||||
| 		1000} ms.\n' | ||||
| 	tmsg += term.gray(msg) | ||||
| 	return tmsg | ||||
| } | ||||
| 
 | ||||
| // total_duration returns the duration in ms.
 | ||||
|  |  | |||
|  | @ -30,7 +30,8 @@ pub fn can_show_color_on_stderr() bool { | |||
| // If colors are not allowed, returns a given string.
 | ||||
| pub fn ok_message(s string) string { | ||||
| 	return if can_show_color_on_stdout() { | ||||
| 		green(s) | ||||
| 		msg := ' $s ' | ||||
| 		green(msg) | ||||
| 	} else { | ||||
| 		s | ||||
| 	} | ||||
|  | @ -40,7 +41,8 @@ pub fn ok_message(s string) string { | |||
| // If colors are not allowed, returns a given string.
 | ||||
| pub fn fail_message(s string) string { | ||||
| 	return if can_show_color_on_stdout() { | ||||
| 		bold(bg_red(white(s))) | ||||
| 		msg := ' $s ' | ||||
| 		inverse(bg_white(bold(red(msg)))) | ||||
| 	} else { | ||||
| 		s | ||||
| 	} | ||||
|  | @ -50,7 +52,7 @@ pub fn fail_message(s string) string { | |||
| // If colors are not allowed, returns a given string.
 | ||||
| pub fn warn_message(s string) string { | ||||
| 	return if can_show_color_on_stdout() { | ||||
| 		bright_yellow(s) | ||||
| 		bright_yellow(' $s ') | ||||
| 	} else { | ||||
| 		s | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue