/* (c) 2016 Open Source Geospatial Foundation - all rights reserved
* (c) 2014 - 2016 Boundless Spatial Inc.
* This code is licensed under the GPL 2.0 license, available at the root
* application directory.
*/
package org.geoserver.ysld;
import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import static org.geotools.ysld.TestUtils.rangeContains;
import static org.hamcrest.Matchers.closeTo;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.notNullValue;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.*;
import java.awt.Color;
import org.easymock.classextension.EasyMock;
import org.geotools.styling.PointSymbolizer;
import org.geotools.styling.SLD;
import org.geotools.styling.StyledLayerDescriptor;
import org.geotools.ysld.TestUtils;
import org.geotools.ysld.Ysld;
import org.geotools.ysld.parse.ScaleRange;
import org.geotools.ysld.parse.ZoomContext;
import org.geotools.ysld.parse.ZoomContextFinder;
import org.geowebcache.grid.Grid;
import org.geowebcache.grid.GridSet;
import org.geowebcache.grid.GridSetBroker;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
public class GWCZoomContextFinderTest {
private static final double EPSILON = 0.000000001d;
Grid mockGrid(int level, double denom, GridSet mockGridset) {
Grid grid = createMock(Grid.class);
expect(mockGridset.getGrid(level)).andStubReturn(grid);
expect(grid.getScaleDenominator()).andStubReturn(denom);
return grid;
}
@Test
public void testGetContext() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andReturn(set);
Grid grid1 = mockGrid(1, 500_000_000d, set);
replay(broker, set, grid1);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
assertThat(zContext, notNullValue());
verify(broker, set, grid1);
}
@Test
public void testCouldntFind() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
expect(broker.get("doesntexist")).andStubReturn(null);
Grid grid1 = mockGrid(1, 500_000_000d, set);
replay(broker, set, grid1);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("doesntexist");
assertThat(zContext, nullValue());
verify(broker, set, grid1);
}
@Test
public void testCorrectScale() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
Grid grid1 = mockGrid(1, 500_000_000d, set);
expect(set.getNumLevels()).andStubReturn(5);
replay(broker, set, grid1);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
double denom = zContext.getScaleDenominator(1);
assertThat(denom, closeTo(500_000_000d, EPSILON));
verify(broker, set, grid1);
}
@Test
public void testScaleNegativeLevel() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
expect(set.getNumLevels()).andStubReturn(5);
replay(broker, set);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
double denom = zContext.getScaleDenominator(-1);
assertThat(denom, is(Double.POSITIVE_INFINITY));
verify(broker, set);
}
@Test
public void testScalePastEnd() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
expect(set.getNumLevels()).andStubReturn(5);
replay(broker, set);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
double denom = zContext.getScaleDenominator(5);
assertThat(denom, is(0d));
verify(broker, set);
}
@Test
public void testRange() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
Grid grid1 = mockGrid(1, 500_000_000d, set);
Grid grid2 = mockGrid(2, 200_000_000d, set);
Grid grid3 = mockGrid(3, 100_000_000d, set);
expect(set.getNumLevels()).andStubReturn(5);
replay(broker, set, grid1, grid2, grid3);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
ScaleRange range = zContext.getRange(2,2);
assertThat(range, rangeContains(200_000_000d));
assertThat(range, not(rangeContains(500_000_000d)));
assertThat(range, not(rangeContains(100_000_000d)));
verify(broker, set, grid1, grid2, grid3);
}
@Test
public void testRangeStart() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
Grid grid0 = mockGrid(0, 500_000_000d, set);
Grid grid1 = mockGrid(1, 200_000_000d, set);
Grid grid2 = mockGrid(2, 100_000_000d, set);
expect(set.getNumLevels()).andStubReturn(5);
replay(broker, set, grid0, grid1, grid2);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
ScaleRange range = zContext.getRange(0,1);
assertThat(range, rangeContains(1/EPSILON));
assertThat(range, rangeContains(500_000_000d));
assertThat(range, rangeContains(200_000_000d));
assertThat(range, not(rangeContains(100_000_000d)));
assertThat(range, not(rangeContains(EPSILON)));
verify(broker, set, grid0, grid1, grid2);
}
@Test
public void testRangeEnd() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
Grid grid2 = mockGrid(2, 500_000_000d, set);
Grid grid3 = mockGrid(3, 200_000_000d, set);
Grid grid4 = mockGrid(4, 100_000_000d, set);
expect(set.getNumLevels()).andStubReturn(5);
replay(broker, set, grid2, grid3, grid4);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
ScaleRange range = zContext.getRange(3,4);
assertThat(range, not(rangeContains(1/EPSILON)));
assertThat(range, not(rangeContains(500_000_000d)));
assertThat(range, rangeContains(200_000_000d));
assertThat(range, rangeContains(100_000_000d));
assertThat(range, rangeContains(EPSILON));
verify(broker, set, grid2, grid3, grid4);
}
@Test
public void testRangePastEnd() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
Grid grid2 = mockGrid(2, 500_000_000d, set);
Grid grid3 = mockGrid(3, 200_000_000d, set);
Grid grid4 = mockGrid(4, 100_000_000d, set);
expect(set.getNumLevels()).andStubReturn(5);
replay(broker, set, grid2, grid3, grid4);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
ScaleRange range = zContext.getRange(6,7);
assertThat(range, not(rangeContains(1/EPSILON)));
assertThat(range, not(rangeContains(500_000_000d)));
assertThat(range, not(rangeContains(200_000_000d)));
assertThat(range, not(rangeContains(100_000_000d)));
assertThat(range, not(rangeContains(EPSILON)));
verify(broker, set, grid2, grid3, grid4);
}
@Test
public void testRangePastStart() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
Grid grid2 = mockGrid(2, 500_000_000d, set);
Grid grid3 = mockGrid(3, 200_000_000d, set);
Grid grid4 = mockGrid(4, 100_000_000d, set);
expect(set.getNumLevels()).andStubReturn(5);
replay(broker, set, grid2, grid3, grid4);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
ScaleRange range = zContext.getRange(-2,-1);
assertThat(range, not(rangeContains(1/EPSILON)));
assertThat(range, not(rangeContains(500_000_000d)));
assertThat(range, not(rangeContains(200_000_000d)));
assertThat(range, not(rangeContains(100_000_000d)));
assertThat(range, not(rangeContains(EPSILON)));
verify(broker, set, grid2, grid3, grid4);
}
@Test
public void testRangeBoundaryLikeTileFuser() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
Grid grid2 = mockGrid(2, 500_000_000d, set);
Grid grid3 = mockGrid(3, 200_000_000d, set);
Grid grid4 = mockGrid(4, 100_000_000d, set);
expect(set.getNumLevels()).andStubReturn(5);
replay(broker, set, grid2, grid3, grid4);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
ScaleRange range = zContext.getRange(3,3);
assertThat(range.getMaxDenom(), Matchers.closeTo(500_000_000d/1.005, EPSILON));
assertThat(range.getMinDenom(), Matchers.closeTo(200_000_000d/1.005, EPSILON));
verify(broker, set, grid2, grid3, grid4);
}
@Test
@Ignore
public void testRangeBoundaryGeometric() throws Exception {
GridSetBroker broker = createMock(GridSetBroker.class);
GridSet set = createMock(GridSet.class);
expect(broker.get("test")).andStubReturn(set);
Grid grid2 = mockGrid(2, 500_000_000d, set);
Grid grid3 = mockGrid(3, 200_000_000d, set);
Grid grid4 = mockGrid(4, 100_000_000d, set);
expect(set.getNumLevels()).andStubReturn(5);
replay(broker, set, grid2, grid3, grid4);
ZoomContextFinder finder = new GWCZoomContextFinder(broker);
ZoomContext zContext = finder.get("test");
ScaleRange range = zContext.getRange(3,3);
assertThat(range.getMaxDenom(), Matchers.closeTo(Math.sqrt(500_000_000d*200_000_000), EPSILON));
assertThat(range.getMinDenom(), Matchers.closeTo(Math.sqrt(200_000_000d*100_000_000), EPSILON));
verify(broker, set, grid2, grid3, grid4);
}
}