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
« 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# --------------------------------------------------------------------------------------------------
9import contextlib
10import io
11from pathlib import Path
13import pytest
15from tsfpga.constraint import Constraint
16from tsfpga.hdl_file import HdlFile
19def test_constraint():
20 constraint = Constraint(Path("dummy.tcl"))
21 constraint.validate_scoped_entity([])
23 assert constraint.ref is None
24 assert constraint.used_in_synthesis
25 assert constraint.used_in_implementation
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
33 constraint = Constraint(Path("dummy.tcl"), used_in_implementation=False)
34 assert constraint.used_in_synthesis
35 assert not constraint.used_in_implementation
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
43 constraint = Constraint(Path("dummy.tcl"), used_in="synth")
44 assert constraint.used_in_synthesis
45 assert not constraint.used_in_implementation
47 constraint = Constraint(Path("dummy.tcl"), used_in="all")
48 assert constraint.used_in_synthesis
49 assert constraint.used_in_implementation
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"
58 source_files = [HdlFile(tmp_path / "a" / "apa.vhd")]
59 constraint.validate_scoped_entity(source_files)
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")
71def test_can_cast_to_string_without_error():
72 str(Constraint(Path("dummy.tcl"), used_in="impl"))
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()
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()
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)