/* * Copyright 2014 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.resources.gss; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import com.google.gwt.core.ext.GeneratorContext; import com.google.gwt.core.ext.typeinfo.TypeOracle; import com.google.gwt.resources.ext.ResourceContext; import com.google.gwt.thirdparty.common.css.compiler.ast.CssTree; import com.google.gwt.thirdparty.common.css.compiler.ast.ErrorManager; import com.google.gwt.thirdparty.common.css.compiler.ast.GssFunction; import com.google.gwt.thirdparty.common.css.compiler.ast.MutatingVisitController; import com.google.gwt.thirdparty.common.css.compiler.passes.CreateConditionalNodes; import com.google.gwt.thirdparty.common.css.compiler.passes.CreateStandardAtRuleNodes; import com.google.gwt.thirdparty.common.css.compiler.passes.ResolveCustomFunctionNodes; import java.util.HashSet; import java.util.Map; /** * Test for {@link CssPrinter}. */ public class CssPrinterTest extends BaseGssTest { public void testWrapCssInValidJavaString() { assertPrintedResult("(\".foo{width:15px}\")", lines( ".foo {", " width:15px;", "}" )); } public void testDontPrintExternalAtRule() { assertPrintedResult("(\".foo{width:15px}\")", lines( "@external foo;", ".foo {", " width:15px;", "}" )); } public void testRuntimeConditionalNode() { String expectedCss = "((com.foo.BAR) ? (\".foo{color:black}\") + (" + "(com.foo.BAR2) ? (\".foo{color:white}\") : (\".foo{color:gray}\"))" + " : (com.foo.foo()) ? (\".foo{color:blue}\")" + " : (\".foo{color:yellow}\"))"; assertPrintedResult(expectedCss, lines( "@if (eval('com.foo.BAR')) {", " .foo {", " color: black;", " }", "", " @if (eval('com.foo.BAR2')) {", " .foo {", " color: white;", " }", " }", " @else {", " .foo {", " color: gray;", " }", " }", "}", "@elseif (eval('com.foo.foo()')) {", " .foo {", " color: blue;", " }", "}", "@else {", " .foo {", " color:yellow", " }", "}" )); } public void testCssDotPathNodePrint() { assertPrintedResult("(\".foo{width:\" + (image().getWidth() + \"px\") + \"}\")", lines( ".foo {", " width: value('image.getWidth', 'px');", "}" )); } public void testCssJavaExpressionNodePrint() { assertPrintedResult("(\".foo{width:\" " + "+ (com.foo.bar.WIDTH) " + "+ \";height:\" " + "+ (com.foo.bar.height()) " + "+ \"}\")", lines( ".foo {", " width: eval('com.foo.bar.WIDTH');", " height: eval('com.foo.bar.height()');", "}" )); } private void assertPrintedResult(String expectedCss, String source) { CssTree cssTree = parseAndBuildTree(source); CssPrinter pass = new CssPrinter(cssTree); pass.runPass(); assertEquals(expectedCss, pass.getCompactPrintedString()); } @Override protected void runPassesOnNewTree(CssTree cssTree, ErrorManager errorManager) { MutatingVisitController mutatingVisitController = cssTree.getMutatingVisitController(); new CreateConditionalNodes(mutatingVisitController, errorManager).runPass(); new CreateRuntimeConditionalNodes(mutatingVisitController).runPass(); new CreateStandardAtRuleNodes(mutatingVisitController, errorManager).runPass(); ResourceContext context = mockResourceContext(); Map<String, GssFunction> gssFunctionMap = new GwtGssFunctionMapProvider(context).get(); new ResolveCustomFunctionNodes(mutatingVisitController, errorManager, gssFunctionMap, true, new HashSet<String>()).runPass(); new ExternalClassesCollector(mutatingVisitController, errorManager) .runPass(); } private ResourceContext mockResourceContext() { ResourceContext context = mock(ResourceContext.class); GeneratorContext generatorContext = mock(GeneratorContext.class); TypeOracle oracle = mock(TypeOracle.class); when(generatorContext.getTypeOracle()).thenReturn(oracle); when(context.getGeneratorContext()).thenReturn(generatorContext); return context; } }