Coverage for hdl_registers/field/test/test_enumeration.py: 100%

81 statements  

« prev     ^ index     » next       coverage.py v7.6.12, created at 2025-03-12 11:11 +0000

1# -------------------------------------------------------------------------------------------------- 

2# Copyright (c) Lukas Vik. All rights reserved. 

3# 

4# This file is part of the hdl-registers project, an HDL register generator fast enough to run 

5# in real time. 

6# https://hdl-registers.com 

7# https://github.com/hdl-registers/hdl-registers 

8# -------------------------------------------------------------------------------------------------- 

9 

10import pytest 

11 

12from hdl_registers.field.enumeration import Enumeration, EnumerationElement 

13 

14 

15def test_enumeration_element(): 

16 enumeration_element = EnumerationElement(name="apa", value=3, description="hest") 

17 

18 assert enumeration_element.name == "apa" 

19 assert enumeration_element.value == 3 

20 assert enumeration_element.description == "hest" 

21 

22 assert repr(enumeration_element) == "EnumerationElement(_name=apa,_value=3,description=hest,)" 

23 

24 

25def test_enumeration_basics(): 

26 enumeration = Enumeration( 

27 name="apa", 

28 base_index=3, 

29 description="hest", 

30 elements={ 

31 "element0": "desc0", 

32 "element1": "desc1", 

33 "element2": "desc2", 

34 "element3": "desc3", 

35 "element4": "desc4", 

36 }, 

37 default_value="element2", 

38 ) 

39 

40 assert enumeration.name == "apa" 

41 assert enumeration.base_index == 3 

42 assert enumeration.description == "hest" 

43 

44 for idx, element in enumerate(enumeration.elements): 

45 assert element.name == f"element{idx}" 

46 assert element.value == idx 

47 assert element.description == f"desc{idx}" 

48 

49 assert enumeration.width == 3 

50 

51 assert enumeration.default_value is enumeration.elements[2] 

52 assert enumeration.default_value_uint == 2 

53 

54 

55def test_no_elements_should_raise_exception(): 

56 with pytest.raises(ValueError) as exception_info: 

57 Enumeration( 

58 name="apa", 

59 base_index=3, 

60 description="", 

61 elements={}, 

62 default_value="element0", 

63 ) 

64 assert str(exception_info.value) == 'Enumeration "apa", must have at least one element.' 

65 

66 

67def test_get_element_by_name(): 

68 enumeration = Enumeration( 

69 name="apa", 

70 base_index=3, 

71 description="", 

72 elements={"element0": "", "element1": ""}, 

73 default_value="element0", 

74 ) 

75 

76 assert enumeration.get_element_by_name("element0") is enumeration.elements[0] 

77 assert enumeration.get_element_by_name("element1") is enumeration.elements[1] 

78 

79 

80def test_get_element_by_name_with_invalid_name_should_raise_exception(): 

81 enumeration = Enumeration( 

82 name="apa", 

83 base_index=3, 

84 description="", 

85 elements={"element0": ""}, 

86 default_value="element0", 

87 ) 

88 

89 with pytest.raises(ValueError) as exception_info: 

90 enumeration.get_element_by_name("element1") 

91 assert ( 

92 str(exception_info.value) 

93 == 'Enumeration "apa", requested element name does not exist. Got: "element1".' 

94 ) 

95 

96 

97def test_get_element_by_value(): 

98 enumeration = Enumeration( 

99 name="apa", 

100 base_index=3, 

101 description="", 

102 elements={"element0": "", "element1": ""}, 

103 default_value="element0", 

104 ) 

105 

106 assert enumeration.get_element_by_value(0) is enumeration.elements[0] 

107 assert enumeration.get_element_by_value(1) is enumeration.elements[1] 

108 

109 

110def test_get_element_by_value_with_invalid_value_should_raise_exception(): 

111 enumeration = Enumeration( 

112 name="apa", 

113 base_index=3, 

114 description="", 

115 elements={"element0": ""}, 

116 default_value="element0", 

117 ) 

118 

119 with pytest.raises(ValueError) as exception_info: 

120 enumeration.get_element_by_value(1) 

121 assert ( 

122 str(exception_info.value) 

123 == 'Enumeration "apa", requested element value does not exist. Got: "1".' 

124 ) 

125 

126 

127def test_setting_default_value(): 

128 enumeration = Enumeration( 

129 name="apa", 

130 base_index=3, 

131 description="", 

132 elements={"element0": "", "element1": ""}, 

133 default_value="element0", 

134 ) 

135 assert enumeration.default_value is enumeration.elements[0] 

136 

137 enumeration.set_default_value("element1") 

138 assert enumeration.default_value is enumeration.elements[1] 

139 

140 

141def test_setting_default_value_that_does_not_exist_should_raise_exception(): 

142 # Invalid value to constructor. 

143 with pytest.raises(ValueError) as exception_info: 

144 Enumeration( 

145 name="apa", 

146 base_index=3, 

147 description="", 

148 elements={"element0": ""}, 

149 default_value="element1", 

150 ) 

151 assert ( 

152 str(exception_info.value) 

153 ) == 'Enumeration "apa", requested element name does not exist. Got: "element1".' 

154 

155 # Valid value to constructor but then an invalid update of the value. 

156 enumeration = Enumeration( 

157 name="apa", 

158 base_index=3, 

159 description="", 

160 elements={"element0": ""}, 

161 default_value="element0", 

162 ) 

163 with pytest.raises(ValueError) as exception_info: 

164 enumeration.set_default_value("element1") 

165 assert ( 

166 str(exception_info.value) 

167 ) == 'Enumeration "apa", requested element name does not exist. Got: "element1".' 

168 

169 

170def test_get_value(): 

171 base_index = 3 

172 

173 enumeration = Enumeration( 

174 name="apa", 

175 base_index=base_index, 

176 description="", 

177 elements={ 

178 "element0": "", 

179 "element1": "", 

180 "element2": "", 

181 }, 

182 default_value="element0", 

183 ) 

184 

185 assert enumeration.width == 2 

186 

187 # Ones outside of this field. Should be masked out when getting value. 

188 register_base_value = 0b111_00_111 

189 

190 register_value = register_base_value 

191 assert enumeration.get_value(register_value=register_value) is enumeration.elements[0] 

192 

193 register_value = register_base_value + (1 << base_index) 

194 assert enumeration.get_value(register_value=register_value) is enumeration.elements[1] 

195 

196 register_value = register_base_value + (2 << base_index) 

197 assert enumeration.get_value(register_value=register_value) is enumeration.elements[2] 

198 

199 register_value = register_base_value + (3 << base_index) 

200 with pytest.raises(ValueError) as exception_info: 

201 enumeration.get_value(register_value=register_value) 

202 assert ( 

203 str(exception_info.value) 

204 == 'Enumeration "apa", requested element value does not exist. Got: "3".' 

205 ) 

206 

207 

208def test_set_value(): 

209 base_index = 4 

210 

211 enumeration = Enumeration( 

212 name="apa", 

213 base_index=base_index, 

214 description="", 

215 elements={ 

216 "element0": "", 

217 "element1": "", 

218 "element2": "", 

219 }, 

220 default_value="element0", 

221 ) 

222 

223 assert enumeration.width == 2 

224 

225 assert enumeration.set_value(field_value=enumeration.elements[0]) == 0 

226 assert enumeration.set_value(field_value=enumeration.elements[1]) == 1 << base_index 

227 assert enumeration.set_value(field_value=enumeration.elements[2]) == 2 << base_index 

228 

229 

230def test_repr(): 

231 enumeration = Enumeration( 

232 name="apa", 

233 base_index=3, 

234 description="hest", 

235 elements={"element0": "element0 description"}, 

236 default_value="element0", 

237 ) 

238 element = "EnumerationElement(_name=element0,_value=0,description=element0 description,)" 

239 assert repr(enumeration) == ( 

240 "Enumeration(name=apa,_base_index=3,description=hest," 

241 f"_elements=[{element}]," 

242 f"_default_value={element},)" 

243 )