Skip to content

Commit 6558a92

Browse files
committed
Add support for specific test configuration. Closes #22.
1 parent 7bf04fa commit 6558a92

11 files changed

Lines changed: 739 additions & 349 deletions

File tree

examples/generate_tests/run.py

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ def post_check(output_path):
2525
This function recives the output_path of the test
2626
"""
2727

28-
expected = ", ".join(["hello world",
29-
str(data_width),
28+
expected = ", ".join([str(data_width),
3029
str(sign).lower()]) + "\n"
3130

3231
output_file = join(output_path, "generics.txt")
@@ -42,21 +41,21 @@ def post_check(output_path):
4241
return post_check
4342

4443

45-
def generate_data_width_and_sign_tests(entity):
44+
def generate_tests(obj, signs, data_widths):
4645
"""
47-
Generate test for entity by varying the data_width and sign generics
46+
Generate test by varying the data_width and sign generics
4847
"""
4948

50-
for sign, data_width in product([False, True], range(1, 5)):
49+
for sign, data_width in product(signs, data_widths):
5150
# This configuration name is added as a suffix to the test bench name
5251
config_name = "data_width=%i,sign=%s" % (data_width, sign)
5352

5453
# Add the configuration with a post check function to verify the output
55-
entity.add_config(name=config_name,
56-
generics=dict(
57-
data_width=data_width,
58-
sign=sign),
59-
post_check=make_post_check(data_width, sign))
54+
obj.add_config(name=config_name,
55+
generics=dict(
56+
data_width=data_width,
57+
sign=sign),
58+
post_check=make_post_check(data_width, sign))
6059

6160

6261
test_path = join(dirname(__file__), "test")
@@ -68,7 +67,17 @@ def generate_data_width_and_sign_tests(entity):
6867
tb_generated = lib.entity("tb_generated")
6968

7069
# Just set a generic for a given test bench
71-
tb_generated.set_generic("message", "hello world")
72-
generate_data_width_and_sign_tests(tb_generated)
70+
tb_generated.set_generic("message", "set-for-entity")
71+
72+
# Run all tests with signed/unsigned and data width in range [1,5[
73+
generate_tests(tb_generated, [False, True], range(1, 5))
74+
75+
# Test 2 should only be run with signed width of 16
76+
test_2 = tb_generated.test("Test 2")
77+
generate_tests(test_2, [True], [16])
78+
79+
# Just set a generic for a given test
80+
test_2.set_generic("message", "set-for-test")
81+
7382

7483
ui.main()

examples/generate_tests/test/tb_generated.vhd

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,26 @@ end entity;
2121
architecture a of tb_generated is
2222
begin
2323
main : process
24-
file fwrite : text;
25-
variable l : line;
24+
procedure dump_generics is
25+
file fwrite : text;
26+
variable l : line;
27+
begin
28+
file_open(fwrite, output_path & "/" & "generics.txt", write_mode);
29+
write(l, to_string(data_width) & ", " & to_string(sign));
30+
writeline(fwrite, l);
31+
file_close(fwrite);
32+
end procedure;
2633
begin
2734
test_runner_setup(runner, runner_cfg);
28-
file_open(fwrite, output_path & "/" & "generics.txt", write_mode);
29-
write(l, message & ", " & to_string(data_width) & ", " & to_string(sign));
30-
writeline(fwrite, l);
31-
file_close(fwrite);
35+
while test_suite loop
36+
if run("Test 1") then
37+
assert message = "set-for-entity";
38+
dump_generics;
39+
elsif run("Test 2") then
40+
assert message = "set-for-test";
41+
dump_generics;
42+
end if;
43+
end loop;
3244
test_runner_cleanup(runner);
3345
wait;
3446
end process;

vunit/test/acceptance/artificial/run.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,33 @@
1818
ui = VUnit.from_argv()
1919
lib = ui.add_library("lib")
2020
lib.add_source_files(join(root, "vhdl", "*.vhd"))
21+
22+
23+
def configure_tb_with_generic_config(ui):
24+
"""
25+
Configure tb_with_generic_config test bench
26+
"""
27+
bench = lib.entity("tb_with_generic_config")
28+
tests = [bench.test("Test %i" % i) for i in range(5)]
29+
30+
bench.set_generic("set_generic", "set-for-entity")
31+
32+
tests[1].add_config("", generics=dict(config_generic="set-from-config"))
33+
34+
tests[2].set_generic("set_generic", "set-for-test")
35+
36+
tests[3].add_config("", generics=dict(set_generic="set-for-test",
37+
config_generic="set-from-config"))
38+
39+
def post_check(output_path):
40+
with open(join(output_path, "post_check.txt"), "r") as fptr:
41+
return fptr.read() == "Test 4 was here"
42+
43+
tests[4].add_config("",
44+
generics=dict(set_generic="set-from-config",
45+
config_generic="set-from-config"),
46+
post_check=post_check)
47+
48+
configure_tb_with_generic_config(ui)
49+
2150
ui.main()
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
-- This Source Code Form is subject to the terms of the Mozilla Public
2+
-- License, v. 2.0. If a copy of the MPL was not distributed with this file,
3+
-- You can obtain one at http://mozilla.org/MPL/2.0/.
4+
--
5+
-- Copyright (c) 2015, Lars Asplund lars.anders.asplund@gmail.com
6+
7+
use std.textio.all;
8+
9+
library vunit_lib;
10+
context vunit_lib.vunit_context;
11+
12+
entity tb_with_generic_config is
13+
generic (
14+
runner_cfg : runner_cfg_t;
15+
output_path : string;
16+
set_generic : string := "default";
17+
config_generic : string := "default");
18+
end entity;
19+
20+
architecture tb of tb_with_generic_config is
21+
begin
22+
test_runner : process
23+
file fptr : text;
24+
begin
25+
test_runner_setup(runner, runner_cfg);
26+
27+
while test_suite loop
28+
if run("Test 0") then
29+
assert set_generic = "set-for-entity";
30+
assert config_generic = "default";
31+
32+
elsif run("Test 1") then
33+
assert set_generic = "set-for-entity";
34+
assert config_generic = "set-from-config";
35+
36+
elsif run("Test 2") then
37+
assert set_generic = "set-for-test";
38+
assert config_generic = "default";
39+
40+
elsif run("Test 3") then
41+
assert set_generic = "set-for-test";
42+
assert config_generic = "set-from-config";
43+
44+
elsif run("Test 4") then
45+
assert set_generic = "set-from-config";
46+
assert config_generic = "set-from-config";
47+
file_open(fptr, output_path & "post_check.txt", write_mode);
48+
write(fptr, string'("Test 4 was here"));
49+
file_close(fptr);
50+
end if;
51+
end loop;
52+
53+
test_runner_cleanup(runner);
54+
wait;
55+
end process;
56+
test_runner_watchdog(runner, 50 ns);
57+
end architecture;

vunit/test/acceptance/test_artificial.py

Lines changed: 47 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -41,33 +41,16 @@ def test_artificial_elaborate_only(self):
4141
self.check(self.artificial_run,
4242
exit_code=1,
4343
args=["--elaborate"])
44-
check_report(self.report_file, [
45-
("passed", "lib.tb_pass"),
46-
("passed", "lib.tb_fail"),
47-
("passed", "lib.tb_infinite_events"),
48-
("passed", "lib.tb_fail_on_warning"),
49-
("passed", "lib.tb_no_fail_on_warning"),
50-
("passed", "lib.tb_two_architectures.pass"),
51-
("passed", "lib.tb_two_architectures.fail"),
52-
("passed", "lib.tb_with_vhdl_runner.pass"),
53-
("passed", "lib.tb_with_vhdl_runner.Test with spaces"),
54-
("passed", "lib.tb_with_vhdl_runner.fail"),
55-
("passed", "lib.tb_with_vhdl_runner.Test that timeouts"),
56-
("passed", "lib.tb_magic_paths"),
57-
("passed", "lib.tb_no_fail_after_cleanup"),
58-
("failed", "lib.tb_elab_fail"),
59-
60-
("passed", "lib.tb_same_sim_all_pass.Test 1"),
61-
("passed", "lib.tb_same_sim_all_pass.Test 2"),
62-
("passed", "lib.tb_same_sim_all_pass.Test 3"),
63-
64-
("passed", "lib.tb_same_sim_some_fail.Test 1"),
65-
("passed", "lib.tb_same_sim_some_fail.Test 2"),
66-
("passed", "lib.tb_same_sim_some_fail.Test 3"),
67-
68-
("passed", "lib.tb_with_checks.Test passing check"),
69-
("passed", "lib.tb_with_checks.Test failing check"),
70-
("passed", "lib.tb_with_checks.Test non-stopping failing check")])
44+
45+
elab_expected_report = []
46+
for status, name in EXPECTED_REPORT:
47+
if name in ("lib.tb_elab_fail",):
48+
status = "failed"
49+
else:
50+
status = "passed"
51+
elab_expected_report.append((status, name))
52+
53+
check_report(self.report_file, elab_expected_report)
7154

7255
self.check(self.artificial_run,
7356
exit_code=0,
@@ -91,34 +74,7 @@ def _test_artificial(self, args=None):
9174
self.check(self.artificial_run,
9275
exit_code=1,
9376
args=args)
94-
check_report(self.report_file, [
95-
("passed", "lib.tb_pass"),
96-
("failed", "lib.tb_fail"),
97-
("passed", "lib.tb_infinite_events"),
98-
("failed", "lib.tb_fail_on_warning"),
99-
("passed", "lib.tb_no_fail_on_warning"),
100-
("passed", "lib.tb_two_architectures.pass"),
101-
("failed", "lib.tb_two_architectures.fail"),
102-
("passed", "lib.tb_with_vhdl_runner.pass"),
103-
("passed", "lib.tb_with_vhdl_runner.Test with spaces"),
104-
("failed", "lib.tb_with_vhdl_runner.fail"),
105-
("failed", "lib.tb_with_vhdl_runner.Test that timeouts"),
106-
("passed", "lib.tb_magic_paths"),
107-
("passed", "lib.tb_no_fail_after_cleanup"),
108-
("failed", "lib.tb_elab_fail"),
109-
110-
# @TODO verify that these are actually run in separate simulations
111-
("passed", "lib.tb_same_sim_all_pass.Test 1"),
112-
("passed", "lib.tb_same_sim_all_pass.Test 2"),
113-
("passed", "lib.tb_same_sim_all_pass.Test 3"),
114-
115-
("passed", "lib.tb_same_sim_some_fail.Test 1"),
116-
("failed", "lib.tb_same_sim_some_fail.Test 2"),
117-
("skipped", "lib.tb_same_sim_some_fail.Test 3"),
118-
119-
("passed", "lib.tb_with_checks.Test passing check"),
120-
("failed", "lib.tb_with_checks.Test failing check"),
121-
("failed", "lib.tb_with_checks.Test non-stopping failing check")])
77+
check_report(self.report_file, EXPECTED_REPORT)
12278

12379
def test_run_selected_tests_in_same_sim_test_bench(self):
12480
self.check(self.artificial_run,
@@ -181,3 +137,39 @@ def check(self, run_file, args=None, persistent_sim=True, clean=True, exit_code=
181137
"--xunit-xml=%s" % self.report_file] + args,
182138
env=new_env)
183139
self.assertEqual(retcode, exit_code)
140+
141+
142+
EXPECTED_REPORT = (
143+
("passed", "lib.tb_pass"),
144+
("failed", "lib.tb_fail"),
145+
("passed", "lib.tb_infinite_events"),
146+
("failed", "lib.tb_fail_on_warning"),
147+
("passed", "lib.tb_no_fail_on_warning"),
148+
("passed", "lib.tb_two_architectures.pass"),
149+
("failed", "lib.tb_two_architectures.fail"),
150+
("passed", "lib.tb_with_vhdl_runner.pass"),
151+
("passed", "lib.tb_with_vhdl_runner.Test with spaces"),
152+
("failed", "lib.tb_with_vhdl_runner.fail"),
153+
("failed", "lib.tb_with_vhdl_runner.Test that timeouts"),
154+
("passed", "lib.tb_magic_paths"),
155+
("passed", "lib.tb_no_fail_after_cleanup"),
156+
("failed", "lib.tb_elab_fail"),
157+
158+
# @TODO verify that these are actually run in separate simulations
159+
("passed", "lib.tb_same_sim_all_pass.Test 1"),
160+
("passed", "lib.tb_same_sim_all_pass.Test 2"),
161+
("passed", "lib.tb_same_sim_all_pass.Test 3"),
162+
163+
("passed", "lib.tb_same_sim_some_fail.Test 1"),
164+
("failed", "lib.tb_same_sim_some_fail.Test 2"),
165+
("skipped", "lib.tb_same_sim_some_fail.Test 3"),
166+
167+
("passed", "lib.tb_with_checks.Test passing check"),
168+
("failed", "lib.tb_with_checks.Test failing check"),
169+
("failed", "lib.tb_with_checks.Test non-stopping failing check"),
170+
171+
("passed", "lib.tb_with_generic_config.Test 0"),
172+
("passed", "lib.tb_with_generic_config.Test 1"),
173+
("passed", "lib.tb_with_generic_config.Test 2"),
174+
("passed", "lib.tb_with_generic_config.Test 3"),
175+
("passed", "lib.tb_with_generic_config.Test 4"))

vunit/test/acceptance/test_external_run_scripts.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ def test_check_example_project(self):
3939

4040
def test_generate_tests_example_project(self):
4141
self.check(join(ROOT, "examples", "generate_tests", "run.py"))
42+
check_report(self.report_file,
43+
[("passed", "lib.tb_generated.data_width=1,sign=False.Test 1"),
44+
("passed", "lib.tb_generated.data_width=1,sign=True.Test 1"),
45+
("passed", "lib.tb_generated.data_width=2,sign=False.Test 1"),
46+
("passed", "lib.tb_generated.data_width=2,sign=True.Test 1"),
47+
("passed", "lib.tb_generated.data_width=3,sign=False.Test 1"),
48+
("passed", "lib.tb_generated.data_width=3,sign=True.Test 1"),
49+
("passed", "lib.tb_generated.data_width=4,sign=False.Test 1"),
50+
("passed", "lib.tb_generated.data_width=4,sign=True.Test 1"),
51+
("passed", "lib.tb_generated.data_width=16,sign=True.Test 2")])
4252

4353
def test_array_example_project(self):
4454
self.check(join(ROOT, "examples", "array", "run.py"))

0 commit comments

Comments
 (0)