Coverage for tsfpga/test/test_constraint.py: 100%

56 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-01 20:51 +0000

1# -------------------------------------------------------------------------------------------------- 

2# Copyright (c) Lukas Vik. All rights reserved. 

3# 

4# This file is part of the tsfpga project, a project platform for modern FPGA development. 

5# https://tsfpga.com 

6# https://github.com/tsfpga/tsfpga 

7# -------------------------------------------------------------------------------------------------- 

8 

9import contextlib 

10import io 

11from pathlib import Path 

12 

13import pytest 

14 

15from tsfpga.constraint import Constraint 

16from tsfpga.hdl_file import HdlFile 

17 

18 

19def test_constraint(): 

20 constraint = Constraint(Path("dummy.tcl")) 

21 constraint.validate_scoped_entity([]) 

22 

23 assert constraint.ref is None 

24 assert constraint.used_in_synthesis 

25 assert constraint.used_in_implementation 

26 

27 

28def test_constraint_used_in(): 

29 constraint = Constraint(Path("dummy.tcl"), used_in_synthesis=False) 

30 assert not constraint.used_in_synthesis 

31 assert constraint.used_in_implementation 

32 

33 constraint = Constraint(Path("dummy.tcl"), used_in_implementation=False) 

34 assert constraint.used_in_synthesis 

35 assert not constraint.used_in_implementation 

36 

37 

38def test_constraint_used_in_deprecated(): 

39 constraint = Constraint(Path("dummy.tcl"), used_in="impl") 

40 assert not constraint.used_in_synthesis 

41 assert constraint.used_in_implementation 

42 

43 constraint = Constraint(Path("dummy.tcl"), used_in="synth") 

44 assert constraint.used_in_synthesis 

45 assert not constraint.used_in_implementation 

46 

47 constraint = Constraint(Path("dummy.tcl"), used_in="all") 

48 assert constraint.used_in_synthesis 

49 assert constraint.used_in_implementation 

50 

51 

52def test_scoped_constraint(tmp_path): 

53 constraint = Constraint( 

54 tmp_path / "a" / "scoped_constraints" / "apa.tcl", scoped_constraint=True 

55 ) 

56 assert constraint.ref == "apa" 

57 

58 source_files = [HdlFile(tmp_path / "a" / "apa.vhd")] 

59 constraint.validate_scoped_entity(source_files) 

60 

61 

62def test_matching_entity_not_existing_should_raise_exception(tmp_path): 

63 constraint = Constraint( 

64 tmp_path / "a" / "scoped_constraints" / "dummy.tcl", scoped_constraint=True 

65 ) 

66 with pytest.raises(FileNotFoundError) as exception_info: 

67 constraint.validate_scoped_entity([]) 

68 assert str(exception_info.value).startswith("Could not find a matching entity file") 

69 

70 

71def test_can_cast_to_string_without_error(): 

72 str(Constraint(Path("dummy.tcl"), used_in="impl")) 

73 

74 

75def test_used_in_deprecated_warning(): 

76 string_io = io.StringIO() 

77 with contextlib.redirect_stdout(string_io): 

78 Constraint(Path("dummy.tcl"), used_in="impl") 

79 assert "DEPRECATED: " in string_io.getvalue() 

80 

81 string_io = io.StringIO() 

82 with contextlib.redirect_stdout(string_io): 

83 Constraint(Path("dummy.tcl"), used_in_synthesis=False, used_in_implementation=False) 

84 assert "DEPRECATED: " not in string_io.getvalue() 

85 

86 

87def test_using_both_new_and_deprecated_should_raise_exception(): 

88 string_io = io.StringIO() 

89 with contextlib.redirect_stdout(string_io), pytest.raises(ValueError) as exception_info: 

90 Constraint(Path("dummy.tcl"), used_in="impl", used_in_synthesis=False) 

91 assert "DEPRECATED: " in string_io.getvalue() 

92 assert "Using both 'used_in_*' and deprecated 'used_in'" in str(exception_info.value)