Coverage for hdl_registers/parser/test/test_json.py: 100%

42 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 

11from tsfpga.system_utils import create_file 

12 

13from hdl_registers.parser.json import from_json 

14from hdl_registers.register import Register 

15from hdl_registers.register_modes import REGISTER_MODES 

16 

17 

18def test_load_nonexistent_json_file_should_raise_exception(tmp_path): 

19 json_path = tmp_path / "apa.json" 

20 with pytest.raises(FileNotFoundError) as exception_info: 

21 from_json(name="", json_file=json_path) 

22 assert str(exception_info.value) == f"Requested JSON file does not exist: {json_path}" 

23 

24 

25def test_load_dirty_json_file_should_raise_exception(tmp_path): 

26 json = """ 

27{ 

28 "config": { 

29 "mode": "r_w" 

30 } 

31} 

32""" 

33 json_path = create_file(tmp_path / "apa.json", json) 

34 from_json(name="", json_file=json_path) 

35 

36 json_path = create_file(tmp_path / "hest.json", json + "garbage") 

37 with pytest.raises(ValueError) as exception_info: 

38 from_json(name="", json_file=json_path) 

39 assert str(exception_info.value).startswith( 

40 f"Error while parsing JSON file {json_path}:\nExtra data: " 

41 ) 

42 

43 

44def test_default_registers(tmp_path): 

45 json_path = create_file( 

46 file=tmp_path / "regs.json", 

47 contents=""" 

48{ 

49 "apa": { 

50 "mode": "r_w", 

51 "description": "Apa.", 

52 "enable": { 

53 "type": "bit", 

54 "description": "Enable.", 

55 "default_value": "1" 

56 } 

57 }, 

58 "hest": { 

59 "mode": "r", 

60 "description": "Hest.", 

61 "disable": { 

62 "type": "bit", 

63 "description": "Disable." 

64 } 

65 } 

66} 

67""", 

68 ) 

69 register_list = from_json( 

70 name="", 

71 json_file=json_path, 

72 default_registers=[ 

73 Register(name="config", index=0, mode=REGISTER_MODES["r_w"], description=""), 

74 Register(name="status", index=1, mode=REGISTER_MODES["r"], description=""), 

75 ], 

76 ) 

77 

78 # Default registers. 

79 assert register_list.get_register("config").index == 0 

80 assert register_list.get_register("status").index == 1 

81 

82 # json registers. 

83 assert register_list.get_register("apa").index == 2 

84 assert register_list.get_register("apa").mode == REGISTER_MODES["r_w"] 

85 assert register_list.get_register("apa").description == "Apa." 

86 assert len(register_list.get_register("apa").fields) == 1 

87 assert register_list.get_register("apa").fields[0].name == "enable" 

88 assert register_list.get_register("apa").fields[0].description == "Enable." 

89 assert register_list.get_register("apa").fields[0].default_value == "1" 

90 

91 assert register_list.get_register("hest").index == 3 

92 assert register_list.get_register("hest").mode == REGISTER_MODES["r"] 

93 assert register_list.get_register("hest").description == "Hest." 

94 assert len(register_list.get_register("hest").fields) == 1 

95 assert register_list.get_register("hest").fields[0].name == "disable" 

96 assert register_list.get_register("hest").fields[0].description == "Disable." 

97 assert register_list.get_register("hest").fields[0].default_value == "0" 

98 

99 

100def test_two_registers_with_same_name_does_not_raise_exception(tmp_path): 

101 # Limitation in the JSON file format, unlike TOML. 

102 # We would highly prefer if this raised exception. 

103 json_path = create_file( 

104 file=tmp_path / "regs.json", 

105 contents=""" 

106{ 

107 "apa": { 

108 "mode": "r" 

109 }, 

110 "apa": { 

111 "mode": "r_w" 

112 } 

113} 

114""", 

115 ) 

116 

117 register_list = from_json(name="", json_file=json_path) 

118 assert len(register_list.register_objects) == 1 

119 assert register_list.register_objects[0].mode == REGISTER_MODES["r_w"]