Files
Uni-Lab-OS/test/ros/msgs/test_mapping.py
Junhan Chang c78ac482d8 Initial commit
2025-04-17 15:19:47 +08:00

121 lines
3.2 KiB
Python

"""
映射测试
测试消息类型映射和字段映射功能。
"""
import unittest
from dataclasses import dataclass
from unilabos.ros.msgs.message_converter import (
_msg_mapping,
_action_mapping,
_msg_converter,
_msg_converter_back,
compare_model_fields,
Point,
Point3D,
Float64,
String,
set_msg_data,
)
@dataclass
class TestMappingModel:
"""用于测试映射的数据类"""
id: str
name: str
value: float
@dataclass
class TestPointModel:
"""用于测试字段比较的点模型"""
x: float
y: float
z: float
class TestTypeMapping(unittest.TestCase):
"""测试类型映射"""
def test_msg_mapping(self):
"""测试消息类型映射"""
self.assertIn(float, _msg_mapping)
self.assertEqual(_msg_mapping[float], Float64)
self.assertIn(str, _msg_mapping)
self.assertEqual(_msg_mapping[str], String)
self.assertIn(Point3D, _msg_mapping)
self.assertEqual(_msg_mapping[Point3D], Point)
def test_action_mapping(self):
"""测试动作类型映射"""
self.assertIn(float, _action_mapping)
self.assertIn("type", _action_mapping[float])
self.assertIn("goal", _action_mapping[float])
self.assertIn("feedback", _action_mapping[float])
self.assertIn("result", _action_mapping[float])
def test_converter_mapping(self):
"""测试转换器映射"""
# 测试Python到ROS映射
self.assertIn(float, _msg_converter)
self.assertIn(Float64, _msg_converter)
self.assertIn(String, _msg_converter)
self.assertIn(Point, _msg_converter)
# 测试ROS到Python映射
self.assertIn(float, _msg_converter_back)
self.assertIn(Float64, _msg_converter_back)
self.assertIn(String, _msg_converter_back)
self.assertIn(Point, _msg_converter_back)
class TestFieldMapping(unittest.TestCase):
"""测试字段映射"""
def test_compare_model_fields(self):
"""测试模型字段比较"""
# Point3D和TestPointModel有相同的字段
self.assertTrue(compare_model_fields(Point3D, TestPointModel))
# 与其他类型比较
self.assertFalse(compare_model_fields(Point3D, TestMappingModel))
self.assertFalse(compare_model_fields(Point3D, float))
# 类型对象和实例对象比较
point = Point3D(x=1.0, y=2.0, z=3.0)
self.assertTrue(compare_model_fields(Point3D, type(point)))
def test_set_msg_data(self):
"""测试设置消息数据类型"""
# 测试float转换
float_value = "3.14"
self.assertEqual(set_msg_data("float", float_value), 3.14)
self.assertEqual(set_msg_data("double", float_value), 3.14)
# 测试int转换
int_value = "42"
self.assertEqual(set_msg_data("int", int_value), 42)
# 测试bool转换
bool_value = "True"
self.assertEqual(set_msg_data("bool", bool_value), True)
# 测试str转换
str_value = "hello"
self.assertEqual(set_msg_data("str", str_value), "hello")
# 测试默认转换
default_value = 123
self.assertEqual(set_msg_data("unknown_type", default_value), "123")
if __name__ == "__main__":
unittest.main()