Package com.google.gwt.resources.gss

Source Code of com.google.gwt.resources.gss.ExternalClassesCollectorTest

/*
* Copyright 2013 Julien Dramaix.
*
* 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.gss;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.google.common.css.compiler.ast.CssCompositeValueNode;
import com.google.common.css.compiler.ast.CssLiteralNode;
import com.google.common.css.compiler.ast.CssStringNode;
import com.google.common.css.compiler.ast.CssUnknownAtRuleNode;
import com.google.common.css.compiler.ast.CssValueNode;
import com.google.common.css.compiler.ast.MutatingVisitController;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import java.util.List;
import java.util.Set;


@RunWith(MockitoJUnitRunner.class)
public class ExternalClassesCollectorTest {
  @Mock
  private CssUnknownAtRuleNode cssUnknownAtRuleNode;
  @Mock
  private CssLiteralNode atRuleNameNode;
  @Mock
  private MutatingVisitController mutatingVisitController;
  @Mock
  private CssCompositeValueNode atRuleParameters;

  @Before
  public void setUp() {
    when(cssUnknownAtRuleNode.getName()).thenReturn(atRuleNameNode);
    when(cssUnknownAtRuleNode.getParameters()).thenReturn(
        Lists.<CssValueNode>newArrayList(atRuleParameters));
  }

  @Test
  public void leaveUnknownAtRule_notAnExternalAtRule_doNothing() {
    // Given
    ExternalClassesCollector externalClassesCollector = createAndInitExternalClassesCollector();
    when(atRuleNameNode.getValue()).thenReturn("dummy");

    // When
    externalClassesCollector.leaveUnknownAtRule(cssUnknownAtRuleNode);

    // Then
    verify(cssUnknownAtRuleNode, never()).getParameters();
    verify(mutatingVisitController, never()).removeCurrentNode();
  }

  @Test
  public void leaveUnknownAtRule_simpleExternalAtRule_classesReturnByGetExternalClass() {
    // Given
    ExternalClassesCollector externalClassesCollector = createAndInitExternalClassesCollector();
    when(atRuleNameNode.getValue()).thenReturn("external");

    List<CssValueNode> parameters = Lists.newArrayList(literalNode("externalClass"),
        literalNode("externalClass2"));
    when(atRuleParameters.getValues()).thenReturn(parameters);

    // When
    externalClassesCollector.leaveUnknownAtRule(cssUnknownAtRuleNode);

    // Then
    verify(cssUnknownAtRuleNode).getParameters();
    verify(atRuleParameters).getValues();
    verify(mutatingVisitController).removeCurrentNode();

    Set<String> externalClasses = externalClassesCollector.getExternalClassNames();
    assertEquals(2, externalClasses.size());
    assertTrue(externalClasses.contains("externalClass"));
    assertTrue(externalClasses.contains("externalClass2"));
  }


  @Test
  public void leaveUnknownAtRule_externalAtRuleWithMatchAllPrefix_allClassesAreExternals() {
    // Given
    ExternalClassesCollector externalClassesCollector =
        createAndInitExternalClassesCollector(Sets.newHashSet("class1", "class2", "class3"));
    when(atRuleNameNode.getValue()).thenReturn("external");
    List<CssValueNode> parameters = Lists.newArrayList(stringNode("*"));
    when(atRuleParameters.getValues()).thenReturn(parameters);

    // When
    externalClassesCollector.leaveUnknownAtRule(cssUnknownAtRuleNode);

    // Then
    verify(cssUnknownAtRuleNode).getParameters();
    verify(atRuleParameters).getValues();
    verify(mutatingVisitController).removeCurrentNode();

    Set<String> externalClasses = externalClassesCollector.getExternalClassNames();
    assertEquals(3, externalClasses.size());
    assertTrue(externalClasses.contains("class1"));
    assertTrue(externalClasses.contains("class2"));
    assertTrue(externalClasses.contains("class3"));
  }

  @Test
  public void leaveUnknownAtRule_externalAtRuleWithMatchAllPrefixThenAnotherExternalAtRule_anotherAtRuleNotProcessed() {
    // Given
    ExternalClassesCollector externalClassesCollector = createAndInitExternalClassesCollector();
    when(atRuleNameNode.getValue()).thenReturn("external");
    List<CssValueNode> parameters = Lists.newArrayList(stringNode("*"));
    when(atRuleParameters.getValues()).thenReturn(parameters);
    externalClassesCollector.leaveUnknownAtRule(cssUnknownAtRuleNode);
    reset(mutatingVisitController);
    CssUnknownAtRuleNode secondAtRuleNode = mock(CssUnknownAtRuleNode.class);
    CssLiteralNode secondAtRuleNameNode = mock(CssLiteralNode.class);
    when(secondAtRuleNameNode.getValue()).thenReturn("external");
    when(secondAtRuleNode.getName()).thenReturn(secondAtRuleNameNode);

    // When
    externalClassesCollector.leaveUnknownAtRule(secondAtRuleNode);

    // Then
    verify(secondAtRuleNode, never()).getParameters();
    verify(mutatingVisitController).removeCurrentNode();
  }

  @Test
  public void leaveUnknownAtRule_externalAtRuleWithPrefix_classesMatchingThePrefixAreExternals() {
    // Given
    ExternalClassesCollector externalClassesCollector =
        createAndInitExternalClassesCollector(Sets.newHashSet("prefix", "prefix-class1",
            "prefi-notexternal","external"));
    when(atRuleNameNode.getValue()).thenReturn("external");
    List<CssValueNode> parameters = Lists.newArrayList(literalNode("external"),
        stringNode("prefix*"));
    when(atRuleParameters.getValues()).thenReturn(parameters);

    // When
    externalClassesCollector.leaveUnknownAtRule(cssUnknownAtRuleNode);

    // Then
    verify(cssUnknownAtRuleNode).getParameters();
    verify(atRuleParameters).getValues();
    verify(mutatingVisitController).removeCurrentNode();

    Set<String> externalClasses = externalClassesCollector.getExternalClassNames();
    assertEquals(3, externalClasses.size());
    assertTrue(externalClasses.contains("prefix"));
    assertTrue(externalClasses.contains("prefix-class1"));
    assertTrue(externalClasses.contains("external"));
  }

  private CssValueNode literalNode(String externalClass) {
    CssValueNode node = mock(CssLiteralNode.class);
    when(node.getValue()).thenReturn(externalClass);
    return node;
  }

  private CssValueNode stringNode(String selector) {
    CssStringNode node = mock(CssStringNode.class);
    when(node.getConcreteValue()).thenReturn(selector);
    return node;
  }

  private ExternalClassesCollector createAndInitExternalClassesCollector() {
    return createAndInitExternalClassesCollector(Sets.<String>newHashSet());
  }

  private ExternalClassesCollector createAndInitExternalClassesCollector(Set<String> classNames) {
    ExternalClassesCollector externalClassesCollector =
        new ExternalClassesCollector(mutatingVisitController, classNames);

    // initialise the object but do nothing
    externalClassesCollector.runPass();

    return externalClassesCollector;
  }
}
TOP

Related Classes of com.google.gwt.resources.gss.ExternalClassesCollectorTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.