Пример #1
0
        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;
                }
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        private void ValidatePattern(Pattern pattern)
        {
            this.usedContext.Clear();
            foreach (Rule rule in pattern.Rules)
            {
                this.ValidateRule(pattern, rule);

                if (isCanceled)
                {
                    break;
                }
            }
        }
Пример #4
0
        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;
        }