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
« 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
11from tsfpga.system_utils import create_file
13from hdl_registers.parser.json import from_json
14from hdl_registers.register import Register
15from hdl_registers.register_modes import REGISTER_MODES
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}"
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)
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 )
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 )
78 # Default registers.
79 assert register_list.get_register("config").index == 0
80 assert register_list.get_register("status").index == 1
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"
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"
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 )
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"]