Coverage for hdl_registers/parser/test/test_parser/test_parser_constant.py: 100%

51 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 

12from tsfpga.system_utils import create_file 

13 

14# First party libraries 

15from hdl_registers.constant.bit_vector_constant import UnsignedVectorConstant 

16from hdl_registers.constant.string_constant import StringConstant 

17from hdl_registers.parser.toml import from_toml 

18 

19 

20def test_constants_in_toml(tmp_path): 

21 # Test all supported data types 

22 toml_path = create_file( 

23 file=tmp_path / "regs.toml", 

24 contents=""" 

25[data_width] 

26 

27type = "constant" 

28value = 0xf 

29description = "the width" 

30 

31[apa] 

32 

33type = "constant" 

34value = 3.14 

35 

36[hest] 

37 

38type = "constant" 

39value = true 

40 

41[zebra] 

42 

43type = "constant" 

44value = "foo" 

45 

46[base_address_hex] 

47 

48type = "constant" 

49value = "0xFF01_2345" 

50data_type = "unsigned" 

51 

52[base_address_bin] 

53 

54type = "constant" 

55value = "0b1000_0011" 

56data_type = "unsigned" 

57""", 

58 ) 

59 

60 register_list = from_toml(name="", toml_file=toml_path) 

61 assert len(register_list.constants) == 6 

62 

63 assert register_list.constants[0].name == "data_width" 

64 assert register_list.constants[0].value == 15 

65 assert register_list.constants[0].description == "the width" 

66 

67 assert register_list.constants[1].name == "apa" 

68 assert register_list.constants[1].value == 3.14 

69 assert register_list.constants[1].description == "" 

70 

71 assert register_list.constants[2].name == "hest" 

72 assert register_list.constants[2].value is True 

73 

74 assert isinstance(register_list.constants[3], StringConstant) 

75 assert register_list.constants[3].name == "zebra" 

76 assert register_list.constants[3].value == "foo" 

77 

78 assert isinstance(register_list.constants[4], UnsignedVectorConstant) 

79 assert register_list.constants[4].name == "base_address_hex" 

80 assert register_list.constants[4].value == "FF01_2345" 

81 

82 assert isinstance(register_list.constants[5], UnsignedVectorConstant) 

83 assert register_list.constants[5].name == "base_address_bin" 

84 assert register_list.constants[5].value == "1000_0011" 

85 

86 

87def test_constant_without_value_should_raise_exception(tmp_path): 

88 toml_path = create_file( 

89 file=tmp_path / "regs.toml", 

90 contents=""" 

91[data_width] 

92 

93type = "constant" 

94description = "the width" 

95""", 

96 ) 

97 with pytest.raises(ValueError) as exception_info: 

98 from_toml(name="", toml_file=toml_path) 

99 assert str(exception_info.value) == ( 

100 f'Error while parsing constant "data_width" in {toml_path}: ' 

101 'Missing required property "value".' 

102 ) 

103 

104 

105def test_unknown_constant_property_should_raise_exception(tmp_path): 

106 toml_path = create_file( 

107 file=tmp_path / "regs.toml", 

108 contents=""" 

109[data_width] 

110 

111type = "constant" 

112value = 0xf 

113default_value = 0xf 

114""", 

115 ) 

116 

117 with pytest.raises(ValueError) as exception_info: 

118 from_toml(name="", toml_file=toml_path) 

119 assert str(exception_info.value) == ( 

120 f'Error while parsing constant "data_width" in {toml_path}: ' 

121 'Got unknown property "default_value".' 

122 ) 

123 

124 

125def test_unknown_constant_sub_item_should_raise_exception(tmp_path): 

126 toml_path = create_file( 

127 file=tmp_path / "regs.toml", 

128 contents=""" 

129[data_width] 

130 

131type = "constant" 

132value = 0xf 

133 

134default_value.value = 0x3 

135""", 

136 ) 

137 

138 with pytest.raises(ValueError) as exception_info: 

139 from_toml(name="", toml_file=toml_path) 

140 assert str(exception_info.value) == ( 

141 f'Error while parsing constant "data_width" in {toml_path}: ' 

142 'Got unknown property "default_value".' 

143 ) 

144 

145 

146def test_data_type_on_non_string_constant_should_raise_exception(tmp_path): 

147 toml_path = create_file( 

148 file=tmp_path / "regs.toml", 

149 contents=""" 

150[data_width] 

151 

152type = "constant" 

153value = 0xf 

154data_type = "unsigned" 

155""", 

156 ) 

157 

158 with pytest.raises(ValueError) as exception_info: 

159 from_toml(name="", toml_file=toml_path) 

160 assert str(exception_info.value) == ( 

161 f'Error while parsing constant "data_width" in {toml_path}: ' 

162 'May not set "data_type" for non-string constant.' 

163 ) 

164 

165 

166def test_invalid_string_constant_data_type_should_raise_exception(tmp_path): 

167 toml_path = create_file( 

168 file=tmp_path / "regs.toml", 

169 contents=""" 

170[data_width] 

171 

172type = "constant" 

173value = "0xff" 

174data_type = "signed" 

175""", 

176 ) 

177 

178 with pytest.raises(ValueError) as exception_info: 

179 from_toml(name="", toml_file=toml_path) 

180 assert str(exception_info.value) == ( 

181 f'Error while parsing constant "data_width" in {toml_path}: Invalid data type "signed".' 

182 )