diff --git a/vunit/vhdl/run/src/run.vhd b/vunit/vhdl/run/src/run.vhd index 4763e737a..7d7504a94 100644 --- a/vunit/vhdl/run/src/run.vhd +++ b/vunit/vhdl/run/src/run.vhd @@ -87,6 +87,8 @@ package body run_pkg is end if; end loop; end if; + set_num_of_run_test_cases(runner_state, 0); + exit_gate(runner); set_phase(runner_state, test_suite_setup); notify(runner); @@ -234,7 +236,7 @@ package body run_pkg is if get_test_suite_completed(runner_state) then set_running_test_case(runner_state, ""); return false; - elsif get_run_all(runner_state) then + elsif get_run_all(runner_state) or get_test_case_name(runner_state, get_active_test_case_index(runner_state)) = name then if not has_run(name) then register_run(name); info(runner_trace_logger, "Test case: " & name); @@ -243,14 +245,10 @@ package body run_pkg is end if; set_running_test_case(runner_state, name); return true; + elsif get_test_case_name(runner_state, get_active_test_case_index(runner_state)) = name then + error(runner_trace_logger, "Test case: " & name & " cannot be run more than once."); + return false; end if; - elsif get_test_case_name(runner_state, get_active_test_case_index(runner_state)) = name then - info(runner_trace_logger, "Test case: " & name); - if has_active_python_runner(runner_state) then - core_pkg.test_start(name); - end if; - set_running_test_case(runner_state, name); - return true; end if; set_running_test_case(runner_state, ""); diff --git a/vunit/vhdl/run/src/runner_pkg.vhd b/vunit/vhdl/run/src/runner_pkg.vhd index 7455622ed..3ddb1d6c6 100644 --- a/vunit/vhdl/run/src/runner_pkg.vhd +++ b/vunit/vhdl/run/src/runner_pkg.vhd @@ -84,6 +84,8 @@ package runner_pkg is procedure inc_num_of_run_test_cases(runner : runner_t); + procedure set_num_of_run_test_cases(runner : runner_t; new_value : integer); + procedure set_has_run_since_last_loop_check(runner : runner_t); procedure clear_has_run_since_last_loop_check(runner : runner_t); @@ -425,6 +427,11 @@ package body runner_pkg is set(runner.p_data, n_run_test_cases_idx, get_num_of_run_test_cases(runner) + 1); end; + procedure set_num_of_run_test_cases(runner : runner_t; new_value : integer) is + begin + set(runner.p_data, n_run_test_cases_idx, new_value); + end; + procedure set_has_run_since_last_loop_check(runner : runner_t) is begin set(runner.p_data, has_run_since_last_loop_check_idx, to_integer(true)); diff --git a/vunit/vhdl/run/test/run_tests.vhd b/vunit/vhdl/run/test/run_tests.vhd index 61b3038fb..39bb9cc4b 100644 --- a/vunit/vhdl/run/test/run_tests.vhd +++ b/vunit/vhdl/run/test/run_tests.vhd @@ -467,6 +467,26 @@ begin test_case_cleanup; + --------------------------------------------------------------------------- + banner("Should prevent from running a test from enabled_test_case more than once."); + test_case_setup; + test_runner_setup(runner, "enabled_test_cases : Should one"); + while test_suite loop + for i in 0 to 2 loop + case i is + when 0 => + check(c, run("Should one"), "Expected ""Should one"" to run."); + when others => + mock(runner_trace_logger); + check_false(c, run("Should one"), "Didn't expected ""Should one"" to run."); + check_log(runner_trace_logger, "Test case: Should one cannot be run more than once.", error); + unmock(runner_trace_logger); + end case; + end loop; + end loop; + + test_case_cleanup; + --------------------------------------------------------------------------- --banner("Should be possible to exit a test case or test suite with an error message that can be caught afterwards."); --test_case_setup;