// 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 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'")); } }