| /******************************************************************************* |
| * Copyright (c) 2009, 2013 David Green and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * David Green - initial API and implementation |
| *******************************************************************************/ |
| |
| package org.eclipse.mylyn.wikitext.parser.css; |
| |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.io.InputStreamReader; |
| import java.io.Reader; |
| import java.io.StringWriter; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import junit.framework.TestCase; |
| |
| /** |
| * @author David Green |
| */ |
| public class CssParserTest extends TestCase { |
| private CssParser parser; |
| |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| parser = new CssParser(); |
| } |
| |
| public void testDetectStyles() { |
| String css = "a: b and more; c: d ; e: fg; h i: j"; |
| String[] expectedRuleNames = new String[] { "a", "c", "e", "i" }; |
| String[] expectedRuleValues = new String[] { "b and more", "d", "fg", "j" }; |
| Iterator<CssRule> ruleIterator = parser.createRuleIterator(css); |
| int count = 0; |
| while (ruleIterator.hasNext()) { |
| CssRule rule = ruleIterator.next(); |
| ++count; |
| assertEquals(expectedRuleNames[count - 1], rule.name); |
| assertEquals(expectedRuleValues[count - 1], rule.value); |
| } |
| assertEquals(expectedRuleNames.length, count); |
| } |
| |
| public void testSimple() throws IOException { |
| |
| Stylesheet stylesheet = parser.parse(readFully(CssParserTest.class.getSimpleName() + "_0.css")); |
| assertNotNull(stylesheet); |
| assertEquals(25, stylesheet.getBlocks().size()); |
| } |
| |
| private String readFully(String resourceName) throws IOException { |
| InputStream stream = CssParserTest.class.getResourceAsStream(resourceName); |
| try { |
| Reader reader = new InputStreamReader(stream); |
| int i; |
| StringWriter writer = new StringWriter(); |
| while ((i = reader.read()) != -1) { |
| writer.write(i); |
| } |
| return writer.toString(); |
| } finally { |
| stream.close(); |
| } |
| } |
| |
| public void testSimpleId() { |
| Selector selector = parser.parseSelector("#id"); |
| assertNotNull(selector); |
| |
| assertEquals(IdSelector.class, selector.getClass()); |
| assertEquals("id", ((IdSelector) selector).getId()); |
| } |
| |
| public void testSimpleClass() { |
| Selector selector = parser.parseSelector(".className"); |
| assertNotNull(selector); |
| |
| assertEquals(CssClassSelector.class, selector.getClass()); |
| assertEquals("className", ((CssClassSelector) selector).getCssClass()); |
| } |
| |
| public void testSimpleElement() { |
| Selector selector = parser.parseSelector("body"); |
| assertNotNull(selector); |
| |
| assertEquals(NameSelector.class, selector.getClass()); |
| assertEquals("body", ((NameSelector) selector).getName()); |
| } |
| |
| public void testNumericElementName() { |
| Selector selector = parser.parseSelector("h1"); |
| assertNotNull(selector); |
| |
| assertEquals(NameSelector.class, selector.getClass()); |
| assertEquals("h1", ((NameSelector) selector).getName()); |
| } |
| |
| public void testCompoundIdElement() { |
| Selector selector = parser.parseSelector("#foo a"); |
| assertNotNull(selector); |
| |
| assertEquals(CompositeSelector.class, selector.getClass()); |
| |
| CompositeSelector compositeSelector = (CompositeSelector) selector; |
| |
| assertTrue(compositeSelector.isAnd()); |
| assertEquals(2, compositeSelector.getComponents().size()); |
| |
| Selector firstComponent = compositeSelector.getComponents().get(0); |
| assertEquals(DescendantSelector.class, firstComponent.getClass()); |
| |
| Selector ancestorSelector = ((DescendantSelector) firstComponent).getAncestorSelector(); |
| assertEquals(IdSelector.class, ancestorSelector.getClass()); |
| assertEquals("foo", ((IdSelector) ancestorSelector).getId()); |
| |
| Selector secondComponent = compositeSelector.getComponents().get(1); |
| assertEquals(NameSelector.class, secondComponent.getClass()); |
| assertEquals("a", ((NameSelector) secondComponent).getName()); |
| } |
| |
| public void testCompoundIdElement2() { |
| Selector selector = parser.parseSelector("#foo, a"); |
| assertNotNull(selector); |
| |
| assertEquals(CompositeSelector.class, selector.getClass()); |
| |
| CompositeSelector compositeSelector = (CompositeSelector) selector; |
| |
| assertFalse(compositeSelector.isAnd()); |
| assertEquals(2, compositeSelector.getComponents().size()); |
| |
| Selector firstComponent = compositeSelector.getComponents().get(0); |
| assertEquals(IdSelector.class, firstComponent.getClass()); |
| assertEquals("foo", ((IdSelector) firstComponent).getId()); |
| |
| Selector secondComponent = compositeSelector.getComponents().get(1); |
| assertEquals(NameSelector.class, secondComponent.getClass()); |
| assertEquals("a", ((NameSelector) secondComponent).getName()); |
| } |
| |
| public void testCompoundElementWithJoin() { |
| Selector selector = parser.parseSelector("table tr"); |
| assertNotNull(selector); |
| |
| assertEquals(CompositeSelector.class, selector.getClass()); |
| |
| CompositeSelector compositeSelector = (CompositeSelector) selector; |
| |
| assertTrue(compositeSelector.isAnd()); |
| assertEquals(2, compositeSelector.getComponents().size()); |
| |
| Selector firstComponent = compositeSelector.getComponents().get(0); |
| assertEquals(DescendantSelector.class, firstComponent.getClass()); |
| |
| Selector ancestorSelector = ((DescendantSelector) firstComponent).getAncestorSelector(); |
| assertEquals(NameSelector.class, ancestorSelector.getClass()); |
| assertEquals("table", ((NameSelector) ancestorSelector).getName()); |
| |
| Selector secondComponent = compositeSelector.getComponents().get(1); |
| assertEquals(NameSelector.class, secondComponent.getClass()); |
| assertEquals("tr", ((NameSelector) secondComponent).getName()); |
| } |
| |
| public void testCompoundElementUsingDot() { |
| Selector selector = parser.parseSelector("table.summaryTable"); |
| assertNotNull(selector); |
| |
| assertEquals(CompositeSelector.class, selector.getClass()); |
| |
| CompositeSelector compositeSelector = (CompositeSelector) selector; |
| |
| assertTrue(compositeSelector.isAnd()); |
| assertEquals(2, compositeSelector.getComponents().size()); |
| |
| Selector firstComponent = compositeSelector.getComponents().get(0); |
| assertEquals(NameSelector.class, firstComponent.getClass()); |
| assertEquals("table", ((NameSelector) firstComponent).getName()); |
| |
| Selector secondComponent = compositeSelector.getComponents().get(1); |
| assertEquals(CssClassSelector.class, secondComponent.getClass()); |
| assertEquals("summaryTable", ((CssClassSelector) secondComponent).getCssClass()); |
| } |
| |
| public void testCompoundElementUsingDotAndJoin() { |
| Selector selector = parser.parseSelector("table.summaryTable tr.a1"); |
| assertNotNull(selector); |
| |
| assertEquals(CompositeSelector.class, selector.getClass()); |
| |
| CompositeSelector compositeSelector = (CompositeSelector) selector; |
| |
| assertTrue(compositeSelector.isAnd()); |
| assertEquals(2, compositeSelector.getComponents().size()); |
| |
| } |
| |
| public void testComments() { |
| Stylesheet stylesheet = parser.parse("tr { /* font-size: 115%; */ font-size: 100%; } /* foo { sdf: sdf; } */"); |
| List<Block> blocks = stylesheet.getBlocks(); |
| assertEquals(1, blocks.size()); |
| Block block = blocks.get(0); |
| List<CssRule> rules = block.getRules(); |
| assertEquals(1, rules.size()); |
| CssRule rule = rules.get(0); |
| assertEquals("font-size", rule.name); |
| assertEquals("100%", rule.value); |
| } |
| } |