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;
        }