summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/jrummikub/model/StoneSet.java120
-rw-r--r--test/jrummikub/model/StoneSetTest.java16
2 files changed, 98 insertions, 38 deletions
diff --git a/src/jrummikub/model/StoneSet.java b/src/jrummikub/model/StoneSet.java
index ba96625..f10eca0 100644
--- a/src/jrummikub/model/StoneSet.java
+++ b/src/jrummikub/model/StoneSet.java
@@ -2,8 +2,10 @@ package jrummikub.model;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
@@ -14,17 +16,71 @@ public class StoneSet implements Iterable<Stone> {
private List<Stone> stones;
public StoneSet(Stone stone) {
- stones = Collections.singletonList(stone);
+ stones = Collections.singletonList(stone);
}
public StoneSet(List<Stone> stones) {
- this.stones = new ArrayList<Stone>(stones);
+ this.stones = new ArrayList<Stone>(stones);
}
/** Test for rule conflict within the StoneSet */
public boolean isValid() {
- return false;
+ if (stones.size() < 3) {
+ return false;
+ }
+ int nonJoker1 = -1, nonJoker2 = -1;
+ for (int i = 0; i < stones.size(); i++) {
+ if (stones.get(i).isJoker()) {
+ continue;
+ }
+ nonJoker2 = nonJoker1;
+ nonJoker1 = i;
+ }
+ if (nonJoker2 == -1) {
+ return true;
+ }
+ // is run
+ if (stones.get(nonJoker1).getColor() == stones.get(nonJoker2)
+ .getColor()) {
+ StoneColor runColor = stones.get(nonJoker1).getColor();
+ int startValue = stones.get(nonJoker1).getValue() - nonJoker1;
+ int endValue = startValue + stones.size() - 1;
+ if (startValue < 1 || endValue > 13) {
+ return false;
+ }
+ for (int i = 0; i < stones.size(); i++) {
+ if (stones.get(i).isJoker()) {
+ continue;
+ }
+ if (stones.get(i).getColor() != runColor) {
+ // warum macht er das nicht?
+ return false;
+ }
+ if (stones.get(i).getValue() != i + startValue) {
+ return false;
+ }
+ }
+ return true;
+ }
+ // is group
+ else {
+ if (stones.size() > 4) {
+ return false;
+ }
+ Set<StoneColor> seenColors = new HashSet<StoneColor>();
+ for (Stone i : stones) {
+ if (i.isJoker()) {
+ continue;
+ }
+ if (seenColors.contains(i.getColor())) {
+ return false;
+ } else {
+ seenColors.add(i.getColor());
+ }
+ }
+ return true;
+ }
}
/**
@@ -35,12 +91,11 @@ public class StoneSet implements Iterable<Stone> {
* Splitting {@link Position}
*/
public Pair<StoneSet, StoneSet> splitAt(int position) {
- //Exception falls falscher index
- if (position==0||position==stones.size()){
-
- }
- else {
-
+ // Exception falls falscher index
+ if (position == 0 || position == stones.size()) {
+
+ } else {
+
}
return null;
@@ -65,28 +120,29 @@ public class StoneSet implements Iterable<Stone> {
return stones.get(i);
}
- @Override
- public Iterator<Stone> iterator() {
- final Iterator<Stone> it = stones.iterator();
-
- return new Iterator<Stone>(){
-
- @Override
- public boolean hasNext() {
- return it.hasNext();
- }
-
- @Override
- public Stone next() {
- return it.next();
- }
-
- @Override
- public void remove() {
- // removing stones is impossible
-
- throw new NotImplementedException();
- }};
- }
+ @Override
+ public Iterator<Stone> iterator() {
+ final Iterator<Stone> it = stones.iterator();
+
+ return new Iterator<Stone>() {
+
+ @Override
+ public boolean hasNext() {
+ return it.hasNext();
+ }
+
+ @Override
+ public Stone next() {
+ return it.next();
+ }
+
+ @Override
+ public void remove() {
+ // removing stones is impossible
+
+ throw new NotImplementedException();
+ }
+ };
+ }
}
diff --git a/test/jrummikub/model/StoneSetTest.java b/test/jrummikub/model/StoneSetTest.java
index d929783..b2d6a46 100644
--- a/test/jrummikub/model/StoneSetTest.java
+++ b/test/jrummikub/model/StoneSetTest.java
@@ -60,6 +60,7 @@ public class StoneSetTest {
assertSet(false, Arrays.asList(new Stone(RED), new Stone(BLACK),
new Stone(1, RED), new Stone(2, RED)));
}
+
@Test
public void sameColor() {
assertSet(false, Arrays.asList(new Stone(1, RED), new Stone(1, RED),
@@ -71,23 +72,26 @@ public class StoneSetTest {
@Test
public void incorrectOrder() {
assertSet(false, Arrays.asList(new Stone(4, RED), new Stone(6, RED),
- new Stone(5, RED)));
+ new Stone(5, RED)));
assertSet(false, Arrays.asList(new Stone(4, RED), new Stone(6, RED),
- new Stone(RED)));
+ new Stone(RED)));
assertSet(false, Arrays.asList(new Stone(4, RED), new Stone(RED),
new Stone(5, RED)));
}
-
+
@Test
public void otherInvalid() {
-
+
assertSet(false, Arrays.asList(new Stone(4, RED), new Stone(5, RED),
- new Stone(7, RED)));
+ new Stone(7, RED)));
assertSet(false, Arrays.asList(new Stone(4, RED), new Stone(5, BLUE),
new Stone(6, RED)));
assertSet(false, Arrays.asList(new Stone(4, RED), new Stone(5, RED)));
-
+ assertSet(false, Arrays.asList(new Stone(4, BLUE), new Stone(5, RED),
+ new Stone(6, RED)));
+
}
+
// invalid Split
@Test(expected = AssertionError.class)
public void testSplitInvalidLow() {