From 5400a765a498538d9664aa891c324ce1a35aeb97 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Wed, 2 Jun 2021 19:14:37 +0300 Subject: [PATCH] tests: make `fn test_fn() ? { return error(fail) }` count as a fail --- vlib/v/gen/c/cgen.v | 18 ++++++++++++------ vlib/v/gen/c/cmain.v | 10 ++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 6205c731a6..9ea7d53d4f 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -4869,8 +4869,17 @@ fn (mut g Gen) return_stmt(node ast.Return) { if fn_return_is_optional { optional_none := node.exprs[0] is ast.None ftyp := g.typ(node.types[0]) - mut is_regular_option := ftyp in ['Option2', 'Option'] + mut is_regular_option := ftyp == 'Option' if optional_none || is_regular_option || node.types[0] == ast.error_type_idx { + if !isnil(g.fn_decl) && g.fn_decl.is_test { + test_error_var := g.new_tmp_var() + g.write('$ret_typ $test_error_var = ') + g.gen_optional_error(g.fn_decl.return_type, node.exprs[0]) + g.writeln(';') + g.write_defer_stmts_when_needed() + g.gen_failing_return_error_for_test_fn(node, test_error_var) + return + } if use_tmp_var { g.write('$ret_typ $tmpvar = ') } else { @@ -4993,7 +5002,7 @@ fn (mut g Gen) return_stmt(node ast.Return) { node.types[0].has_flag(.optional) } } - if fn_return_is_optional && !expr_type_is_opt && return_sym.name !in ['Option2', 'Option'] { + if fn_return_is_optional && !expr_type_is_opt && return_sym.name != 'Option' { styp := g.base_type(g.fn_decl.return_type) g.writeln('$ret_typ $tmpvar;') g.write('opt_ok(&($styp[]) { ') @@ -5173,9 +5182,6 @@ fn (mut g Gen) const_decl_init_later(mod string, name string, expr ast.Expr, typ // Initialize more complex consts in `void _vinit/2{}` // (C doesn't allow init expressions that can't be resolved at compile time). mut styp := g.typ(typ) - if styp == 'Option2' { - styp = 'IError' - } cname := '_const_$name' g.definitions.writeln('$styp $cname; // inited later') if cname == '_const_os__args' { @@ -5587,7 +5593,7 @@ fn (mut g Gen) write_init_function() { } const ( - builtins = ['string', 'array', 'DenseArray', 'map', 'Error', 'IError', 'Option2', 'Option'] + builtins = ['string', 'array', 'DenseArray', 'map', 'Error', 'IError', 'Option'] ) fn (mut g Gen) write_builtin_types() { diff --git a/vlib/v/gen/c/cmain.v b/vlib/v/gen/c/cmain.v index bc093104d0..1ea32941c4 100644 --- a/vlib/v/gen/c/cmain.v +++ b/vlib/v/gen/c/cmain.v @@ -162,6 +162,16 @@ pub fn (mut g Gen) gen_failing_error_propagation_for_test_fn(or_block ast.OrExpr g.writeln('\tlongjmp(g_jump_buffer, 1);') } +pub fn (mut g Gen) gen_failing_return_error_for_test_fn(return_stmt ast.Return, cvar_name string) { + // in test_() functions, a `return error('something')` is sugar for + // `or { err := error('something') cb_propagate_test_error(@LINE, @FILE, @MOD, @FN, err.msg) return err }` + // and the test is considered failed + paline, pafile, pamod, pafn := g.panic_debug_info(return_stmt.pos) + g.writeln('\tmain__cb_propagate_test_error($paline, tos3("$pafile"), tos3("$pamod"), tos3("$pafn"), *(${cvar_name}.err.msg) );') + g.writeln('\tg_test_fails++;') + g.writeln('\tlongjmp(g_jump_buffer, 1);') +} + pub fn (mut g Gen) gen_c_main_for_tests() { main_fn_start_pos := g.out.len g.writeln('')