blob: 914216d5a521f3229f725af33ed1d64cedeabc9c [file] [log] [blame]
// Copyright (c) 2011, Mike Samuel
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
//
// Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// Neither the name of the OWASP nor the names of its contributors may
// be used to endorse or promote products derived from this software
// without specific prior written permission.
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
// COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
package org.owasp.html;
import java.util.List;
import org.junit.Test;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import junit.framework.TestCase;
public class CssGrammarTest extends TestCase {
@Test
public static final void testLex() throws Exception {
CssTokens tokens = CssTokens.lex(Joiner.on('\n').join(
"/* A comment */",
"words with-dashes #hashes .dots. -and-leading-dashes",
"quantities: 3px 4ex -.5pt 12.5%",
"punctuation: { ( } / , ;",
"[ url( http://example.com )",
"rgb(255, 127, 127)",
"'strings' \"oh \\\"my\" 'foo bar'",
""));
List<String> actualTokens = Lists.newArrayList();
for (CssTokens.TokenIterator it = tokens.iterator(); it.hasNext();) {
CssTokens.TokenType type = it.type();
String token = it.next();
if (!" ".equals(token)) {
actualTokens.add(token + ":" + type.name());
}
}
assertEquals(
Joiner.on('\n').join(
// "/* A comment */", // Comments are elided.
"words:IDENT",
"with-dashes:IDENT",
"#hashes:HASH_ID",
".dots:DOT_IDENT",
".:DELIM",
"-and-leading-dashes:IDENT",
"quantities:IDENT",
"::COLON",
"3px:DIMENSION",
"4ex:DIMENSION",
"-0.5pt:DIMENSION",
"12.5%:PERCENTAGE",
"punctuation:IDENT",
"::COLON",
"{:LEFT_CURLY",
"(:LEFT_PAREN", // Explicit
"):RIGHT_PAREN", // Implicit closing bracket to keep balance.
"}:RIGHT_CURLY",
"/:DELIM",
",:COMMA",
";:SEMICOLON",
"[:LEFT_SQUARE",
"url('http://example.com'):URL",
"rgb(:FUNCTION",
"255:NUMBER",
",:COMMA",
"127:NUMBER",
",:COMMA",
"127:NUMBER",
"):RIGHT_PAREN",
"'strings':STRING",
"'oh \\22my':STRING",
"'foo bar':STRING",
"]:RIGHT_SQUARE"
),
Joiner.on('\n').join(actualTokens));
}
@Test
public static final void testCssContent() {
assertEquals("", CssGrammar.cssContent(""));
assertEquals("azimuth", CssGrammar.cssContent("\\61zimuth"));
assertEquals("table-cell", CssGrammar.cssContent("t\\61\tble-cell"));
assertEquals("foo", CssGrammar.cssContent("foo"));
assertEquals("foo", CssGrammar.cssContent("'foo'"));
assertEquals("foo", CssGrammar.cssContent("\"foo\""));
assertEquals("'", CssGrammar.cssContent("'"));
assertEquals("\"", CssGrammar.cssContent("\""));
assertEquals("\"\"", CssGrammar.cssContent("\"\\22\\22\""));
assertEquals("\"\"", CssGrammar.cssContent("\"\\22 \\22\""));
assertEquals("\"\"", CssGrammar.cssContent("\\22\\22"));
assertEquals("\\", CssGrammar.cssContent("'\\\\'"));
assertEquals("\n", CssGrammar.cssContent("'\\a'"));
}
}