kopia lustrzana https://github.com/Hamlib/Hamlib
Add a Python script to autogenerate some tests for pytest
rodzic
f2aaed6e09
commit
464450384d
|
@ -22,6 +22,7 @@ SWGDEP = \
|
||||||
|
|
||||||
EXTRA_DIST = $(SWGFILES) \
|
EXTRA_DIST = $(SWGFILES) \
|
||||||
Makefile.PL perltest.pl tcltest.tcl.in \
|
Makefile.PL perltest.pl tcltest.tcl.in \
|
||||||
|
python/generate_tests.py \
|
||||||
python/test_startup.py \
|
python/test_startup.py \
|
||||||
luatest.lua README.python
|
luatest.lua README.python
|
||||||
|
|
||||||
|
@ -108,6 +109,10 @@ all-py: $(pyexec_ltlib)
|
||||||
|
|
||||||
check-py: all-py pytest-${enable_pytest}
|
check-py: all-py pytest-${enable_pytest}
|
||||||
|
|
||||||
|
generate-pytests: all-py
|
||||||
|
$(AM_V_at)PYTHONPATH=$(builddir):$(builddir)/.libs \
|
||||||
|
$(PYTHON) "$(srcdir)/python/generate_tests.py" "$(srcdir)/python/"
|
||||||
|
|
||||||
pytest-yes:
|
pytest-yes:
|
||||||
$(AM_V_at)PYTHONPATH=$(builddir):$(builddir)/.libs \
|
$(AM_V_at)PYTHONPATH=$(builddir):$(builddir)/.libs \
|
||||||
$(PYTEST) --capture=no $(srcdir)/
|
$(PYTEST) --capture=no $(srcdir)/
|
||||||
|
|
|
@ -0,0 +1,92 @@
|
||||||
|
#! /bin/env python
|
||||||
|
"""
|
||||||
|
Creates tests for the Python bindings for Hamlib
|
||||||
|
|
||||||
|
Running this script directly will use the installed bindings.
|
||||||
|
For an in-tree run use "make check", or set PYTHONPATH to point to
|
||||||
|
the directories containing Hamlib.py and _Hamlib.so.
|
||||||
|
"""
|
||||||
|
import inspect
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import Hamlib
|
||||||
|
|
||||||
|
# This class gets copied to the generated file with replacements
|
||||||
|
class TestClass:
|
||||||
|
"""A pytest class for {object_name}"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setup_class(cls):
|
||||||
|
"""Common initialization before calling test methods"""
|
||||||
|
cls.actual_callables, cls.actual_properties = cls.generate_data({object_name})
|
||||||
|
|
||||||
|
def test_callables(self):
|
||||||
|
"""Check that nothing was added or removed"""
|
||||||
|
expected_callables = {expected_callables}
|
||||||
|
assert expected_callables == self.actual_callables
|
||||||
|
|
||||||
|
def test_properties(self):
|
||||||
|
"""Check that nothing was added or removed"""
|
||||||
|
expected_properties = {expected_properties}
|
||||||
|
assert expected_properties == self.actual_properties
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def generate_data(cls, the_object):
|
||||||
|
"""Extract callables and properties from the given object"""
|
||||||
|
callables = []
|
||||||
|
properties = []
|
||||||
|
for method_or_property in dir(the_object):
|
||||||
|
if not method_or_property.startswith("_"):
|
||||||
|
if callable(getattr(the_object, method_or_property)):
|
||||||
|
callables.append(method_or_property)
|
||||||
|
else:
|
||||||
|
properties.append(method_or_property)
|
||||||
|
|
||||||
|
return callables, properties
|
||||||
|
|
||||||
|
|
||||||
|
def generate_file(object_name, callables, properties):
|
||||||
|
"""Create a complete file for pytest"""
|
||||||
|
|
||||||
|
file_header = '''#! /bin/env pytest
|
||||||
|
"""
|
||||||
|
Tests of the Python bindings for Hamlib
|
||||||
|
|
||||||
|
DO NOT EDIT this autogenerated file, run "make generate-pytests" instead
|
||||||
|
"""
|
||||||
|
import Hamlib
|
||||||
|
'''
|
||||||
|
filename = f"test_{object_name.replace(".", "_")}_class.py"
|
||||||
|
class_source = inspect.getsource(TestClass)
|
||||||
|
expected_callables = repr(callables)
|
||||||
|
expected_properties = repr(properties)
|
||||||
|
|
||||||
|
print(f"Generating {filename}")
|
||||||
|
with open(filename, "w", encoding='utf-8') as output_file:
|
||||||
|
print(file_header, file=output_file)
|
||||||
|
print(class_source.format(
|
||||||
|
object_name=object_name,
|
||||||
|
expected_callables=expected_callables,
|
||||||
|
expected_properties=expected_properties),
|
||||||
|
file=output_file, end='')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) == 2 and not sys.argv[1].startswith("-"):
|
||||||
|
os.chdir(sys.argv[1])
|
||||||
|
else:
|
||||||
|
print("Usage: {sys.argv[0]} [OUTPUT_DIRECTORY]", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
for the_object in (
|
||||||
|
Hamlib,
|
||||||
|
Hamlib.Amp,
|
||||||
|
Hamlib.Rig,
|
||||||
|
Hamlib.Rot,
|
||||||
|
):
|
||||||
|
try:
|
||||||
|
full_name = f"{the_object.__module__}.{the_object.__name__}"
|
||||||
|
except AttributeError:
|
||||||
|
full_name = the_object.__name__
|
||||||
|
expected_callables, expected_properties = TestClass.generate_data(the_object)
|
||||||
|
generate_file(full_name, expected_callables, expected_properties)
|
Ładowanie…
Reference in New Issue