Coverage for /home/runner/work/zserio/zserio/compiler/extensions/python/runtime/tests/test_typeinfo.py: 100%

71 statements  

« prev     ^ index     » next       coverage.py v6.5.0, created at 2024-07-18 11:41 +0000

1import unittest 

2import enum 

3 

4from zserio.typeinfo import ( 

5 TypeInfo, 

6 RecursiveTypeInfo, 

7 MemberInfo, 

8 CaseInfo, 

9 ItemInfo, 

10 TypeAttribute, 

11 MemberAttribute, 

12) 

13 

14 

15class TypeInfoTest(unittest.TestCase): 

16 class DummyType: 

17 pass 

18 

19 class DummyEnum(enum.Enum): 

20 ONE = 1 

21 TWO = 2 

22 

23 class RecursiveType: 

24 @staticmethod 

25 def type_info(): 

26 return TypeInfo( 

27 "schema_name", 

28 TypeInfoTest.RecursiveType, 

29 attributes={ 

30 TypeAttribute.FIELDS: [ 

31 MemberInfo( 

32 "recursive", 

33 RecursiveTypeInfo(TypeInfoTest.RecursiveType.type_info), 

34 ), 

35 ] 

36 }, 

37 ) 

38 

39 def test_type_info(self): 

40 type_info_1 = TypeInfo("schema_name", TypeInfoTest.DummyType) 

41 self.assertEqual("schema_name", type_info_1.schema_name) 

42 self.assertEqual(TypeInfoTest.DummyType, type_info_1.py_type) 

43 self.assertEqual(0, len(type_info_1.attributes)) 

44 

45 type_info_2 = TypeInfo( 

46 "schema_name", 

47 TypeInfoTest.DummyType, 

48 attributes={ 

49 TypeAttribute.FIELDS: [ 

50 MemberInfo("member_1", type_info_1), 

51 MemberInfo( 

52 "member_2", 

53 type_info_1, 

54 attributes={ 

55 MemberAttribute.OPTIONAL: None, 

56 MemberAttribute.IS_USED_INDICATOR_NAME: "is_member_2_used", 

57 MemberAttribute.IS_SET_INDICATOR_NAME: "is_member_2_set", 

58 MemberAttribute.PROPERTY_NAME: "member_2_prop_name", 

59 }, 

60 ), 

61 ] 

62 }, 

63 ) 

64 

65 self.assertEqual("schema_name", type_info_2.schema_name) 

66 self.assertEqual(TypeInfoTest.DummyType, type_info_2.py_type) 

67 self.assertEqual(1, len(type_info_2.attributes)) 

68 self.assertIn(TypeAttribute.FIELDS, type_info_2.attributes) 

69 

70 fields = type_info_2.attributes[TypeAttribute.FIELDS] 

71 member_1 = fields[0] 

72 self.assertEqual("member_1", member_1.schema_name) 

73 self.assertEqual(type_info_1, member_1.type_info) 

74 self.assertEqual(0, len(member_1.attributes)) 

75 member_2 = fields[1] 

76 self.assertEqual("member_2", member_2.schema_name) 

77 self.assertEqual(type_info_1, member_2.type_info) 

78 self.assertEqual(4, len(member_2.attributes)) 

79 self.assertIn(MemberAttribute.OPTIONAL, member_2.attributes) 

80 self.assertIsNone(member_2.attributes[MemberAttribute.OPTIONAL]) 

81 self.assertIn(MemberAttribute.IS_USED_INDICATOR_NAME, member_2.attributes) 

82 self.assertEqual( 

83 "is_member_2_used", 

84 member_2.attributes[MemberAttribute.IS_USED_INDICATOR_NAME], 

85 ) 

86 self.assertIn(MemberAttribute.IS_SET_INDICATOR_NAME, member_2.attributes) 

87 self.assertEqual( 

88 "is_member_2_set", 

89 member_2.attributes[MemberAttribute.IS_SET_INDICATOR_NAME], 

90 ) 

91 self.assertIn(MemberAttribute.PROPERTY_NAME, member_2.attributes) 

92 self.assertEqual("member_2_prop_name", member_2.attributes[MemberAttribute.PROPERTY_NAME]) 

93 

94 def test_recursive_type_info(self): 

95 type_info = TypeInfoTest.RecursiveType.type_info() 

96 recursive_type_info = type_info.attributes[TypeAttribute.FIELDS][0].type_info 

97 

98 self.assertEqual(type_info.schema_name, recursive_type_info.schema_name) 

99 self.assertEqual(type_info.py_type, recursive_type_info.py_type) 

100 self.assertEqual( 

101 len(type_info.attributes[TypeAttribute.FIELDS]), 

102 len(recursive_type_info.attributes[TypeAttribute.FIELDS]), 

103 ) 

104 

105 def test_member_info(self): 

106 member_info = MemberInfo( 

107 "schema_name", 

108 TypeInfo("uint32", int), 

109 attributes={MemberAttribute.PROPERTY_NAME: "property_name"}, 

110 ) 

111 self.assertEqual("schema_name", member_info.schema_name) 

112 self.assertEqual("uint32", member_info.type_info.schema_name) 

113 self.assertEqual(int, member_info.type_info.py_type) 

114 self.assertEqual(1, len(member_info.attributes)) 

115 self.assertIn(MemberAttribute.PROPERTY_NAME, member_info.attributes) 

116 self.assertEqual("property_name", member_info.attributes[MemberAttribute.PROPERTY_NAME]) 

117 

118 member_info = MemberInfo( 

119 "schema_name", 

120 TypeInfo("uint32", int), 

121 attributes={MemberAttribute.ALIGN: "8"}, 

122 ) 

123 self.assertEqual(1, len(member_info.attributes)) 

124 self.assertEqual("8", member_info.attributes[MemberAttribute.ALIGN]) 

125 

126 def test_case_info(self): 

127 member_info = MemberInfo("schema_name", TypeInfo("uint32", int)) 

128 case_info = CaseInfo(["1", "2"], member_info) 

129 self.assertEqual(["1", "2"], case_info.case_expressions) 

130 self.assertEqual(member_info, case_info.field) 

131 

132 case_info = CaseInfo([], None) # default without field 

133 self.assertEqual(0, len(case_info.case_expressions)) 

134 self.assertIsNone(case_info.field) 

135 

136 def test_item_info(self): 

137 item_info = ItemInfo("one", TypeInfoTest.DummyEnum.ONE, False, False) 

138 self.assertEqual("one", item_info.schema_name) 

139 self.assertEqual(TypeInfoTest.DummyEnum.ONE, item_info.py_item) 

140 self.assertEqual(False, item_info.is_deprecated) 

141 self.assertEqual(False, item_info.is_removed)