Coverage for hdl_registers/parser/test/test_yaml.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.yaml import from_yaml 

14from hdl_registers.register import Register 

15from hdl_registers.register_modes import REGISTER_MODES 

16 

17 

18def test_load_nonexistent_yaml_file_should_raise_exception(tmp_path): 

19 yaml_path = tmp_path / "apa.yaml" 

20 with pytest.raises(FileNotFoundError) as exception_info: 

21 from_yaml(name="", yaml_file=yaml_path) 

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

23 

24 

25def test_load_dirty_yaml_file_should_raise_exception(tmp_path): 

26 yaml = """ 

27apa: 

28 mode: r_w 

29""" 

30 yaml_path = create_file(tmp_path / "apa.yaml", yaml) 

31 from_yaml(name="", yaml_file=yaml_path) 

32 

33 yaml_path = create_file(tmp_path / "hest.yaml", yaml + "garbage") 

34 with pytest.raises(ValueError) as exception_info: 

35 from_yaml(name="", yaml_file=yaml_path) 

36 assert str(exception_info.value).startswith( 

37 f"Error while parsing YAML file {yaml_path}:\nwhile scanning a simple key\n" 

38 ) 

39 

40 

41def test_default_registers(tmp_path): 

42 yaml_path = create_file( 

43 file=tmp_path / "regs.yaml", 

44 contents=""" 

45apa: 

46 mode: r_w 

47 description: Apa. 

48 enable: 

49 type: bit 

50 default_value: '1' 

51 description: Enable. 

52 

53hest: 

54 mode: r 

55 description: Hest. 

56 disable: 

57 type: bit 

58 description: Disable. 

59""", 

60 ) 

61 register_list = from_yaml( 

62 name="", 

63 yaml_file=yaml_path, 

64 default_registers=[ 

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

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

67 ], 

68 ) 

69 

70 # Default registers. 

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

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

73 

74 # yaml registers. 

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

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

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

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

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

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

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

82 

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

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

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

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

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

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

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

90 

91 

92def test_two_registers_with_same_name_does_not_raise_exception(tmp_path): 

93 # Limitation in the YAML Python parser: https://github.com/yaml/pyyaml/issues/165 

94 # This is not a problem for TOML. 

95 # We would highly prefer if this raised exception. 

96 yaml_path = create_file( 

97 file=tmp_path / "regs.yaml", 

98 contents=""" 

99apa: 

100 mode: r_w 

101 

102apa: 

103 mode: r 

104""", 

105 ) 

106 

107 register_list = from_yaml(name="", yaml_file=yaml_path) 

108 assert len(register_list.register_objects) == 1 

109 assert register_list.register_objects[0].mode == REGISTER_MODES["r"]