package squidpony.squidmath; import org.junit.Test; import squidpony.ArrayTools; import squidpony.squidgrid.Radius; import squidpony.squidgrid.mapping.DungeonGenerator; import squidpony.squidgrid.mapping.DungeonUtility; import java.util.ArrayList; import static org.junit.Assert.assertTrue; /** * Created by Tommy Ettinger on 10/1/2015. */ public class GreasedRegionTest { public static GreasedRegion dataCross = new GreasedRegion(64, 64).insertRectangle(25, 2, 14, 60).insertRectangle(2, 25, 60, 14); public static GreasedRegion dataCross2 = new GreasedRegion(128, 128).insertRectangle(24+32, 2 + 32, 16, 60).insertRectangle(2 + 32, 24 + 32, 60, 16); public static GreasedRegion box = new GreasedRegion(64, 64).insertRectangle(24, 24, 16, 16); public static GreasedRegion box2 = new GreasedRegion(120, 120).insertRectangle(24+32, 24+32, 16, 16); public static GreasedRegion box3 = new GreasedRegion(240, 240).insertRectangle(30, 30, 180, 180); public static StatefulRNG srng = new StatefulRNG(0x1337BEEF); public static DungeonGenerator dungeonGen = new DungeonGenerator(64, 64, srng); public static char[][] dungeon = dungeonGen.generate(); public static GreasedRegion dataDungeon = new GreasedRegion(dungeon, '.'); public static final char[] letters = ArrayTools.letterSpan(256); static { //printRegion(dataCross); //printRegion(dataCross2); } public static final boolean PRINTING = false; public static void print2D(int[][] data) { if(!PRINTING) return; if(data == null || data.length <= 0 || data[0] == null || data[0].length <= 0) System.out.println("null"); else { int d = 0; for (int y = 0; y < data[0].length; y++) { for (int x = 0; x < data.length; x++) { d = data[x][y]& 255; System.out.print(letters[d]); } System.out.println(); } } } @Test public void testBasics() { //printPacked(dataCross, 64, 64); GreasedRegion singleNegative = new GreasedRegion(dataCross).not(), doubleNegative = new GreasedRegion(dataCross).not().not(); assertTrue(dataCross.equals(doubleNegative)); GreasedRegion gr = new GreasedRegion(box2); printRegion(gr); GreasedRegion gr2 = new GreasedRegion(120, 120); gr2.insertRectangle(24 + 32, 24 + 32, 16, 16); assertTrue(gr.equals(gr2)); if(false) { srng.setState(0x123456789ABCDEFL); printRegion(new GreasedRegion(120, 120).insertSeveral(gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng), gr.singleRandom(srng))); System.out.println("\nSOBOL:"); int dcs = dataCross.copy().not().size() + dataCross.size() / 20; printRegion(gr = dataCross.copy().not().insertSeveral(dataCross.separatedPortion(0.05))); System.out.println("expected size: " + (dcs) + ", actual size " + gr.size()); System.out.println("\nVDC_2:"); printRegion(gr2 = dataCross.copy().not().insertSeveral(dataCross.quasiRandomSeparated(0.05))); System.out.println("expected size: " + (dcs) + ", actual size " + gr2.size()); System.out.println(); printRegion(dataDungeon); System.out.println("\nSOBOL:"); printRegion(gr = dataDungeon.copy().empty().insertSeveral(dataDungeon.separatedPortion(0.05))); System.out.println("expected size: " + (dataDungeon.size() * 3 / 50) + ", actual size " + gr.size()); System.out.println("\nVDC_2:"); printRegion(gr2 = dataDungeon.copy().empty().insertSeveral(dataDungeon.quasiRandomSeparated(0.05))); System.out.println("expected size: " + (dataDungeon.size() * 3 / 50) + ", actual size " + gr2.size()); } GreasedRegion g = new GreasedRegion(box); GreasedRegion g2 = new GreasedRegion(64, 64); g2.insertRectangle(24, 24, 16, 16); assertTrue(g.equals(g2)); GreasedRegion grr = new GreasedRegion(box3); GreasedRegion grr2 = new GreasedRegion(240, 240); grr2.insertRectangle(30, 30, 180, 180); assertTrue(grr.equals(grr2)); // GreasedRegion gri = new GreasedRegion(grr).insertRectangle(24, 52, 16, 16); // GreasedRegion gri2 = new GreasedRegion(grr).insert(0, 28, box); // printRegion(box); // printRegion(gri); // printRegion(gri2); // assertTrue(gri.equals(gri2)); GreasedRegion bigOn = new GreasedRegion(152, 152).not(); GreasedRegion gri = new GreasedRegion(150, 150).insertRectangle(3, 4, 147, 146); GreasedRegion gri2 = new GreasedRegion(150, 150).insert(3, 4, bigOn); printRegion(box); printRegion(gri); printRegion(gri2); assertTrue(gri.equals(gri2)); } public static int FOV_RANGE = 12; public static Radius RADIUS = Radius.SQUARE; public static void printRegion(GreasedRegion r) { if (PRINTING) { DungeonUtility.debugPrint(r.toChars()); System.out.println(); } } public void printBits16(int n) { for (int i = 0x8000; i > 0; i >>= 1) System.out.print((n & i) > 0 ? 1 : 0); } public void printBits32(int n) { for (int i = 1 << 31; i != 0; i >>>= 1) System.out.print((n & i) != 0 ? 1 : 0); } public long arrayMemoryUsage(int length, long bytesPerItem) { return (((bytesPerItem * length + 12 - 1) / 8) + 1) * 8L; } public long arrayMemoryUsage2D(int xSize, int ySize, long bytesPerItem) { return arrayMemoryUsage(xSize, (((bytesPerItem * ySize + 12 - 1) / 8) + 1) * 8L); } public int arrayMemoryUsageJagged(short[][] arr) { int ctr = 0; for (int i = 0; i < arr.length; i++) { ctr += arrayMemoryUsage(arr[i].length, 2); } return (((ctr + 12 - 1) / 8) + 1) * 8; } @Test public void testTranslate() { GreasedRegion crossZeroTranslated = new GreasedRegion(dataCross).translate(0, 0); GreasedRegion crossTranslated = new GreasedRegion(dataCross).translate(1, 1); GreasedRegion crossUnTranslated = new GreasedRegion(crossTranslated).translate(-1, -1); assertTrue(dataCross.equals(crossZeroTranslated)); assertTrue(dataCross.equals(crossUnTranslated)); printRegion(dataCross); GreasedRegion crossBox = new GreasedRegion(dataCross).translate(25, 25).translate(-50, -50); printRegion(crossBox); assertTrue(crossBox.equals(new GreasedRegion(CoordPacker.unpack(CoordPacker.rectangle(14, 14), 64, 64)))); GreasedRegion big = new GreasedRegion(150, 150).not().translate(100, 100); GreasedRegion big2 = new GreasedRegion(150, 150).insertRectangle(100, 100, 50, 50); printRegion(big); printRegion(big2); assertTrue(big.equals(big2)); } @Test public void testUnion() { GreasedRegion box = new GreasedRegion(dataCross); //printRegion(box); box.translate(25, 25); //printRegion(box); box.translate(-50, -50); //printRegion(box); box.translate(25, 25); GreasedRegion alter = new GreasedRegion(CoordPacker.unpack(CoordPacker.rectangle(25, 2, 14, 60), 64, 64)) .and(new GreasedRegion(CoordPacker.unpack(CoordPacker.rectangle(2, 25, 60, 14), 64, 64))); //printRegion(box); //printRegion(alter); assertTrue(box.equals(alter)); GreasedRegion minus = new GreasedRegion(dataCross).andNot(box); GreasedRegion xr = new GreasedRegion(CoordPacker.unpack(CoordPacker.rectangle(25, 2, 14, 60), 64, 64)) .xor(new GreasedRegion(CoordPacker.unpack(CoordPacker.rectangle(2, 25, 60, 14), 64, 64))); printRegion(minus); printRegion(xr); assertTrue(minus.equals(xr)); } @Test public void testExpanding() { GreasedRegion edge = new GreasedRegion(dataCross).fringe(); printRegion(edge); GreasedRegion bonus = new GreasedRegion(dataCross).expand(); printRegion(bonus); assertTrue(new GreasedRegion(bonus).andNot(edge).equals(dataCross)); GreasedRegion edge2 = new GreasedRegion(dataCross2).fringe8way(); printRegion(edge2); GreasedRegion bonus2 = new GreasedRegion(dataCross2).expand8way(); printRegion(bonus2); assertTrue(new GreasedRegion(bonus2).andNot(edge2).equals(dataCross2)); GreasedRegion flooded = new GreasedRegion(Coord.get(26, 2), 64, 64).flood(dataCross, 2); GreasedRegion manual = new GreasedRegion(64, 64, Coord.get(25, 2), Coord.get(26, 2), Coord.get(27, 2), Coord.get(28, 2), Coord.get(25, 3), Coord.get(26, 3), Coord.get(27, 3), Coord.get(26, 4)); printRegion(flooded); printRegion(manual); assertTrue(flooded.equals(manual)); } @Test public void testRetracting() { GreasedRegion surf = new GreasedRegion(dataCross).surface(); printRegion(surf); GreasedRegion shrunk = new GreasedRegion(dataCross).retract(); printRegion(shrunk); assertTrue(new GreasedRegion(shrunk).or(surf).equals(dataCross)); GreasedRegion surf2 = new GreasedRegion(dataCross2).surface8way(); printRegion(surf2); GreasedRegion shrunk2 = new GreasedRegion(dataCross2).retract8way(); printRegion(shrunk2); assertTrue(new GreasedRegion(shrunk2).or(surf2).equals(dataCross2)); System.out.println(); GreasedRegion littleBox = new GreasedRegion(32, 32).insertRectangle(12, 12, 8, 8); printRegion(littleBox); System.out.println(); ArrayList<GreasedRegion> toLimit = littleBox.fringeSeriesToLimit8way(); for(GreasedRegion gr : toLimit) printRegion(gr); } @Test public void testFitting() { GreasedRegion wrecked = new GreasedRegion(dataCross); int[][] numbers = GreasedRegion.sum(new GreasedRegion(64, 64).not().retractSeries8way(30)); print2D(numbers); System.out.println(); printRegion(wrecked); System.out.println(); print2D(wrecked.fit(numbers, 0)); } @Test public void testRandom() { StatefulRNG rng = new StatefulRNG(0x1337BEEF); GreasedRegion wrecked = dataCross.copy().disperse(); printRegion(wrecked); wrecked.disperse8way(); printRegion(wrecked); wrecked.remake(dataCross).disperseRandom(rng); printRegion(wrecked); } @Test public void testCorners() { GreasedRegion beveled = new GreasedRegion(dataCross).removeCorners(); printRegion(beveled); GreasedRegion other = new GreasedRegion(dataCross).expand().retract8way(); printRegion(other); assertTrue(beveled.equals(other)); beveled.fill(true).removeCorners(); printRegion(beveled); } @Test public void testZoom() { GreasedRegion crossCopy = new GreasedRegion(dataCross); printRegion(crossCopy); crossCopy.zoom(13, 13); printRegion(crossCopy); GreasedRegion midCross = new GreasedRegion(71, 71).insertRectangle(27, 2, 17, 60).insertRectangle(2, 27, 60, 17); printRegion(midCross); midCross.zoom(30, 33); printRegion(midCross); } }