/*
* Copyright 2009 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.common.css.compiler.passes;
/**
* Tests the compact printer visitor.
* TODO(oana): Remove definitions from these tests.
*
* @author oana@google.com (Oana Florescu)
* @author fbenz@google.com (Florian Benz)
*/
public class CompactPrinterTest extends AbstractCompactPrinterTest {
public void testEmptyRuleset1() throws Exception {
assertCompactPrintedResult("foo{}", "foo {}");
}
public void testEmptyRuleset2() throws Exception {
assertCompactPrintedResult("bar{}", "bar {}");
}
public void testEmptyRuleset3() {
assertCompactPrintedResult("foo,bar{}", "foo, bar {\n}\n");
}
public void testEmptyRuleset4() {
assertCompactPrintedResult("foo,.bar{}", "foo, .bar {}");
assertCompactPrintedResult("foo,.bar:hover{}", "foo, .bar:hover {}");
}
public void testEmptyRulesetFancyRefiner() {
assertCompactPrintedResult("foo,.bar:hover{}", "foo, .bar:hover {}");
}
public void testRuleset1() {
assertCompactPrintedResult(
"foo,.bar{color:red}", "foo, .bar {color: red;}");
}
public void testRuleset2() {
assertCompactPrintedResult(
"foo,.bar{color:red;background-image:url('http://s')}",
lines("foo, .bar {",
"color: red;",
"background-image: url('http://s');",
"}"));
}
public void testRuleset3() {
assertCompactPrintedResult(
".foo .bar{color:red;background-image:url('http://s')}",
lines(".foo .bar {",
"color: red;",
"background-image: url('http://s');",
"}"));
}
public void testRuleset4() {
assertCompactPrintedResult(
".foo .bar .foobar{color:red;background-image:url('http://s')}",
lines(".foo .bar .foobar {",
"color: red;",
"background-image: url('http://s');",
"}",
""));
}
public void testRuleset5() {
assertCompactPrintedResult(
".foo:hover .bar+.foobar{color:red;background-image:url('http://s')}",
lines(".foo:hover .bar+.foobar {",
"color: red;",
"background-image: url('http://s');",
"}"));
}
public void testRuleset6() {
assertCompactPrintedResult(
".CSS_RULE{background:generate(COLOR,2px);border:BORDER}",
lines("@def COLOR red;",
"@def BORDER border(COLOR, 3px);",
".CSS_RULE {",
" background: generate(COLOR, 2px);",
" border: BORDER;",
"}"));
}
public void testConditionalBlock() {
assertCompactPrintedResult(
"",
lines("@def COLOR red;",
"@if COND_1 {",
" .CSS_RULE {",
" foo: bar;",
" }",
"}"));
}
public void testDefinitions1() {
assertCompactPrintedResult(
lines(""),
lines("@def COLOR red;",
"@def BORDER 2px;"));
}
public void testDefinitions2() {
assertCompactPrintedResult(
"body,td,input,textarea,select{margin:0;" +
"font-family:APP_FONT_FACE}" +
"td{padding:0}" +
"input,textarea,select{font-size:APP_CAPTION_FONT_SIZE}",
lines("@def APP_FONT_FACE arial sans-serif;",
"@def APP_CAPTION_FONT_SIZE 100%;",
"body, td, input, textarea, select {",
" margin:0;",
" font-family: APP_FONT_FACE;",
"}",
"td {",
" padding: 0;",
"}",
"input, textarea, select {",
" font-size: APP_CAPTION_FONT_SIZE;",
"}"));
}
public void testDefinitions3() {
assertCompactPrintedResult(
".CSS_RULE{background:CORNER_BG;filter:alpha(opacity=70)}",
lines(
"@def A red;",
"@def B 3px;",
"@def C 1;",
"@def CORNER_BG gssFunction(A, B, C);",
".CSS_RULE {",
" background: CORNER_BG;",
" filter: alpha(opacity=70);",
"}"));
}
public void testImport() {
assertNewCompactPrintedResult(
"@import 'a.css';.CSS_RULE{foo:bar}",
lines(
"@import 'a.css';",
".CSS_RULE {",
" foo: bar;",
"}",
"@def COLOR blue;"));
}
public void testMedia() {
assertCompactPrintedResult(
"@media print{.CSS_RULE{foo:bar}}",
lines(
"@media print {",
" .CSS_RULE {",
" foo: bar;",
" }",
"}",
"@def COLOR blue;"));
}
public void testStarPropertyHack() {
assertCompactPrintedResult(
".myClass{*height:14px}",
lines(
".myClass {",
"*height: 14px;",
"}"));
}
public void testIeRect() {
// Non-standard IE workaround.
assertCompactPrintedResult(
".a{clip:rect(0 0 0 0)}",
lines(
".a {",
"clip: rect(0 0 0 0);",
"}"));
}
public void testFont() {
assertCompactPrintedResult(
".a{font:9px verdana,helvetica,arial,san-serif}",
lines(
".a {",
" font: 9px verdana, helvetica, arial, san-serif;",
"}"));
}
public void testMediaQuery() {
assertNewCompactPrintedResult(
"@media screen,print{}",
"@media screen, print {}");
assertNewCompactPrintedResult(
"@media screen and (-webkit-min-device-pixel-ratio:0){}",
"@media screen and (-webkit-min-device-pixel-ratio:0){}");
assertNewCompactPrintedResult(
"@media all and (max-height:300px){}",
"@media all and ( max-height: 300px ){}");
assertNewCompactPrintedResult(
"@media all and (aspect-ratio:3/4){}",
"@media all and ( aspect-ratio: 3 / 4 ){}");
assertNewCompactPrintedResult(
"@media all and (aspect-ratio:3/4){}",
"@media all and (aspect-ratio: 3 /4 ){}");
assertNewCompactPrintedResult(
"@media screen and (device-width:800px){}",
"@media screen and (device-width:800px){}");
assertNewCompactPrintedResult(
"@media screen and (device-width:800px),print{}",
"@media screen and (device-width:800px), print {}");
assertNewCompactPrintedResult(
"@media screen and (device-width:800px),tv and (scan:progressive),"
+ "handheld and (grid) and (max-width:15em){}",
"@media screen and (device-width: 800px), "
+ "tv and (scan: progressive), "
+ "handheld and (grid) and (max-width: 15em) {}");
}
public void testMediaQueryPage() {
assertNewCompactPrintedResult(
"@media print{.CLASS{width:50%}@page{size:8.5in 11in}}",
lines(
"@media print {",
" .CLASS {",
" width: 50%;",
" }",
" @page {",
" size: 8.5in 11in;",
" }",
"}"));
}
public void testWebkitKeyframes1() {
assertNewCompactPrintedResult(
"@-webkit-keyframes bounce{from{left:0px}to{left:200px}}",
lines("@-webkit-keyframes bounce {",
"from { left: 0px; }",
"to { left: 200px; } }"));
}
public void testWebkitKeyframes2() {
assertNewCompactPrintedResult(
"@-webkit-keyframes pulse{0%{}33.33%{}100%{}}",
lines("@-webkit-keyframes pulse {",
"0% {}",
"33.33% {}",
"100% {}",
"}"));
}
public void testRefiners() {
assertNewCompactPrintedResult("foo:bar{}", "foo:bar {}");
assertNewCompactPrintedResult("foo::bar{}", "foo::bar {}");
assertNewCompactPrintedResult("foo:bar(ident){}", "foo:bar( ident ) {}");
assertNewCompactPrintedResult("foo:bar(2n+1){}", "foo:bar( 2n+1 ) {}");
assertNewCompactPrintedResult("button:not([DISABLED]){}",
"button:not( [DISABLED] ) {}");
assertNewCompactPrintedResult("*:not(:link):not(:visited){}",
"*:not( :link ):not( :visited ) {}");
}
public void testPageRule() {
assertNewCompactPrintedResult(
"@page{a:b}",
"@page{a:b}");
}
public void testPagePseudoClass1() {
assertNewCompactPrintedResult(
"@page :left{a:b}",
"@page :left { a:b }");
}
public void testPagePseudoClass2() {
assertNewCompactPrintedResult(
"@page CompanyLetterHead:first{a:b}",
"@page CompanyLetterHead:first { a:b }");
}
public void testPageInMedia() {
assertNewCompactPrintedResult(
"@media print{@page{a:b}}",
"@media print { @page{ a:b } }");
}
public void testPageSelector() {
assertNewCompactPrintedResult(
"@media print{@page{@bottom-right-corner{a:b}}}",
"@media print { @page { @bottom-right-corner { a:b } } }");
}
public void testFontFace1() {
// Example taken from http://www.w3.org/TR/css3-fonts/#src-desc.
assertNewCompactPrintedResult(
"@font-face{font-family:MyGentium;"
+ "src:local(Gentium),url(Gentium.ttf)}",
lines(
"@font-face {",
" font-family: MyGentium;",
" src: local(Gentium), url(Gentium.ttf);",
"}"));
}
public void testFontFace2() {
// Example taken from http://www.w3.org/TR/css3-fonts/#src-desc.
assertNewCompactPrintedResult(
"@font-face{font-family:Headline;"
+ "src:local(Futura-Medium),"
+ "url(fonts.svg#MyGeometricModern) format(\"svg\")}",
lines(
"@font-face {",
" font-family: Headline;",
" src: local(Futura-Medium),",
" url(fonts.svg#MyGeometricModern) format(\"svg\");",
"}"));
}
public void testAlphaImageLoader() throws Exception {
assertNewCompactPrintedResult(
".CSS_CW_MUC_BUBBLE_BOTTOM_LEFT_ANCHOR{filter:"
+ "progid:DXImageTransform.Microsoft.AlphaImageLoader("
+ "src='images/muc_left_anchor_bubble_bot.png',sizingMethod='crop')}",
lines(
".CSS_CW_MUC_BUBBLE_BOTTOM_LEFT_ANCHOR {",
" filter: progid:DXImageTransform.Microsoft.AlphaImageLoader("
+ "src = 'images/muc_left_anchor_bubble_bot.png',"
+ " sizingMethod = 'crop');",
"}",
""));
}
public void testYouTube() throws Exception {
assertNewCompactPrintedResult(
".test{"
+ "background:-webkit-linear-gradient(left,rgba(0,0,0,.12),"
+ "rgba(0,0,0,.08) 1px,rgba(0,0,0,.08) 1px,rgba(0,0,0,0) 30px,"
+ "transparent 100%)"
+ "}",
lines(
".test {",
" background: -webkit-linear-gradient(left, rgba(0,0,0,.12),"
+ " rgba(0,0,0,.08) 1px, rgba(0,0,0,.08) 1px,rgba(0,0,0,0) 30px,"
+ "transparent 100%);",
"}"));
}
public void testRemovesComments() throws Exception {
assertNewCompactPrintedResult(
".foo{}.bar{color:red}",
lines(
"/* Goodbye world! */",
".foo {",
"}",
"/*! I'm important. */",
".bar {",
" color: red;",
"}"));
}
public void testPreservesImportantCommentsWhenSet() throws Exception {
preserveMarkedComments = true;
assertNewCompactPrintedResult(
".foo{}\n/*! I'm important. */\n.bar{color:red}",
lines(
"/* Goodbye world! */",
".foo {",
"}",
"/*! I'm important. */",
".bar {",
" color: red;",
"}"));
}
public void testPreservesImportantCommentsWhenSet2() throws Exception {
preserveMarkedComments = true;
assertNewCompactPrintedResult(
".foo{}\n/* I'm @license */\n.bar{color:red}",
lines(
"/* Goodbye world! */",
".foo {",
"}",
"/* I'm @license */",
".bar {",
" color: red;",
"}"));
}
public void testPreservesImportantCommentsWhenSet3() throws Exception {
preserveMarkedComments = true;
assertNewCompactPrintedResult(
".foo{}\n/* I'm @preserve */\n.bar{color:red}",
lines(
"/* Goodbye world! */",
".foo {",
"}",
"/* I'm @preserve */",
".bar {",
" color: red;",
"}"));
}
public void testPreservesMultipleImportantCommentsWhenSet() throws Exception {
preserveMarkedComments = true;
assertNewCompactPrintedResult(
"\n/* I'm @preserve */\n.foo{}\n/*! Save me *//* @license hi */\n.bar{color:red}",
lines(
"/* I'm @preserve */",
"/* Goodbye world! */",
".foo {",
"}",
"/*! Save me *//* ! don't save me *//* @license hi */",
".bar {",
" color: red;",
"}"));
}
}