Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added FinishWithGrassTest #650

Merged
merged 16 commits into from
Oct 24, 2023
Merged
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
import org.junit.Test;

import java.awt.*;
import java.util.List;
import java.util.ArrayList;

public class FinishWithGrassDirectRuleTest {

Expand All @@ -27,15 +29,24 @@ public static void setUp() {
treetent = new TreeTent();
}

/**
* 3x3 TreeTent puzzle with a tent at (0,0)
* Tests FinishWithGrassDirectRule on GRASS tiles horizontal of the tent
* at (1,0) and (2,0)
*
* @throws InvalidFileFormatException
*/
@Test
public void EmptyFieldTest() throws InvalidFileFormatException {
TestUtilities.importTestBoard("puzzles/treetent/rules/FinishWithGrassDirectRule/FinishWithGrass", treetent);
public void FinishWithGrassHorizontalTest() throws InvalidFileFormatException {
TestUtilities.importTestBoard("puzzles/treetent/rules/FinishWithGrassDirectRule/CornerTent", treetent);
TreeNode rootNode = treetent.getTree().getRootNode();
TreeTransition transition = rootNode.getChildren().get(0);
transition.setRule(RULE);

// get board state
TreeTentBoard board = (TreeTentBoard) transition.getBoard();

// change the board's cells considering the FinishWithGrass rule
TreeTentCell cell1 = board.getCell(1, 0);
cell1.setData(TreeTentType.GRASS);
TreeTentCell cell2 = board.getCell(2, 0);
Expand All @@ -44,21 +55,316 @@ public void EmptyFieldTest() throws InvalidFileFormatException {
board.addModifiedData(cell1);
board.addModifiedData(cell2);

// confirm there is a logical following of the EmptyField rule
Assert.assertNull(RULE.checkRule(transition));

// only the cell above should change following the rule
TreeTentCell c;
for (int i = 0; i < board.getHeight(); i++) {
for (int k = 0; k < board.getWidth(); k++) {
Point point = new Point(k, i);
if (point.equals(cell1.getLocation()) || point.equals(cell2.getLocation())) {
Assert.assertNull(RULE.checkRuleAt(transition, board.getCell(k, i)));
c = board.getCell(k, i);
if (c.getLocation().equals(cell1.getLocation()) || c.getLocation().equals(cell2.getLocation())) {
// logically follows
Assert.assertNull(RULE.checkRuleAt(transition, c));
}
else {
Assert.assertNotNull(RULE.checkRuleAt(transition, board.getCell(k, i)));
// does not use the rule to logically follow
Assert.assertNotNull(RULE.checkRuleAt(transition, c));
}
}
}
}
}

/**
* 3x3 TreeTent puzzle with a tent at (0,0)
* Tests FinishWithGrassDirectRule on GRASS tiles vertical of the tent
* at (0,1) and (0,2)
*
* @throws InvalidFileFormatException
*/
@Test
public void FinishWithGrassVerticalTest() throws InvalidFileFormatException {
TestUtilities.importTestBoard("puzzles/treetent/rules/FinishWithGrassDirectRule/CornerTent", treetent);
TreeNode rootNode = treetent.getTree().getRootNode();
TreeTransition transition = rootNode.getChildren().get(0);
transition.setRule(RULE);

// get board state
TreeTentBoard board = (TreeTentBoard) transition.getBoard();

// change the board's cells considering the FinishWithGrass rule
TreeTentCell cell1 = board.getCell(0, 1);
cell1.setData(TreeTentType.GRASS);
TreeTentCell cell2 = board.getCell(0, 2);
cell2.setData(TreeTentType.GRASS);

board.addModifiedData(cell1);
board.addModifiedData(cell2);

// confirm there is a logical following of the EmptyField rule
Assert.assertNull(RULE.checkRule(transition));

// only the cell above should change following the rule
TreeTentCell c;
for (int i = 0; i < board.getHeight(); i++) {
for (int k = 0; k < board.getWidth(); k++) {
c = board.getCell(k, i);
if (c.getLocation().equals(cell1.getLocation()) || c.getLocation().equals(cell2.getLocation())) {
// logically follows
Assert.assertNull(RULE.checkRuleAt(transition, c));
}
else {
// does not use the rule to logically follow
Assert.assertNotNull(RULE.checkRuleAt(transition, c));
}
}
}
}

/**
* 3x3 TreeTent puzzle with a tent at (0,0)
* Tests FinishWithGrassDirectRule on GRASS tiles
* at (1,0), (2,0), (0,1), and (0,2)
*
* @throws InvalidFileFormatException
*/
@Test
public void FinishWithGrassTest() throws InvalidFileFormatException {
TestUtilities.importTestBoard("puzzles/treetent/rules/FinishWithGrassDirectRule/CornerTent", treetent);
TreeNode rootNode = treetent.getTree().getRootNode();
TreeTransition transition = rootNode.getChildren().get(0);
transition.setRule(RULE);

// get board state
TreeTentBoard board = (TreeTentBoard) transition.getBoard();

// change the board's cells considering the FinishWithGrass rule
TreeTentCell cell1 = board.getCell(1, 0);
cell1.setData(TreeTentType.GRASS);
TreeTentCell cell2 = board.getCell(2, 0);
cell2.setData(TreeTentType.GRASS);
TreeTentCell cell3 = board.getCell(0, 1);
cell3.setData(TreeTentType.GRASS);
TreeTentCell cell4 = board.getCell(0, 2);
cell4.setData(TreeTentType.GRASS);

board.addModifiedData(cell1);
board.addModifiedData(cell2);
board.addModifiedData(cell3);
board.addModifiedData(cell4);

// confirm there is a logical following of the EmptyField rule
Assert.assertNull(RULE.checkRule(transition));

// only the cell above should change following the rule
TreeTentCell c;
for (int i = 0; i < board.getHeight(); i++) {
for (int k = 0; k < board.getWidth(); k++) {
c = board.getCell(k, i);
if (c.getLocation().equals(cell1.getLocation()) ||
c.getLocation().equals(cell2.getLocation()) ||
c.getLocation().equals(cell3.getLocation()) ||
c.getLocation().equals(cell4.getLocation())) {
// logically follows
Assert.assertNull(RULE.checkRuleAt(transition, c));
}
else {
// does not use the rule to logically follow
Assert.assertNotNull(RULE.checkRuleAt(transition, c));
}
}
}
}

/**
* 3x3 TreeTent puzzle with no tents
* Tests FinishWithGrassDirectRule on GRASS tiles
* GRASS tiles fill entire board
*
* @throws InvalidFileFormatException
*/
@Test
public void NoTentTest() throws InvalidFileFormatException {
TestUtilities.importTestBoard("puzzles/treetent/rules/FinishWithGrassDirectRule/NoTent", treetent);
TreeNode rootNode = treetent.getTree().getRootNode();
TreeTransition transition = rootNode.getChildren().get(0);
transition.setRule(RULE);

// get board state
TreeTentBoard board = (TreeTentBoard) transition.getBoard();

// change the board's cells considering the FinishWithGrass rule
List<TreeTentCell> cells = new ArrayList<TreeTentCell>();
for (int i = 0; i < board.getWidth(); i++) {
for (int k = 0; k < board.getHeight(); k++) {
TreeTentCell c = board.getCell(i, k);
c.setData(TreeTentType.GRASS);
cells.add(c);
}
}

for (TreeTentCell c : cells) {
board.addModifiedData(c);
}

// confirm there is a logical following of the EmptyField rule
Assert.assertNull(RULE.checkRule(transition));

// all cells should change following the rule
for (TreeTentCell c : cells) {
// logically follows
Assert.assertNull(RULE.checkRuleAt(transition, c));
}
}
/**
* 3x3 TreeTent puzzle with a tent at (1,1)
* Tests FinishWithGrassDirectRule on GRASS tiles surrounding the tent
* at (1,0), (0,1), (2,1), and (1,2)
*
* @throws InvalidFileFormatException
*/
@Test
public void MiddleTentTest() throws InvalidFileFormatException {
TestUtilities.importTestBoard("puzzles/treetent/rules/FinishWithGrassDirectRule/MiddleTent", treetent);
TreeNode rootNode = treetent.getTree().getRootNode();
TreeTransition transition = rootNode.getChildren().get(0);
transition.setRule(RULE);

// get board state
TreeTentBoard board = (TreeTentBoard) transition.getBoard();

// change the board's cells considering the FinishWithGrass rule
TreeTentCell cell1 = board.getCell(1, 0);
TreeTentCell cell2 = board.getCell(0, 1);
TreeTentCell cell3 = board.getCell(2, 1);
TreeTentCell cell4 = board.getCell(1, 2);

cell1.setData(TreeTentType.GRASS);
cell2.setData(TreeTentType.GRASS);
cell3.setData(TreeTentType.GRASS);
cell4.setData(TreeTentType.GRASS);

board.addModifiedData(cell1);
board.addModifiedData(cell2);
board.addModifiedData(cell3);
board.addModifiedData(cell4);

// confirm there is a logical following of the EmptyField rule
Assert.assertNull(RULE.checkRule(transition));

// only the cell above should change following the rule
TreeTentCell c;
for (int i = 0; i < board.getHeight(); i++) {
for (int k = 0; k < board.getWidth(); k++) {
c = board.getCell(k, i);
if (c.getLocation().equals(cell1.getLocation()) ||
c.getLocation().equals(cell2.getLocation()) ||
c.getLocation().equals(cell3.getLocation()) ||
c.getLocation().equals(cell4.getLocation())) {
// logically follows
Assert.assertNull(RULE.checkRuleAt(transition, c));
}
else {
// does not use the rule to logically follow
Assert.assertNotNull(RULE.checkRuleAt(transition, c));
}
}
}
}

/**
* 3x3 TreeTent puzzle with missing tents
* Tests FinishWithGrassDirectRule on GRASS tiles filling the puzzle
* all GRASS tiles should fail the FinishWithGrassDirectRule
*
* @throws InvalidFileFormatException
*/
@Test
public void FailTentTest() throws InvalidFileFormatException {
TestUtilities.importTestBoard("puzzles/treetent/rules/FinishWithGrassDirectRule/FailTent", treetent);
TreeNode rootNode = treetent.getTree().getRootNode();
TreeTransition transition = rootNode.getChildren().get(0);
transition.setRule(RULE);

// get board state
TreeTentBoard board = (TreeTentBoard) transition.getBoard();

// change the board's cells not following the FinishWithGrass rule
List<TreeTentCell> cells = new ArrayList<TreeTentCell>();
for (int i = 0; i < board.getWidth(); i++) {
for (int k = 0; k < board.getHeight(); k++) {
TreeTentCell c = board.getCell(i, k);
c.setData(TreeTentType.GRASS);
cells.add(c);
}
}

for (TreeTentCell c : cells) {
board.addModifiedData(c);
}

// confirm there is a logical following of the EmptyField rule
Assert.assertNotNull(RULE.checkRule(transition));

// all cells should fail the rule test
for (TreeTentCell c : cells) {
// does not use the rule to logically follow
Assert.assertNotNull(RULE.checkRuleAt(transition, c));
}
}
/**
* 7x7 TreeTent puzzle with multiple tents spaced out
* Tests FinishWithGrassDirectRule on GRASS tiles between the tents
* at (0,3), (2,3), (4,3), and (6,3)
*
* @throws InvalidFileFormatException
*/
@Test
public void SpacedOutTentTest() throws InvalidFileFormatException {
TestUtilities.importTestBoard("puzzles/treetent/rules/FinishWithGrassDirectRule/SpacedOutTent", treetent);
TreeNode rootNode = treetent.getTree().getRootNode();
TreeTransition transition = rootNode.getChildren().get(0);
transition.setRule(RULE);

// get board state
TreeTentBoard board = (TreeTentBoard) transition.getBoard();

// change the board's cells considering the FinishWithGrass rule
TreeTentCell cell1 = board.getCell(0, 3);
TreeTentCell cell2 = board.getCell(2, 3);
TreeTentCell cell3 = board.getCell(4, 3);
TreeTentCell cell4 = board.getCell(6, 3);

cell1.setData(TreeTentType.GRASS);
cell2.setData(TreeTentType.GRASS);
cell3.setData(TreeTentType.GRASS);
cell4.setData(TreeTentType.GRASS);

board.addModifiedData(cell1);
board.addModifiedData(cell2);
board.addModifiedData(cell3);
board.addModifiedData(cell4);

// confirm there is a logical following of the EmptyField rule
Assert.assertNull(RULE.checkRule(transition));

// only the cell above should change following the rule
TreeTentCell c;
for (int i = 0; i < board.getHeight(); i++) {
for (int k = 0; k < board.getWidth(); k++) {
c = board.getCell(k, i);
if (c.getLocation().equals(cell1.getLocation()) ||
c.getLocation().equals(cell2.getLocation()) ||
c.getLocation().equals(cell3.getLocation()) ||
c.getLocation().equals(cell4.getLocation())) {
// logically follows
Assert.assertNull(RULE.checkRuleAt(transition, c));
}
else {
// does not use the rule to logically follow
Assert.assertNotNull(RULE.checkRuleAt(transition, c));
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<clue index="C" value="0"/>
</axis>
<axis side="south">
<clue index="1" value="0"/>
<clue index="1" value="1"/>
<clue index="2" value="0"/>
<clue index="3" value="0"/>
</axis>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<Legup>
<puzzle name="TreeTent">
<board height="3" width="3">
<cells>
</cells>
<axis side="east">
<clue index="A" value="1"/>
<clue index="B" value="1"/>
<clue index="C" value="1"/>
</axis>
<axis side="south">
<clue index="1" value="1"/>
<clue index="2" value="1"/>
<clue index="3" value="1"/>
</axis>
</board>
</puzzle>
<solved isSolved="false" lastSaved="--"/>
</Legup>
Loading
Loading