85 lines
2.5 KiB
Python
85 lines
2.5 KiB
Python
# --------------------------------------------------------------------------------------
|
|
# Copyright (c) 2014-2021, Nucleic Development Team.
|
|
#
|
|
# Distributed under the terms of the Modified BSD License.
|
|
#
|
|
# The full license is in the file LICENSE, distributed with this software.
|
|
# --------------------------------------------------------------------------------------
|
|
import gc
|
|
import re
|
|
|
|
import pytest
|
|
|
|
from kiwisolver import Constraint, Variable, strength
|
|
|
|
|
|
@pytest.mark.parametrize("op", ("==", "<=", ">="))
|
|
def test_constraint_creation(op) -> None:
|
|
"""Test constraints creation and methods."""
|
|
v = Variable("foo")
|
|
c = Constraint(v + 1, op)
|
|
|
|
assert c.strength() == strength.required and c.op() == op
|
|
e = c.expression()
|
|
t = e.terms()
|
|
assert (
|
|
e.constant() == 1
|
|
and len(t) == 1
|
|
and t[0].variable() is v
|
|
and t[0].coefficient() == 1
|
|
)
|
|
|
|
constraint_format = r"1 \* foo \+ 1 %s 0 | strength = 1.001e\+[0]+9" % op
|
|
assert re.match(constraint_format, str(c))
|
|
|
|
for s in ("weak", "medium", "strong", "required"):
|
|
# Not an exact literal...
|
|
c = Constraint(v + 1, op, s) # type: ignore
|
|
assert c.strength() == getattr(strength, s)
|
|
|
|
# Ensure we test garbage collection.
|
|
del c
|
|
gc.collect()
|
|
|
|
|
|
def test_constraint_creation2() -> None:
|
|
"""Test for errors in Constraints creation."""
|
|
v = Variable("foo")
|
|
|
|
with pytest.raises(TypeError) as excinfo:
|
|
Constraint(1, "==") # type: ignore
|
|
assert "Expression" in excinfo.exconly()
|
|
|
|
with pytest.raises(TypeError) as excinfo:
|
|
Constraint(v + 1, 1) # type: ignore
|
|
assert "str" in excinfo.exconly()
|
|
|
|
with pytest.raises(ValueError) as excinfo2:
|
|
Constraint(v + 1, "!=") # type: ignore
|
|
assert "relational operator" in excinfo2.exconly()
|
|
|
|
|
|
@pytest.mark.parametrize("op", ("==", "<=", ">="))
|
|
def test_constraint_repr(op) -> None:
|
|
"""Test the repr method of a constraint object."""
|
|
v = Variable("foo")
|
|
c = Constraint(v + 1, op)
|
|
|
|
assert op in repr(c)
|
|
|
|
|
|
def test_constraint_or_operator() -> None:
|
|
"""Test modifying a constraint strength using the | operator."""
|
|
v = Variable("foo")
|
|
c = Constraint(v + 1, "==")
|
|
|
|
for s in ("weak", "medium", "strong", "required", strength.create(1, 1, 0)):
|
|
c2 = c | s # type: ignore
|
|
if isinstance(s, str):
|
|
assert c2.strength() == getattr(strength, s)
|
|
else:
|
|
assert c2.strength() == s
|
|
|
|
with pytest.raises(ValueError):
|
|
c | "unknown" # type: ignore
|