public void TestValidate() { // test success _orNode.AddChildNode(new SupportExprNode(typeof(Boolean))); _orNode.AddChildNode(new SupportExprNode(typeof(Boolean))); _orNode.Validate(ExprValidationContextFactory.MakeEmpty()); // test failure, type mismatch _orNode.AddChildNode(new SupportExprNode(typeof(string))); try { _orNode.Validate(ExprValidationContextFactory.MakeEmpty()); Assert.Fail(); } catch (ExprValidationException ex) { // Expected } // test failed - with just one child _orNode = new ExprOrNode(); _orNode.AddChildNode(new SupportExprNode(typeof(Boolean))); try { _orNode.Validate(ExprValidationContextFactory.MakeEmpty()); Assert.Fail(); } catch (ExprValidationException ex) { // Expected } }
public void TestEvaluate() { _orNode.AddChildNode(new SupportBoolExprNode(true)); _orNode.AddChildNode(new SupportBoolExprNode(false)); SupportExprNodeUtil.Validate(_orNode); Assert.IsTrue(_orNode.Evaluate(new EvaluateParams(null, false, null)).AsBoolean()); _orNode = new ExprOrNode(); _orNode.AddChildNode(new SupportBoolExprNode(false)); _orNode.AddChildNode(new SupportBoolExprNode(false)); SupportExprNodeUtil.Validate(_orNode); Assert.IsFalse(_orNode.Evaluate(new EvaluateParams(null, false, null)).AsBoolean()); _orNode = new ExprOrNode(); _orNode.AddChildNode(new SupportExprNode(null, typeof(Boolean))); _orNode.AddChildNode(new SupportExprNode(false)); SupportExprNodeUtil.Validate(_orNode); Assert.IsNull(_orNode.Evaluate(new EvaluateParams(null, false, null))); }
public static ExprOrNode ConnectExpressionsByLogicalOr(ICollection<ExprNode> nodes) { if (nodes.Count < 2) { throw new ArgumentException("Invalid empty or 1-element list of nodes"); } ExprOrNode orNode = new ExprOrNode(); foreach (ExprNode node in nodes) { orNode.AddChildNode(node); } return orNode; }
private static ExprNode Unwind(ExprNode node) { var isOr = node is ExprOrNode; var isAnd = node is ExprAndNode; if (!isOr && !isAnd) { return node; } var needsUnwind = false; foreach (var child in node.ChildNodes) { if (child is ExprOrNode && isOr || child is ExprAndNode && isAnd) { needsUnwind = true; break; } } if (!needsUnwind) { return node; } if (isOr) { var unwoundX = new ExprOrNode(); foreach (var child in node.ChildNodes) { if (child is ExprOrNode) { foreach (var orChild in child.ChildNodes) { var unwoundChild = Unwind(orChild); if (unwoundChild is ExprOrNode) { unwoundX.AddChildNodes(Arrays.AsList(unwoundChild.ChildNodes)); } else { unwoundX.AddChildNode(unwoundChild); } } } else { unwoundX.AddChildNode(Unwind(child)); } } return unwoundX; } ExprAndNode unwound = new ExprAndNodeImpl(); foreach (var child in node.ChildNodes) { if (child is ExprAndNode) { foreach (var andChild in child.ChildNodes) { var unwoundChild = Unwind(andChild); if (unwoundChild is ExprAndNode) { unwound.AddChildNodes(Arrays.AsList(unwoundChild.ChildNodes)); } else { unwound.AddChildNode(unwoundChild); } } } else { unwound.AddChildNode(Unwind(child)); } } return unwound; }