上传初版SDK
This commit is contained in:
@@ -0,0 +1 @@
|
||||
"""测试包初始化"""
|
||||
@@ -0,0 +1,82 @@
|
||||
"""
|
||||
核心模块测试
|
||||
"""
|
||||
import pytest
|
||||
from src.core.base import Base, create_uuid, create_text_element
|
||||
from src.core.enums import Category, Encoding, CalibrationAccess
|
||||
|
||||
|
||||
class TestBase:
|
||||
"""Base 基类测试"""
|
||||
|
||||
def test_base_creation(self):
|
||||
"""测试基本创建"""
|
||||
base = Base(name="TestElement")
|
||||
assert base.name == "TestElement"
|
||||
assert base.id is None
|
||||
assert base.parent is None
|
||||
assert base.description is None
|
||||
|
||||
def test_base_with_parent(self):
|
||||
"""测试带父元素的创建"""
|
||||
parent = Base(name="Parent")
|
||||
child = Base(name="Child", parent=parent)
|
||||
assert child.parent == parent
|
||||
assert child.parent_id == parent.id
|
||||
|
||||
def test_package_path(self):
|
||||
"""测试包路径计算"""
|
||||
parent = Base(name="Parent")
|
||||
child = Base(name="Child", parent=parent)
|
||||
assert child.package_path == "/Parent/Child"
|
||||
|
||||
def test_package_path_deep(self):
|
||||
"""测试深层包路径"""
|
||||
level1 = Base(name="Level1")
|
||||
level2 = Base(name="Level2", parent=level1)
|
||||
level3 = Base(name="Level3", parent=level2)
|
||||
level4 = Base(name="Level4", parent=level3)
|
||||
assert level4.package_path == "/Level1/Level2/Level3/Level4"
|
||||
|
||||
|
||||
class TestUtilityFunctions:
|
||||
"""工具函数测试"""
|
||||
|
||||
def test_create_uuid(self):
|
||||
"""测试 UUID 生成"""
|
||||
uuid1 = create_uuid()
|
||||
uuid2 = create_uuid()
|
||||
assert uuid1 != uuid2
|
||||
assert len(uuid1) == 36
|
||||
|
||||
def test_create_text_element(self):
|
||||
"""测试文本元素创建"""
|
||||
import xml.dom.minidom as Dom
|
||||
|
||||
doc = Dom.Document()
|
||||
element = create_text_element(doc, "TEST_TAG", "test_value")
|
||||
|
||||
assert element.tagName == "TEST_TAG"
|
||||
assert element.firstChild.nodeValue == "test_value"
|
||||
|
||||
|
||||
class TestEnums:
|
||||
"""枚举类型测试"""
|
||||
|
||||
def test_category_enum(self):
|
||||
"""测试 Category 枚举"""
|
||||
assert Category.FIXED_LENGTH is not None
|
||||
assert Category.VALUE is not None
|
||||
assert Category.STRUCTURE is not None
|
||||
assert Category.ARRAY is not None
|
||||
|
||||
def test_calibration_access_enum(self):
|
||||
"""测试 CalibrationAccess 枚举"""
|
||||
assert CalibrationAccess.READ_ONLY is not None
|
||||
assert CalibrationAccess.READ_WRITE is not None
|
||||
assert CalibrationAccess.NOT_ACCESSIBLE is not None
|
||||
assert CalibrationAccess.NOT_SPECIFIED is not None
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pytest.main([__file__, "-v"])
|
||||
@@ -0,0 +1,136 @@
|
||||
"""
|
||||
集成测试 - 完整 ARXML 文件生成
|
||||
"""
|
||||
import pytest
|
||||
from xml.dom.minidom import Document
|
||||
from src import (
|
||||
create_base_type,
|
||||
create_unit,
|
||||
create_data_constraint,
|
||||
create_compu_method,
|
||||
create_linear,
|
||||
create_boolean_type,
|
||||
create_value_type,
|
||||
create_structure_type,
|
||||
create_impl_value_type,
|
||||
create_sender_receiver_interface,
|
||||
SenderReceiverInterface,
|
||||
ApplicationStructureDataType,
|
||||
Category,
|
||||
CalibrationAccess,
|
||||
)
|
||||
|
||||
|
||||
class TestARXMLGeneration:
|
||||
"""ARXML 生成测试"""
|
||||
|
||||
def test_full_type_chain(self):
|
||||
"""测试完整的类型链(应用类型 -> 实现类型 -> 基础类型)"""
|
||||
base_type = create_base_type("UInt8", size=8)
|
||||
assert base_type.name == "UInt8"
|
||||
|
||||
impl_type = create_impl_value_type("ImplUInt8", base_type=base_type)
|
||||
assert impl_type.name == "ImplUInt8"
|
||||
assert impl_type.base_type == base_type
|
||||
|
||||
app_type = create_value_type("AppUInt8")
|
||||
assert app_type.name == "AppUInt8"
|
||||
|
||||
doc = Document()
|
||||
base_element = base_type.to_arxml(doc)
|
||||
assert base_element.tagName == "SW-BASE-TYPE"
|
||||
|
||||
impl_element = impl_type.to_arxml(doc)
|
||||
assert impl_element.tagName == "IMPLEMENTATION-DATA-TYPE"
|
||||
|
||||
app_element = app_type.to_arxml(doc)
|
||||
assert app_element.tagName == "APPLICATION-PRIMITIVE-DATA-TYPE"
|
||||
|
||||
def test_unit_with_compu_method(self):
|
||||
"""测试单位与计算方法关联"""
|
||||
unit = create_unit("kmh", display="km/h")
|
||||
|
||||
linear = create_linear(factor=0.01, offset=0)
|
||||
compu = create_compu_method("SpeedConversion", unit=unit, linear=linear)
|
||||
assert compu.unit == unit
|
||||
assert compu.linear == linear
|
||||
|
||||
def test_complex_structure(self):
|
||||
"""测试复杂结构体"""
|
||||
member1 = ApplicationStructureDataType.StructureElement(name="temperature")
|
||||
member2 = ApplicationStructureDataType.StructureElement(name="humidity")
|
||||
|
||||
struct = create_structure_type("EnvironmentData", elements=[member1, member2])
|
||||
assert len(struct.structure_elements) == 2
|
||||
|
||||
doc = Document()
|
||||
element = struct.to_arxml(doc)
|
||||
assert element.tagName == "APPLICATION-RECORD-DATA-TYPE"
|
||||
|
||||
def test_interface_creation(self):
|
||||
"""测试接口创建"""
|
||||
data_element = SenderReceiverInterface.DataElement(name="SpeedData")
|
||||
interface = create_sender_receiver_interface(
|
||||
"SpeedInterface",
|
||||
data_element=data_element,
|
||||
is_service=False
|
||||
)
|
||||
|
||||
assert interface.name == "SpeedInterface"
|
||||
assert interface.data_element == data_element
|
||||
|
||||
doc = Document()
|
||||
element = interface.to_arxml(doc)
|
||||
assert element.tagName == "SENDER-RECEIVER-INTERFACE"
|
||||
|
||||
def test_data_constraint_chain(self):
|
||||
"""测试数据约束链"""
|
||||
unit = create_unit("percent", display="%")
|
||||
constraint = create_data_constraint(
|
||||
"PercentageRange",
|
||||
lower=0,
|
||||
upper=100,
|
||||
unit=unit
|
||||
)
|
||||
|
||||
assert constraint.unit == unit
|
||||
assert constraint.lower == 0
|
||||
assert constraint.upper == 100
|
||||
|
||||
doc = Document()
|
||||
element = constraint.to_arxml(doc)
|
||||
assert element.tagName == "DATA-CONSTR"
|
||||
|
||||
def test_package_creation(self):
|
||||
"""测试包创建"""
|
||||
from src import create_package, create_base_type
|
||||
|
||||
base_type = create_base_type("TestType")
|
||||
pkg = create_package("TestPackage", elements=[base_type])
|
||||
|
||||
assert pkg.name == "TestPackage"
|
||||
assert len(pkg.elements) == 1
|
||||
assert pkg.get_element("TestType") == base_type
|
||||
|
||||
def test_package_to_arxml(self):
|
||||
"""测试包 ARXML 转换"""
|
||||
from src import create_package, create_base_type
|
||||
|
||||
base_type = create_base_type("PackageType")
|
||||
pkg = create_package("MyPackage", elements=[base_type])
|
||||
|
||||
doc = Document()
|
||||
element = pkg.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "AR-PACKAGE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
short_name = element.getElementsByTagName("SHORT-NAME")[0]
|
||||
assert short_name.firstChild.nodeValue == "MyPackage"
|
||||
|
||||
elements = element.getElementsByTagName("ELEMENTS")
|
||||
assert len(elements) == 1
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pytest.main([__file__, "-v"])
|
||||
@@ -0,0 +1,294 @@
|
||||
"""
|
||||
SWC 组件和内部行为测试
|
||||
"""
|
||||
import pytest
|
||||
from xml.dom.minidom import Document
|
||||
|
||||
from src import (
|
||||
ApplicationSwComponentType,
|
||||
RPortPrototype,
|
||||
PPortPrototype,
|
||||
PRPortPrototype,
|
||||
SenderReceiverInterface,
|
||||
create_sender_receiver_interface,
|
||||
create_runnable_entity,
|
||||
create_timing_event,
|
||||
create_init_event,
|
||||
create_operation_invoked_event,
|
||||
create_data_received_event,
|
||||
create_swc_internal_behavior,
|
||||
SwcInternalBehavior,
|
||||
VariableAccess,
|
||||
)
|
||||
|
||||
|
||||
class TestRunnableEntity:
|
||||
"""RunnableEntity 测试"""
|
||||
|
||||
def test_create_runnable_entity(self):
|
||||
"""测试创建 Runnable 实体"""
|
||||
runnable = create_runnable_entity(
|
||||
name="Runnable_Init",
|
||||
minimum_start_interval=10,
|
||||
can_be_invoked_concurrently=False,
|
||||
symbol="Runnable_Init_Function"
|
||||
)
|
||||
assert runnable.name == "Runnable_Init"
|
||||
assert runnable.minimum_start_interval == 10
|
||||
assert runnable.can_be_invoked_concurrently is False
|
||||
assert runnable.symbol == "Runnable_Init_Function"
|
||||
|
||||
def test_runnable_entity_add_data_access(self):
|
||||
"""测试 Runnable 添加数据访问"""
|
||||
runnable = create_runnable_entity(name="TestRunnable")
|
||||
access = VariableAccess(name="DataAccess", port_prototype_ref="Port1")
|
||||
runnable.add_variable_access(access)
|
||||
|
||||
assert len(runnable.variable_accesses) == 1
|
||||
|
||||
def test_runnable_entity_to_arxml(self):
|
||||
"""测试 Runnable 实体 ARXML 转换"""
|
||||
runnable = create_runnable_entity(
|
||||
name="TestRunnable",
|
||||
symbol="TestRunnable_Func"
|
||||
)
|
||||
|
||||
doc = Document()
|
||||
element = runnable.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "RUNNABLE-ENTITY"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
short_name = element.getElementsByTagName("SHORT-NAME")[0]
|
||||
assert short_name.firstChild.nodeValue == "TestRunnable"
|
||||
|
||||
|
||||
class TestEvents:
|
||||
"""事件测试"""
|
||||
|
||||
def test_create_timing_event(self):
|
||||
"""测试创建定时事件"""
|
||||
event = create_timing_event("TimingEvent_10ms", period=0.01)
|
||||
assert event.name == "TimingEvent_10ms"
|
||||
assert event.period == 0.01
|
||||
|
||||
def test_timing_event_to_arxml(self):
|
||||
"""测试定时事件 ARXML 转换"""
|
||||
event = create_timing_event("PeriodicTask", period=0.05)
|
||||
|
||||
doc = Document()
|
||||
element = event.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "TIMING-EVENT"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
short_name = element.getElementsByTagName("SHORT-NAME")[0]
|
||||
assert short_name.firstChild.nodeValue == "PeriodicTask"
|
||||
|
||||
def test_create_init_event(self):
|
||||
"""测试创建初始化事件"""
|
||||
event = create_init_event("InitEvent")
|
||||
assert event.name == "InitEvent"
|
||||
|
||||
def test_init_event_to_arxml(self):
|
||||
"""测试初始化事件 ARXML 转换"""
|
||||
event = create_init_event("InitEvent")
|
||||
|
||||
doc = Document()
|
||||
element = event.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "INIT-EVENT"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
def test_create_operation_invoked_event(self):
|
||||
"""测试创建操作调用事件"""
|
||||
event = create_operation_invoked_event(
|
||||
"OpInvokeEvent",
|
||||
operation_ref="/Package/Interface/Operation"
|
||||
)
|
||||
assert event.name == "OpInvokeEvent"
|
||||
assert event.operation_ref == "/Package/Interface/Operation"
|
||||
|
||||
def test_operation_invoked_event_to_arxml(self):
|
||||
"""测试操作调用事件 ARXML 转换"""
|
||||
event = create_operation_invoked_event("OpInvokeEvent")
|
||||
|
||||
doc = Document()
|
||||
element = event.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "OPERATION-INVOKED-EVENT"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
def test_create_data_received_event(self):
|
||||
"""测试创建数据接收事件"""
|
||||
event = create_data_received_event(
|
||||
"DataReceived",
|
||||
data_element_ref="/Package/Interface/Port",
|
||||
period=0.02
|
||||
)
|
||||
assert event.name == "DataReceived"
|
||||
assert event.data_element_ref == "/Package/Interface/Port"
|
||||
assert event.period == 0.02
|
||||
|
||||
def test_data_received_event_to_arxml(self):
|
||||
"""测试数据接收事件 ARXML 转换"""
|
||||
event = create_data_received_event("DataReceived", period=0.01)
|
||||
|
||||
doc = Document()
|
||||
element = event.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "DATA-RECEIVED-EVENT"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
|
||||
class TestSwcInternalBehavior:
|
||||
"""SWC 内部行为测试"""
|
||||
|
||||
def test_create_swc_internal_behavior(self):
|
||||
"""测试创建 SWC 内部行为"""
|
||||
runnable = create_runnable_entity(name="MainRunnable")
|
||||
timing = create_timing_event("MainTiming", period=0.01)
|
||||
|
||||
behavior = create_swc_internal_behavior(
|
||||
name="ComponentBehavior",
|
||||
runnable_entities=[runnable],
|
||||
events=[timing],
|
||||
symbol="Component_Symbol"
|
||||
)
|
||||
assert behavior.name == "ComponentBehavior"
|
||||
assert len(behavior.runnable_entities) == 1
|
||||
assert len(behavior.events) == 1
|
||||
assert behavior.symbol == "Component_Symbol"
|
||||
|
||||
def test_swc_internal_behavior_add_runnable(self):
|
||||
"""测试 SWC 内部行为添加 Runnable"""
|
||||
behavior = create_swc_internal_behavior(name="Behavior")
|
||||
runnable = create_runnable_entity(name="NewRunnable")
|
||||
|
||||
behavior.add_runnable(runnable)
|
||||
assert behavior.get_runnable("NewRunnable") == runnable
|
||||
|
||||
def test_swc_internal_behavior_add_event(self):
|
||||
"""测试 SWC 内部行为添加事件"""
|
||||
behavior = create_swc_internal_behavior(name="Behavior")
|
||||
event = create_timing_event("NewTiming", period=0.02)
|
||||
|
||||
behavior.add_event(event)
|
||||
assert behavior.get_event("NewTiming") == event
|
||||
|
||||
def test_swc_internal_behavior_to_arxml(self):
|
||||
"""测试 SWC 内部行为 ARXML 转换"""
|
||||
runnable = create_runnable_entity(name="MainRunnable", symbol="MainRunnable_Func")
|
||||
timing = create_timing_event("Periodic", period=0.01)
|
||||
|
||||
behavior = create_swc_internal_behavior(
|
||||
name="ComponentBehavior",
|
||||
runnable_entities=[runnable],
|
||||
events=[timing]
|
||||
)
|
||||
|
||||
doc = Document()
|
||||
element = behavior.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "SWC-INTERNAL-BEHAVIOR"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
|
||||
class TestSwComponent:
|
||||
"""软件组件测试"""
|
||||
|
||||
def test_create_application_swc(self):
|
||||
"""测试创建应用组件"""
|
||||
swc = ApplicationSwComponentType(name="TestComponent")
|
||||
assert swc.name == "TestComponent"
|
||||
assert swc.atomic_type.value == "Application"
|
||||
|
||||
def test_application_swc_add_port(self):
|
||||
"""测试应用组件添加端口"""
|
||||
swc = ApplicationSwComponentType(name="TestComponent")
|
||||
|
||||
data_element = SenderReceiverInterface.DataElement(name="TestData")
|
||||
interface = create_sender_receiver_interface("TestInterface", data_element=data_element)
|
||||
port = PPortPrototype(name="TestPort", interface=interface)
|
||||
|
||||
swc.add_port(port)
|
||||
assert swc.get_port("TestPort") == port
|
||||
|
||||
def test_application_swc_to_arxml(self):
|
||||
"""测试应用组件 ARXML 转换"""
|
||||
swc = ApplicationSwComponentType(name="TestComponent")
|
||||
|
||||
doc = Document()
|
||||
element = swc.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "APPLICATION-SW-COMPONENT-TYPE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
short_name = element.getElementsByTagName("SHORT-NAME")[0]
|
||||
assert short_name.firstChild.nodeValue == "TestComponent"
|
||||
|
||||
def test_application_swc_with_ports_to_arxml(self):
|
||||
"""测试带端口的应用组件 ARXML 转换"""
|
||||
swc = ApplicationSwComponentType(name="ComponentWithPorts")
|
||||
|
||||
data_element = SenderReceiverInterface.DataElement(name="StatusData")
|
||||
interface = create_sender_receiver_interface("StatusInterface", data_element=data_element)
|
||||
port = PPortPrototype(name="StatusPort", interface=interface)
|
||||
swc.add_port(port)
|
||||
|
||||
doc = Document()
|
||||
element = swc.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "APPLICATION-SW-COMPONENT-TYPE"
|
||||
ports = element.getElementsByTagName("PORTS")
|
||||
assert len(ports) == 1
|
||||
|
||||
|
||||
class TestPortPrototypes:
|
||||
"""端口原型测试"""
|
||||
|
||||
def test_r_port_prototype_to_arxml(self):
|
||||
"""测试 R-Port ARXML 转换"""
|
||||
data_element = SenderReceiverInterface.DataElement(name="RxData")
|
||||
interface = create_sender_receiver_interface("RxInterface", data_element=data_element)
|
||||
port = RPortPrototype(name="RPort1", interface=interface)
|
||||
|
||||
doc = Document()
|
||||
element = port.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "R-PORT-PROTOTYPE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
short_name = element.getElementsByTagName("SHORT-NAME")[0]
|
||||
assert short_name.firstChild.nodeValue == "RPort1"
|
||||
|
||||
def test_p_port_prototype_to_arxml(self):
|
||||
"""测试 P-Port ARXML 转换"""
|
||||
data_element = SenderReceiverInterface.DataElement(name="TxData")
|
||||
interface = create_sender_receiver_interface("TxInterface", data_element=data_element)
|
||||
port = PPortPrototype(name="PPort1", interface=interface)
|
||||
|
||||
doc = Document()
|
||||
element = port.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "P-PORT-PROTOTYPE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
short_name = element.getElementsByTagName("SHORT-NAME")[0]
|
||||
assert short_name.firstChild.nodeValue == "PPort1"
|
||||
|
||||
def test_pr_port_prototype_to_arxml(self):
|
||||
"""测试 PR-Port ARXML 转换"""
|
||||
data_element = SenderReceiverInterface.DataElement(name="BidirectionalData")
|
||||
interface = create_sender_receiver_interface("BiInterface", data_element=data_element)
|
||||
port = PRPortPrototype(name="PRPort1", interface=interface)
|
||||
|
||||
doc = Document()
|
||||
element = port.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "P-PORT-PROTOTYPE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pytest.main([__file__, "-v"])
|
||||
@@ -0,0 +1,423 @@
|
||||
"""
|
||||
数据类型测试
|
||||
"""
|
||||
import pytest
|
||||
from xml.dom.minidom import Document
|
||||
|
||||
from src import (
|
||||
BaseType,
|
||||
create_base_type,
|
||||
Unit,
|
||||
create_unit,
|
||||
Category,
|
||||
Encoding,
|
||||
)
|
||||
from src.core.base import create_uuid, create_text_element
|
||||
|
||||
|
||||
class TestBaseType:
|
||||
"""BaseType 测试"""
|
||||
|
||||
def test_create_base_type(self):
|
||||
"""测试创建基础类型"""
|
||||
base_type = create_base_type("UInt8", size=8)
|
||||
assert base_type.name == "UInt8"
|
||||
assert base_type.size == 8
|
||||
assert base_type.category == Category.FIXED_LENGTH
|
||||
|
||||
def test_base_type_encoding(self):
|
||||
"""测试编码属性"""
|
||||
base_type = create_base_type(
|
||||
"SInt8",
|
||||
encoding=Encoding.TWO_COMPONENT
|
||||
)
|
||||
assert base_type.encoding_value == "2C"
|
||||
|
||||
def test_base_type_to_arxml(self):
|
||||
"""测试 ARXML 转换"""
|
||||
base_type = create_base_type("UInt16", size=16)
|
||||
doc = Document()
|
||||
element = base_type.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "SW-BASE-TYPE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
short_name = element.getElementsByTagName("SHORT-NAME")[0]
|
||||
assert short_name.firstChild.nodeValue == "UInt16"
|
||||
|
||||
|
||||
class TestUnit:
|
||||
"""Unit 测试"""
|
||||
|
||||
def test_create_unit(self):
|
||||
"""测试创建单位"""
|
||||
unit = create_unit("kmh", display="km/h", factor=1, offset=0)
|
||||
assert unit.name == "kmh"
|
||||
assert unit.display == "km/h"
|
||||
assert unit.factor == 1
|
||||
assert unit.offset == 0
|
||||
|
||||
def test_unit_to_arxml(self):
|
||||
"""测试单位 ARXML 转换"""
|
||||
unit = create_unit("m/s", display="meters per second")
|
||||
doc = Document()
|
||||
element = unit.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "UNIT"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
short_name = element.getElementsByTagName("SHORT-NAME")[0]
|
||||
assert short_name.firstChild.nodeValue == "m/s"
|
||||
|
||||
|
||||
class TestDataConstraint:
|
||||
"""DataConstraint 测试"""
|
||||
|
||||
def test_create_data_constraint(self):
|
||||
"""测试创建数据约束"""
|
||||
from src import create_data_constraint
|
||||
|
||||
constraint = create_data_constraint(
|
||||
"SpeedConstraint",
|
||||
lower=0,
|
||||
upper=250
|
||||
)
|
||||
assert constraint.name == "SpeedConstraint"
|
||||
assert constraint.lower == 0
|
||||
assert constraint.upper == 250
|
||||
|
||||
def test_data_constraint_to_arxml(self):
|
||||
"""测试数据约束 ARXML 转换"""
|
||||
from src import create_data_constraint
|
||||
|
||||
constraint = create_data_constraint(
|
||||
"RangeConstraint",
|
||||
lower=0,
|
||||
upper=100
|
||||
)
|
||||
doc = Document()
|
||||
element = constraint.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "DATA-CONSTR"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
|
||||
class TestCompuMethod:
|
||||
"""CompuMethod 测试"""
|
||||
|
||||
def test_create_compu_method(self):
|
||||
"""测试创建计算方法"""
|
||||
from src import create_compu_method, create_linear
|
||||
|
||||
linear = create_linear(factor=0.1, offset=10)
|
||||
compu = create_compu_method(
|
||||
"LinearConversion",
|
||||
linear=linear
|
||||
)
|
||||
assert compu.name == "LinearConversion"
|
||||
assert compu.linear == linear
|
||||
assert compu.category == Category.IDENTICAL
|
||||
|
||||
def test_compu_method_with_text_table(self):
|
||||
"""测试带文本表的计算方法"""
|
||||
from src import create_compu_method, create_text_table
|
||||
|
||||
text_table = create_text_table("OnOff", "ON", 0, 1)
|
||||
compu = create_compu_method(
|
||||
"OnOffTable",
|
||||
text_tables=[text_table]
|
||||
)
|
||||
assert len(compu.text_tables) == 1
|
||||
assert compu.get_text_table("ON") == text_table
|
||||
|
||||
def test_compu_method_to_arxml(self):
|
||||
"""测试计算方法 ARXML 转换"""
|
||||
from src import create_compu_method
|
||||
|
||||
compu = create_compu_method("TestMethod")
|
||||
doc = Document()
|
||||
element = compu.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "COMPU-METHOD"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
|
||||
class TestApplicationTypes:
|
||||
"""应用数据类型测试"""
|
||||
|
||||
def test_create_boolean_type(self):
|
||||
"""测试创建布尔类型"""
|
||||
from src import create_boolean_type
|
||||
|
||||
bool_type = create_boolean_type("BooleanSignal")
|
||||
assert bool_type.name == "BooleanSignal"
|
||||
assert bool_type.category == Category.BOOLEAN
|
||||
|
||||
def test_create_value_type(self):
|
||||
"""测试创建值类型"""
|
||||
from src import create_value_type
|
||||
|
||||
value_type = create_value_type("SpeedValue")
|
||||
assert value_type.name == "SpeedValue"
|
||||
assert value_type.category == Category.VALUE
|
||||
|
||||
def test_create_structure_type(self):
|
||||
"""测试创建结构体类型"""
|
||||
from src import create_structure_type, ApplicationStructureDataType
|
||||
|
||||
element = ApplicationStructureDataType.StructureElement(name="member1")
|
||||
struct_type = create_structure_type("MyStruct", elements=[element])
|
||||
assert struct_type.name == "MyStruct"
|
||||
assert len(struct_type.structure_elements) == 1
|
||||
assert struct_type.get_element("member1") == element
|
||||
|
||||
|
||||
class TestImplementationTypes:
|
||||
"""实现数据类型测试"""
|
||||
|
||||
def test_create_impl_value_type(self):
|
||||
"""测试创建实现值类型"""
|
||||
from src import create_impl_value_type, create_base_type
|
||||
|
||||
base = create_base_type("UInt8")
|
||||
impl_type = create_impl_value_type("ImplUInt8", base_type=base)
|
||||
assert impl_type.name == "ImplUInt8"
|
||||
assert impl_type.base_type == base
|
||||
assert impl_type.category == Category.VALUE
|
||||
|
||||
def test_create_impl_structure_type(self):
|
||||
"""测试创建实现结构体类型"""
|
||||
from src import create_impl_structure_type, ImplementationStructureDataType
|
||||
|
||||
element = ImplementationStructureDataType.StructureElement(name="field1")
|
||||
struct = create_impl_structure_type("ImplStruct", elements=[element])
|
||||
assert struct.name == "ImplStruct"
|
||||
assert len(struct.structure_elements) == 1
|
||||
|
||||
def test_impl_value_type_to_arxml(self):
|
||||
"""测试实现值类型 ARXML 转换"""
|
||||
from src import create_impl_value_type, create_base_type
|
||||
|
||||
base = create_base_type("UInt8")
|
||||
impl_type = create_impl_value_type("ImplUInt8", base_type=base)
|
||||
|
||||
doc = Document()
|
||||
element = impl_type.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "IMPLEMENTATION-DATA-TYPE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
short_name = element.getElementsByTagName("SHORT-NAME")[0]
|
||||
assert short_name.firstChild.nodeValue == "ImplUInt8"
|
||||
|
||||
def test_impl_structure_type_to_arxml(self):
|
||||
"""测试实现结构体类型 ARXML 转换"""
|
||||
from src import create_impl_structure_type, ImplementationStructureDataType
|
||||
|
||||
element = ImplementationStructureDataType.StructureElement(name="field1")
|
||||
struct = create_impl_structure_type("ImplStruct", elements=[element])
|
||||
|
||||
doc = Document()
|
||||
element = struct.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "IMPLEMENTATION-DATA-TYPE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
|
||||
class TestLinear:
|
||||
"""Linear 转换测试"""
|
||||
|
||||
def test_linear_to_arxml(self):
|
||||
"""测试线性转换 ARXML 转换"""
|
||||
from src import create_linear
|
||||
|
||||
linear = create_linear(factor=0.1, offset=10)
|
||||
|
||||
doc = Document()
|
||||
element = linear.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "COMPU-SCALE"
|
||||
assert element.hasChildNodes()
|
||||
|
||||
|
||||
class TestTextTable:
|
||||
"""TextTable 文本表测试"""
|
||||
|
||||
def test_create_text_table(self):
|
||||
"""测试创建文本表"""
|
||||
from src import create_text_table
|
||||
|
||||
text_table = create_text_table("OnOff", "ON", 0, 1)
|
||||
assert text_table.name == "OnOff"
|
||||
assert text_table.vt == "ON"
|
||||
assert text_table.lower == 0
|
||||
assert text_table.upper == 1
|
||||
|
||||
def test_text_table_to_arxml(self):
|
||||
"""测试文本表 ARXML 转换"""
|
||||
from src import create_text_table
|
||||
|
||||
text_table = create_text_table("Status", "ACTIVE", 1, 2)
|
||||
|
||||
doc = Document()
|
||||
element = text_table.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "COMPU-SCALE"
|
||||
assert element.hasChildNodes()
|
||||
|
||||
vt_elem = element.getElementsByTagName("VT")
|
||||
assert len(vt_elem) > 0
|
||||
|
||||
|
||||
class TestInterfaces:
|
||||
"""接口测试"""
|
||||
|
||||
def test_client_server_interface_creation(self):
|
||||
"""测试创建客户端-服务端接口"""
|
||||
from src import ClientServerInterface
|
||||
|
||||
cs_interface = ClientServerInterface(name="TestService")
|
||||
assert cs_interface.name == "TestService"
|
||||
assert cs_interface.is_service is False
|
||||
|
||||
operation = ClientServerInterface.Operation(name="StartOperation")
|
||||
cs_interface.add_operation(operation)
|
||||
assert cs_interface.get_operation("StartOperation") == operation
|
||||
|
||||
def test_client_server_interface_to_arxml(self):
|
||||
"""测试客户端-服务端接口 ARXML 转换"""
|
||||
from src import ClientServerInterface
|
||||
|
||||
cs_interface = ClientServerInterface(name="TestService")
|
||||
operation = ClientServerInterface.Operation(name="StartOperation")
|
||||
cs_interface.add_operation(operation)
|
||||
|
||||
doc = Document()
|
||||
element = cs_interface.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "CLIENT-SERVER-INTERFACE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
def test_client_server_operation_to_arxml(self):
|
||||
"""测试操作方法 ARXML 转换"""
|
||||
from src import ClientServerInterface
|
||||
|
||||
operation = ClientServerInterface.Operation(name="TestOp", is_server=True)
|
||||
|
||||
doc = Document()
|
||||
element = operation.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "CLIENT-SERVER-OPERATION"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
|
||||
class TestDataMapping:
|
||||
"""数据类型映射测试"""
|
||||
|
||||
def test_data_type_mapping_creation(self):
|
||||
"""测试创建数据类型映射"""
|
||||
from src import create_data_type_mapping
|
||||
|
||||
mapping = create_data_type_mapping("TestMapping")
|
||||
assert mapping.name == "TestMapping"
|
||||
|
||||
def test_data_type_mapping_to_arxml(self):
|
||||
"""测试数据类型映射 ARXML 转换"""
|
||||
from src import create_data_type_mapping
|
||||
|
||||
mapping = create_data_type_mapping("TestMapping")
|
||||
|
||||
doc = Document()
|
||||
element = mapping.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "DATA-TYPE-MAP"
|
||||
|
||||
def test_data_type_mapping_set_creation(self):
|
||||
"""测试创建数据类型映射集"""
|
||||
from src import create_data_type_mapping_set, create_data_type_mapping
|
||||
|
||||
mapping1 = create_data_type_mapping("Mapping1")
|
||||
mapping_set = create_data_type_mapping_set("TestSet", mappings=[mapping1])
|
||||
|
||||
assert mapping_set.name == "TestSet"
|
||||
assert len(mapping_set.data_type_mappings) == 1
|
||||
assert mapping_set.get_mapping("Mapping1") == mapping1
|
||||
|
||||
def test_data_type_mapping_set_to_arxml(self):
|
||||
"""测试数据类型映射集 ARXML 转换"""
|
||||
from src import create_data_type_mapping_set
|
||||
|
||||
mapping_set = create_data_type_mapping_set("TestSet")
|
||||
|
||||
doc = Document()
|
||||
element = mapping_set.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "DATA-TYPE-MAPPING-SET"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
|
||||
class TestApplicationTypesToArxml:
|
||||
"""应用数据类型 ARXML 测试"""
|
||||
|
||||
def test_value_type_to_arxml(self):
|
||||
"""测试应用值类型 ARXML 转换"""
|
||||
from src import create_value_type
|
||||
|
||||
value_type = create_value_type("SpeedValue")
|
||||
|
||||
doc = Document()
|
||||
element = value_type.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "APPLICATION-PRIMITIVE-DATA-TYPE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
short_name = element.getElementsByTagName("SHORT-NAME")[0]
|
||||
assert short_name.firstChild.nodeValue == "SpeedValue"
|
||||
|
||||
def test_boolean_type_to_arxml(self):
|
||||
"""测试布尔类型 ARXML 转换"""
|
||||
from src import create_boolean_type
|
||||
|
||||
bool_type = create_boolean_type("IsActive")
|
||||
|
||||
doc = Document()
|
||||
element = bool_type.to_arxml(doc)
|
||||
|
||||
assert element.tagName == "APPLICATION-PRIMITIVE-DATA-TYPE"
|
||||
assert element.hasAttribute("UUID")
|
||||
|
||||
def test_structure_type_to_arxml(self):
|
||||
"""测试应用结构体类型 ARXML 转换"""
|
||||
from src import create_structure_type, ApplicationStructureDataType
|
||||
|
||||
element = ApplicationStructureDataType.StructureElement(name="member1")
|
||||
struct = create_structure_type("MyStruct", elements=[element])
|
||||
|
||||
doc = Document()
|
||||
arxml_element = struct.to_arxml(doc)
|
||||
|
||||
assert arxml_element.tagName == "APPLICATION-RECORD-DATA-TYPE"
|
||||
assert arxml_element.hasAttribute("UUID")
|
||||
|
||||
def test_array_type_to_arxml(self):
|
||||
"""测试应用数组类型 ARXML 转换"""
|
||||
from src import create_array_type, create_value_type, ApplicationArrayDataType, Semantic
|
||||
|
||||
element_type = create_value_type("ArrayElement")
|
||||
array_element = ApplicationArrayDataType.ArrayElement(
|
||||
name="element",
|
||||
data_type=element_type,
|
||||
array_size_semantics=Semantic.FIXED,
|
||||
length=10
|
||||
)
|
||||
array_type = create_array_type("MyArray", element=array_element)
|
||||
|
||||
doc = Document()
|
||||
arxml_element = array_type.to_arxml(doc)
|
||||
|
||||
assert arxml_element.tagName == "APPLICATION-ARRAY-DATA-TYPE"
|
||||
assert arxml_element.hasAttribute("UUID")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
pytest.main([__file__, "-v"])
|
||||
Reference in New Issue
Block a user