public void SelectorSequence_WithThreeSelectors_Matches()
        {
            var selector = CssSelector.WithElement("h1", null)
                           .Add(CssSelector.WithId("chapter1"));

            var pseudoClassInfo = Substitute.For <XElementPseudoClassInfo>();

            pseudoClassInfo.IsTarget(Arg.Any <XElement>())
            .Returns(call => "true".Equals(call.Arg <XElement>().Attribute("istarget")?.Value, StringComparison.OrdinalIgnoreCase));

            var xdoc = XDocument.Parse(@"
				<html>
					<head />
					<body>
						<p id='chapter1' istarget='true' />
						<h1 id='chapter1' istarget='true' />
						<h1 id='ch2' istarget='true' />
						<h1 id='ch3' />
					</body>
				</html>"                );

            var matchingElements = Match(xdoc, selector);

            Assert.That(matchingElements.Select(e => e.Name.LocalName + "." + e.Attribute("id").Value), Is.EquivalentTo(new[] { "h1.chapter1" }));
        }
        public void SelectorSequence_WithTwoSelectors_ToString()
        {
            var selector = CssSelector.WithElement("h1", null)
                           .Add(CssSelector.WithId("chapter1"));

            Assert.That(selector.ToString(), Is.EqualTo("h1#chapter1"));
        }
        public void SelectorSequence_WithThreeSelectors_ToString()
        {
            var selector = CssSelector.WithElement("h1", null)
                           .Add(CssSelector.WithId("chapter1"))
                           .Add(CssSelector.WithPseudoClass("target"));

            Assert.That(selector.ToString(), Is.EqualTo("h1#chapter1:target"));
        }
        public void SelectorSequence_WithTwoSelectors()
        {
            var typeSelector  = CssSelector.WithElement("h1");
            var extraSelector = CssSelector.WithId("chapter1");
            var selector      = typeSelector.Add(extraSelector);

            Assert.Multiple(() =>
            {
                Assert.That(selector.TypeSelector, Is.SameAs(typeSelector), nameof(selector.TypeSelector));
                Assert.That(selector.OtherSelectors, Is.EquivalentTo(new[] { extraSelector }), nameof(selector.OtherSelectors));
                Assert.That(selector.Subject, Is.SameAs(selector), nameof(selector.Subject));
                Assert.That(selector.Specificity, Is.EqualTo(new CssSpecificity(1, 0, 1)), nameof(selector.Specificity));
            });
        }
        public void SelectorSequence_WithTwoSelectors_Matches()
        {
            var selector = CssSelector.WithElement("h1", null)
                           .Add(CssSelector.WithId("chapter1"));

            var xdoc = XDocument.Parse(@"
				<html>
					<head />
					<body>
						<p id='chapter1' />
						<h1 id='chapter1' />
						<h1 id='ch2' />
						<h1 id='ch3' />
					</body>
				</html>"                );

            var matchingElements = Match(xdoc, selector);

            Assert.That(matchingElements.Select(e => e.Name.LocalName + "." + e.Attribute("id").Value), Is.EquivalentTo(new[] { "h1.chapter1" }));
        }
        public void IdSelector_Matches()
        {
            var selector = CssSelector.WithId("par1");
            var xdoc     = XDocument.Parse(@"
				<html>
					<head />
					<body>
						<p id='par1' />
						<p id='par2' />
						<p id='par1b' />
						<p id='PAR1' />
						<p id='' />
						<p />
					</body>
				</html>"                );

            var matchingElements = xdoc.Descendants().Where(e => selector.Matches(new XElementInfo(e))).ToList();

            Assert.That(matchingElements.Select(e => e.Attribute("id").Value), Is.EquivalentTo(new[] { "par1" }));
        }
        public void SelectorSequence_WithThreeSelectors()
        {
            var typeSelector   = CssSelector.WithElement("h1", null);
            var extraSelectors = new CssSimpleSelector[]
            {
                CssSelector.WithId("chapter1"),
                CssSelector.WithPseudoClass("target")
            };

            var selector = typeSelector.Add(extraSelectors[0]);

            for (var i = 1; i < extraSelectors.Length; i++)
            {
                selector = selector.Add(extraSelectors[i]);
            }

            Assert.Multiple(() =>
            {
                Assert.That(selector.TypeSelector, Is.SameAs(typeSelector), nameof(selector.TypeSelector));
                Assert.That(selector.OtherSelectors, Is.EquivalentTo(extraSelectors), nameof(selector.OtherSelectors));
                Assert.That(selector.Subject, Is.SameAs(selector), nameof(selector.Subject));
                Assert.That(selector.Specificity, Is.EqualTo(new CssSpecificity(1, 1, 1)), nameof(selector.Specificity));
            });
        }
 public void IdSelector_ToString()
 {
     Assert.That(CssSelector.WithId("par1").ToString(), Is.EqualTo("#par1"));
 }
        public void IdSelector()
        {
            var selector = CssSelector.WithId("par1");

            Assert.That(selector.Specificity, Is.EqualTo(new CssSpecificity(1, 0, 0)), nameof(selector.Specificity));
        }
 public void IdSelector()
 {
     VerifyRule(CssSelectorGrammar.IdSelector, "#id1", CssSelector.WithId("id1"));
 }