/*
* 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.gss;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyList;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.google.gwt.core.ext.GeneratorContext;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JMethod;
import com.google.gwt.core.ext.typeinfo.NotFoundException;
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.resources.client.ImageResource.ImageOptions;
import com.google.gwt.resources.client.ImageResource.RepeatStyle;
import com.google.gwt.resources.ext.ResourceContext;
import com.google.gwt.resources.gss.ImageSpriteCreator.MethodByPathHelper;
import com.google.gwt.thirdparty.common.css.compiler.ast.CssTree;
import com.google.gwt.thirdparty.common.css.compiler.ast.ErrorManager;
import com.google.gwt.thirdparty.common.css.compiler.ast.GssError;
/**
* Test class for {@link ImageSpriteCreator}.
*/
public class ImageSpriteCreatorTest extends BaseGssTest {
private JClassType imageResourceType;
private ResourceContext resourceContext;
private ErrorManager errorManager;
private MethodByPathHelper methodByPathHelper;
private JMethod imageMethod;
@Override
protected void setUp() {
errorManager = mock(ErrorManager.class);
imageResourceType = mock(JClassType.class);
resourceContext = mockResourceContext();
methodByPathHelper = mock(MethodByPathHelper.class);
imageMethod = mock(JMethod.class);
}
public void testInvalidSpriteWithSeveralValue() {
// given
CssTree cssTree = parseAndBuildTree(lines(
".someClassWithSprite { ",
" gwt-sprite: imageResource otherImageResource;",
"}"));
ImageSpriteCreator visitor = new ImageSpriteCreator(cssTree.getMutatingVisitController(),
resourceContext, errorManager, methodByPathHelper);
// when
visitor.runPass();
// then
verify(errorManager).report(any(GssError.class));
}
public void testInvalidSpriteImageMethodNotFound() throws NotFoundException {
// given
CssTree cssTree = parseAndBuildTree(lines(
".someClassWithSprite { ",
" gwt-sprite: imageResource;",
"}"));
when(resourceContext.getClientBundleType()).thenReturn(mock(JClassType.class));
when(methodByPathHelper.getMethodByPath(any(ResourceContext.class), anyList(),
any(JClassType.class))).thenThrow(new NotFoundException(""));
ImageSpriteCreator visitor = new ImageSpriteCreator(cssTree.getMutatingVisitController(),
resourceContext, errorManager, methodByPathHelper);
// when
visitor.runPass();
// then
verify(errorManager).report(any(GssError.class));
}
public void testSimpleSpriteCreation() throws NotFoundException {
testSpriteCreation("no-repeat", null);
}
public void testSpriteCreationWithHorizontalRepeat() throws NotFoundException {
testSpriteCreation("repeat-x", RepeatStyle.Horizontal);
}
public void testSpriteCreationWithVerticalRepeat() throws NotFoundException {
testSpriteCreation("repeat-y", RepeatStyle.Vertical);
}
public void testSpriteCreationWithRepeat() throws NotFoundException {
testSpriteCreation("repeat", RepeatStyle.Both);
}
public void testSpriteCreationWithNoneRepeat() throws NotFoundException {
testSpriteCreation("no-repeat", RepeatStyle.None);
}
private void testSpriteCreation(String repeat, RepeatStyle repeatStyle) throws NotFoundException {
// given
CssTree cssTree = parseAndBuildTree(lines(
".someClassWithSprite { ",
" color: white;",
" gwt-sprite: 'imageResource';",
" background-color: black;",
"}"));
when(methodByPathHelper.getMethodByPath(any(ResourceContext.class), anyList(),
any(JClassType.class))).thenReturn(imageMethod);
if (repeatStyle != null) {
// simulate a @ImageOptions(repeatStyle)
ImageOptions imageOptions = mock(ImageOptions.class);
when(imageOptions.repeatStyle()).thenReturn(repeatStyle);
when(imageMethod.getAnnotation(ImageOptions.class)).thenReturn(imageOptions);
}
ImageSpriteCreator visitor = new ImageSpriteCreator(cssTree.getMutatingVisitController(),
resourceContext, errorManager, methodByPathHelper);
// when
visitor.runPass();
// then
verify(errorManager, never()).report(any(GssError.class));
String widthRule = "[/* @alternate */]width:[ImageSpriteCreatorTest.this.imageResource()" +
".getWidth() + \"px\"], ";
String heightRule = "[/* @alternate */]height:[ImageSpriteCreatorTest.this.imageResource()" +
".getHeight() + \"px\"], ";
if (repeatStyle == RepeatStyle.Horizontal || repeatStyle == RepeatStyle.Both) {
widthRule = "";
}
if (repeatStyle == RepeatStyle.Vertical || repeatStyle == RepeatStyle.Both) {
heightRule = "";
}
String cssTreeStringExpected = "[" +
"[.someClassWithSprite]{" +
"[color:[white], " +
heightRule +
widthRule +
"[/* @alternate */]overflow:[hidden], " +
"[/* @alternate */]background:" +
"[url(ImageSpriteCreatorTest.this.imageResource().getSafeUri().asString()), " +
"\"-\" + ImageSpriteCreatorTest.this.imageResource().getLeft() + \"px\", " +
"\"-\" + ImageSpriteCreatorTest.this.imageResource().getTop() + \"px\", " +
"" + repeat + "], " +
"background-color:[black]]" +
"}]";
assertEquals(cssTreeStringExpected, cssTree.getRoot().getBody().toString());
}
private ResourceContext mockResourceContext() {
ResourceContext context = mock(ResourceContext.class);
when(context.getImplementationSimpleSourceName()).thenReturn("ImageSpriteCreatorTest");
GeneratorContext generatorContext = mock(GeneratorContext.class);
TypeOracle oracle = mock(TypeOracle.class);
when(oracle.findType(ImageResource.class.getCanonicalName())).thenReturn(imageResourceType);
when(generatorContext.getTypeOracle()).thenReturn(oracle);
when(context.getGeneratorContext()).thenReturn(generatorContext);
return context;
}
@Override
protected void runPassesOnNewTree(CssTree cssTree, ErrorManager errorManager) {
}
}