blob: 569cd78a02018f3058f80a7a8836775a955dff58 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.safecss.shared;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Clear;
import com.google.gwt.dom.client.Style.Display;
import com.google.gwt.dom.client.Style.TextAlign;
import com.google.gwt.dom.client.Style.TextDecoration;
import com.google.gwt.dom.client.Style.TextJustify;
import com.google.gwt.dom.client.Style.TextOverflow;
import com.google.gwt.dom.client.Style.TextTransform;
import com.google.gwt.dom.client.Style.WhiteSpace;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.gwt.safehtml.shared.SafeUri;
import com.google.gwt.safehtml.shared.UriUtils;
/**
* GWT Unit tests for {@link SafeStylesUtils}.
*/
public class GwtSafeStylesUtilsTest extends GWTTestCase {
static final String INVALID_STYLE_NAME = "contains;semicolon";
static final String[] INVALID_STYLE_NAMES = {
null, "", ";startsWithSemicolon", "endsWithSemicolon;", "contains;semicolon",
"--starts-with-double-hyphen", "0starts-with-digit", "-0starts-with-hyphen-digit",
"contains:colon"};
static final String INVALID_STYLE_VALUE = "contains;semicolon";
static final String[] INVALID_STYLE_VALUES = {
null, "", "unmatched}close-bracket", "unmatched{open-bracket", "mismatched[bracket)",
";startsWithSemicolon", "endsWithSemicolon;", "contains;semicolon",
"almost-escaped\\\\;semi-colon", "almost-escaped\\\\:colon", "unmatched'singlequote",
"unmatched\"doublequote", "url(http://withUnmatched(Paren)", "url(http://unterminated",
"end-in-escape-character\\"};
static final String[] VALID_STYLE_NAMES = {
"simple", "one-hyphen", "has-two-hyphens", "-starts-with-hyphen", "_startsWithUnderscore",
"endsWithUnderscore_", "contains_underscore", "contains--double-hyphen", "contains-1-digit"};
static final String[] VALID_STYLE_VALUES = {
"simple", "one-hyphen", "has-two-hyphens", "-starts-with-hyphen", "[braces]",
"curly{brackets}", "paren(thes)es", "(nested[pair]ables)",
"(sibling)parenthesis{and[braces]}", "semicolon-in'single;quote'",
"semicolon-in\"double;quote\"", "unmatched'in quote}'", "unmatched\"in [double quote\"",
"escaped\\;semi-colon", "escaped\\:colon", "url(http://localhost)",
"url('http://withSingleQuotes')", "url(\"http://withDoubleQuotes\")",
"url(http://withSemiColon;)", "url(http://withUnmatchedBracket{[)",
"url(http://withUnmatchedCloseBracket}])", "end-in-escaped-backslash\\\\", "u-near-end-u",
"url-near-end-url", "absolute"};
private static Boolean isAssertionEnabled;
/**
* Check if assertions are enabled.
*
* @return true if enabled, false if not
*/
static boolean isAssertionEnabled() {
if (isAssertionEnabled == null) {
try {
assert false;
isAssertionEnabled = false;
} catch (AssertionError e) {
isAssertionEnabled = true;
}
}
return isAssertionEnabled;
}
@Override
public String getModuleName() {
return "com.google.gwt.safecss.SafeCss";
}
public void testForBackgroundImage() {
SafeUri uri = UriUtils.fromSafeConstant("http://localhost");
assertEquals("background-image:url(\"http://localhost\");", SafeStylesUtils.forBackgroundImage(
uri).asString());
}
public void testForClear() {
assertEquals("clear:both;", SafeStylesUtils.forClear(Clear.BOTH).asString());
assertEquals("clear:left;", SafeStylesUtils.forClear(Clear.LEFT).asString());
assertEquals("clear:none;", SafeStylesUtils.forClear(Clear.NONE).asString());
assertEquals("clear:right;", SafeStylesUtils.forClear(Clear.RIGHT).asString());
}
public void testForDisplay() {
assertEquals("display:none;", SafeStylesUtils.forDisplay(Display.NONE).asString());
}
public void testForTextAlign() {
assertEquals("text-align:center;", SafeStylesUtils.forTextAlign(TextAlign.CENTER));
assertEquals("text-align:justify;", SafeStylesUtils.forTextAlign(TextAlign.JUSTIFY));
assertEquals("text-align:left;", SafeStylesUtils.forTextAlign(TextAlign.LEFT));
assertEquals("text-align:right;", SafeStylesUtils.forTextAlign(TextAlign.RIGHT));
}
public void testForTextDecoration() {
assertEquals("text-decoration:blink;", SafeStylesUtils.forTextDecoration(TextDecoration.BLINK));
assertEquals("text-decoration:line-through;", SafeStylesUtils.forTextDecoration(TextDecoration.LINE_THROUGH));
assertEquals("text-decoration:none;", SafeStylesUtils.forTextDecoration(TextDecoration.NONE));
assertEquals("text-decoration:overline;", SafeStylesUtils.forTextDecoration(TextDecoration.OVERLINE));
assertEquals("text-decoration:underline;", SafeStylesUtils.forTextDecoration(TextDecoration.UNDERLINE));
}
public void testForTextJustify() {
assertEquals("text-justify:auto;", SafeStylesUtils.forTextJustify(TextJustify.AUTO));
assertEquals("text-justify:distribute;", SafeStylesUtils.forTextJustify(TextJustify.DISTRIBUTE));
assertEquals("text-justify:inter-cluster;", SafeStylesUtils.forTextJustify(TextJustify.INTER_CLUSTER));
assertEquals("text-justify:inter-ideograph;", SafeStylesUtils.forTextJustify(TextJustify.INTER_IDEOGRAPH));
assertEquals("text-justify:inter-word;", SafeStylesUtils.forTextJustify(TextJustify.INTER_WORD));
assertEquals("text-justify:kashida;", SafeStylesUtils.forTextJustify(TextJustify.KASHIDA));
assertEquals("text-justify:none;", SafeStylesUtils.forTextJustify(TextJustify.NONE));
}
public void testForTextOverflow() {
assertEquals("text-overflow:clip;", SafeStylesUtils.forTextOverflow(TextOverflow.CLIP));
assertEquals("text-overflow:ellipsis;", SafeStylesUtils.forTextOverflow(TextOverflow.ELLIPSIS));
}
public void testForTextTransform() {
assertEquals("text-transform:capitalize;", SafeStylesUtils.forTextTransform(TextTransform.CAPITALIZE));
assertEquals("text-transform:lowercase;", SafeStylesUtils.forTextTransform(TextTransform.LOWERCASE));
assertEquals("text-transform:none;", SafeStylesUtils.forTextTransform(TextTransform.NONE));
assertEquals("text-transform:uppercase;", SafeStylesUtils.forTextTransform(TextTransform.UPPERCASE));
}
public void testForWhiteSpace() {
assertEquals(
"white-space:normal;", SafeStylesUtils.forWhiteSpace(WhiteSpace.NORMAL).asString());
assertEquals(
"white-space:nowrap;", SafeStylesUtils.forWhiteSpace(WhiteSpace.NOWRAP).asString());
assertEquals("white-space:pre;", SafeStylesUtils.forWhiteSpace(WhiteSpace.PRE).asString());
assertEquals(
"white-space:pre-line;", SafeStylesUtils.forWhiteSpace(WhiteSpace.PRE_LINE).asString());
assertEquals(
"white-space:pre-wrap;", SafeStylesUtils.forWhiteSpace(WhiteSpace.PRE_WRAP).asString());
}
public void testForZIndex() {
assertEquals("z-index: 5;", SafeStylesUtils.forZIndex(5).asString());
}
public void testFromTrustedNameAndValue() {
assertEquals("name:value;", SafeStylesUtils.fromTrustedNameAndValue("name", "value").asString());
assertEquals("name-top:value;", SafeStylesUtils.fromTrustedNameAndValue("name-top", "value")
.asString());
assertEquals("-name-top:value;", SafeStylesUtils.fromTrustedNameAndValue("-name-top", "value")
.asString());
assertEquals("_name_:value;", SafeStylesUtils.fromTrustedNameAndValue("_name_", "value")
.asString());
assertEquals("name:1px solid red;", SafeStylesUtils.fromTrustedNameAndValue("name",
"1px solid red").asString());
assertEquals("name:url('test.png');", SafeStylesUtils.fromTrustedNameAndValue("name",
"url('test.png')").asString());
assertEquals("name:url(\"test.png\");", SafeStylesUtils.fromTrustedNameAndValue("name",
"url(\"test.png\")").asString());
}
public void testFromTrustedNameAndValueInvalidName() {
if (GWT.isProdMode()) {
// fromTrustedNameAndValue only catches errors in dev mode.
return;
}
for (String s : INVALID_STYLE_NAMES) {
boolean caught = false;
try {
SafeStylesUtils.fromTrustedNameAndValue(s, "value");
} catch (IllegalArgumentException e) {
// Expected.
caught = true;
} catch (AssertionError e) {
// Expected.
caught = true;
}
if (!caught) {
fail("Expected an exception for invalid style name: '" + s + "'");
}
}
}
public void testFromTrustedNameAndValueInvalidValue() {
if (GWT.isProdMode()) {
// fromTrustedNameAndValue only catches errors in dev mode.
return;
}
boolean caught = false;
for (String s : INVALID_STYLE_VALUES) {
try {
SafeStylesUtils.fromTrustedNameAndValue("name", s);
} catch (IllegalArgumentException e) {
// Expected.
caught = true;
} catch (AssertionError e) {
// Expected.
caught = true;
}
if (!caught) {
fail("Expected an exception for invalid style value: '" + s + "'");
}
}
}
public void testFromTrustedNameAndValueValidName() {
if (GWT.isProdMode()) {
// fromTrustedNameAndValue only catches errors in dev mode.
return;
}
for (String s : VALID_STYLE_NAMES) {
try {
SafeStyles styles = SafeStylesUtils.fromTrustedNameAndValue(s, "value");
assertEquals(s + ":value;", styles);
} catch (Exception e) {
fail("Unexpected exception thrown for valid style name: '" + s + "'.\n" + e.getMessage());
}
}
}
public void testFromTrustedNameAndValueValidValue() {
if (GWT.isProdMode()) {
// fromTrustedNameAndValue only catches errors in dev mode.
return;
}
for (String s : VALID_STYLE_VALUES) {
try {
SafeStyles styles = SafeStylesUtils.fromTrustedNameAndValue("name", s);
assertEquals("name" + ":" + s + ";", styles);
} catch (Exception e) {
fail("Unexpected exception thrown for valid style value: '" + s + "'.\n" + e.getMessage());
}
}
}
public void testFromTrustedString() {
assertEquals("name:value;", SafeStylesUtils.fromTrustedString("name:value;"));
}
private void assertEquals(String cssValue, SafeStyles safeStyles) {
assertEquals(cssValue, safeStyles.asString());
}
}