private void ValidateAssert(Pattern pattern, Rule rule, Assert assert, XPathNavigator context) { // evaluate test object objResult = context.Evaluate(assert.CompiledTest); // resolve object result bool isViolated = false; switch (assert.CompiledTest.ReturnType) { case XPathResultType.Boolean: { isViolated = !Convert.ToBoolean(objResult); break; } case XPathResultType.Number: { double value = Convert.ToDouble(objResult); isViolated = double.IsNaN(value); break; } case XPathResultType.NodeSet: { XPathNodeIterator iterator = (XPathNodeIterator)objResult; isViolated = (iterator.Count == 0); break; } default: throw new InvalidOperationException(String.Format("'{0}'.", assert.Test)); } // results if (isViolated) { if (!this.fullValidation) { this.isCanceled = true; } this.results.IsValid = false; AssertionInfo info = new AssertionInfo(); info.IsReport = assert.IsReport; info.PatternId = pattern.Id; info.RuleId = rule.Id; info.RuleContext = rule.Context; info.AssertionId = assert.Id; info.AssertionTest = assert.Test; info.UserMessage = CreateUserMessage(assert, context); info.Location = CreateLocation(context); IXmlLineInfo lineInfo = (IXmlLineInfo)context; info.LineNumber = lineInfo.LineNumber; info.LinePosition = lineInfo.LinePosition; this.results.ViolatedAssertionsList.Add(info); } }
private void ValidateRule(Pattern pattern, Rule rule) { XPathNodeIterator contextSet = this.xNavigator.Select(rule.CompiledContext); while (contextSet.MoveNext()) { XPathNavigator contextNode = contextSet.Current; if (!this.IsContextUsed(contextNode)) { foreach (Assert assert in rule.Asserts) { this.ValidateAssert(pattern, rule, assert, contextNode); if (this.isCanceled) { break; } } this.usedContext.Add(contextNode.Clone()); } if (this.isCanceled) { break; } } }
private static IEnumerable<Rule> DeserializeRules(XElement xPattern, XmlNamespaceManager nsManager) { List<Rule> listRule = new List<Rule>(); foreach (XElement xRule in xPattern.XPathSelectElements("sch:rule", nsManager)) { Rule rule = new Rule(); // @id XAttribute xId = xRule.Attribute(XName.Get("id")); if (xId != null) { rule.Id = xId.Value; } // @context rule.Context = xRule.Attribute(XName.Get("context")).Value; // asserts rule.Asserts = DeserializeAsserts(xRule, nsManager); listRule.Add(rule); } return listRule; }