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
---
.../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