kopia lustrzana https://github.com/Hamlib/Hamlib
93 wiersze
3.0 KiB
Python
Executable File
93 wiersze
3.0 KiB
Python
Executable File
#! /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)
|