/*
* 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.ast;
import com.google.common.css.compiler.ast.testing.NewFunctionalTestBase;
import com.google.common.css.compiler.passes.CreateConditionalNodes;
import com.google.common.css.compiler.passes.CreateDefinitionNodes;
import com.google.common.css.compiler.passes.MarkDefaultDefinitions;
import com.google.common.css.compiler.passes.MarkNonFlippableNodes;
/**
* Tests the handling of GSS comments.
*
*/
public class GssCommentsTest extends NewFunctionalTestBase {
@Override
protected void runPass() {
}
protected void createDefinintions() {
CreateDefinitionNodes pass = new CreateDefinitionNodes(
tree.getMutatingVisitController(), errorManager);
pass.runPass();
}
protected void createConditionalNodes() {
CreateConditionalNodes pass = new CreateConditionalNodes(
tree.getMutatingVisitController(), errorManager);
pass.runPass();
}
protected void relocateDefinintionsComments() {
RelocateDefaultComments pass = new RelocateDefaultComments(
tree.getMutatingVisitController());
pass.runPass();
}
protected void markDefaultDefinitions() {
MarkDefaultDefinitions pass = new MarkDefaultDefinitions(
tree.getMutatingVisitController());
pass.runPass();
}
protected void markNonFlippableNodes() {
MarkNonFlippableNodes pass = new MarkNonFlippableNodes(
tree.getVisitController(), errorManager);
pass.runPass();
}
public void testCreateDefinitionComments() throws Exception {
parseAndRun("/* comment0 */ @def /* comment-x */ X /* comment-y */Y " +
"/* comment1 */ /* comment2 */ ;");
assertTrue(getFirstActualNode() instanceof CssUnknownAtRuleNode);
CssUnknownAtRuleNode def = (CssUnknownAtRuleNode) getFirstActualNode();
assertEquals("def", def.getName().getValue());
CssCommentNode comment0 = def.getComments().get(0);
assertEquals("/* comment0 */", comment0.getValue());
CssCommentNode comment1 = def.getComments().get(1);
assertEquals("/* comment1 */", comment1.getValue());
CssCommentNode comment2 = def.getComments().get(2);
assertEquals("/* comment2 */", comment2.getValue());
assertEquals("/* comment-x */",def.getParameters().get(0).getComments().get(0).getValue());
assertEquals("/* comment-y */",def.getParameters().get(1).getComments().get(0).getValue());
}
public void testCreateFunctionComments() throws Exception {
parseAndRun("@def /*comment0*/func(x, y/*comment1*/);");
assertTrue(getFirstActualNode() instanceof CssUnknownAtRuleNode);
CssUnknownAtRuleNode def = (CssUnknownAtRuleNode) getFirstActualNode();
int defComments = def.getComments().size();
assertEquals(0, defComments);
CssValueNode valueNode = def.getParameters().get(0);
assertTrue(valueNode instanceof CssFunctionNode);
CssFunctionNode functionNode = (CssFunctionNode) valueNode;
CssCommentNode comment0 = functionNode.getComments().get(0);
assertEquals("/*comment0*/", comment0.getValue());
CssCommentNode comment1 = functionNode.getComments().get(1);
assertEquals("/*comment1*/", comment1.getValue());
}
public void testCreateDefinitionCommentsAfterRelocation() throws Exception {
parseAndRun("@def A /* @default */#fff;");
createDefinintions();
relocateDefinintionsComments();
assertTrue(getFirstActualNode() instanceof CssDefinitionNode);
CssDefinitionNode def = (CssDefinitionNode) getFirstActualNode();
CssCommentNode comment0 = def.getComments().get(0);
assertEquals("/* @default */", comment0.getValue());
}
// We don't test for comments between '!' and 'important'. See the comment on
// the IMPORTANT_SYM in the grammar for the reason.
public void testCreateRulesetComments() throws Exception {
parseAndRun("A {/* comment-d */b:c /*comment0*/!important }");
assertTrue(getFirstActualNode() instanceof CssRulesetNode);
CssRulesetNode ruleset = (CssRulesetNode)getFirstActualNode();
CssDeclarationNode declNode =
(CssDeclarationNode) ruleset.getDeclarations().getChildren().get(0);
CssCommentNode commentDecl = declNode.getComments().get(0);
assertEquals("/* comment-d */", commentDecl.getValue());
CssPropertyValueNode propValue = declNode.getPropertyValue();
CssValueNode prioNode = propValue.getChildren().get(1);
CssCommentNode comment0 = prioNode.getComments().get(0);
assertEquals("/*comment0*/", comment0.getValue());
}
public void testNoflip() throws Exception {
parseAndRun(".a .b { \n /* @noflip */\n float: left;\n}");
assertTrue(getFirstActualNode() instanceof CssRulesetNode);
CssRulesetNode ruleset = (CssRulesetNode)getFirstActualNode();
CssDeclarationNode declNode =
(CssDeclarationNode) ruleset.getDeclarations().getChildren().get(0);
CssCommentNode commentDecl = declNode.getComments().get(0);
assertEquals("/* @noflip */", commentDecl.getValue());
}
public void testMarkNonFlippable() throws Exception {
parseAndRun(linesToString("/* @noflip */ @if COND {",
" foo { top : expression('cond') }",
" bar { bottom : expression('cond') }",
"} @else {",
" bar { top : expression('cond') }",
"}"));
createConditionalNodes();
markNonFlippableNodes();
CssConditionalBlockNode block =
(CssConditionalBlockNode) getFirstActualNode();
assertFalse(block.getShouldBeFlipped());
CssConditionalRuleNode condRule1 = block.getChildren().get(0);
assertFalse(condRule1.getShouldBeFlipped());
}
public void testMarkDefaultDefinitions1() throws Exception {
parseAndRun("/* @default */ @def PADDING 2px 3px 5px 1px;");
createDefinintions();
relocateDefinintionsComments();
markDefaultDefinitions();
CssDefinitionNode definition = (CssDefinitionNode) getFirstActualNode();
for (CssValueNode node : definition.getParameters()) {
assertTrue(node.getIsDefault());
}
}
public void testMarkDefaultDefinitions2() throws Exception {
parseAndRun("@def PADDING /* @default */ 2px 3px 5px 1px;");
createDefinintions();
relocateDefinintionsComments();
markDefaultDefinitions();
CssDefinitionNode definition = (CssDefinitionNode) getFirstActualNode();
for (CssValueNode node : definition.getParameters()) {
assertTrue(node.getIsDefault());
}
}
public void testSelectorList() throws Exception {
parseAndRun("foo/*foo*/, /*bar1*/ /*bar2*/ bar /*bar3*/ , zoo /*zoo*/ { a:b }");
CssRulesetNode ruleset = (CssRulesetNode) getFirstActualNode();
CssSelectorListNode selectors = ruleset.getSelectors();
CssSelectorNode fooSelector = selectors.getChildren().get(0);
CssCommentNode fooComment = fooSelector.getComments().get(0);
assertEquals("/*foo*/", fooComment.getValue());
CssSelectorNode barSelector = selectors.getChildren().get(1);
CssCommentNode barComment1 = barSelector.getComments().get(0);
assertEquals("/*bar1*/", barComment1.getValue());
CssCommentNode barComment2 = barSelector.getComments().get(1);
assertEquals("/*bar2*/", barComment2.getValue());
CssCommentNode barComment3 = barSelector.getComments().get(2);
assertEquals("/*bar3*/", barComment3.getValue());
CssSelectorNode zooSelector = selectors.getChildren().get(2);
// The comment after the last selector goes to the rulesetNode.
CssCommentNode zooComment = ruleset.getComments().get(0);
assertEquals("/*zoo*/", zooComment.getValue());
}
}