blob: ebf71a3eb17b603bd697f14ca53208998606f389 [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.converter;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.gwt.resources.css.ast.CssIf;
import com.google.gwt.resources.css.ast.CssNode;
import com.google.gwt.resources.css.ast.CssRule;
import junit.framework.TestCase;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Test for {@link ElseNodeCreator}.
*/
public class ElseNodeCreatorTest extends TestCase {
private ElseNodeCreator elseNodeCreator;
private CssIf cssIf;
private List<CssNode> elseNodes;
@Override
protected void setUp() {
elseNodeCreator = new ElseNodeCreator();
elseNodes = new ArrayList<CssNode>();
cssIf = mock(CssIf.class);
when(cssIf.getElseNodes()).thenReturn(elseNodes);
}
public void testVisit_SimpleIf_NoElseNode() {
// when
elseNodeCreator.visit(cssIf, null);
// then
assertEquals(0, elseNodes.size());
}
public void testVisit_IfElse_CssElseInElseNodes() {
// given
CssRule elseRule = new CssRule();
elseNodes.add(elseRule);
// when
elseNodeCreator.visit(cssIf, null);
// then
assertEquals(1, elseNodes.size());
assertTrue(elseNodes.get(0) instanceof CssElse);
assertEquals(1, ((CssElse) elseNodes.get(0)).getNodes().size());
assertTrue(((CssElse) elseNodes.get(0)).getNodes().contains(elseRule));
}
public void testVisit_IfElseWithSeveralRules_CssElseInElseNodesAndContainsAllRules() {
// given
CssRule elseRule1 = new CssRule();
CssRule elseRule2 = new CssRule();
CssRule elseRule3 = new CssRule();
elseNodes.add(elseRule1);
elseNodes.add(elseRule2);
elseNodes.add(elseRule3);
// when
elseNodeCreator.visit(cssIf, null);
// then
assertEquals(1, elseNodes.size());
assertTrue(elseNodes.get(0) instanceof CssElse);
CssElse newElseNode = (CssElse) elseNodes.get(0);
assertEquals(3, newElseNode.getNodes().size());
assertTrue(newElseNode.getNodes().contains(elseRule1));
assertTrue(newElseNode.getNodes().contains(elseRule2));
assertTrue(newElseNode.getNodes().contains(elseRule3));
}
public void testVisit_IfElif_CssElIfInElseNodes() {
// given
CssIf elifNode = mockCssIf(0);
elseNodes.add(elifNode);
// when
elseNodeCreator.visit(cssIf, null);
// then
assertEquals(1, elseNodes.size());
assertTrue(elseNodes.get(0) instanceof CssElIf);
verify((CssElIf) elseNodes.get(0), elifNode);
}
public void testVisit_IfElifElse_CssElIfAndCssElseInElseNodes() {
// given
CssIf elifNode = mockCssIf(0);
CssNode elseRule = new CssRule();
when(elifNode.getElseNodes()).thenReturn(Arrays.<CssNode>asList(elseRule));
elseNodes.add(elifNode);
// when
elseNodeCreator.visit(cssIf, null);
// then
assertEquals(2, elseNodes.size());
assertTrue(elseNodes.get(0) instanceof CssElIf);
assertTrue(elseNodes.get(1) instanceof CssElse);
verify((CssElIf) elseNodes.get(0), elifNode);
CssElse newElseNode = (CssElse) elseNodes.get(1);
assertEquals(1, newElseNode.getNodes().size());
assertTrue(newElseNode.getNodes().contains(elseRule));
}
public void testVisit_IfElifElifElse_2CssElIfAnd1CssElseInElseNodes() {
// given
CssIf elifNode0 = mockCssIf(0);
CssIf elifNode1 = mockCssIf(1);
when(elifNode0.getElseNodes()).thenReturn(Arrays.<CssNode>asList(elifNode1));
CssNode elseRule = new CssRule();
when(elifNode1.getElseNodes()).thenReturn(Arrays.<CssNode>asList(elseRule));
elseNodes.add(elifNode0);
// when
elseNodeCreator.visit(cssIf, null);
// then
assertEquals(3, elseNodes.size());
assertTrue(elseNodes.get(0) instanceof CssElIf);
assertTrue(elseNodes.get(1) instanceof CssElIf);
assertTrue(elseNodes.get(2) instanceof CssElse);
verify((CssElIf) elseNodes.get(0), elifNode0);
verify((CssElIf) elseNodes.get(1), elifNode1);
CssElse newElseNode = (CssElse) elseNodes.get(2);
assertEquals(1, newElseNode.getNodes().size());
assertTrue(newElseNode.getNodes().contains(elseRule));
}
private void verify(CssElIf toVerify, CssIf original) {
assertEquals(3, toVerify.getNodes().size());
for (CssNode node : original.getNodes()) {
assertTrue(toVerify.getNodes().contains(node));
}
assertEquals(original.getExpression(), toVerify.getExpression());
assertTrue(toVerify.isNegated());
assertEquals(original.getPropertyName(), toVerify.getPropertyName());
assertEquals(1, toVerify.getPropertyValues().length);
assertEquals(original.getPropertyValues()[0], toVerify.getPropertyValues()[0]);
assertEquals(0, toVerify.getElseNodes().size());
}
private CssIf mockCssIf(int id) {
CssIf elifNode = mock(CssIf.class);
when(elifNode.getNodes()).thenReturn(Arrays.<CssNode>asList(new CssRule(), new CssRule(),
new CssRule()));
when(elifNode.getExpression()).thenReturn("expression" + id);
when(elifNode.isNegated()).thenReturn(true);
when(elifNode.getPropertyName()).thenReturn("propertyName" + id);
when(elifNode.getPropertyValues()).thenReturn(new String[] {"propertyValue" + id});
return elifNode;
}
}