/*
* 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;
import com.google.common.collect.ImmutableList;
import com.google.common.css.compiler.ast.CssRulesetNode;
import com.google.common.css.compiler.ast.CssSelectorNode;
import com.google.common.css.compiler.ast.CssTree.RulesetNodesToRemove;
import com.google.common.css.compiler.ast.DefaultTreeVisitor;
import com.google.common.css.compiler.passes.testing.PassesTestBase;
import java.util.List;
/**
* Unit tests for {@link MarkRemovableRulesetNodesForChunk}.
*
*/
public class MarkRemovableRulesetNodesForChunkTest extends PassesTestBase {
public void testAllOneChunk() {
collectRemovableRulesetNodes(
linesToString(
".CSS_RULE {",
" border: 2px;",
"}",
".CSS_RULE {",
" border: 3px;",
"}"),
ImmutableList.of("C1", "C1"));
RulesetNodesToRemove rules = tree.getRulesetNodesToRemove();
assertEquals(1, rules.getRulesetNodes().size());
CssRulesetNode rule = rules.getRulesetNodes().iterator().next();
checkRuleset("[[.CSS_RULE]{[border:[[2px]];]}]", rule);
}
public void testAllOneChunkButSkipping() {
collectRemovableRulesetNodes(
linesToString(
".CSS_RULE {",
" display: inline-box;",
"}",
".CSS_RULE {",
" display: -moz-inline-box;",
"}"),
ImmutableList.of("C1", "C1"));
RulesetNodesToRemove rules = tree.getRulesetNodesToRemove();
assertEquals(0, rules.getRulesetNodes().size());
}
public void testDiffChunkHit() {
collectRemovableRulesetNodes(
linesToString(
".CSS_RULE {",
" border: 2px;",
"}",
".CSS_RULE {",
" border: 3px;",
"}"),
ImmutableList.of("C1", "C2"));
RulesetNodesToRemove rules = tree.getRulesetNodesToRemove();
assertEquals(0, rules.getRulesetNodes().size());
}
public void testSameChunkHit() {
collectRemovableRulesetNodes(
linesToString(
".CSS_RULE {",
" border: 1px;",
"}",
".CSS_RULE {",
" border: 2px;",
"}",
".CSS_RULE {",
" border: 3px;",
"}"),
ImmutableList.of("C1", "C1", "C2"));
RulesetNodesToRemove rules = tree.getRulesetNodesToRemove();
assertEquals(1, rules.getRulesetNodes().size());
CssRulesetNode rule = rules.getRulesetNodes().iterator().next();
checkRuleset("[[.CSS_RULE]{[border:[[1px]];]}]", rule);
}
private void collectRemovableRulesetNodes(
String source, List<String> chunks) {
parseAndBuildTree(source);
mapChunks(chunks);
new MarkRemovableRulesetNodesForChunk<String>("C1", tree, true).runPass();
}
private void mapChunks(final List<String> chunks) {
tree.getVisitController().startVisit(
new DefaultTreeVisitor() {
private int count = 0;
@Override
public boolean enterSelector(CssSelectorNode selector) {
selector.setChunk(chunks.get(count++));
return true;
}
});
}
}