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

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.register_array import RegisterArray 

13from hdl_registers.register_modes import REGISTER_MODES 

14 

15 

16def test_registers_are_appended_properly_and_can_be_edited_in_place(): 

17 register_array = RegisterArray(name="apa", base_index=0, length=4, description="") 

18 

19 register_hest = register_array.append_register( 

20 name="hest", mode=REGISTER_MODES["r"], description="" 

21 ) 

22 assert register_hest.index == 0 

23 

24 register_zebra = register_array.append_register( 

25 name="zebra", mode=REGISTER_MODES["r"], description="" 

26 ) 

27 assert register_zebra.index == 1 

28 

29 register_hest.description = "new desc" 

30 assert register_array.registers[0].description == "new desc" 

31 

32 

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="") 

37 

38 assert register_array.get_register("hest") is hest 

39 assert register_array.get_register("zebra") is zebra 

40 

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 ) 

47 

48 

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="")) 

52 

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 ) 

57 

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 ) 

62 

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 ) 

67 

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 ) 

72 

73 

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="") 

77 

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="") 

80 

81 assert repr(register_array_a) == repr(register_array_b) 

82 

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="") 

85 

86 assert repr(register_array_a) != repr(register_array_b) 

87 

88 

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 ) 

95 

96 

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 

101 

102 register_array.length = 5 

103 assert register_array.index == 4 

104 

105 register_array.append_register(name="zebra", mode=REGISTER_MODES["r"], description="") 

106 assert register_array.index == 9 

107 

108 

109def test_index_for_array_without_registers_should_raise_exception(): 

110 register_array = RegisterArray(name="apa", base_index=0, length=4, description="") 

111 

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.' 

115 

116 

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 

123 

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 

128 

129 

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="") 

133 

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.' 

137 

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 )