diff options
-rw-r--r-- | src/jrummikub/model/StoneSet.java | 120 | ||||
-rw-r--r-- | test/jrummikub/model/StoneSetTest.java | 16 |
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() { |