Пример #1
0
        public void FontFaceRule_ParseTest()
        {
            string            text   = "@font-face {  font-family: Headline; src: local(Futura-Medium), url(fonts.svg#MyGeometricModern) format(\"svg\", 'opentype'); unicode-range: U+3000-9FFF, U+ff??; }";
            ITextProvider     tp     = new StringTextProvider(text);
            TokenStream       tokens = Helpers.MakeTokenStream(tp);
            FontFaceDirective ff     = new FontFaceDirective();

            Assert.IsTrue(ff.Parse(new ItemFactory(tp, null), tp, tokens));

            Assert.IsTrue(tp.CompareTo(ff.Keyword.Start, "font-face", ignoreCase: false));
            Assert.IsNotNull(ff.Block.OpenCurlyBrace);
            Assert.IsNotNull(ff.Block.CloseCurlyBrace);

            Assert.AreEqual(3, ff.RuleBlock.Declarations.Count);

            Assert.IsTrue(tp.CompareTo(ff.RuleBlock.Declarations[0].PropertyName.Start, "font-family", ignoreCase: false));

            Assert.IsTrue(tp.CompareTo(ff.RuleBlock.Declarations[1].PropertyName.Start, "src", ignoreCase: false));
            Assert.IsTrue(ff.RuleBlock.Declarations[1].Values[0] is FunctionLocal);
            Assert.IsTrue(ff.RuleBlock.Declarations[1].Values[2] is UrlItem);
            Assert.IsTrue(ff.RuleBlock.Declarations[1].Values[3] is FunctionFormat);
            FunctionFormat func = ff.RuleBlock.Declarations[1].Values[3] as FunctionFormat;

            FunctionArgument arg = func.Arguments[0] as FunctionArgument;

            Assert.AreEqual("\"svg\",", tp.GetText(arg.Start, arg.Length));

            arg = func.Arguments[1] as FunctionArgument;
            Assert.AreEqual("'opentype'", tp.GetText(arg.Start, arg.Length));

            Assert.IsTrue(tp.CompareTo(ff.RuleBlock.Declarations[2].PropertyName.Start, "unicode-range", ignoreCase: false));
        }
Пример #2
0
        public void CssTextRange_Equals()
        {
            ITextProvider tp     = new StringTextProvider("@namespace foo \"www.foo.com\";");
            TokenList     tokens = Helpers.MakeTokens(tp);

            Assert.IsTrue(tp.CompareTo(tokens[0].Start, "@", ignoreCase: false));
            Assert.IsTrue(tp.CompareTo(tokens[1].Start, "Namespace", ignoreCase: true));
            Assert.IsTrue(tp.CompareTo(tokens[2].Start, "foo", ignoreCase: false));
        }
        public void KeyFramesRule_ParseTest()
        {
            string text =
                @"@keyframes bounce {
                      from {
                          top: 100px;
                          animation-timing-function: ease-out;
                      }
                      25% {
                          top: 50px;
                          animation-timing-function: ease-in;
                      }
                      50% {
                          top: 100px;
                          animation-timing-function: ease-out;
                      }
                      75% {
                          top: 75px;
                          animation-timing-function: ease-in;
                      }
                      to {
                          top: 100px;
                      }
                }";

            ITextProvider      tp     = new StringTextProvider(text);
            TokenStream        tokens = Helpers.MakeTokenStream(tp);
            KeyFramesDirective kf     = new KeyFramesDirective();

            Assert.IsTrue(kf.Parse(new ItemFactory(tp, null), tp, tokens));
            Assert.IsTrue(tp.CompareTo(kf.Keyword.Start, "keyframes", ignoreCase: false));
            Assert.IsTrue(tp.CompareTo(kf.Name.Start, "bounce", ignoreCase: false));
            Assert.IsNotNull(kf.Block.OpenCurlyBrace);
            Assert.IsNotNull(kf.Block.CloseCurlyBrace);

            KeyFrameSelectorType[] types = new KeyFrameSelectorType[]
            {
                KeyFrameSelectorType.From,
                KeyFrameSelectorType.Percentage,
                KeyFrameSelectorType.Percentage,
                KeyFrameSelectorType.Percentage,
                KeyFrameSelectorType.To
            };

            Assert.AreEqual(5, kf.KeyFramesBlock.KeyFrames.Count);
            for (int i = 0; i < kf.KeyFramesBlock.KeyFrames.Count; i++)
            {
                Assert.AreEqual(types[i], kf.KeyFramesBlock.KeyFrames[i].Selectors[0].SelectorType);
                Assert.IsNotNull(kf.KeyFramesBlock.KeyFrames[i].RuleBlock.OpenCurlyBrace);
                Assert.IsNotNull(kf.KeyFramesBlock.KeyFrames[i].RuleBlock.CloseCurlyBrace);
                Assert.IsTrue(kf.KeyFramesBlock.KeyFrames[i].RuleBlock.Declarations.Count > 0);
                Assert.IsTrue(tp.CompareTo(kf.KeyFramesBlock.KeyFrames[i].RuleBlock.Declarations[0].PropertyName.Start, "top", ignoreCase: false));
            }
        }
Пример #4
0
        public void Combinator6SelectorTest()
        {
            string        text = "A+B C >     D * foo {}";
            ITextProvider tp   = new StringTextProvider(text);
            TokenStream   ts   = Helpers.MakeTokenStream(tp);

            Selector s = new Selector();

            Assert.IsTrue(s.Parse(new ItemFactory(tp, null), tp, ts), "Valid CSS '{0}' parsed incorrectly", text);

            Assert.AreEqual(s.SimpleSelectors.Count, 6, "We should have only 6 SimpleSelectors for CSS '{0}'", text);

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[0].Name.Start, "A", ignoreCase: false));
            Assert.IsNotNull(s.SimpleSelectors[0].SelectorCombineOperator);
            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[0].SelectorCombineOperator.Start, "+", ignoreCase: false));

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[1].Name.Start, "B", ignoreCase: false));
            Assert.IsNull(s.SimpleSelectors[1].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[2].Name.Start, "C", ignoreCase: false), "SimpleSelector C not obtained for CSS '{0}'", text);
            Assert.IsNotNull(s.SimpleSelectors[2].SelectorCombineOperator);
            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[2].SelectorCombineOperator.Start, ">", ignoreCase: false), "SelectorCombineOperator \">\" not obtained for CSS '{0}'", text);

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[3].Name.Start, "D", ignoreCase: false), "SimpleSelector D not obtained for CSS '{0}'", text);
            Assert.IsNull(s.SimpleSelectors[3].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[4].Name.Start, "*", ignoreCase: false));
            Assert.IsNull(s.SimpleSelectors[4].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[5].Name.Start, "foo", ignoreCase: false));
            Assert.IsNull(s.SimpleSelectors[5].SelectorCombineOperator);

            Assert.IsTrue(s.IsValid);
        }
        public void AttributeSelector_AttributeOrSeparatorNoNS()
        {
            string            test = "[|att=val]";
            ITextProvider     tp   = new StringTextProvider(test);
            TokenStream       ts   = Helpers.MakeTokenStream(tp);
            AttributeSelector attributeSelector = new AttributeSelector();

            Assert.IsTrue(attributeSelector.Parse(new ItemFactory(tp, null), tp, ts), "Valid CSS '{0}' parsed incorrectly", test);
            Assert.IsTrue(attributeSelector.IsValid);
            Assert.IsNotNull(attributeSelector.OpenBracket, "OpenBracket not parsed for CSS : '{0}'", test);
            Assert.IsNotNull(attributeSelector.CloseBracket, "CloseBracket not parsed for CSS : '{0}'", test);

            Assert.IsNotNull(attributeSelector.AttributeName.Separator, test, "AttributeName.Separator  not parsed for CSS : '{0}'", test);
            Assert.IsTrue(tp.CompareTo(attributeSelector.AttributeName.Name.Start, "att", ignoreCase: false), "AttributeName not parsed for CSS : '{0}'", test);
            Assert.IsTrue(tp.CompareTo(attributeSelector.AttributeValue.Start, "val", ignoreCase: false), "Value not parsed for CSS : '{0}'", test);
        }
        public void ImportDirective_ParseTest()
        {
            ITextProvider    tp     = new StringTextProvider("@import 'foo';");
            TokenStream      tokens = Helpers.MakeTokenStream(tp);
            CharsetDirective d      = new CharsetDirective();

            Assert.IsTrue(d.Parse(new ItemFactory(tp, null), tp, tokens));
            Assert.IsNotNull(d.CharacterSet);
            Assert.IsTrue(tp.CompareTo(d.CharacterSet.Start, "'foo'", ignoreCase: false));
            Assert.IsNotNull(d.Keyword);
            Assert.IsNotNull(d.Semicolon);

            tp     = new StringTextProvider("@import ;");
            tokens = Helpers.MakeTokenStream(tp);
            d      = new CharsetDirective();
            Assert.IsTrue(d.Parse(new ItemFactory(tp, null), tp, tokens));
            Assert.IsNotNull(d.Keyword);
            Assert.IsNull(d.CharacterSet);
            Assert.IsNotNull(d.Semicolon);

            tp     = new StringTextProvider("@import");
            tokens = Helpers.MakeTokenStream(tp);
            d      = new CharsetDirective();
            Assert.IsTrue(d.Parse(new ItemFactory(tp, null), tp, tokens));
            Assert.IsNotNull(d.Keyword);
            Assert.IsNull(d.CharacterSet);
            Assert.IsNull(d.Semicolon);
        }
        public void StringTextProvider_Simple()
        {
            string        text = "abcd";
            ITextProvider ts   = new StringTextProvider(text);

            Assert.AreEqual(text[0], ts[0]);
            Assert.AreEqual(text[3], ts[3]);
            Assert.AreEqual(4, ts.Length);
            Assert.AreEqual("bc", ts.GetText(1, 2));
            Assert.IsTrue(ts.CompareTo(1, "bcd", ignoreCase: false));
            Assert.IsFalse(ts.CompareTo(1, "abcd", ignoreCase: true));

            Assert.IsTrue(ts.CompareTo(1, new StringTextProvider("BCd"), 0, 3, ignoreCase: true));
            Assert.IsFalse(ts.CompareTo(1, new StringTextProvider("aBCDe"), 1, 3, ignoreCase: false));
            Assert.IsTrue(ts.CompareTo(1, new StringTextProvider("aBCDe"), 1, 3, ignoreCase: true));
        }
        public void AttributeSelector_AttributeContainsString()
        {
            string            test = "[  title  *=  \"hello\"  ]:ignore";
            ITextProvider     tp   = new StringTextProvider(test);
            TokenStream       ts   = Helpers.MakeTokenStream(tp);
            AttributeSelector attributeSelector = new AttributeSelector();

            Assert.IsTrue(attributeSelector.Parse(new ItemFactory(tp, null), tp, ts), "Valid CSS '{0}' parsed incorrectly", test);
            Assert.IsNotNull(attributeSelector.OpenBracket, "OpenBracket not parsed for CSS : '{0}'", test);
            Assert.IsNotNull(attributeSelector.CloseBracket, "CloseBracket not parsed for CSS : '{0}'", test);
            Assert.IsTrue(tp.CompareTo(attributeSelector.AttributeName.Start, "title", ignoreCase: false), "AttributeName not parsed for CSS : '{0}'", test);
            Assert.AreEqual(CssTokenType.ContainsString, attributeSelector.Operation.TokenType);
            Assert.IsTrue(attributeSelector.IsValid);
        }
        public void AttributeSelector_AttributeEndsWith()
        {
            string            test = "[href$=\".html\"][ignore=this]";
            ITextProvider     tp   = new StringTextProvider(test);
            TokenStream       ts   = Helpers.MakeTokenStream(tp);
            AttributeSelector attributeSelector = new AttributeSelector();

            Assert.IsTrue(attributeSelector.Parse(new ItemFactory(tp, null), tp, ts), "Valid CSS '{0}' parsed incorrectly", test);
            Assert.IsNotNull(attributeSelector.OpenBracket, "OpenBracket not parsed for CSS : '{0}'", test);
            Assert.IsNotNull(attributeSelector.CloseBracket, "CloseBracket not parsed for CSS : '{0}'", test);
            Assert.IsTrue(tp.CompareTo(attributeSelector.AttributeName.Start, "href", ignoreCase: false), "AttributeName not parsed for CSS : '{0}'", test);
            Assert.AreEqual(CssTokenType.EndsWith, attributeSelector.Operation.TokenType);
            Assert.IsTrue(attributeSelector.IsValid);
        }
        public void AttributeSelectorAttributeOneOfValue()
        {
            string            test = "[rel ~= 'copyright']";
            ITextProvider     tp   = new StringTextProvider(test);
            TokenStream       ts   = Helpers.MakeTokenStream(tp);
            AttributeSelector attributeSelector = new AttributeSelector();

            Assert.IsTrue(attributeSelector.Parse(new ItemFactory(tp, null), tp, ts), "Valid CSS '{0}' parsed incorrectly", test);
            Assert.IsNotNull(attributeSelector.OpenBracket, "OpenBracket not parsed for CSS : '{0}'", test);
            Assert.IsNotNull(attributeSelector.CloseBracket, "CloseBracket not parsed for CSS : '{0}'", test);
            Assert.IsTrue(tp.CompareTo(attributeSelector.AttributeName.Start, "rel", ignoreCase: false), "AttributeName not parsed for CSS : '{0}'", test);
            Assert.AreEqual(CssTokenType.OneOf, attributeSelector.Operation.TokenType, "CssTokenType.OneOf not parsed for CSS : '{0}'", test);
            Assert.IsTrue(attributeSelector.IsValid);
        }
Пример #11
0
        public void SelectorGroup_ParseTest()
        {
            string        text = "A+B, C > D, body + html ~ * foo {}";
            ITextProvider tp   = new StringTextProvider(text);
            TokenStream   ts   = Helpers.MakeTokenStream(tp);

            RuleSet s = new RuleSet();

            Assert.IsTrue(s.Parse(new ItemFactory(tp, null), tp, ts));
            Assert.AreEqual(4, s.Children.Count);
            Assert.AreEqual(3, s.Selectors.Count);

            Assert.IsTrue(tp.CompareTo(s.Selectors[0].SimpleSelectors[0].Name.Start, "A", ignoreCase: false));
            Assert.IsNotNull(s.Selectors[0].SimpleSelectors[0].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(s.Selectors[0].SimpleSelectors[1].Name.Start, "B", ignoreCase: false));
            Assert.IsNull(s.Selectors[0].SimpleSelectors[1].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(s.Selectors[1].SimpleSelectors[0].Name.Start, "C", ignoreCase: false));
            Assert.IsNotNull(s.Selectors[1].SimpleSelectors[0].SelectorCombineOperator);
            Assert.IsTrue(tp.CompareTo(s.Selectors[1].SimpleSelectors[0].SelectorCombineOperator.Start, ">", ignoreCase: false));

            Assert.IsTrue(tp.CompareTo(s.Selectors[1].SimpleSelectors[1].Name.Start, "D", ignoreCase: false));
            Assert.IsNull(s.Selectors[1].SimpleSelectors[1].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(s.Selectors[2].SimpleSelectors[0].Name.Start, "body", ignoreCase: false));
            Assert.IsNotNull(s.Selectors[2].SimpleSelectors[0].SelectorCombineOperator);
            Assert.IsTrue(tp.CompareTo(s.Selectors[2].SimpleSelectors[0].SelectorCombineOperator.Start, "+", ignoreCase: false));

            Assert.IsTrue(tp.CompareTo(s.Selectors[2].SimpleSelectors[1].Name.Start, "html", ignoreCase: false));
            Assert.IsNotNull(s.Selectors[2].SimpleSelectors[1].SelectorCombineOperator);
            Assert.IsTrue(tp.CompareTo(s.Selectors[2].SimpleSelectors[1].SelectorCombineOperator.Start, "~", ignoreCase: false));

            Assert.IsTrue(tp.CompareTo(s.Selectors[2].SimpleSelectors[2].Name.Start, "*", ignoreCase: false));
            Assert.IsNull(s.Selectors[2].SimpleSelectors[2].SelectorCombineOperator);
        }
Пример #12
0
        public void SelectorGroup_ParseTest2()
        {
            string        text = "A B, C ~ D, body + html foo, E+F, body {}";
            ITextProvider tp   = new StringTextProvider(text);
            TokenStream   ts   = Helpers.MakeTokenStream(tp);

            RuleSet ruleSet = new RuleSet();

            Assert.IsTrue(ruleSet.Parse(new ItemFactory(tp, null), tp, ts), "Valid CSS '{0}' parsed incorrectly", text);
            Assert.AreEqual(ruleSet.Selectors.Count, 5, "Selectors.Count not obtained correctly for CSS '{0}'", text);

            // Selector A B
            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[0].SimpleSelectors[0].Name.Start, "A", ignoreCase: false));
            Assert.IsNull(ruleSet.Selectors[0].SimpleSelectors[0].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[0].SimpleSelectors[1].Name.Start, "B", ignoreCase: false));
            Assert.IsNull(ruleSet.Selectors[0].SimpleSelectors[1].SelectorCombineOperator);

            // Selector C ~ D
            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[1].SimpleSelectors[0].Name.Start, "C", ignoreCase: false), "Selector C not parsed for CSS '{0}'", text);
            Assert.IsNotNull(ruleSet.Selectors[1].SimpleSelectors[0].SelectorCombineOperator, "SelectorCombineOperator not parsed for CSS '{0}'", text);
            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[1].SimpleSelectors[0].SelectorCombineOperator.Start, "~", ignoreCase: false), "SelectorCombineOperator \"~\" not parsed for CSS '{0}'", text);

            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[1].SimpleSelectors[1].Name.Start, "D", ignoreCase: false), "Selector D not parsed for CSS '{0}'", text);
            Assert.IsNull(ruleSet.Selectors[1].SimpleSelectors[1].SelectorCombineOperator, "SelectorCombineOperator after D found, when not present for CSS '{0}'", text);

            // body + html foo
            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[2].SimpleSelectors[0].Name.Start, "body", ignoreCase: false));
            Assert.IsNotNull(ruleSet.Selectors[2].SimpleSelectors[0].SelectorCombineOperator);
            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[2].SimpleSelectors[0].SelectorCombineOperator.Start, "+", ignoreCase: false));

            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[2].SimpleSelectors[1].Name.Start, "html", ignoreCase: false));
            Assert.IsNull(ruleSet.Selectors[2].SimpleSelectors[1].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[2].SimpleSelectors[2].Name.Start, "foo", ignoreCase: false));
            Assert.IsNull(ruleSet.Selectors[2].SimpleSelectors[2].SelectorCombineOperator);

            // Selector E+F
            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[3].SimpleSelectors[0].Name.Start, "E", ignoreCase: false));
            Assert.IsNotNull(ruleSet.Selectors[3].SimpleSelectors[0].SelectorCombineOperator);
            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[3].SimpleSelectors[0].SelectorCombineOperator.Start, "+", ignoreCase: false));

            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[3].SimpleSelectors[1].Name.Start, "F", ignoreCase: false));
            Assert.IsNull(ruleSet.Selectors[3].SimpleSelectors[1].SelectorCombineOperator);

            // Selector body
            Assert.IsTrue(tp.CompareTo(ruleSet.Selectors[4].SimpleSelectors[0].Name.Start, "body", ignoreCase: false));
            Assert.IsNull(ruleSet.Selectors[4].SimpleSelectors[0].SelectorCombineOperator);
        }
Пример #13
0
        public void MediaDirective_ParseTest()
        {
            string        text = "@media screen and (device-aspect-ratio: 16/9), projection and (color) { @page {margin: 3cm;} body { background:lime } }";
            ITextProvider tp   = new StringTextProvider(text);
            TokenStream   ts   = Helpers.MakeTokenStream(tp);

            MediaDirective md = new MediaDirective();

            Assert.IsTrue(md.Parse(new ItemFactory(tp, null), tp, ts));
            Assert.IsTrue(tp.CompareTo(md.Keyword.Start, "media", ignoreCase: false));
            Assert.AreEqual(2, md.MediaQueries.Count);

            Assert.IsTrue(md.MediaQueries[0] is MediaQuery);
            MediaQuery mq = md.MediaQueries[0] as MediaQuery;

            Assert.IsTrue(tp.CompareTo(mq.MediaType.Start, "screen", ignoreCase: false));
            Assert.AreEqual(1, mq.Expressions.Count);
            Assert.IsTrue(tp.CompareTo(mq.Expressions[0].MediaCombineOperator.Start, "and", ignoreCase: false));
            Assert.IsTrue(tp.CompareTo(mq.Expressions[0].MediaFeature.Start, "device-aspect-ratio", ignoreCase: false));
            Assert.IsNotNull(mq.Expressions[0].Colon);
            Assert.IsNotNull(mq.Expressions[0].CloseFunctionBrace);
            Assert.IsNotNull(tp.CompareTo(mq.Expressions[0].Values[0].Start, "16/9", ignoreCase: false));

            Assert.IsTrue(md.MediaQueries[1] is MediaQuery);
            mq = md.MediaQueries[1] as MediaQuery;
            Assert.IsNotNull(mq.Comma);
            Assert.IsTrue(tp.CompareTo(mq.MediaType.Start, "projection", ignoreCase: false));
            Assert.AreEqual(1, mq.Expressions.Count);
            Assert.IsTrue(tp.CompareTo(mq.Expressions[0].MediaCombineOperator.Start, "and", ignoreCase: false));
            Assert.IsTrue(tp.CompareTo(mq.Expressions[0].MediaFeature.Start, "color", ignoreCase: false));
            Assert.IsNull(mq.Expressions[0].Colon);
            Assert.IsNotNull(mq.Expressions[0].CloseFunctionBrace);
            Assert.AreEqual(0, mq.Expressions[0].Values.Count);

            Assert.IsNotNull(md.MediaBlock);
            Assert.IsTrue(md.MediaBlock is StyleSheet);
            Assert.AreEqual(4, md.MediaBlock.Children.Count);
            Assert.IsInstanceOfType(md.MediaBlock.Children[1], typeof(PageDirective));
            Assert.IsInstanceOfType(md.MediaBlock.Children[2], typeof(RuleSet));
            RuleSet rs = md.MediaBlock.Children[2] as RuleSet;

            Assert.IsTrue(tp.CompareTo(rs.Selectors[0].SimpleSelectors[0].Name.Start, "body", ignoreCase: false));
            Assert.IsTrue(tp.CompareTo(rs.Block.Declarations[0].PropertyName.Start, "background", ignoreCase: false));
            Assert.IsTrue(tp.CompareTo(rs.Block.Declarations[0].Values[0].Start, "lime", ignoreCase: false));
        }
Пример #14
0
        public void PageDirective_ParseTest()
        {
            string        text = "@page { }";
            ITextProvider tp   = new StringTextProvider(text);
            TokenStream   ts   = Helpers.MakeTokenStream(tp);
            PageDirective pd   = new PageDirective();

            Assert.IsTrue(pd.Parse(new ItemFactory(tp, null), tp, ts));

            text = "@page:left { }";
            tp   = new StringTextProvider(text);
            ts   = Helpers.MakeTokenStream(tp);
            pd   = new PageDirective();
            Assert.IsTrue(pd.Parse(new ItemFactory(tp, null), tp, ts));
            Assert.IsTrue(tp.CompareTo(pd.Keyword.Start, "page", ignoreCase: false));
            Assert.AreEqual("left", tp.GetText(pd.PseudoPage.Start, pd.PseudoPage.Length));
            Assert.IsNotNull(pd.Block.OpenCurlyBrace);
            Assert.IsNotNull(pd.Block.CloseCurlyBrace);

            text = "@page :right{ }";
            tp   = new StringTextProvider(text);
            ts   = Helpers.MakeTokenStream(tp);
            pd   = new PageDirective();
            Assert.IsTrue(pd.Parse(new ItemFactory(tp, null), tp, ts));
            Assert.IsTrue(tp.CompareTo(pd.Keyword.Start, "page", ignoreCase: false));
            Assert.AreEqual("right", tp.GetText(pd.PseudoPage.Start, pd.PseudoPage.Length));
            Assert.IsNotNull(pd.Block.OpenCurlyBrace);
            Assert.IsNotNull(pd.Block.CloseCurlyBrace);

            text = "@page foo:first{ }";
            tp   = new StringTextProvider(text);
            ts   = Helpers.MakeTokenStream(tp);
            pd   = new PageDirective();
            Assert.IsTrue(pd.Parse(new ItemFactory(tp, null), tp, ts));
            Assert.IsTrue(tp.CompareTo(pd.Keyword.Start, "page", ignoreCase: false));
            Assert.IsTrue(tp.CompareTo(pd.Identifier.Start, "foo", ignoreCase: false));
            Assert.AreEqual("first", tp.GetText(pd.PseudoPage.Start, pd.PseudoPage.Length));
            Assert.IsNotNull(pd.Block.OpenCurlyBrace);
            Assert.IsNotNull(pd.Block.CloseCurlyBrace);

            text = "@page :foo{ @top-left { } }";
            tp   = new StringTextProvider(text);
            ts   = Helpers.MakeTokenStream(tp);
            pd   = new PageDirective();
            Assert.IsTrue(pd.Parse(new ItemFactory(tp, null), tp, ts));
            Assert.AreEqual(1, pd.PageDirectiveBlock.Margins.Count);
            Assert.AreEqual(MarginDirectiveType.TopLeft, pd.PageDirectiveBlock.Margins[0].DirectiveType);
            Assert.IsTrue(tp.CompareTo(pd.PageDirectiveBlock.Margins[0].Keyword.Start, "top-left", ignoreCase: false));

            text = "@page";
            tp   = new StringTextProvider(text);
            ts   = Helpers.MakeTokenStream(tp);
            pd   = new PageDirective();
            Assert.IsTrue(pd.Parse(new ItemFactory(tp, null), tp, ts));
            Assert.IsNull(pd.Block);

            text = "@page :right{ @top-left { }";
            tp   = new StringTextProvider(text);
            ts   = Helpers.MakeTokenStream(tp);
            pd   = new PageDirective();
            Assert.IsTrue(pd.Parse(new ItemFactory(tp, null), tp, ts));
            Assert.AreEqual(1, pd.PageDirectiveBlock.Margins.Count);
            Assert.IsTrue(tp.CompareTo(pd.PageDirectiveBlock.Margins[0].Keyword.Start, "top-left", ignoreCase: false));
            Assert.IsNotNull(pd.PageDirectiveBlock.Margins[0].RuleBlock.OpenCurlyBrace);
            Assert.IsNotNull(pd.PageDirectiveBlock.Margins[0].RuleBlock.CloseCurlyBrace);
            Assert.IsNotNull(pd.Block.OpenCurlyBrace);
            Assert.IsNull(pd.Block.CloseCurlyBrace);
        }
Пример #15
0
        public void Selector_ParseTest()
        {
            string        text = "A+B C > D body + html ~ * foo {}";
            ITextProvider tp   = new StringTextProvider(text);
            TokenStream   ts   = Helpers.MakeTokenStream(tp);

            Selector s = new Selector();

            Assert.IsTrue(s.Parse(new ItemFactory(tp, null), tp, ts));
            Assert.AreEqual(8, s.Children.Count);
            Assert.AreEqual(8, s.SimpleSelectors.Count);

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[0].Name.Start, "A", ignoreCase: false));
            Assert.IsNotNull(s.SimpleSelectors[0].SelectorCombineOperator);
            Assert.AreEqual(CssTokenType.Plus, ((TokenItem)s.SimpleSelectors[0].SelectorCombineOperator).TokenType);

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[1].Name.Start, "B", ignoreCase: false));
            Assert.IsNull(s.SimpleSelectors[1].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[2].Name.Start, "C", ignoreCase: false));
            Assert.IsNotNull(s.SimpleSelectors[2].SelectorCombineOperator);
            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[2].SelectorCombineOperator.Start, ">", ignoreCase: false));

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[3].Name.Start, "D", ignoreCase: false));
            Assert.IsNull(s.SimpleSelectors[3].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[4].Name.Start, "body", ignoreCase: false));
            Assert.IsNotNull(s.SimpleSelectors[4].SelectorCombineOperator);
            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[4].SelectorCombineOperator.Start, "+", ignoreCase: false));

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[5].Name.Start, "html", ignoreCase: false));
            Assert.IsNotNull(s.SimpleSelectors[5].SelectorCombineOperator);
            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[5].SelectorCombineOperator.Start, "~", ignoreCase: false));

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[6].Name.Start, "*", ignoreCase: false));
            Assert.IsNull(s.SimpleSelectors[6].SelectorCombineOperator);

            Assert.IsTrue(tp.CompareTo(s.SimpleSelectors[7].Name.Start, "foo", ignoreCase: false));
            Assert.IsNull(s.SimpleSelectors[7].SelectorCombineOperator);

            Assert.IsTrue(s.IsValid);
        }