It's sometimes useful to have a batch of tests to be run in a variety of different scenarios. In particular it's sometimes useful to reuse those tests for scenarios that aren't known at the time of writing the tests. Introduce the 'test_output' decorator. This creates a number of tests by feeding the output of the decorated function (representing the scenario setup) into all of the listed tests. Signed-off-by: David Gibson <david(a)gibson.dropbear.id.au> --- .../avocado_classless/test.py | 13 ++++++++ test/avocado_classless/examples.py | 31 ++++++++++++++++++- test/avocado_classless/selftests.py | 15 ++++++++- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/test/avocado_classless/avocado_classless/test.py b/test/avocado_classless/avocado_classless/test.py index 0602f9c9..e5251960 100644 --- a/test/avocado_classless/avocado_classless/test.py +++ b/test/avocado_classless/avocado_classless/test.py @@ -19,6 +19,19 @@ def test(func): manifest_add(func.__module__, func.__name__, func) return func + +def test_output(*tests): + """Decorate a function to test its output with a list of other functions""" + def dec(func): + for testfn in tests: + manifest_add(func.__module__, + f"{testfn.__name__}∘{func.__name__}", + lambda testfn=testfn: testfn(func())) + + return func + return dec + + # # Assertion helpers without unnecessary OOP nonsense # diff --git a/test/avocado_classless/examples.py b/test/avocado_classless/examples.py index a4856124..a0e883f3 100644 --- a/test/avocado_classless/examples.py +++ b/test/avocado_classless/examples.py @@ -8,7 +8,7 @@ are expected to fail. import sys -from avocado_classless.test import test +from avocado_classless.test import test, test_output @test @@ -20,3 +20,32 @@ def trivial_pass(): def trivial_fail(): print("Fails, trivially", file=sys.stderr) assert False + + +# Some test_output checks +def is_integer(val): + assert isinstance(val, int) + + +def is_positive(val): + assert val > 0 + + +@test_output(is_integer, is_positive) +def positive_integer(): + return 17 + + +@test_output(is_integer, is_positive) +def negative_integer(): + return -17 + + +@test_output(is_integer, is_positive) +def positive_fraction(): + return 3.5 + + +@test_output(is_integer, is_positive) +def negative_fraction(): + return -3.5 diff --git a/test/avocado_classless/selftests.py b/test/avocado_classless/selftests.py index 12a4a5a2..6b6d40ff 100644 --- a/test/avocado_classless/selftests.py +++ b/test/avocado_classless/selftests.py @@ -8,7 +8,7 @@ import types from avocado_classless.manifest import manifest_add from avocado_classless.test import ( - assert_eq, assert_eq_unordered, assert_in, assert_raises, test + assert_eq, assert_eq_unordered, assert_in, assert_raises, test, test_output ) @@ -61,3 +61,16 @@ def test_double_register(): manifest_add(mod, "test", trivial) manifest_add(mod, "test", assert_true) assert_raises(ValueError, double_register) + + +def is_int(val): + assert isinstance(val, int) + + +def is_positive(val): + assert val > 0 + + +@test_output(is_int, is_positive) +def seventeen(): + return 17 -- 2.41.0