Coverage for hdl_registers/test/test_register_array.py: 100%

71 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2024-09-07 20:51 +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 

10# Third party libraries 

11import pytest 

12 

13# First party libraries 

14from hdl_registers.register_array import RegisterArray 

15from hdl_registers.register_modes import REGISTER_MODES 

16 

17 

18def test_registers_are_appended_properly_and_can_be_edited_in_place(): 

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

20 

21 register_hest = register_array.append_register( 

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

23 ) 

24 assert register_hest.index == 0 

25 

26 register_zebra = register_array.append_register( 

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

28 ) 

29 assert register_zebra.index == 1 

30 

31 register_hest.description = "new desc" 

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

33 

34 

35def test_get_register(): 

36 register_array = RegisterArray(name="apa", base_index=0, length=3, description="") 

37 hest = register_array.append_register(name="hest", mode=REGISTER_MODES["w"], description="") 

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

39 

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

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

42 

43 with pytest.raises(ValueError) as exception_info: 

44 assert register_array.get_register("non existing") is None 

45 assert ( 

46 str(exception_info.value) 

47 == 'Could not find register "non existing" within register array "apa"' 

48 ) 

49 

50 

51def test_repr_basic(): 

52 # Check that repr is an actual representation, not just "X object at 0xABCDEF" 

53 assert "apa" in repr(RegisterArray(name="apa", base_index=0, length=4, description="")) 

54 

55 # Different name 

56 assert repr(RegisterArray(name="apa", base_index=0, length=4, description="")) != repr( 

57 RegisterArray(name="hest", base_index=0, length=4, description="") 

58 ) 

59 

60 # Different base_index 

61 assert repr(RegisterArray(name="apa", base_index=0, length=4, description="")) != repr( 

62 RegisterArray(name="apa", base_index=8, length=4, description="") 

63 ) 

64 

65 # Different length 

66 assert repr(RegisterArray(name="apa", base_index=0, length=4, description="")) != repr( 

67 RegisterArray(name="apa", base_index=0, length=8, description="") 

68 ) 

69 

70 # Different description 

71 assert repr(RegisterArray(name="apa", base_index=0, length=4, description="hest")) != repr( 

72 RegisterArray(name="apa", base_index=0, length=4, description="zebra") 

73 ) 

74 

75 

76def test_repr_with_registers_appended(): 

77 register_array_a = RegisterArray(name="apa", base_index=0, length=4, description="") 

78 register_array_a.append_register(name="hest", mode=REGISTER_MODES["r"], description="") 

79 

80 register_array_b = RegisterArray(name="apa", base_index=0, length=4, description="") 

81 register_array_b.append_register(name="hest", mode=REGISTER_MODES["r"], description="") 

82 

83 assert repr(register_array_a) == repr(register_array_b) 

84 

85 register_array_a.append_register(name="zebra", mode=REGISTER_MODES["w"], description="") 

86 register_array_b.append_register(name="zebra", mode=REGISTER_MODES["r_w"], description="") 

87 

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

89 

90 

91def test_invalid_length_should_raise_exception(): 

92 with pytest.raises(ValueError) as exception_info: 

93 RegisterArray(name="apa", base_index=0, length=0, description="") 

94 assert ( 

95 str(exception_info.value) == 'Register array "apa" length must be greater than 0. Got "0".' 

96 ) 

97 

98 

99def test_index(): 

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

101 register_array.append_register(name="hest", mode=REGISTER_MODES["r"], description="") 

102 assert register_array.index == 3 

103 

104 register_array.length = 5 

105 assert register_array.index == 4 

106 

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

108 assert register_array.index == 9 

109 

110 

111def test_index_for_array_without_registers_should_raise_exception(): 

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

113 

114 with pytest.raises(ValueError) as exception_info: 

115 print(register_array.index) 

116 assert str(exception_info.value) == 'Register array "apa" must contain at least one register.' 

117 

118 

119def test_start_index(): 

120 register_array = RegisterArray(name="apa", base_index=10, length=4, description="") 

121 register_array.append_register(name="hest", mode=REGISTER_MODES["r"], description="") 

122 assert register_array.get_start_index(0) == 10 

123 assert register_array.get_start_index(1) == 11 

124 assert register_array.get_start_index(2) == 12 

125 

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

127 assert register_array.get_start_index(0) == 10 

128 assert register_array.get_start_index(1) == 12 

129 assert register_array.get_start_index(2) == 14 

130 

131 

132def test_start_index_with_argument_outside_of_length_should_raise_exception(): 

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

134 register_array.append_register(name="hest", mode=REGISTER_MODES["r"], description="") 

135 

136 with pytest.raises(ValueError) as exception_info: 

137 register_array.get_start_index(4) 

138 assert str(exception_info.value) == 'Index 4 out of range for register array "apa" of length 4.' 

139 

140 with pytest.raises(ValueError) as exception_info: 

141 register_array.get_start_index(-1) 

142 assert ( 

143 str(exception_info.value) == 'Index -1 out of range for register array "apa" of length 4.' 

144 )