package com.github.sommeri.less4j.grammar; import static com.github.sommeri.less4j.grammar.GrammarAsserts.assertValid; import static com.github.sommeri.less4j.grammar.GrammarAsserts.assertValidSelector; import org.junit.Test; import com.github.sommeri.less4j.core.parser.ANTLRParser; import com.github.sommeri.less4j.core.parser.ANTLRParser.ParseResult; /** * Testing selectors parser. * * Note: strange things happen with EOF during unit tests, so I added a dummy * { to the test selectors. The generated lexer thinks that there should be * something after selector. That is true, but I want to test selector rule only. * * Note: CSS3 pseudoclasses and pseudoelements are not properly handled for now: * * https://developer.mozilla.org/en/CSS/:after * * selectors grammar http://www.w3.org/TR/css3-selectors/#gen-content * * http://www.w3.org/wiki/CSS3/Selectors#Pseudo-classes * * http://www.w3.org/TR/selectors/ * */ public class SelectorsGrammarTest { @Test public void emptyCombinator() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("h1 h2 {", null); assertValidSelector(result); } @Test public void spacelessCombinator() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("h1>h2 {", null); assertValidSelector(result); } @Test public void spacedCombinator() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("h1 + h2 {", null); assertValidSelector(result); } @Test public void notPseudo() { ANTLRParser compiler = new ANTLRParser(); String selector = "li:not(:only-child) { "; ANTLRParser.ParseResult result = compiler.parseSelector(selector, null); assertValidSelector(result); } @Test public void notNumber() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("class#id[attr=32]:not(1) {", null); assertValidSelector(result); } @Test public void notAttribute() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("p:not([class*=\"lead\"]) {", null); assertValidSelector(result); } @Test public void stylesheetWithMultipleFormulas() { String combined_stylesheet = "li:nth-child(4n+1),\n" + "li:nth-child(-5n),\n" + "li:nth-child(-n+2) {\n" + " color: white;\n" + "}"; ANTLRParser compiler = new ANTLRParser(); ParseResult result = compiler.parseStyleSheet(combined_stylesheet, null); assertValid(result); } @Test public void formulaAnb() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("li:nth-child(4n+1) {", null); assertValidSelector(result); } @Test public void formulaAnMinusb() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("li:nth-child(4n-1) {", null); assertValidSelector(result); } @Test public void formulaAn() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("li:nth-child(4n) {", null); assertValidSelector(result); } @Test public void formulaMinusAn() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("li:nth-child(-4n) {", null); assertValidSelector(result); } @Test public void formulaMinusN() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("li:nth-child(-n) {", null); assertValidSelector(result); } @Test public void formulaMinusNMinus() { ANTLRParser compiler = new ANTLRParser(); String selector = "li:nth-child(-n+2) {"; ANTLRParser.ParseResult result = compiler.parseSelector(selector, null); assertValidSelector(result); } @Test public void formulaEven() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("li:nth-child(even) {", null); assertValidSelector(result); } @Test public void formulaEvenUppercase() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("li:NTH-CHILD(EVEN) {", null); assertValidSelector(result); } @Test public void formulaOdd() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("li:nth-child(odd) {", null); assertValidSelector(result); } @Test public void formulaOddUppercase() { ANTLRParser compiler = new ANTLRParser(); ANTLRParser.ParseResult result = compiler.parseSelector("li:NTH-CHILD(ODD) {", null); assertValidSelector(result); } }