| /* |
| * 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) { |
| } |
| } |