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 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 ValidatePattern(Pattern pattern) { this.usedContext.Clear(); foreach (Rule rule in pattern.Rules) { this.ValidateRule(pattern, rule); if (isCanceled) { break; } } }
private static IEnumerable<Pattern> DeserializePatterns(XElement xRoot, XmlNamespaceManager nsManager) { List<Pattern> listPattern = new List<Pattern>(); foreach (XElement xPattern in xRoot.XPathSelectElements("sch:pattern", nsManager)) { Pattern pattern = new Pattern(); // @id XAttribute xId = xPattern.Attribute(XName.Get("id")); if (xId != null) { pattern.Id = xId.Value; } // rules pattern.Rules = DeserializeRules(xPattern, nsManager); listPattern.Add(pattern); } return listPattern; }