/*
* This is part of Geomajas, a GIS framework, http://www.geomajas.org/.
*
* Copyright 2008-2015 Geosparc nv, http://www.geosparc.com/, Belgium.
*
* The program is available in open source according to the GNU Affero
* General Public License. All contributions in this program are covered
* by the Geomajas Contributors License Agreement. For full licensing
* details, see LICENSE.txt in the project root.
*/
package org.geomajas.gwt2.plugin.print.client.widget;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.stub;
import static org.mockito.Mockito.verify;
import java.util.List;
import junit.framework.Assert;
import org.geomajas.configuration.client.ClientMapInfo;
import org.geomajas.geometry.Bbox;
import org.geomajas.gwt2.client.GeomajasServerExtension;
import org.geomajas.gwt2.client.map.MapConfiguration;
import org.geomajas.gwt2.client.map.MapPresenter;
import org.geomajas.gwt2.client.map.ViewPort;
import org.geomajas.gwt2.client.map.layer.LayersModel;
import org.geomajas.gwt2.plugin.print.client.Print;
import org.geomajas.gwt2.plugin.print.client.PrintService;
import org.geomajas.gwt2.plugin.print.client.ViewMockData;
import org.geomajas.gwt2.plugin.print.client.event.PrintRequestInfo;
import org.geomajas.gwt2.plugin.print.client.template.PageSize;
import org.geomajas.plugin.printing.command.dto.PrintTemplateInfo;
import org.geomajas.plugin.printing.component.dto.ImageComponentInfo;
import org.geomajas.plugin.printing.component.dto.LayoutConstraintInfo;
import org.geomajas.plugin.printing.component.dto.MapComponentInfo;
import org.geomajas.plugin.printing.component.dto.PageComponentInfo;
import org.geomajas.plugin.printing.component.dto.PrintComponentInfo;
import org.geomajas.plugin.printing.component.dto.ScaleBarComponentInfo;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import com.google.gwt.core.client.Callback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwtmockito.GwtMockitoTestRunner;
/**
* Test class for {@link org.geomajas.gwt2.plugin.print.client.widget.PrintWidgetPresenterImpl}.
*
* @author Jan Venstermans
*/
@RunWith(GwtMockitoTestRunner.class) // for the final class GeomajasServerExtension
public abstract class PrintWidgetMockStart {
protected PrintWidgetPresenterImpl presenter;
@Mock
protected MapPresenter mapPresenterMock;
@Mock
protected PrintWidgetView printWidgetViewMock;
@Mock
protected PrintService printServiceMock;
@Mock
protected ViewPort viewPortMock;
@Mock
protected AbsolutePanel mapPresenterPanelMock;
@Mock
protected MapConfiguration mapConfigurationMock;
@Mock
protected ClientMapInfo clientMapInfoMock;
@Mock
protected LayersModel layersModelMock;
// response dummy data
protected Bbox viewPortBounds = new Bbox(0,0,200,100);
protected ViewMockData viewData = new ViewMockData();
@Before
public void before() {
MockitoAnnotations.initMocks(this);
viewData.resetData();
Print.getInstance().setPrintService(printServiceMock);
presenter = new PrintWidgetPresenterImpl(mapPresenterMock, viewData.getApplicationId(), printWidgetViewMock);
reset(mapPresenterMock);
reset(printWidgetViewMock);
// stub Geomajas framework for testing
stub(mapPresenterMock.getViewPort()).toReturn(viewPortMock);
stub(mapPresenterMock.asWidget()).toReturn(mapPresenterPanelMock);
stub(mapPresenterMock.getLayersModel()).toReturn(layersModelMock);
stub(layersModelMock.getLayerCount()).toReturn(0);
stub(viewPortMock.getBounds()).toReturn(viewPortBounds);
stub(mapPresenterMock.getConfiguration()).toReturn(mapConfigurationMock);
stub(mapConfigurationMock.getHintValue(GeomajasServerExtension.MAPINFO)).toReturn(clientMapInfoMock);
// add dummy data to printWidgetViewMock
stubViewMockWithViewData();
}
protected PrintComponentInfo getChildOfType(List<PrintComponentInfo> children, Class<? extends PrintComponentInfo> typeClass) {
return getChildOfTypeAndTag(children, typeClass, null);
}
protected PrintComponentInfo getChildOfTypeAndTag(List<PrintComponentInfo> children,
Class<? extends PrintComponentInfo> typeClass, String tag) {
for (PrintComponentInfo component : children) {
if (typeClass.isInstance(component)) {
if (tag == null || component.getTag().equals(tag)) {
return component;
}
}
}
return null;
}
protected void captureServiceCallAndAssertTemplate() {
//attempt to get data from view
ArgumentCaptor<PrintRequestInfo> templateCaptor = ArgumentCaptor.forClass(PrintRequestInfo.class);
ArgumentCaptor<Callback> callbackCaptor = ArgumentCaptor.forClass(Callback.class);
verify(printServiceMock).print(templateCaptor.capture(), callbackCaptor.capture());
// assert command
PrintTemplateInfo templateInfo = templateCaptor.getValue().getPrintTemplateInfo();
assertPageComponentInfo(templateInfo.getPage());
}
protected void assertPageComponentInfo(PageComponentInfo pageComponentInfo) {
assertBounds(pageComponentInfo.getLayoutConstraint(), viewData.isLandscape(), viewData.getPageSize());
MapComponentInfo mapComponent = (MapComponentInfo) getChildOfType(pageComponentInfo.getChildren(), MapComponentInfo.class);
Assert.assertNotNull(mapComponent);
Assert.assertEquals(viewData.getApplicationId(), mapComponent.getApplicationId());
Assert.assertEquals((int) viewData.getRasterDpi(), (int) mapComponent.getRasterResolution());
// check scalebar
ScaleBarComponentInfo scaleBarComponent = (ScaleBarComponentInfo)
getChildOfType(mapComponent.getChildren(), ScaleBarComponentInfo.class);
Assert.assertEquals(viewData.isWithScaleBar(), scaleBarComponent != null);
// check scalebar
ImageComponentInfo imageComponentInfo = (ImageComponentInfo)
getChildOfTypeAndTag(mapComponent.getChildren(), ImageComponentInfo.class, "arrow");
Assert.assertEquals(viewData.isWithArrow(), imageComponentInfo != null);
}
protected void assertBounds(LayoutConstraintInfo bounds, boolean landscape, PageSize pageSize) {
double width = bounds.getWidth();
double height = bounds.getHeight();
// assert landscape
if (landscape) {
Assert.assertTrue(width >= height);
} else {
Assert.assertTrue(width <= height);
}
double pageSizeWidth = pageSize.getWidth();
double pageSizeHeight = pageSize.getHeight();
Assert.assertEquals(Math.max(width, height), Math.max(pageSizeWidth, pageSizeHeight), 0.005);
Assert.assertEquals(Math.min(width, height), Math.min(pageSizeWidth, pageSizeHeight), 0.005);
}
protected void stubViewMockWithViewData() {
stub(printWidgetViewMock.getTemplateBuilderDataProvider()).toReturn(viewData);
}
}