/*
* 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 static com.google.common.base.Predicates.alwaysTrue;
import static com.google.common.truth.Truth.assertThat;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
import com.google.common.css.JobDescription;
import com.google.common.css.JobDescriptionBuilder;
import com.google.common.css.MinimalSubstitutionMap;
import com.google.common.css.RecordingSubstitutionMap;
import com.google.common.css.SimpleSubstitutionMap;
import com.google.common.css.SourceCode;
import com.google.common.css.SubstitutionMap;
import com.google.common.css.compiler.ast.CssTree;
import com.google.common.css.compiler.ast.ErrorManager;
import com.google.common.css.compiler.ast.GssParser;
import com.google.common.css.compiler.ast.GssParserException;
import com.google.common.css.testing.UtilityTestCase;
import java.util.Map;
/**
* Test for RecordingSubstitutionMap.
*
* @author bolinfest@google.com (Michael Bolin)
*/
public class RecordingSubstitutionMapTest extends UtilityTestCase {
private String styleSheet;
private Predicate<String> predicate;
private Map<String,String> mappings;
@Override
protected void setUp() {
styleSheet = linesToString(
".CSS_SPRITE { background-image: url(\"foo.png\"); }",
".sprite { background-image: url(\"bar.png\"); }"
);
predicate = new Predicate<String>() {
@Override
public boolean apply(String key) {
return key.startsWith("CSS_");
}
};
}
private void parse(String styleSheet, RecordingSubstitutionMap map) {
SourceCode input = new SourceCode("test-input", styleSheet);
GssParser parser = new GssParser(input);
CssTree cssTree;
try {
cssTree = parser.parse();
} catch (GssParserException e) {
throw new RuntimeException(e);
}
JobDescription job = new JobDescriptionBuilder().getJobDescription();
ErrorManager errorManager = new DummyErrorManager();
PassRunner passRunner = new PassRunner(job, errorManager, map);
passRunner.runPasses(cssTree);
}
public void testGet() {
SubstitutionMap substitutionMap = new SubstitutionMap() {
@Override
public String get(String key) {
if ("CSS_FOO".equals(key)) {
return "a";
} else if ("CSS_BAR".equals(key)) {
return "b";
} else {
return key;
}
}
};
RecordingSubstitutionMap recordingMap = new RecordingSubstitutionMap(
substitutionMap, predicate);
assertEquals("a", recordingMap.get("CSS_FOO"));
assertEquals("b", recordingMap.get("CSS_BAR"));
assertEquals("CSS_BAZ", recordingMap.get("CSS_BAZ"));
assertEquals("BIZ", recordingMap.get("BIZ"));
mappings = recordingMap.getMappings();
assertFalse("Predicate for RecordingSubstitutionMap was not honored",
mappings.containsKey("BIZ"));
Map<String,String> expectedMap = ImmutableMap.of("CSS_FOO", "a", "CSS_BAR",
"b", "CSS_BAZ", "CSS_BAZ");
assertEquals(expectedMap, mappings);
}
public void testOrderIsPreserved() {
styleSheet = linesToString(
".zero { color: red; }",
".one { color: red; }",
".two { color: red; }",
".three { color: red; }",
".four { color: red; }",
".five { color: red; }",
".six { color: red; }",
".seven { color: red; }",
".eight { color: red; }",
".nine { color: red; }"
);
RecordingSubstitutionMap map = new RecordingSubstitutionMap(
new SimpleSubstitutionMap(), alwaysTrue());
parse(styleSheet, map);
mappings = map.getMappings();
assertEquals(10, mappings.size());
assertThat(mappings.keySet())
.containsExactly(
"zero",
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine")
.inOrder();
}
private RecordingSubstitutionMap setupWithMap(RecordingSubstitutionMap map) {
parse(styleSheet, map);
mappings = map.getMappings();
return map;
}
public void testMapWithTypeIdentity() {
RecordingSubstitutionMap map = new RecordingSubstitutionMap(
new SimpleSubstitutionMap(), predicate);
setupWithMap(map);
assertEquals(1, mappings.size());
assertEquals("CSS_SPRITE_", mappings.get("CSS_SPRITE"));
}
public void testMapWithTypeMinimal() {
RecordingSubstitutionMap map = new RecordingSubstitutionMap(
new MinimalSubstitutionMap(), predicate);
setupWithMap(map);
assertEquals(1, mappings.size());
assertEquals(1, mappings.get("CSS_SPRITE").length());
}
}