/*******************************************************************************
* Copyright (c) 2004, 2008 John Krasnay and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* John Krasnay - initial API and implementation
*******************************************************************************/
package test.net.sf.vex.css;
import java.net.URL;
import junit.framework.TestCase;
import net.sf.vex.css.Rule;
import net.sf.vex.css.StyleSheet;
import net.sf.vex.css.StyleSheetReader;
import net.sf.vex.dom.Document;
import net.sf.vex.dom.Element;
import net.sf.vex.dom.RootElement;
/**
* Test rule matching.
*/
public class RuleTest extends TestCase {
public void testRuleMatching() throws Exception {
URL url = RuleTest.class.getResource("testRules.css");
StyleSheetReader reader = new StyleSheetReader();
reader.setSource(StyleSheet.SOURCE_USER);
StyleSheet ss = reader.read(url);
Rule[] rules = ss.getRules();
RootElement a = new RootElement("a");
Element b = new Element("b");
Element c = new Element("c");
Element d = new Element("d");
Element e = new Element("e");
Element f = new Element("f");
b.setAttribute("color", "blue");
c.setAttribute("color", "blue red");
d.setAttribute("color", "gree blue red");
e.setAttribute("color", "red blue");
f.setAttribute("color", "bluered");
Document doc = new Document(a);
doc.insertElement(1, b);
doc.insertElement(2, c);
doc.insertElement(3, d);
doc.insertElement(4, e);
doc.insertElement(5, f);
// /* 0 */ c { }
Rule rule = rules[0];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertTrue(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 1 */ b c { }
rule = rules[1];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertTrue(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 2 */ b d { }
rule = rules[2];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertFalse(rule.matches(c));
assertTrue(rule.matches(d));
assertFalse(rule.matches(e));
// /* 3 */ other b c { }
rule = rules[3];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 4 */ other b d { }
rule = rules[4];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 5 */ a c e { }
rule = rules[5];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertTrue(rule.matches(e));
// /* 6 */ c a e { }
rule = rules[6];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 7 */ * { }
rule = rules[7];
assertTrue(rule.matches(a));
assertTrue(rule.matches(b));
assertTrue(rule.matches(c));
assertTrue(rule.matches(d));
assertTrue(rule.matches(e));
// /* 8 */ *[color]
rule = rules[8];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertTrue(rule.matches(c));
assertTrue(rule.matches(d));
assertTrue(rule.matches(e));
// /* 9 */ a[color]
rule = rules[9];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 10 */ b[color]
rule = rules[10];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 11 */ c[color]
rule = rules[11];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertTrue(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 12 */ d[color]
rule = rules[12];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertFalse(rule.matches(c));
assertTrue(rule.matches(d));
assertFalse(rule.matches(e));
// /* 13 */ *[color=blue]
rule = rules[13];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 14 */ a[color=blue]
rule = rules[14];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 15 */ b[color=blue]
rule = rules[15];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 16 */ b[color='blue']
rule = rules[16];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 17 */ b[color="blue"]
rule = rules[17];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 18 */ c[color=blue]
rule = rules[18];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 19 */ a * { }
rule = rules[19];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertTrue(rule.matches(c));
assertTrue(rule.matches(d));
assertTrue(rule.matches(e));
// /* 20 */ a > * { }
rule = rules[20];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 21 */ a *[color] { }
rule = rules[21];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertTrue(rule.matches(c));
assertTrue(rule.matches(d));
assertTrue(rule.matches(e));
// /* 22 */ a > *[color] { }
rule = rules[22];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertFalse(rule.matches(c));
assertFalse(rule.matches(d));
assertFalse(rule.matches(e));
// /* 23 */ *[color~=blue] { }
rule = rules[23];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertTrue(rule.matches(c));
assertTrue(rule.matches(d));
assertTrue(rule.matches(e));
assertFalse(rule.matches(f));
//
// Rules that test class conditions
//
b.setAttribute("class", "foo");
c.setAttribute("class", "foo bar");
d.setAttribute("class", "bar");
// /* 24 */ .foo { }
rule = rules[24];
assertFalse(rule.matches(a));
assertTrue(rule.matches(b));
assertTrue(rule.matches(c));
assertFalse(rule.matches(d));
// /* 25 */ .foo.bar { }
rule = rules[25];
assertFalse(rule.matches(a));
assertFalse(rule.matches(b));
assertTrue(rule.matches(c));
assertFalse(rule.matches(d));
}
}