def test_constraints_expression(): """Test constraint expressions: And, Or, Not, Constraint.""" and_expression = And([ Constraint("number", ConstraintType(ConstraintTypes.LESS_THAN, 15)), Constraint("number", ConstraintType(ConstraintTypes.GREATER_THAN, 10)), ]) and_expression.check_validity() assert and_expression.check(Description({"number": 12})) assert and_expression.is_valid( DataModel("some_name", [Attribute("number", int, True)])) and_expression_pb = ConstraintExpr._encode(and_expression) actual_and_expression = ConstraintExpr._decode(and_expression_pb) assert actual_and_expression == and_expression or_expression = Or([ Constraint("number", ConstraintType(ConstraintTypes.EQUAL, 12)), Constraint("number", ConstraintType(ConstraintTypes.EQUAL, 13)), ]) or_expression.check_validity() assert or_expression.check(Description({"number": 12})) assert or_expression.is_valid( DataModel("some_name", [Attribute("number", int, True)])) or_expression_pb = ConstraintExpr._encode(or_expression) actual_or_expression = ConstraintExpr._decode(or_expression_pb) assert actual_or_expression == or_expression not_expression = Not( And([ Constraint("number", ConstraintType(ConstraintTypes.EQUAL, 12)), Constraint("number", ConstraintType(ConstraintTypes.EQUAL, 12)), ])) not_expression.check_validity() assert not_expression.check(Description({"number": 13})) assert not_expression.is_valid( DataModel("some_name", [Attribute("number", int, True)])) not_expression_pb = ConstraintExpr._encode(not_expression) actual_not_expression = ConstraintExpr._decode(not_expression_pb) assert actual_not_expression == not_expression # constraint constraint_expression = Constraint("author", ConstraintType("==", "Stephen King")) constraint_expression.check_validity() assert constraint_expression.check(Description({"author": "Stephen King"})) assert constraint_expression.is_valid( DataModel("some_name", [Attribute("author", str, True)])) constraint_expression_pb = ConstraintExpr._encode(constraint_expression) actual_constraint_expression = ConstraintExpr._decode( constraint_expression_pb) assert actual_constraint_expression == constraint_expression incorrect_expression = Location(1.1, 2.2) with pytest.raises( ValueError, match= f"Invalid expression type. Expected either of 'And', 'Or', 'Not', 'Constraint'. Found {type(incorrect_expression)}.", ): ConstraintExpr._encode(incorrect_expression)
def test_constraints_or(): """Test Or.""" or_expression = Or([ Constraint("number", ConstraintType(ConstraintTypes.EQUAL, 12)), Constraint("number", ConstraintType(ConstraintTypes.EQUAL, 13)), ]) or_expression.check_validity() assert or_expression.check(Description({"number": 12})) assert or_expression.is_valid( DataModel("some_name", [Attribute("number", int, True)])) or_expression_pb = or_expression.encode() actual_or_expression = Or.decode(or_expression_pb) assert actual_or_expression == or_expression