/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.verifier.visitor;
import org.drools.core.base.evaluators.Operator;
import org.drools.compiler.lang.descr.PackageDescr;
import org.drools.verifier.TestBase;
import org.drools.verifier.components.*;
import org.drools.verifier.data.VerifierComponent;
import org.junit.Test;
import java.util.Collection;
import static org.junit.Assert.*;
public class ExprConstraintDescrVisitorTest extends TestBase {
@Test
public void testVisitPerson() throws Exception {
PackageDescr packageDescr = getPackageDescr(getClass().getResourceAsStream("ExprConstraintDescr1.drl"));
assertNotNull(packageDescr);
packageDescrVisitor.visitPackageDescr(packageDescr);
Collection<StringRestriction> allRestrictions = verifierData.getAll(VerifierComponentType.RESTRICTION);
Collection<Field> allFields = verifierData.getAll(VerifierComponentType.FIELD);
assertEquals(3, allRestrictions.size());
assertEquals(3, allFields.size());
for (Field field : allFields) {
assertNotNull(field.getFieldType());
}
assertContainsField("name");
assertContainsField("lastName");
assertContainsField("age");
assertContainsStringRestriction(Operator.EQUAL, "toni");
assertContainsStringRestriction(Operator.NOT_EQUAL, "Lake");
assertContainsNumberRestriction(Operator.GREATER, 20);
assertContainsEval("eval( true )");
}
@Test
public void testVisitAnd() throws Exception {
PackageDescr packageDescr = getPackageDescr(getClass().getResourceAsStream("ExprConstraintDescr2.drl"));
assertNotNull(packageDescr);
packageDescrVisitor.visitPackageDescr(packageDescr);
Collection<StringRestriction> allRestrictions = verifierData.getAll(VerifierComponentType.RESTRICTION);
assertEquals(2, allRestrictions.size());
assertContainsFields(1);
assertContainsField("age");
assertContainsNumberRestriction(Operator.GREATER, 0);
assertContainsNumberRestriction(Operator.LESS, 100);
}
@Test
public void testVisitVariableRestriction() throws Exception {
PackageDescr packageDescr = getPackageDescr(getClass().getResourceAsStream("ExprConstraintDescr3.drl"));
assertNotNull(packageDescr);
packageDescrVisitor.visitPackageDescr(packageDescr);
Collection<StringRestriction> allRestrictions = verifierData.getAll(VerifierComponentType.RESTRICTION);
assertEquals(1, allRestrictions.size());
assertContainsFields(1);
assertContainsField("age");
assertContainsVariable("Test 1", "var");
assertContainsVariableRestriction(Operator.EQUAL, "var");
}
private void assertContainsEval(String eval) {
Collection<VerifierComponent> allEvals = verifierData.getAll(VerifierComponentType.PREDICATE);
for (VerifierComponent component : allEvals) {
Eval evalObject = (Eval) component;
if (eval.equals(evalObject.getContent())) {
return;
}
}
fail(String.format("Could not find Eval : %s ", eval));
}
private void assertContainsVariableRestriction(Operator operator, String variableName) {
Collection<Restriction> allRestrictions = verifierData.getAll(VerifierComponentType.RESTRICTION);
for (Restriction restriction : allRestrictions) {
if (restriction instanceof VariableRestriction) {
VariableRestriction variableRestriction = (VariableRestriction) restriction;
if (variableName.equals(variableRestriction.getVariable().getName()) && operator.equals(variableRestriction.getOperator())) {
return;
}
}
}
fail(String.format("Could not find VariableRestriction: Operator : %s Variable name: %s", operator, variableName));
}
private void assertContainsStringRestriction(Operator operator, String value) {
Collection<Restriction> allRestrictions = verifierData.getAll(VerifierComponentType.RESTRICTION);
for (Restriction restriction : allRestrictions) {
if (restriction instanceof StringRestriction) {
StringRestriction stringLiteral = (StringRestriction) restriction;
if (value.equals(stringLiteral.getValueAsString()) && operator.equals(stringLiteral.getOperator())) {
return;
}
}
}
fail(String.format("Could not find StringRestriction: Operator : %s Value: %s", operator, value));
}
private void assertContainsNumberRestriction(Operator operator, Number value) {
Collection<Restriction> allRestrictions = verifierData.getAll(VerifierComponentType.RESTRICTION);
for (Restriction restriction : allRestrictions) {
if (restriction instanceof NumberRestriction) {
NumberRestriction numberRestriction = (NumberRestriction) restriction;
if (value.equals(numberRestriction.getValue()) && operator.equals(numberRestriction.getOperator())) {
return;
}
}
}
fail(String.format("Could not find NumberRestriction: Operator : %s Value: %s", operator, value));
}
}