blob: 34f038af80f6050155a0d1a5b0791835a31bc885 [file] [log] [blame]
/*
* 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 com.google.gwt.thirdparty.common.css.compiler.ast.CssConditionalBlockNode;
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.passes.CreateConditionalNodes;
import com.google.gwt.thirdparty.guava.common.collect.Sets;
import java.util.Set;
/**
* Test class for {@link ExtendedEliminateConditionalNodes}.
*/
public class ExtendedEliminateConditionalNodesTest extends BaseGssTest {
private Set<CssConditionalBlockNode> cssRuntimeConditionalBlockNodes;
public void testCompileTimeConditional() {
// given
CssTree cssTree = parseAndBuildTree(lines(
"@if (is('custom.one', 'foo') && is('custom.one', 'bar')) {",
" .foo {",
" padding: 5px;",
" }",
"}",
"",
"@elseif (!is('custom.two', 'foo') && is('custom.three', 'foo') " +
"|| is('custom.four', 'foo')) {",
" .foo {",
" padding: 15px;",
" }",
"}"));
Set<String> trueConditions = Sets.newHashSet("custom.one:foo", "custom.three:foo");
ExtendedEliminateConditionalNodes visitor =
new ExtendedEliminateConditionalNodes(cssTree.getMutatingVisitController(),
trueConditions, cssRuntimeConditionalBlockNodes);
// when
visitor.runPass();
// then
String expectedTreeToString = "[[.foo]{[padding:[15px]]}]";
assertEquals(expectedTreeToString, cssTree.getRoot().getBody().toString());
}
public void testIgnoreRuntimeConditional() {
// given
CssTree cssTree = parseAndBuildTree(lines(
"@if (eval('com.foo.BAR')) {",
" .foo {",
" padding: 5px;",
" }",
" @if (is('ie9')) {",
" .foo {",
" padding: 55px;",
" }",
" }",
"}",
"@elseif (eval('com.foo.bar()')) {",
" .foo {",
" padding: 15px;",
" }",
"}"));
Set<String> trueConditions = Sets.newHashSet("user.agent:ie6");
ExtendedEliminateConditionalNodes visitor =
new ExtendedEliminateConditionalNodes(cssTree.getMutatingVisitController(),
trueConditions, cssRuntimeConditionalBlockNodes);
// when
visitor.runPass();
// then
// the " @if (is('ie9')) {", node is removed because it is evaluated to false
String expectedTreeToString =
"[[@if[Java expression : com.foo.BAR]{" +
"[[.foo]{" +
"[padding:[5px]]" +
"}]}, " +
"@elseif[Java expression : com.foo.bar()]{" +
"[[.foo]{" +
"[padding:[15px]]" +
"}]" +
"}]]";
assertEquals(expectedTreeToString, cssTree.getRoot().getBody().toString());
}
public void testRemoveUnreachableRuntimeConditional() {
// given
CssTree cssTree = parseAndBuildTree(lines(
"@if (is('foo', 'BAR')) {",
" .foo {",
" padding: 5px;",
" }",
"}",
"@elseif (eval('com.foo.bar()')) {",
" @if (eval('com.foo.FOO')) {",
" .foo {",
" padding: 15px;",
" }",
" }",
" @else{",
" .foo {",
" padding: 15px;",
" }",
" }",
"}"));
Set<String> trueConditions = Sets.newHashSet("foo:BAR");
ExtendedEliminateConditionalNodes visitor =
new ExtendedEliminateConditionalNodes(cssTree.getMutatingVisitController(),
trueConditions, cssRuntimeConditionalBlockNodes);
// when
visitor.runPass();
// then
String expectedTreeToString = "[[.foo]{[padding:[5px]]}]";
assertEquals(expectedTreeToString, cssTree.getRoot().getBody().toString());
}
@Override
protected void runPassesOnNewTree(CssTree cssTree, ErrorManager errorManager) {
new CreateConditionalNodes(cssTree.getMutatingVisitController(), errorManager).runPass();
new CreateRuntimeConditionalNodes(cssTree.getMutatingVisitController()).runPass();
new PermutationsCollector(cssTree.getMutatingVisitController()).runPass();
RuntimeConditionalBlockCollector runtimeConditionalBlockCollector = new
RuntimeConditionalBlockCollector(cssTree.getVisitController());
runtimeConditionalBlockCollector.runPass();
cssRuntimeConditionalBlockNodes = runtimeConditionalBlockCollector.getRuntimeConditionalBlock();
}
}