/*
* Copyright 2013 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.ImmutableMap;
import com.google.common.collect.Lists;
import com.google.common.css.compiler.ast.CssCompilerPass;
import com.google.common.css.compiler.ast.GssParserException;
import com.google.common.css.compiler.ast.testing.NewFunctionalTestBase;
import java.util.List;
/**
* Tests for {@link CheckMissingRequire}.
*
*/
public class CheckMissingRequireTest extends NewFunctionalTestBase {
protected void runPasses(TestErrorManager errorMgr) {
List<CssCompilerPass> l = Lists.newArrayList();
l.add(new CreateMixins(tree.getMutatingVisitController(), errorMgr));
l.add(new CreateDefinitionNodes(tree.getMutatingVisitController(), errorMgr));
l.add(new CreateConstantReferences(tree.getMutatingVisitController()));
l.add(new CheckDependencyNodes(tree.getMutatingVisitController(), errorMgr));
l.add(new CreateComponentNodes(tree.getMutatingVisitController(), errorMgr));
l.add(new ProcessComponents<Object>(tree.getMutatingVisitController(), errorMgr, null));
for (CssCompilerPass pass : l) {
pass.runPass();
}
CollectProvideNamespaces collectProvides = new CollectProvideNamespaces(
tree.getVisitController());
collectProvides.runPass();
new CheckMissingRequire(
tree.getVisitController(),
errorMgr,
collectProvides.getFilenameProvideMap(),
collectProvides.getFilenameRequireMap(),
collectProvides.getDefProvideMap(),
collectProvides.getDefmixinProvideMap()).runPass();
}
public void testBaseCase1() throws GssParserException {
String base = ""
+ "@provide 'foo.base';"
+ "@def FOO_BASE_COLOR #fff;";
String streamitem = ""
+ "@provide 'foo.streamitem';"
+ "@require 'foo.base';"
+ ".nav {"
+ " color: FOO_BASE_COLOR;"
+ "}";
String streamcomponent = ""
+ "@provide 'foo.streamcomponent';"
+ "@require 'foo.base';"
+ "@component {"
+ " .nav {"
+ " color: FOO_BASE_COLOR;"
+ " }"
+ "}";
ImmutableMap<String, String> fileNameToGss = ImmutableMap.of(
"base.gss", base,
"streamitem.gss", streamitem,
"streamcomponent.gss", streamcomponent);
parseAndBuildTree(fileNameToGss);
String[] expectedMessages = {};
TestErrorManager errorManager = new TestErrorManager(false, expectedMessages);
runPasses(errorManager);
errorManager.generateReport();
assertTrue("Encountered all errors.", errorManager.hasEncounteredAllErrors());
}
public void testBaseCase2() throws GssParserException {
String base = ""
+ "@provide 'foo.base';"
+ "@def FOO_BASE_COLOR #fff;"
+ "@def FOO_BASE_BG_COLOR FOO_BASE_COLOR;";
ImmutableMap<String, String> fileNameToGss = ImmutableMap.of("base.gss", base);
parseAndBuildTree(fileNameToGss);
String[] expectedMessages = {};
TestErrorManager errorManager = new TestErrorManager(false, expectedMessages);
runPasses(errorManager);
errorManager.generateReport();
assertTrue("Encountered all errors.", errorManager.hasEncounteredAllErrors());
}
public void testMissingRequire() throws GssParserException {
String base = ""
+ "@provide 'foo.base';"
+ "@def FOO_BASE_COLOR #fff;";
String streamitem = ""
+ "@provide 'foo.streamitem';"
+ ".nav {"
+ " color: FOO_BASE_COLOR;"
+ "}";
ImmutableMap<String, String> fileNameToGss = ImmutableMap.of(
"base.gss", base,
"streamitem.gss", streamitem);
parseAndBuildTree(fileNameToGss);
String[] expectedMessages = {"Missing @require for constant FOO_BASE_COLOR."};
TestErrorManager errorManager = new TestErrorManager(false, expectedMessages);
runPasses(errorManager);
errorManager.generateReport();
assertTrue("Encountered all errors.", errorManager.hasEncounteredAllErrors());
}
public void testMissingRequireFromComponent() throws GssParserException {
String base = ""
+ "@provide 'foo.base';"
+ "@def FOO_BASE_COLOR #fff;";
String streamitem = ""
+ "@provide 'foo.streamitem';"
+ "@component {"
+ " @def NAV_COLOR FOO_BASE_COLOR;"
+ " .nav {"
+ " color: NAV_COLOR;"
+ " }"
+ "}";
ImmutableMap<String, String> fileNameToGss = ImmutableMap.of(
"base.gss", base,
"streamitem.gss", streamitem);
parseAndBuildTree(fileNameToGss);
String[] expectedMessages = {"Missing @require for constant FOO_BASE_COLOR."};
TestErrorManager errorManager = new TestErrorManager(false, expectedMessages);
runPasses(errorManager);
errorManager.generateReport();
assertTrue("Encountered all errors.", errorManager.hasEncounteredAllErrors());
}
public void testMissingRequireOfComponent() throws GssParserException {
String basecomponent = ""
+ "@provide 'foo.basecomponent';"
+ "@component {"
+ " @def COLOR #fff;"
+ "}";
String streamitem = ""
+ "@provide 'foo.streamitem';"
+ ".nav {"
+ " color: FOO_BASECOMPONENT_COLOR;"
+ "}";
ImmutableMap<String, String> fileNameToGss = ImmutableMap.of(
"basecomponent.gss", basecomponent,
"streamitem.gss", streamitem);
parseAndBuildTree(fileNameToGss);
String[] expectedMessages = {"Missing @require for constant FOO_BASECOMPONENT_COLOR."};
TestErrorManager errorManager = new TestErrorManager(false, expectedMessages);
runPasses(errorManager);
errorManager.generateReport();
assertTrue("Encountered all errors.", errorManager.hasEncounteredAllErrors());
}
public void testMissingRequireInDef() throws GssParserException {
String base = ""
+ "@provide 'foo.base';"
+ "@def FOO_BASE_COLOR #fff;";
String streamitem = ""
+ "@provide 'foo.streamitem';"
+ "@def FOO_STREAM_ITEM_COLOR FOO_BASE_COLOR;"
+ "@def FOO_BASE_FONT_SIZE 10px;";
ImmutableMap<String, String> fileNameToGss = ImmutableMap.of(
"base.gss", base,
"streamitem.gss", streamitem);
parseAndBuildTree(fileNameToGss);
String[] expectedMessages = {"Missing @require for constant FOO_BASE_COLOR."};
TestErrorManager errorManager = new TestErrorManager(false, expectedMessages);
runPasses(errorManager);
errorManager.generateReport();
assertTrue("Encountered all errors.", errorManager.hasEncounteredAllErrors());
}
public void testMissingRequireDefMixin() throws GssParserException {
String base = ""
+ "@provide 'foo.base';"
+ "@def FOO_BASE_COLOR #fff;"
+ "@defmixin background_color(FALLBACK_BG_COLOR) {"
+ " background-color: FALLBACK_BG_COLOR;"
+ "}";
String streamitem = ""
+ "@provide 'foo.streamitem';"
+ "@def FOO_OVERLAY_BG_COLOR #fff;"
+ "@def FOO_OVERLAY_OPAQUE_BG_COLOR #fee;"
+ ".fooStreamOverlay {"
+ "@mixin background_color(FOO_OVERLAY_BG_COLOR, FOO_OVERLAY_OPAQUE_BG_COLOR);"
+ "}";
ImmutableMap<String, String> fileNameToGss = ImmutableMap.of(
"base.gss", base,
"streamitem.gss", streamitem);
parseAndBuildTree(fileNameToGss);
String[] expectedMessages = {"Missing @require for mixin background_color."};
TestErrorManager errorManager = new TestErrorManager(false, expectedMessages);
runPasses(errorManager);
errorManager.generateReport();
assertTrue("Encountered all errors.", errorManager.hasEncounteredAllErrors());
}
public void testMissingOverrideSelectorNamespace() throws GssParserException {
String base = ""
+ "@provide 'foo.base';"
+ "@def FOO_BASE_COLOR #fff;";
String streamitem = ""
+ "@provide 'foo.streamitem';"
+ "@require 'foo.base';"
+ "/* @overrideSelector {foo.foo} */ .nav {"
+ " color: FOO_BASE_COLOR;"
+ "}";
ImmutableMap<String, String> fileNameToGss = ImmutableMap.of(
"base.gss", base,
"streamitem.gss", streamitem);
parseAndBuildTree(fileNameToGss);
String[] expectedMessages = {"Missing @require for @overrideSelector"};
TestErrorManager errorManager = new TestErrorManager(false, expectedMessages);
runPasses(errorManager);
errorManager.generateReport();
assertTrue("Encountered all errors.", errorManager.hasEncounteredAllErrors());
}
public void testMissingOverrideDefNamespace() throws GssParserException {
String base = ""
+ "@provide 'foo.base';"
+ "@def FOO_BASE_COLOR #fff;";
String streamitem = ""
+ "@provide 'foo.streamitem';"
+ "@require 'foo.bar';"
+ "/* @overrideDef {foo.base} */ @def FOO_BASE_COLOR #ffe;";
ImmutableMap<String, String> fileNameToGss = ImmutableMap.of(
"base.gss", base,
"streamitem.gss", streamitem);
parseAndBuildTree(fileNameToGss);
String[] expectedMessages = {"Missing @require for @overrideDef"};
TestErrorManager errorManager = new TestErrorManager(false, expectedMessages);
runPasses(errorManager);
errorManager.generateReport();
assertTrue("Encountered all errors.", errorManager.hasEncounteredAllErrors());
}
}