Coverage for hdl_registers/test/test_register_array.py: 100%
71 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.register_array import RegisterArray
13from hdl_registers.register_modes import REGISTER_MODES
16def test_registers_are_appended_properly_and_can_be_edited_in_place():
17 register_array = RegisterArray(name="apa", base_index=0, length=4, description="")
19 register_hest = register_array.append_register(
20 name="hest", mode=REGISTER_MODES["r"], description=""
21 )
22 assert register_hest.index == 0
24 register_zebra = register_array.append_register(
25 name="zebra", mode=REGISTER_MODES["r"], description=""
26 )
27 assert register_zebra.index == 1
29 register_hest.description = "new desc"
30 assert register_array.registers[0].description == "new desc"
33def test_get_register():
34 register_array = RegisterArray(name="apa", base_index=0, length=3, description="")
35 hest = register_array.append_register(name="hest", mode=REGISTER_MODES["w"], description="")
36 zebra = register_array.append_register(name="zebra", mode=REGISTER_MODES["r"], description="")
38 assert register_array.get_register("hest") is hest
39 assert register_array.get_register("zebra") is zebra
41 with pytest.raises(ValueError) as exception_info:
42 assert register_array.get_register("non existing") is None
43 assert (
44 str(exception_info.value)
45 == 'Could not find register "non existing" within register array "apa"'
46 )
49def test_repr_basic():
50 # Check that repr is an actual representation, not just "X object at 0xABCDEF"
51 assert "apa" in repr(RegisterArray(name="apa", base_index=0, length=4, description=""))
53 # Different name
54 assert repr(RegisterArray(name="apa", base_index=0, length=4, description="")) != repr(
55 RegisterArray(name="hest", base_index=0, length=4, description="")
56 )
58 # Different base_index
59 assert repr(RegisterArray(name="apa", base_index=0, length=4, description="")) != repr(
60 RegisterArray(name="apa", base_index=8, length=4, description="")
61 )
63 # Different length
64 assert repr(RegisterArray(name="apa", base_index=0, length=4, description="")) != repr(
65 RegisterArray(name="apa", base_index=0, length=8, description="")
66 )
68 # Different description
69 assert repr(RegisterArray(name="apa", base_index=0, length=4, description="hest")) != repr(
70 RegisterArray(name="apa", base_index=0, length=4, description="zebra")
71 )
74def test_repr_with_registers_appended():
75 register_array_a = RegisterArray(name="apa", base_index=0, length=4, description="")
76 register_array_a.append_register(name="hest", mode=REGISTER_MODES["r"], description="")
78 register_array_b = RegisterArray(name="apa", base_index=0, length=4, description="")
79 register_array_b.append_register(name="hest", mode=REGISTER_MODES["r"], description="")
81 assert repr(register_array_a) == repr(register_array_b)
83 register_array_a.append_register(name="zebra", mode=REGISTER_MODES["w"], description="")
84 register_array_b.append_register(name="zebra", mode=REGISTER_MODES["r_w"], description="")
86 assert repr(register_array_a) != repr(register_array_b)
89def test_invalid_length_should_raise_exception():
90 with pytest.raises(ValueError) as exception_info:
91 RegisterArray(name="apa", base_index=0, length=0, description="")
92 assert (
93 str(exception_info.value) == 'Register array "apa" length must be greater than 0. Got "0".'
94 )
97def test_index():
98 register_array = RegisterArray(name="apa", base_index=0, length=4, description="")
99 register_array.append_register(name="hest", mode=REGISTER_MODES["r"], description="")
100 assert register_array.index == 3
102 register_array.length = 5
103 assert register_array.index == 4
105 register_array.append_register(name="zebra", mode=REGISTER_MODES["r"], description="")
106 assert register_array.index == 9
109def test_index_for_array_without_registers_should_raise_exception():
110 register_array = RegisterArray(name="apa", base_index=0, length=4, description="")
112 with pytest.raises(ValueError) as exception_info:
113 print(register_array.index)
114 assert str(exception_info.value) == 'Register array "apa" must contain at least one register.'
117def test_start_index():
118 register_array = RegisterArray(name="apa", base_index=10, length=4, description="")
119 register_array.append_register(name="hest", mode=REGISTER_MODES["r"], description="")
120 assert register_array.get_start_index(0) == 10
121 assert register_array.get_start_index(1) == 11
122 assert register_array.get_start_index(2) == 12
124 register_array.append_register(name="zebra", mode=REGISTER_MODES["r"], description="")
125 assert register_array.get_start_index(0) == 10
126 assert register_array.get_start_index(1) == 12
127 assert register_array.get_start_index(2) == 14
130def test_start_index_with_argument_outside_of_length_should_raise_exception():
131 register_array = RegisterArray(name="apa", base_index=0, length=4, description="")
132 register_array.append_register(name="hest", mode=REGISTER_MODES["r"], description="")
134 with pytest.raises(ValueError) as exception_info:
135 register_array.get_start_index(4)
136 assert str(exception_info.value) == 'Index 4 out of range for register array "apa" of length 4.'
138 with pytest.raises(ValueError) as exception_info:
139 register_array.get_start_index(-1)
140 assert (
141 str(exception_info.value) == 'Index -1 out of range for register array "apa" of length 4.'
142 )