Пример #1
0
 public static bool IsFunctionAvailable(string localName, string nsUri)
 {
     if (XPathBuilder.IsFunctionAvailable(localName, nsUri))
     {
         return(true);
     }
     if (nsUri.Length == 0)
     {
         return(FunctionTable.ContainsKey(localName) && localName != "unparsed-entity-uri");
     }
     if (nsUri == XmlReservedNs.NsMsxsl)
     {
         return(
             localName == "node-set" ||
             localName == "format-date" ||
             localName == "format-time" ||
             localName == "local-name" ||
             localName == "namespace-uri" ||
             localName == "number" ||
             localName == "string-compare" ||
             localName == "utc"
             );
     }
     if (nsUri == XmlReservedNs.NsExsltCommon)
     {
         return(localName == "node-set" || localName == "object-type");
     }
     return(false);
 }
Пример #2
0
        public void HelloWorldTest_CyclesThroughWholeProgram()
        {
            new HeavyTestRunner(_logger).RunServerAndBrowserAndExecute(
                MagicsForTests.ClientSideFlows.HelloWorld, (assertX, server, browser) => {
                assertX.DialogIsVisibleInBrowser("Hello there");

                browser
                .FindElementByXPath(XPathBuilder.Dialog("Hello there").InBody("/input[@type='text']"))
                .SendKeys(someName);

                assertX.NoServiceCallsMadeOnServer();

                browser
                .FindElementByXPath(XPathBuilder.Dialog("Hello there").HasEnabledButtonAction("OK"))
                .Click();

                assertX.DialogIsVisibleInBrowser("Server reply");

                assertX.InvocationsMadeOnServerAre(x => x.ResType == ResourceType.RegularPostService, () => {
                    var onBefore   = FilterInvocation.OfMethod((IHelloWorldService x) => x.SayHello(someName));
                    var actualCall = ServiceCall.OfMethod((IHelloWorldService x) => x.SayHello(someName));
                    var onAfter    = FilterInvocation.ExpectOnConnectionAfterFor(onBefore);

                    return(new CsChoice <ServiceCall, FilterInvocation>[] { onBefore, actualCall, onAfter });
                });

                assertX.MatchesXPathInBrowser(
                    XPathBuilder
                    .Dialog("Server reply")
                    .HasReadOnlyLabel($"Hello {someName}. How are you?"));
            });
        }
Пример #3
0
        public Scss Concat(Scss scss2)
        {
            string resultXpath = XPathBuilder.Concat(this.Xpath, scss2.Xpath);
            var    resultCss   = string.IsNullOrEmpty(this.Css) || string.IsNullOrEmpty(scss2.Css)
                                ? string.Empty
                                : CssBuilder.Concat(this.Css, scss2.Css);

            return(new Scss(resultXpath, resultCss));
        }
        public XPathPatternBuilder(IXPathEnvironment environment) {
            Debug.Assert(environment != null);
            this.environment = environment;
            this.f           = environment.Factory;
            this.predicateEnvironment = new XPathPredicateEnvironment(environment);
            this.predicateBuilder     = new XPathBuilder(predicateEnvironment);

            this.fixupNode = f.Unknown(T.NodeNotRtfS);
        }
Пример #5
0
        public XPathPatternBuilder(IXPathEnvironment environment)
        {
            Debug.Assert(environment != null);
            _environment          = environment;
            _f                    = environment.Factory;
            _predicateEnvironment = new XPathPredicateEnvironment(environment);
            _predicateBuilder     = new XPathBuilder(_predicateEnvironment);

            _fixupNode = _f.Unknown(T.NodeNotRtfS);
        }
Пример #6
0
        //The structure of result is a Filter, variable is current node, body is the match condition.
        //Previous predicate build logic in XPathPatternBuilder is match from right to left, which have 2^n complexiy when have lots of position predicates. TFS #368771
        //Now change the logic to: If predicates contains position/last predicates, given the current node, filter out all the nodes that match the predicates,
        //and then check if current node is in the result set.
        public QilNode BuildPredicates(QilNode nodeset, List <QilNode> predicates)
        {
            //convert predicates to boolean type
            List <QilNode> convertedPredicates = new List <QilNode>(predicates.Count);

            foreach (var predicate in predicates)
            {
                convertedPredicates.Add(XPathBuilder.PredicateToBoolean(predicate, _f, _predicateEnvironment));
            }

            QilLoop     nodeFilter = (QilLoop)nodeset;
            QilIterator current    = nodeFilter.Variable;

            //If no last() and position() in predicates, use nodeFilter.Variable to fixup current
            //because all the predicates only based on the input variable, no matter what other predicates are.
            if (_predicateEnvironment.numFixupLast == 0 && _predicateEnvironment.numFixupPosition == 0)
            {
                foreach (var predicate in convertedPredicates)
                {
                    nodeFilter.Body = _f.And(nodeFilter.Body, predicate);
                }
                nodeFilter.Body = _predicateEnvironment.fixupVisitor.Fixup(nodeFilter.Body, current, null);
            }
            //If any preidcate contains last() or position() node, then the current node is based on previous predicates,
            //for instance, a[...][2] is match second node after filter 'a[...]' instead of second 'a'.
            else
            {
                //filter out the siblings
                QilIterator parentIter = _f.For(_f.Parent(current));
                QilNode     sibling    = _f.Content(parentIter);
                //generate filter based on input filter
                QilLoop siblingFilter = (QilLoop)nodeset.DeepClone(_f.BaseFactory);
                siblingFilter.Variable.Binding = sibling;
                siblingFilter = (QilLoop)_f.Loop(parentIter, siblingFilter);

                //build predicates from left to right to get all the matching nodes
                QilNode matchingSet = siblingFilter;
                foreach (var predicate in convertedPredicates)
                {
                    matchingSet = XPathBuilder.BuildOnePredicate(matchingSet, predicate, /*isReverseStep*/ false,
                                                                 _f, _predicateEnvironment.fixupVisitor,
                                                                 ref _predicateEnvironment.numFixupCurrent, ref _predicateEnvironment.numFixupPosition, ref _predicateEnvironment.numFixupLast);
                }

                //check if the matching nodes contains the current node
                QilIterator matchNodeIter = _f.For(matchingSet);
                QilNode     filterCurrent = _f.Filter(matchNodeIter, _f.Is(matchNodeIter, current));
                nodeFilter.Body = _f.Not(_f.IsEmpty(filterCurrent));
                //for passing type check, explicit say the result is target type
                nodeFilter.Body = _f.And(_f.IsType(current, nodeFilter.XmlType), nodeFilter.Body);
            }

            SetPriority(nodeset, 0.5);
            return(nodeset);
        }
Пример #7
0
        public XmlGridView()
        {
            InitializeComponent();
            _xmlGridView.MouseDown += (sender, args) => { _contextMenuAtPos = args.Location; };

            _xmlGridView.ContextMenu = new ContextMenu(
                new[]
            {
                new MenuItem("Refresh", (sender, evt) => load()),
                new MenuItem("Expand all", (sender, evt) => _xmlGridView.FullExpand()),
                new MenuItem("-"),
                new MenuItem("Copy", (sender, evt) =>
                {
                    Rectangle rect = new Rectangle();
                    GridCell cell  = _xmlGridView.FindCellByPoint(_contextMenuAtPos, ref rect);
                    cell.CopyToClipboard();
                }),
                new MenuItem("Copy XPath", (sender, evt) =>
                {
                    Rectangle rect = new Rectangle();
                    GridCell cell  = _xmlGridView.FindCellByPoint(_contextMenuAtPos, ref rect);

                    XmlNode node;
                    if (cell is XmlLabelCell)
                    {
                        node = ((XmlLabelCell)cell).Node;
                    }
                    else if (cell is XmlValueCell)
                    {
                        node = ((XmlValueCell)cell).Node;
                    }
                    else if (cell is XmlDeclarationCell)
                    {
                        node = ((XmlDeclarationCell)cell).Node;
                    }
                    else if (cell is XmlGroupCell)
                    {
                        node = ((XmlGroupCell)cell).Node;
                    }
                    else
                    {
                        MessageBox.Show("Selected cell is not a XML node. Can't copy XPath", "Error",
                                        MessageBoxButton.OK, MessageBoxImage.Error);
                        return;
                    }

                    if (node != null)
                    {
                        var xpath = XPathBuilder.GetXPathToNode(node);
                        Clipboard.SetText(xpath);
                    }
                }),
            });
        }
Пример #8
0
//        public static By CreateBy(string scssSelector, params object[] args)
//        {
//            scssSelector = string.Format(scssSelector, args);
//            return Create(scssSelector).By;
//        }

        public static Scss Create(string scssSelector)
        {
            if (string.IsNullOrWhiteSpace(scssSelector))
            {
                return(null);
            }

            var combineWithRoot = false;

            if (scssSelector.StartsWith(ROOT_PREFIX))
            {
                combineWithRoot = true;
                scssSelector    = scssSelector.Remove(0, ROOT_PREFIX.Length).Trim();
            }

            var    xpath = string.Empty;
            string css   = null;

            try
            {
                var isTrueCss = true;
                var parts     = SplitIgnoringConditions(scssSelector, true, ',');
                foreach (var partScssSelector in parts)
                {
                    bool partScssIsTrueCss;
                    var  xpathPart = ScssPartToXpath(partScssSelector, out partScssIsTrueCss);
                    xpath     += "//" + RemoveDescendantAxis(xpathPart) + "|";
                    isTrueCss &= partScssIsTrueCss;
                }
                xpath = xpath.Substring(0, xpath.Length - 1);
                if (isTrueCss)
                {
                    css = scssSelector;
                }
            }
            catch (InvalidScssException e)
            {
                // Это не scss, возможно это xpath
                if (XPathBuilder.IsXPath(scssSelector))
                {
                    xpath = scssSelector;
                }
                else
                {
                    throw new InvalidScssException($"Invalid scss: {scssSelector}.", e);
                }
            }
            return(new Scss(xpath, css, combineWithRoot));
        }
        public XPathBuilder_GetAttributePart_Tests()
        {
            _xPathValidator     = new XPathValidator();
            _xPathValidatorMock = Substitute.For <IXPathValidator>();
            _xPathValidatorMock.IsReservedFunctionName(Arg.Any <string>())
            .Returns(x => _xPathValidator.IsReservedFunctionName(x.Arg <string>()));
            _xPathValidatorMock.When(x => x.ValidateQName(Arg.Any <string>(), Arg.Any <string>()))
            .Do(x => _xPathValidator.ValidateQName(x.ArgAt <string>(0), x.ArgAt <string>(1)));
            _xPathValidatorMock.When(x => x.ValidateNCName(Arg.Any <string>(), Arg.Any <string>()))
            .Do(x => _xPathValidator.ValidateNCName(x.ArgAt <string>(0), x.ArgAt <string>(1)));

            _cssValidatorMock = Substitute.For <ICssValidator>();

            _builder = new XPathBuilder(_xPathValidatorMock, _cssValidatorMock);
        }
Пример #10
0
        private static Scss CreateFromXpath(string scssSelector, bool combineWithRoot)
        {
            string xpath;

            // Это не scss, возможно это xpath
            if (XPathBuilder.IsXPath(scssSelector))
            {
                xpath = scssSelector;
            }
            else
            {
                // TODO: what should we do in this case?
                throw new InvalidScssException($"Invalid scss: {scssSelector}.");
            }

            return(new Scss(xpath, null, combineWithRoot));
        }
Пример #11
0
        public static Scss Create(string scssSelector)
        {
            if (string.IsNullOrEmpty(scssSelector))
            {
                return(new Scss(string.Empty, string.Empty));
            }
            var    xpath = string.Empty;
            string css   = null;

            try
            {
                var isTrueCss = true;
                var parts     = SplitIgnoringConditions(scssSelector, true, ',');
                foreach (var partScssSelector in parts)
                {
                    bool partScssIsTrueCss;
                    var  xpathPart = ScssPartToXpath(partScssSelector, out partScssIsTrueCss);
                    xpath     += "//" + RemoveDescendantAxis(xpathPart) + "|";
                    isTrueCss &= partScssIsTrueCss;
                }
                xpath = xpath.Substring(0, xpath.Length - 1);
                if (isTrueCss)
                {
                    css = scssSelector;
                }
            }
            catch (InvalidScssException e)
            {
                // Это не scss, возможно это xpath
                if (XPathBuilder.IsXPath(scssSelector))
                {
                    xpath = scssSelector;
                }
                else
                {
                    throw e;
                }
            }
            return(new Scss(xpath, css));
        }
Пример #12
0
        private static QilLoop BuildAxisFilter(QilPatternFactory f, QilIterator itr, XPathAxis xpathAxis, XPathNodeType nodeType, string name, string nsUri)
        {
            QilNode nameTest = (
                name != null && nsUri != null ? f.Eq(f.NameOf(itr), f.QName(name, nsUri)) :                   // ns:bar || bar
                nsUri != null ? f.Eq(f.NamespaceUriOf(itr), f.String(nsUri)) :                                // ns:*
                name != null ? f.Eq(f.LocalNameOf(itr), f.String(name)) :                                     // *:foo
                                                                          /*name  == nsUri == null*/ f.True() // *
                );

            XmlNodeKindFlags intersection = XPathBuilder.AxisTypeMask(itr.XmlType.NodeKinds, nodeType, xpathAxis);

            QilNode typeTest = (
                intersection == 0 ? f.False() :                    // input & required doesn't intersect
                intersection == itr.XmlType.NodeKinds ? f.True() : // input is subset of required
                                                                    /*else*/ f.IsType(itr, T.NodeChoice(intersection))
                );

            QilLoop filter = f.BaseFactory.Filter(itr, f.And(typeTest, nameTest));

            filter.XmlType = T.PrimeProduct(T.NodeChoice(intersection), filter.XmlType.Cardinality);

            return(filter);
        }
Пример #13
0
        public void BuilderTest()
        {
            const string xml = @"
<root>
  <foo />
  <foo>
     <bar attr='value'/>
     <bar other='va' />
  </foo>
  <foo><bar /></foo>
</root>";
            XmlDocument  doc = new XmlDocument();

            doc.LoadXml(xml);
            XmlNode node = doc.SelectSingleNode("//@attr");

            string xpath = XPathBuilder.GetXPathToNode(node);

            Assert.AreEqual("/node()[1]/node()[2]/node()[1]/@attr", xpath);

            Console.WriteLine(xpath);
            Assert.AreEqual(node, doc.SelectSingleNode(xpath));
        }
Пример #14
0
        private QilGenerator(bool debug)
        {
            _scope = new CompilerScopeManager<QilIterator>();
            _outputScope = new OutputScopeManager();
            _prefixesInUse = new HybridDictionary();
            _f = new XsltQilFactory(new QilFactory(), debug);
            _xpathBuilder = new XPathBuilder((IXPathEnvironment)this);
            _xpathParser = new XPathParser<QilNode>();
            _ptrnBuilder = new XPathPatternBuilder((IXPathEnvironment)this);
            _ptrnParser = new XPathPatternParser();
            _refReplacer = new ReferenceReplacer(_f.BaseFactory);
            _invkGen = new InvokeGenerator(_f, debug);
            _matcherBuilder = new MatcherBuilder(_f, _refReplacer, _invkGen);
            _singlFocus = new SingletonFocus(_f);
            _funcFocus = new FunctionFocus();
            _curLoop = new LoopFocus(_f);
            _strConcat = new QilStrConcatenator(_f);
            _varHelper = new VariableHelper(_f);

            _elementOrDocumentType = T.DocumentOrElement;
            _textOrAttributeType = T.NodeChoice(XmlNodeKindFlags.Text | XmlNodeKindFlags.Attribute);

            _nameCurrent = _f.QName("current", XmlReservedNs.NsXslDebug);
            _namePosition = _f.QName("position", XmlReservedNs.NsXslDebug);
            _nameLast = _f.QName("last", XmlReservedNs.NsXslDebug);
            _nameNamespaces = _f.QName("namespaces", XmlReservedNs.NsXslDebug);
            _nameInit = _f.QName("init", XmlReservedNs.NsXslDebug);

            _formatterCnt = 0;
        }
Пример #15
0
 public XPathBuilder_GetCssClassPart_Tests()
 {
     _xPathValidator = Substitute.For <IXPathValidator>();
     _cssValidator   = Substitute.For <ICssValidator>();
     _builder        = new XPathBuilder(_xPathValidator, _cssValidator);
 }