/* * 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; } }