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
« 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# --------------------------------------------------------------------------------------------------
10import pytest
12from hdl_registers.field.enumeration import Enumeration, EnumerationElement
15def test_enumeration_element():
16 enumeration_element = EnumerationElement(name="apa", value=3, description="hest")
18 assert enumeration_element.name == "apa"
19 assert enumeration_element.value == 3
20 assert enumeration_element.description == "hest"
22 assert repr(enumeration_element) == "EnumerationElement(_name=apa,_value=3,description=hest,)"
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 )
40 assert enumeration.name == "apa"
41 assert enumeration.base_index == 3
42 assert enumeration.description == "hest"
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}"
49 assert enumeration.width == 3
51 assert enumeration.default_value is enumeration.elements[2]
52 assert enumeration.default_value_uint == 2
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.'
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 )
76 assert enumeration.get_element_by_name("element0") is enumeration.elements[0]
77 assert enumeration.get_element_by_name("element1") is enumeration.elements[1]
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 )
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 )
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 )
106 assert enumeration.get_element_by_value(0) is enumeration.elements[0]
107 assert enumeration.get_element_by_value(1) is enumeration.elements[1]
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 )
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 )
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]
137 enumeration.set_default_value("element1")
138 assert enumeration.default_value is enumeration.elements[1]
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".'
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".'
170def test_get_value():
171 base_index = 3
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 )
185 assert enumeration.width == 2
187 # Ones outside of this field. Should be masked out when getting value.
188 register_base_value = 0b111_00_111
190 register_value = register_base_value
191 assert enumeration.get_value(register_value=register_value) is enumeration.elements[0]
193 register_value = register_base_value + (1 << base_index)
194 assert enumeration.get_value(register_value=register_value) is enumeration.elements[1]
196 register_value = register_base_value + (2 << base_index)
197 assert enumeration.get_value(register_value=register_value) is enumeration.elements[2]
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 )
208def test_set_value():
209 base_index = 4
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 )
223 assert enumeration.width == 2
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
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 )