Wir haben noch einen classify-Bug gefunden... und behoben

git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@412 72836036-5685-4462-b002-a69064685172
This commit is contained in:
Ida Massow 2011-06-11 04:09:27 +02:00
parent acc1b64fe7
commit 8b1e09f025
2 changed files with 138 additions and 166 deletions

View file

@ -62,8 +62,8 @@ public class StoneSet implements Iterable<Stone>, Sizeable, Serializable {
} }
/** /**
* Test for rule conflict within the StoneSet and determine whether the set is * Test for rule conflict within the StoneSet and determine whether the set
* a group or a run * is a group or a run
* *
* @param settings * @param settings
* GameSettings * GameSettings
@ -84,13 +84,18 @@ public class StoneSet implements Iterable<Stone>, Sizeable, Serializable {
} }
if (nonJoker == -1) { if (nonJoker == -1) {
if (stones.size() > settings.getHighestValue()) { if (stones.size() > settings.getHighestValue()
&& stones.size() > settings.getStoneColors().size()) {
return new Pair<Type, Integer>(INVALID, 0); return new Pair<Type, Integer>(INVALID, 0);
} else if (stones.size() > settings.getStoneColors().size()) { } else if (stones.size() > settings.getStoneColors().size()) {
return new Pair<Type, Integer>(RUN, return new Pair<Type, Integer>(
(settings.getHighestValue() * (settings.getHighestValue() + 1)) / 2 RUN,
(settings.getHighestValue() * (settings
.getHighestValue() + 1))
/ 2
- (stones.size() - settings.getHighestValue()) - (stones.size() - settings.getHighestValue())
* (stones.size() - settings.getHighestValue() - 1) / 2); * (stones.size() - settings.getHighestValue() - 1)
/ 2);
} else { } else {
return new Pair<Type, Integer>(GROUP, stones.size() return new Pair<Type, Integer>(GROUP, stones.size()
* settings.getHighestValue()); * settings.getHighestValue());
@ -183,7 +188,8 @@ public class StoneSet implements Iterable<Stone>, Sizeable, Serializable {
return new Pair<StoneSet, StoneSet>(this, null); return new Pair<StoneSet, StoneSet>(this, null);
} }
StoneSet firstSet = new StoneSet(stones.subList(0, position)); StoneSet firstSet = new StoneSet(stones.subList(0, position));
StoneSet secondSet = new StoneSet(stones.subList(position, stones.size())); StoneSet secondSet = new StoneSet(stones.subList(position,
stones.size()));
return new Pair<StoneSet, StoneSet>(firstSet, secondSet); return new Pair<StoneSet, StoneSet>(firstSet, secondSet);
} }

View file

@ -26,6 +26,7 @@ public class StoneSetTest {
private GameSettings lowerValueSettings = new GameSettings(); private GameSettings lowerValueSettings = new GameSettings();
private GameSettings noLimitsSettings = new GameSettings(); private GameSettings noLimitsSettings = new GameSettings();
private GameSettings noLimitsLowerValueSettings = new GameSettings(); private GameSettings noLimitsLowerValueSettings = new GameSettings();
private GameSettings moreColorLowerValueSettings = new GameSettings();
/** */ /** */
@Before @Before
@ -38,6 +39,9 @@ public class StoneSetTest {
noLimitsSettings.setNoLimits(true); noLimitsSettings.setNoLimits(true);
noLimitsLowerValueSettings.setHighestValue(10); noLimitsLowerValueSettings.setHighestValue(10);
noLimitsLowerValueSettings.setNoLimits(true); noLimitsLowerValueSettings.setNoLimits(true);
moreColorLowerValueSettings.setStoneColors(EnumSet
.allOf(StoneColor.class));
moreColorLowerValueSettings.setHighestValue(5);
} }
private void assertSet(StoneSet.Type expectedType, Integer expectedValue, private void assertSet(StoneSet.Type expectedType, Integer expectedValue,
@ -53,29 +57,22 @@ public class StoneSetTest {
public void doubleJokerValid() { public void doubleJokerValid() {
// 3 Stones // 3 Stones
// JJZ // JJZ
assertSet(GROUP, 3, assertSet(GROUP, 3, Arrays.asList(new Stone(RED), new Stone(BLACK),
Arrays.asList(new Stone(RED), new Stone(BLACK), new Stone(1, BLACK)), new Stone(1, BLACK)), defaultSettings);
defaultSettings);
// JZJ // JZJ
assertSet(GROUP, 3, assertSet(GROUP, 3, Arrays.asList(new Stone(RED), new Stone(1, BLACK),
Arrays.asList(new Stone(RED), new Stone(1, BLACK), new Stone(BLACK)), new Stone(BLACK)), defaultSettings);
defaultSettings);
// ZJJ // ZJJ
assertSet(RUN, 6, assertSet(RUN, 6, Arrays.asList(new Stone(1, RED), new Stone(RED),
Arrays.asList(new Stone(1, RED), new Stone(RED), new Stone(BLACK)), new Stone(BLACK)), defaultSettings);
defaultSettings); assertSet(RUN, 33, Arrays.asList(new Stone(10, RED), new Stone(RED),
assertSet(RUN, 33, new Stone(BLACK)), defaultSettings);
Arrays.asList(new Stone(10, RED), new Stone(RED), new Stone(BLACK)), assertSet(GROUP, 30, Arrays.asList(new Stone(10, RED), new Stone(RED),
defaultSettings); new Stone(BLACK)), lowerValueSettings);
assertSet(GROUP, 30, assertSet(GROUP, 39, Arrays.asList(new Stone(13, RED), new Stone(RED),
Arrays.asList(new Stone(10, RED), new Stone(RED), new Stone(BLACK)), new Stone(BLACK)), defaultSettings);
lowerValueSettings); assertSet(RUN, 42, Arrays.asList(new Stone(13, RED), new Stone(RED),
assertSet(GROUP, 39, new Stone(BLACK)), higherValueSettings);
Arrays.asList(new Stone(13, RED), new Stone(RED), new Stone(BLACK)),
defaultSettings);
assertSet(RUN, 42,
Arrays.asList(new Stone(13, RED), new Stone(RED), new Stone(BLACK)),
higherValueSettings);
// 4 Stones // 4 Stones
// JJZZ // JJZZ
assertSet(GROUP, 4, Arrays.asList(new Stone(RED), new Stone(BLACK), assertSet(GROUP, 4, Arrays.asList(new Stone(RED), new Stone(BLACK),
@ -85,8 +82,9 @@ public class StoneSetTest {
// ZZJJ // ZZJJ
assertSet(RUN, 10, Arrays.asList(new Stone(1, RED), new Stone(2, RED), assertSet(RUN, 10, Arrays.asList(new Stone(1, RED), new Stone(2, RED),
new Stone(BLACK), new Stone(RED)), defaultSettings); new Stone(BLACK), new Stone(RED)), defaultSettings);
assertSet(GROUP, 4, Arrays.asList(new Stone(1, RED), new Stone(1, BLACK), assertSet(GROUP, 4, Arrays.asList(new Stone(1, RED),
new Stone(BLACK), new Stone(RED)), defaultSettings); new Stone(1, BLACK), new Stone(BLACK), new Stone(RED)),
defaultSettings);
// ZJZJ // ZJZJ
assertSet(GROUP, 4, Arrays.asList(new Stone(1, RED), new Stone(BLACK), assertSet(GROUP, 4, Arrays.asList(new Stone(1, RED), new Stone(BLACK),
new Stone(1, BLACK), new Stone(RED)), defaultSettings); new Stone(1, BLACK), new Stone(RED)), defaultSettings);
@ -108,100 +106,81 @@ public class StoneSetTest {
assertSet(RUN, 10, Arrays.asList(new Stone(1, RED), new Stone(RED), assertSet(RUN, 10, Arrays.asList(new Stone(1, RED), new Stone(RED),
new Stone(BLACK), new Stone(4, RED)), defaultSettings); new Stone(BLACK), new Stone(4, RED)), defaultSettings);
// More than 4 stones // More than 4 stones
assertSet(GROUP, 6, Arrays.asList(new Stone(1, RED), new Stone(1, BLUE), assertSet(GROUP, 6, Arrays.asList(new Stone(1, RED),
new Stone(1, GREEN), new Stone(1, BLACK), new Stone(BLACK), new Stone( new Stone(1, BLUE), new Stone(1, GREEN), new Stone(1, BLACK),
RED)), moreColorSettings); new Stone(BLACK), new Stone(RED)), moreColorSettings);
} }
/** */ /** */
@Test @Test
public void groups() { public void groups() {
assertSet(GROUP, 3, Arrays.asList(new Stone(1, RED), new Stone(1, BLACK), assertSet(GROUP, 3, Arrays.asList(new Stone(1, RED),
new Stone(1, BLUE)), defaultSettings); new Stone(1, BLACK), new Stone(1, BLUE)), defaultSettings);
assertSet(GROUP, 3, Arrays.asList(new Stone(1, RED), new Stone(1, BLACK), assertSet(GROUP, 3, Arrays.asList(new Stone(1, RED),
new Stone(1, BLUE)), lessColorSettings); new Stone(1, BLACK), new Stone(1, BLUE)), lessColorSettings);
assertSet(GROUP, 4, Arrays.asList(new Stone(1, RED), new Stone(1, BLACK), assertSet(GROUP, 4, Arrays.asList(new Stone(1, RED),
new Stone(1, BLUE), new Stone(1, ORANGE)), defaultSettings); new Stone(1, BLACK), new Stone(1, BLUE), new Stone(1, ORANGE)),
assertSet(GROUP, 6, Arrays.asList(new Stone(1, RED), new Stone(1, GREEN), defaultSettings);
new Stone(1, GRAY), new Stone(1, BLACK), new Stone(1, BLUE), new Stone( assertSet(GROUP, 6, Arrays.asList(new Stone(1, RED),
1, ORANGE)), moreColorSettings); new Stone(1, GREEN), new Stone(1, GRAY), new Stone(1, BLACK),
new Stone(1, BLUE), new Stone(1, ORANGE)), moreColorSettings);
} }
/** */ /** */
@Test @Test
public void runs() { public void runs() {
assertSet(RUN, 6, assertSet(RUN, 6, Arrays.asList(new Stone(1, RED), new Stone(2, RED),
Arrays.asList(new Stone(1, RED), new Stone(2, RED), new Stone(3, RED)), new Stone(3, RED)), defaultSettings);
assertSet(RUN, 6, Arrays.asList(new Stone(1, RED), new Stone(2, RED),
new Stone(3, RED)), lowerValueSettings);
assertSet(RUN, 6, Arrays.asList(new Stone(1, RED), new Stone(2, RED),
new Stone(3, RED)), higherValueSettings);
assertSet(RUN, 22, Arrays.asList(new Stone(4, BLUE),
new Stone(5, BLUE), new Stone(6, BLUE), new Stone(7, BLUE)),
defaultSettings); defaultSettings);
assertSet(RUN, 6, assertSet(RUN, 42, Arrays.asList(new Stone(13, RED),
Arrays.asList(new Stone(1, RED), new Stone(2, RED), new Stone(3, RED)), new Stone(14, RED), new Stone(15, RED)), higherValueSettings);
lowerValueSettings);
assertSet(RUN, 6,
Arrays.asList(new Stone(1, RED), new Stone(2, RED), new Stone(3, RED)),
higherValueSettings);
assertSet(RUN, 22, Arrays.asList(new Stone(4, BLUE), new Stone(5, BLUE),
new Stone(6, BLUE), new Stone(7, BLUE)), defaultSettings);
assertSet(RUN, 42, Arrays.asList(new Stone(13, RED), new Stone(14, RED),
new Stone(15, RED)), higherValueSettings);
} }
/** */ /** */
@Test @Test
public void singleJoker() { public void singleJoker() {
// ZJZ // ZJZ
assertSet( assertSet(GROUP, 3, Arrays.asList(new Stone(1, RED), new Stone(BLACK),
GROUP, new Stone(1, BLACK)), defaultSettings);
3, assertSet(RUN, 6, Arrays.asList(new Stone(1, RED), new Stone(RED),
Arrays.asList(new Stone(1, RED), new Stone(BLACK), new Stone(1, BLACK)), new Stone(3, RED)), defaultSettings);
defaultSettings);
assertSet(RUN, 6,
Arrays.asList(new Stone(1, RED), new Stone(RED), new Stone(3, RED)),
defaultSettings);
// JZZ // JZZ
assertSet(GROUP, 3, assertSet(GROUP, 3, Arrays.asList(new Stone(RED), new Stone(1, RED),
Arrays.asList(new Stone(RED), new Stone(1, RED), new Stone(1, BLACK)), new Stone(1, BLACK)), defaultSettings);
defaultSettings); assertSet(RUN, 6, Arrays.asList(new Stone(RED), new Stone(2, RED),
assertSet(RUN, 6, new Stone(3, RED)), defaultSettings);
Arrays.asList(new Stone(RED), new Stone(2, RED), new Stone(3, RED)),
defaultSettings);
// ZZJ // ZZJ
assertSet( assertSet(GROUP, 3, Arrays.asList(new Stone(1, RED),
GROUP, new Stone(1, BLACK), new Stone(BLACK)), defaultSettings);
3, assertSet(RUN, 6, Arrays.asList(new Stone(1, RED), new Stone(2, RED),
Arrays.asList(new Stone(1, RED), new Stone(1, BLACK), new Stone(BLACK)), new Stone(RED)), defaultSettings);
defaultSettings); assertSet(RUN, 39, Arrays.asList(new Stone(12, RED),
assertSet(RUN, 6, new Stone(13, RED), new Stone(RED)), higherValueSettings);
Arrays.asList(new Stone(1, RED), new Stone(2, RED), new Stone(RED)),
defaultSettings);
assertSet(RUN, 39,
Arrays.asList(new Stone(12, RED), new Stone(13, RED), new Stone(RED)),
higherValueSettings);
} }
@Test @Test
public void noLimitsTest() { public void noLimitsTest() {
assertSet(RUN, 16, assertSet(RUN, 16, Arrays.asList(new Stone(RED), new Stone(1, RED),
Arrays.asList(new Stone(RED), new Stone(1, RED), new Stone(2, RED)), new Stone(2, RED)), noLimitsSettings);
noLimitsSettings); assertSet(RUN, 26, Arrays.asList(new Stone(12, RED),
assertSet(RUN, 26, new Stone(13, RED), new Stone(RED)), noLimitsSettings);
Arrays.asList(new Stone(12, RED), new Stone(13, RED), new Stone(RED)), assertSet(RUN, 20, Arrays.asList(new Stone(9, RED), new Stone(10, RED),
noLimitsSettings); new Stone(RED)), noLimitsLowerValueSettings);
assertSet(RUN, 20,
Arrays.asList(new Stone(9, RED), new Stone(10, RED), new Stone(RED)),
noLimitsLowerValueSettings);
assertSet(RUN, 28, Arrays.asList(new Stone(RED), new Stone(BLACK), assertSet(RUN, 28, Arrays.asList(new Stone(RED), new Stone(BLACK),
new Stone(1, RED), new Stone(2, RED)), noLimitsSettings); new Stone(1, RED), new Stone(2, RED)), noLimitsSettings);
assertSet(RUN, 26, Arrays.asList(new Stone(12, RED), new Stone(13, RED), assertSet(RUN, 26, Arrays.asList(new Stone(12, RED),
new Stone(1, RED)), noLimitsSettings); new Stone(13, RED), new Stone(1, RED)), noLimitsSettings);
assertSet( assertSet(RUN, 16, Arrays.asList(new Stone(13, RED), new Stone(1, RED),
RUN, new Stone(2, RED)), noLimitsSettings);
16,
Arrays.asList(new Stone(13, RED), new Stone(1, RED), new Stone(2, RED)),
noLimitsSettings);
assertSet(INVALID, 0, assertSet(INVALID, 0, Arrays.asList(new Stone(13, RED), new Stone(RED),
Arrays.asList(new Stone(13, RED), new Stone(RED), new Stone(1, RED)), new Stone(1, RED)), noLimitsSettings);
noLimitsSettings);
} }
// invalid // invalid
@ -211,87 +190,69 @@ public class StoneSetTest {
assertSet(INVALID, 0, Arrays.asList(new Stone(RED), new Stone(BLACK), assertSet(INVALID, 0, Arrays.asList(new Stone(RED), new Stone(BLACK),
new Stone(1, BLACK), new Stone(1, RED)), lessColorSettings); new Stone(1, BLACK), new Stone(1, RED)), lessColorSettings);
// More than 4 stones // More than 4 stones
assertSet(INVALID, 0, Arrays.asList(new Stone(1, RED), new Stone(1, BLUE), assertSet(INVALID, 0, Arrays.asList(new Stone(1, RED), new Stone(1,
new Stone(1, GREEN), new Stone(1, BLACK), new Stone(1, VIOLET), BLUE), new Stone(1, GREEN), new Stone(1, BLACK), new Stone(1,
new Stone(1, ORANGE), new Stone(1, AQUA), new Stone(BLACK), new Stone( VIOLET), new Stone(1, ORANGE), new Stone(1, AQUA), new Stone(
RED)), moreColorSettings); BLACK), new Stone(RED)), moreColorSettings);
} }
/** */ /** */
@Test @Test
public void outOfBounds() { public void outOfBounds() {
assertSet(INVALID, 0, assertSet(INVALID, 0, Arrays.asList(new Stone(RED), new Stone(1, RED),
Arrays.asList(new Stone(RED), new Stone(1, RED), new Stone(2, RED)), new Stone(2, RED)), defaultSettings);
defaultSettings); assertSet(INVALID, 0, Arrays.asList(new Stone(12, RED), new Stone(13,
assertSet(INVALID, 0, RED), new Stone(RED)), defaultSettings);
Arrays.asList(new Stone(12, RED), new Stone(13, RED), new Stone(RED)), assertSet(INVALID, 0, Arrays.asList(new Stone(9, RED), new Stone(10,
defaultSettings); RED), new Stone(RED)), lowerValueSettings);
assertSet(INVALID, 0,
Arrays.asList(new Stone(9, RED), new Stone(10, RED), new Stone(RED)),
lowerValueSettings);
assertSet(INVALID, 0, Arrays.asList(new Stone(RED), new Stone(BLACK), assertSet(INVALID, 0, Arrays.asList(new Stone(RED), new Stone(BLACK),
new Stone(1, RED), new Stone(2, RED)), defaultSettings); new Stone(1, RED), new Stone(2, RED)), defaultSettings);
assertSet(INVALID, 0, Arrays.asList(new Stone(12, RED), new Stone(13, RED), assertSet(INVALID, 0, Arrays.asList(new Stone(12, RED), new Stone(13,
new Stone(1, RED)), defaultSettings); RED), new Stone(1, RED)), defaultSettings);
assertSet( assertSet(INVALID, 0, Arrays.asList(new Stone(13, RED), new Stone(1,
INVALID, RED), new Stone(2, RED)), defaultSettings);
0,
Arrays.asList(new Stone(13, RED), new Stone(1, RED), new Stone(2, RED)),
defaultSettings);
} }
/** */ /** */
@Test @Test
public void sameColor() { public void sameColor() {
assertSet( assertSet(INVALID, 0, Arrays.asList(new Stone(1, RED),
INVALID, new Stone(1, RED), new Stone(1, BLUE)), defaultSettings);
0, assertSet(INVALID, 0, Arrays.asList(new Stone(1, RED), new Stone(1,
Arrays.asList(new Stone(1, RED), new Stone(1, RED), new Stone(1, BLUE)), BLUE), new Stone(1, BLACK), new Stone(1, ORANGE),
defaultSettings); new Stone(RED)), defaultSettings);
assertSet(INVALID, 0, Arrays.asList(new Stone(1, RED), new Stone(1, BLUE), assertSet(INVALID, 0, Arrays.asList(new Stone(1, RED), new Stone(1,
new Stone(1, BLACK), new Stone(1, ORANGE), new Stone(RED)), BLUE), new Stone(1, GREEN), new Stone(1, BLACK), new Stone(1,
defaultSettings); VIOLET), new Stone(1, GRAY), new Stone(1, ORANGE), new Stone(1,
assertSet(INVALID, 0, Arrays.asList(new Stone(1, RED), new Stone(1, BLUE), AQUA), new Stone(RED)), moreColorSettings);
new Stone(1, GREEN), new Stone(1, BLACK), new Stone(1, VIOLET),
new Stone(1, GRAY), new Stone(1, ORANGE), new Stone(1, AQUA),
new Stone(RED)), moreColorSettings);
} }
/** */ /** */
@Test @Test
public void incorrectOrder() { public void incorrectOrder() {
assertSet(INVALID, 0, assertSet(INVALID, 0, Arrays.asList(new Stone(4, RED),
Arrays.asList(new Stone(4, RED), new Stone(6, RED), new Stone(5, RED)), new Stone(6, RED), new Stone(5, RED)), defaultSettings);
defaultSettings); assertSet(INVALID, 0, Arrays.asList(new Stone(4, RED),
assertSet(INVALID, 0, new Stone(6, RED), new Stone(RED)), defaultSettings);
Arrays.asList(new Stone(4, RED), new Stone(6, RED), new Stone(RED)), assertSet(INVALID, 0, Arrays.asList(new Stone(4, RED), new Stone(RED),
defaultSettings); new Stone(5, RED)), defaultSettings);
assertSet(INVALID, 0,
Arrays.asList(new Stone(4, RED), new Stone(RED), new Stone(5, RED)),
defaultSettings);
} }
/** */ /** */
@Test @Test
public void otherInvalid() { public void otherInvalid() {
assertSet(INVALID, 0, Arrays.asList(new Stone(4, RED),
new Stone(5, RED), new Stone(7, RED)), defaultSettings);
assertSet(INVALID, 0, Arrays.asList(new Stone(4, RED), new Stone(5,
BLUE), new Stone(6, RED)), defaultSettings);
assertSet(INVALID, 0, assertSet(INVALID, 0,
Arrays.asList(new Stone(4, RED), new Stone(5, RED), new Stone(7, RED)), Arrays.asList(new Stone(4, RED), new Stone(5, RED)),
defaultSettings);
assertSet(
INVALID,
0,
Arrays.asList(new Stone(4, RED), new Stone(5, BLUE), new Stone(6, RED)),
defaultSettings);
assertSet(INVALID, 0, Arrays.asList(new Stone(4, RED), new Stone(5, RED)),
defaultSettings);
assertSet(
INVALID,
0,
Arrays.asList(new Stone(4, BLUE), new Stone(5, RED), new Stone(6, RED)),
defaultSettings); defaultSettings);
assertSet(INVALID, 0, Arrays.asList(new Stone(4, BLUE), new Stone(5,
RED), new Stone(6, RED)), defaultSettings);
// Regression test: // Regression test:
assertSet(INVALID, 0, Arrays.asList(new Stone(12, ORANGE), new Stone(12, assertSet(INVALID, 0, Arrays.asList(new Stone(12, ORANGE), new Stone(
BLACK), new Stone(7, BLUE)), defaultSettings); 12, BLACK), new Stone(7, BLUE)), defaultSettings);
} }
/** */ /** */
@ -302,11 +263,16 @@ public class StoneSetTest {
defaultSettings); defaultSettings);
assertSet(GROUP, 4 * 13, Arrays.asList(new Stone(RED), new Stone(RED), assertSet(GROUP, 4 * 13, Arrays.asList(new Stone(RED), new Stone(RED),
new Stone(RED), new Stone(RED)), defaultSettings); new Stone(RED), new Stone(RED)), defaultSettings);
assertSet(RUN, 13 + 12 + 11 + 10 + 9, Arrays.asList(new Stone(RED), assertSet(RUN, 13 + 12 + 11 + 10 + 9,
new Stone(RED), new Stone(RED), new Stone(RED), new Stone(RED)), Arrays.asList(new Stone(RED), new Stone(RED), new Stone(RED),
defaultSettings); new Stone(RED), new Stone(RED)), defaultSettings);
assertSet(RUN, 5 * 10, Arrays.asList(new Stone(RED), new Stone(RED), assertSet(RUN, 5 * 10, Arrays.asList(new Stone(RED), new Stone(RED),
new Stone(RED), new Stone(RED), new Stone(12, RED)), defaultSettings); new Stone(RED), new Stone(RED), new Stone(12, RED)),
defaultSettings);
assertSet(GROUP, 6 * 5,
Arrays.asList(new Stone(RED), new Stone(RED), new Stone(RED),
new Stone(RED), new Stone(RED), new Stone(AQUA)),
moreColorLowerValueSettings);
} }
/** */ /** */