public void ParseNotPredicateTest() { //Create parser PredicateParser predicateParser = new PredicateParser(Init("! condition1 && test.list?")); Predicate parsedPredicate = predicateParser.ParsePredicate(); //Check Predicates Assert.AreEqual(typeof(NotPredicate), parsedPredicate.GetType()); //Check AndPredicate Predicate parsedInnerPredicate = ((NotPredicate)parsedPredicate).GetPredicate(); Assert.AreEqual(typeof(AndPredicate), parsedInnerPredicate.GetType()); AndPredicate parsedInnerAndPredicate = (AndPredicate)parsedInnerPredicate; Assert.AreEqual(typeof(ExpressionPredicate), parsedInnerAndPredicate.GetLeftPredicate().GetType()); Assert.AreEqual(typeof(IsPredicate), parsedInnerAndPredicate.GetRightPredicate().GetType()); }
public void ParsePredicateTest() { //Create parser PredicateParser predicateParser = new PredicateParser(Init("condition1 && condition2 || condition3")); Predicate parsedPredicate = predicateParser.ParsePredicate(); //Check Predicates Assert.AreEqual(typeof(AndPredicate), parsedPredicate.GetType()); //Check OrPredicate AndPredicate parsedAndPredicate = (AndPredicate)parsedPredicate; Assert.AreEqual(typeof(ExpressionPredicate), parsedAndPredicate.GetLeftPredicate().GetType()); Assert.AreEqual(typeof(OrPredicate), parsedAndPredicate.GetRightPredicate().GetType()); //Check nested OrPredicate OrPredicate parsedNestedOrPredicate = (OrPredicate)parsedAndPredicate.GetRightPredicate(); Assert.AreEqual(typeof(ExpressionPredicate), parsedNestedOrPredicate.GetLeftPredicate().GetType()); Assert.AreEqual(typeof(ExpressionPredicate), parsedNestedOrPredicate.GetRightPredicate().GetType()); }
/// <summary> /// Method which evaluates an predicate and returns true or false /// </summary> /// <param name="predicate">Predicate to evaluate</param> /// <returns>True if predicate is true, otherwise false</returns> private bool EvaluatePredicate(Predicate predicate) { if (predicate is IsPredicate) { //Evaluate Expression Predicate IsPredicate isPredicate = (IsPredicate)predicate; Expression expression = isPredicate.GetExpression(); //In case of VarExpression, get expression from symboltable if (expression is VarExpression) { expression = GetReferenceExpression((VarExpression)expression); if (expression == null) { return(false); } } //If right type return true, otherwise false if (isPredicate.GetType() is StringType) { return(expression is TextExpression); } else if (isPredicate.GetType() is ListType) { return(expression is ListExpression); } else if (isPredicate.GetType() is RecordType) { return(expression is RecordExpression); } else { //No match between types which could be checked, so false return(false); } } else if (predicate is ExpressionPredicate) { //Evaluate Expression Predicate ExpressionPredicate expressionPredicate = (ExpressionPredicate)predicate; Expression expression = expressionPredicate.GetExpression(); if (expression is FieldExpression) { //Check if specific field exists in record (not null) Expression expr = GetExpression((FieldExpression)expression); return(expr != null); } else if (expression is VarExpression) { //Check if specific variable is defined VarExpression varExpr = (VarExpression)expression; return(SymbolTable.ContainsVariable(varExpr.GetVariableIdentifier())); } else { //Other expressions are always true, because they doesn't refer to something return(true); } } else if (predicate is AndPredicate) { //Evaluate And Predicate AndPredicate andPredicate = (AndPredicate)predicate; return(EvaluatePredicate(andPredicate.GetLeftPredicate()) && EvaluatePredicate(andPredicate.GetLeftPredicate())); } else if (predicate is OrPredicate) { //Evaluate Or Predicate OrPredicate orPredicate = (OrPredicate)predicate; return(EvaluatePredicate(orPredicate.GetLeftPredicate()) || EvaluatePredicate(orPredicate.GetRightPredicate())); } else if (predicate is NotPredicate) { //Evaluate Not Predicate NotPredicate notPredicate = (NotPredicate)predicate; return(!EvaluatePredicate(notPredicate.GetPredicate())); } return(false); }