/* This file is part of Eternity II Editor.
*
* Eternity II Editor is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Eternity II Editor 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 General Public License
* along with Eternity II Editor. If not, see <http://www.gnu.org/licenses/>.
*
* Eternity II Editor project is hosted on SourceForge:
* http://sourceforge.net/projects/eternityii/
* and maintained by Yannick Kirschhoffer <alcibiade@alcibiade.org>
*/
package org.alcibiade.eternity.editor.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException;
import org.alcibiade.eternity.editor.model.operation.GridFiller;
import org.alcibiade.eternity.editor.model.operation.GridLoader;
import org.junit.Test;
public class GridModelTest {
@Test
public void testFill() {
GridModel grid = new GridModel(5);
GridFiller filler = new GridFiller(grid);
filler.FillRandomAsymetric(7);
for (QuadModel quad : grid) {
assertFalse(quad.isClear());
}
PatternStats stats = grid.getPatternStats();
assertEquals(grid.countConnections(), grid.countPairs());
assertTrue(stats.getPatterns().size() <= 7);
}
@Test
public void testClone() {
GridModel grid1 = new GridModel(5);
GridFiller filler = new GridFiller(grid1);
filler.FillRandomAsymetric(7);
GridModel grid2 = grid1.clone();
assertTrue(grid1 != grid2);
}
@Test
public void testEquals() {
GridModel grid1 = new GridModel(5);
GridModel grid2 = new GridModel(6);
GridModel grid3 = new GridModel(6);
assertFalse(grid1.equals(grid2));
assertTrue(grid2.equals(grid3));
grid3.getQuad(1, 1).setPattern(QuadModel.DIR_EAST, Pattern.getPatternByCode(1));
assertFalse(grid1.equals(grid2));
}
@Test
public void testRotateClockwise() {
GridModel grid1 = new GridModel(5);
GridFiller filler = new GridFiller(grid1);
filler.FillRandomAsymetric(7);
GridModel grid2 = grid1.clone();
assertTrue(grid1.equals(grid2));
grid2.rotateClockwise();
QuadModel q1 = grid1.getQuad(1, 1).clone();
QuadModel q2 = grid2.getQuad(3, 1);
q1.rotateClockwise();
assertTrue(q1.equals(q2));
assertFalse(grid1.equals(grid2));
assertEquals(grid2.countConnections(), grid2.countPairs());
grid2.rotateClockwise();
assertFalse(grid1.equals(grid2));
assertEquals(grid2.countConnections(), grid2.countPairs());
grid2.rotateClockwise();
assertFalse(grid1.equals(grid2));
assertEquals(grid2.countConnections(), grid2.countPairs());
grid2.rotateClockwise();
assertTrue(grid1.equals(grid2));
assertEquals(grid2.countConnections(), grid2.countPairs());
}
@Test
public void testRotateCounterclockwise() {
GridModel grid1 = new GridModel(5);
GridFiller filler = new GridFiller(grid1);
filler.FillRandomAsymetric(7);
GridModel grid2 = grid1.clone();
assertTrue(grid1.equals(grid2));
grid2.rotateCounterclockwise();
QuadModel q1 = grid1.getQuad(3, 1).clone();
QuadModel q2 = grid2.getQuad(1, 1);
q1.rotateCounterclockwise();
assertTrue(q1.equals(q2));
assertFalse(grid1.equals(grid2));
assertEquals(grid2.countConnections(), grid2.countPairs());
grid2.rotateCounterclockwise();
assertFalse(grid1.equals(grid2));
assertEquals(grid2.countConnections(), grid2.countPairs());
grid2.rotateCounterclockwise();
assertFalse(grid1.equals(grid2));
assertEquals(grid2.countConnections(), grid2.countPairs());
grid2.rotateCounterclockwise();
assertTrue(grid1.equals(grid2));
assertEquals(grid2.countConnections(), grid2.countPairs());
}
@Test
public void testRotateCenterClockwise() {
GridModel grid1 = new GridModel(5);
GridFiller filler = new GridFiller(grid1);
filler.FillRandomAsymetric(7);
GridModel grid2 = grid1.clone();
assertTrue(grid1.equals(grid2));
grid2.rotateCenterClockwise();
assertFalse(grid1.equals(grid2));
grid2.rotateCenterClockwise();
assertFalse(grid1.equals(grid2));
grid2.rotateCenterClockwise();
assertFalse(grid1.equals(grid2));
grid2.rotateCenterClockwise();
assertTrue(grid1.equals(grid2));
}
@Test
public void testRotateCenterCounterclockwise() {
GridModel grid1 = new GridModel(5);
GridFiller filler = new GridFiller(grid1);
filler.FillRandomAsymetric(7);
GridModel grid2 = grid1.clone();
assertTrue(grid1.equals(grid2));
grid2.rotateCenterCounterclockwise();
assertFalse(grid1.equals(grid2));
grid2.rotateCenterCounterclockwise();
assertFalse(grid1.equals(grid2));
grid2.rotateCenterCounterclockwise();
assertFalse(grid1.equals(grid2));
grid2.rotateCenterCounterclockwise();
assertTrue(grid1.equals(grid2));
}
@Test
public void testFlipHorizontal() {
GridModel grid1 = new GridModel(5);
GridFiller filler = new GridFiller(grid1);
filler.FillRandomAsymetric(7);
GridModel grid2 = grid1.clone();
assertTrue(grid1.equals(grid2));
grid2.flipHorizontal();
assertFalse(grid1.equals(grid2));
assertEquals(grid2.countConnections(), grid2.countPairs());
grid2.flipHorizontal();
assertEquals(grid2.countConnections(), grid2.countPairs());
assertTrue(grid1.equals(grid2));
}
@Test
public void testFlipVertical() {
GridModel grid1 = new GridModel(5);
GridFiller filler = new GridFiller(grid1);
filler.FillRandomAsymetric(7);
GridModel grid2 = grid1.clone();
assertTrue(grid1.equals(grid2));
grid2.flipVertical();
assertFalse(grid1.equals(grid2));
assertEquals(grid2.countConnections(), grid2.countPairs());
grid2.flipVertical();
assertEquals(grid2.countConnections(), grid2.countPairs());
assertTrue(grid1.equals(grid2));
}
@Test
public void testReadOnly() {
GridModel grid = new GridModel(4);
grid.getQuad(4).setPattern(QuadModel.DIR_NORTH, Pattern.getDefaultPattern());
grid.shuffle();
grid.setReadOnly(true);
try {
grid.shuffle();
fail();
} catch (AssertionError e) {
// Dp nothing
}
grid.countPairs();
try {
grid.getQuad(4).setPattern(QuadModel.DIR_NORTH, Pattern.getDefaultPattern());
fail();
} catch (AssertionError e) {
// Dp nothing
}
grid.setReadOnly(false);
grid.shuffle();
}
@Test
public void testMissing() {
Pattern pattern = Pattern.PAT_01;
GridModel grid = new GridModel(4);
grid.getQuad(1).setPattern(QuadModel.DIR_WEST, pattern);
QuadModel quad = grid.getMissingQuad(0);
assertEquals(Pattern.getDefaultPattern(), quad.getPattern(QuadModel.DIR_NORTH));
assertEquals(pattern, quad.getPattern(QuadModel.DIR_EAST));
assertEquals(null, quad.getPattern(QuadModel.DIR_SOUTH));
assertEquals(Pattern.getDefaultPattern(), quad.getPattern(QuadModel.DIR_WEST));
}
@Test
public void testOptimize() throws IOException, QuadsFormatException {
GridModel grid = new GridModel();
GridLoader loader = new GridLoader(grid);
loader.load("Test_Grid_06x06x08.txt");
QuadModel quad = grid.getQuad(12);
quad.setPattern(QuadModel.DIR_NORTH, Pattern.PAT_12);
quad.setPattern(QuadModel.DIR_SOUTH, Pattern.PAT_19);
quad.setPattern(QuadModel.DIR_EAST, Pattern.PAT_31);
int rotations = grid.optimizeQuadRotation(12);
assertEquals(0, rotations);
assertEquals(Pattern.getDefaultPattern(), quad.getPattern(QuadModel.DIR_WEST));
}
}