/**
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* @author Gabriel Roldan (OpenGeo) 2010
*
*/
package org.geowebcache.diskquota.storage;
import java.math.BigInteger;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import junit.framework.TestCase;
import org.geowebcache.diskquota.storage.PagePyramid.PageLevelInfo;
import org.geowebcache.grid.GridSet;
import org.geowebcache.grid.GridSetBroker;
import org.geowebcache.grid.GridSubset;
import org.geowebcache.grid.GridSubsetFactory;
import org.geowebcache.storage.blobstore.file.FilePathUtils;
public class PagePyramidTest extends TestCase {
GridSet world_EPSG3857 = new GridSetBroker(true, false).WORLD_EPSG3857;
GridSet world_EPSG4326 = new GridSetBroker(true, false).WORLD_EPSG4326;
private long[][] coverages;
private PagePyramid pyramid;
public void setUp() {
coverages = new long[][] {//
{ 0, 0, 1, 1, 0 },// 2x2 tiles
{ 3, 3, 10, 10, 1 },// 11x11 tiles
{ 0, 0, 101, 101, 2 },// 102x102 tiles
{ 1000, 1000, 3000, 3000, 3 } // 2001x2001 tiles
};
pyramid = new PagePyramid(coverages, 0, 3);
}
public void testCalculatePageInfo() {
GridSubset gridSubSet = GridSubsetFactory.createGridSubSet(world_EPSG3857);
long[][] gridSubsetCoverages = gridSubSet.getCoverages();
int zoomStart = gridSubSet.getZoomStart();
int zoomStop = gridSubSet.getZoomStop();
PagePyramid pp = new PagePyramid(gridSubsetCoverages, zoomStart, zoomStop);
printPyramid(zoomStart, zoomStop, pp);
}
private void printPyramid(int zoomStart, int zoomStop, PagePyramid pp) {
NumberFormat nf = NumberFormat.getInstance(new Locale("es"));
nf.setGroupingUsed(true);
long totalPages = 0;
BigInteger totalTiles = BigInteger.ZERO;
for (int z = zoomStart; z <= zoomStop; z++) {
PageLevelInfo pageInfo = pp.getPageInfo(z);
long levelPages = pageInfo.pagesX * pageInfo.pagesY;
BigInteger tilesPerPage = pageInfo.tilesPerPage;
totalPages += levelPages;
totalTiles = totalTiles.add(tilesPerPage.multiply(BigInteger.valueOf(levelPages)));
System.out.println(FilePathUtils.zeroPadder(z, 2) + ": (total pages ="
+ nf.format(totalPages) + ") " + pageInfo.toString() + "(level tiles = "
+ nf.format(tilesPerPage.multiply(BigInteger.valueOf(levelPages))) + ") ");
}
System.out.println("Total pages: " + totalPages);
}
public void testGetPagesPerLevel() {
assertEquals(2, pyramid.getPagesPerLevelX(0));
assertEquals(2, pyramid.getPagesPerLevelY(0));
assertEquals(8, pyramid.getPagesPerLevelX(1));
assertEquals(8, pyramid.getPagesPerLevelY(1));
assertEquals(34, pyramid.getPagesPerLevelX(2));
assertEquals(34, pyramid.getPagesPerLevelY(2));
assertEquals(77, pyramid.getPagesPerLevelX(3));
assertEquals(77, pyramid.getPagesPerLevelY(3));
}
public void testGetTilesPerPage() {
assertEquals(1, pyramid.getTilesPerPageX(0));
assertEquals(1, pyramid.getTilesPerPageY(0));
assertEquals(1, pyramid.getTilesPerPageX(1));
assertEquals(1, pyramid.getTilesPerPageY(1));
assertEquals(3, pyramid.getTilesPerPageX(2));
assertEquals(3, pyramid.getTilesPerPageY(2));
assertEquals(26, pyramid.getTilesPerPageX(3));
assertEquals(26, pyramid.getTilesPerPageY(3));
}
public void testToGridCoverage() {
long[][] gridCoverage;
gridCoverage = pyramid.toGridCoverage(0, 0, 0);
assertEquals(asList(0, 0, 0, 0, 0), asList(gridCoverage[0]));
int level = 1;
int pageX = 2;
int pageY = 2;
int pageZ = 1;
gridCoverage = pyramid.toGridCoverage(pageX, pageY, pageZ);
int tilesPerPageX = pyramid.getTilesPerPageX(level);
int tilesPerPageY = pyramid.getTilesPerPageY(level);
long[] expected = { coverages[level][0] + tilesPerPageX * pageX,//
coverages[level][1] + tilesPerPageY * pageY, //
coverages[level][0] + tilesPerPageX * pageX + tilesPerPageX - 1,//
coverages[level][0] + tilesPerPageY * pageY + tilesPerPageY - 1,//
pageZ };
assertEquals(asList(expected), asList(gridCoverage[1]));
}
public void testPageIndexForTile() throws Exception {
try {
pyramid.pageIndexForTile(0, 0, 0, null);
fail("Expected IAE");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
try {
pyramid.pageIndexForTile(0, 0, 0, new int[2]);
fail("Expected IAE");
} catch (IllegalArgumentException e) {
assertTrue(true);
}
printPyramid(pyramid.getZoomStart(), pyramid.getZoomStop(), pyramid);
// grid coverages:
// { 0, 0, 1, 1, 0 },// 1x1 tiles
int[] pageIndexTarget = { Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE };
int[] expected = { 0, 0, 0 };
pyramid.pageIndexForTile(0, 0, 0, pageIndexTarget);
assertTrue(Arrays.toString(pageIndexTarget), Arrays.equals(expected, pageIndexTarget));
expected = new int[] { 1, 1, 0 };
pyramid.pageIndexForTile(1, 1, 0, pageIndexTarget);
assertTrue(Arrays.toString(pageIndexTarget), Arrays.equals(expected, pageIndexTarget));
// grid coverages:
// { 3, 3, 10, 10, 1 },// 1x1 tiles
expected = new int[] { 0, 0, 1 };
pyramid.pageIndexForTile(3, 3, 1, pageIndexTarget);
assertTrue(Arrays.toString(pageIndexTarget), Arrays.equals(expected, pageIndexTarget));
expected = new int[] { 1, 1, 1 };
pyramid.pageIndexForTile(4, 4, 1, pageIndexTarget);
assertTrue(Arrays.toString(pageIndexTarget), Arrays.equals(expected, pageIndexTarget));
expected = new int[] { 7, 7, 1 };
pyramid.pageIndexForTile(10, 10, 1, pageIndexTarget);
assertTrue(Arrays.toString(pageIndexTarget), Arrays.equals(expected, pageIndexTarget));
// grid coverages:
// { 1000, 1000, 3000, 3000, 3 } // 77x77 pages, 26x26 tiles
expected = new int[] { 0, 0, 3 };
pyramid.pageIndexForTile(1000, 1000, 3, pageIndexTarget);
assertTrue(Arrays.toString(pageIndexTarget), Arrays.equals(expected, pageIndexTarget));
expected = new int[] { 1, 1, 3 };
pyramid.pageIndexForTile(1026, 1026, 3, pageIndexTarget);
assertTrue(Arrays.toString(pageIndexTarget), Arrays.equals(expected, pageIndexTarget));
}
private List<Long> asList(long... coverage) {
List<Long> list = new ArrayList<Long>();
for (long l : coverage) {
list.add(Long.valueOf(l));
}
return list;
}
}