Skip to content

Commit c08ba94

Browse files
valentinbujdosomagwas
authored andcommitted
Create BeatTable #238 #239 #240 (#291)
* Create BeatTable #238 #239 #240 * CompareBeats #249 #250 * Add unimplemeneted test * Traits pattern
1 parent ce3b17f commit c08ba94

File tree

10 files changed

+318
-0
lines changed

10 files changed

+318
-0
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package org.rulez.demokracia.pdengine;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collection;
5+
6+
import org.rulez.demokracia.pdengine.dataobjects.Pair;
7+
import org.rulez.demokracia.types.MapMatrix;
8+
9+
public class BeatTable extends MapMatrix<Choice, Pair> implements ContainingBeats{
10+
private static final long serialVersionUID = 1L;
11+
12+
public enum Direction {
13+
DIRECTION_FORWARD, DIRECTION_BACKWARD
14+
}
15+
16+
public BeatTable() {
17+
this(new ArrayList<Choice>());
18+
}
19+
20+
public BeatTable(final Collection<Choice> keyCollection) {
21+
super(keyCollection);
22+
}
23+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package org.rulez.demokracia.pdengine;
2+
3+
import org.rulez.demokracia.pdengine.BeatTable.Direction;
4+
import org.rulez.demokracia.pdengine.dataobjects.Pair;
5+
import org.rulez.demokracia.pdengine.exception.ReportedException;
6+
import org.rulez.demokracia.types.Matrix;
7+
8+
public interface ContainingBeats extends Matrix<Choice, Pair>{
9+
10+
long serialVersionUID = 1L;
11+
default void checkPair(final Pair pair) {
12+
if (pair == null)
13+
throw new ReportedException("Invalid Pair key");
14+
}
15+
16+
default int beatInformation(final Choice choice1, final Choice choice2, final Direction direction) {
17+
if (direction == null)
18+
throw new ReportedException("Invalid direction");
19+
20+
int result = 0;
21+
Pair pair = getElement(choice1, choice2);
22+
23+
24+
if (direction.equals(Direction.DIRECTION_FORWARD))
25+
result = pair.winning;
26+
else
27+
result = pair.losing;
28+
29+
return result;
30+
}
31+
32+
default Pair compareBeats(final Pair beat1, final Pair beat2) {
33+
checkPair(beat1);
34+
checkPair(beat2);
35+
36+
if (beat1.winning > beat2.winning)
37+
return beat1;
38+
else if (beat1.winning < beat2.winning)
39+
return beat2;
40+
else
41+
if (beat1.losing < beat2.losing)
42+
return beat1;
43+
else if (beat2.losing < beat1.losing)
44+
return beat2;
45+
else
46+
throw new UnsupportedOperationException();
47+
}
48+
49+
50+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.rulez.demokracia.pdengine.dataobjects;
2+
3+
4+
public class Pair extends PairEntity {
5+
private static final long serialVersionUID = 1L;
6+
7+
public Pair(final int winning, final int losing) {
8+
super();
9+
this.winning = winning;
10+
this.losing = losing;
11+
}
12+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.rulez.demokracia.pdengine.dataobjects;
2+
3+
import org.rulez.demokracia.pdengine.persistence.BaseEntity;
4+
5+
public class PairEntity extends BaseEntity {
6+
7+
private static final long serialVersionUID = 1L;
8+
public int winning;
9+
public int losing;
10+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package org.rulez.demokracia.pdengine;
2+
3+
import static org.junit.Assert.*;
4+
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.rulez.demokracia.pdengine.BeatTable.Direction;
8+
import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
9+
import org.rulez.demokracia.pdengine.annotations.TestedFeature;
10+
import org.rulez.demokracia.pdengine.annotations.TestedOperation;
11+
import org.rulez.demokracia.pdengine.exception.ReportedException;
12+
import org.rulez.demokracia.pdengine.testhelpers.CreatedBeatTable;
13+
14+
@TestedFeature("Supporting functionality")
15+
@TestedOperation("BeatTable")
16+
@TestedBehaviour("the beat information related to a and b can be obtained for forward and backward")
17+
public class BeatTableBeatInformationTest extends CreatedBeatTable {
18+
19+
@Before
20+
public void setUp() throws ReportedException {
21+
super.setUp();
22+
}
23+
24+
@Test
25+
public void beatInformation_throws_an_exception_when_direction_is_not_defined() {
26+
assertThrows(() -> beatTable.beatInformation(null, null, null)
27+
).assertMessageIs("Invalid direction");
28+
}
29+
30+
@Test
31+
public void beatInformation_gives_back_the_number_of_winnings_from_choice1_to_choice2() {
32+
createNewBeatTableWithData();
33+
34+
assertEquals(pair.winning, beatTable.beatInformation(choice1, choice2, Direction.DIRECTION_FORWARD));
35+
}
36+
37+
@Test
38+
public void beatInformation_gives_back_the_number_of_losing_from_choice1_to_choice2() {
39+
createNewBeatTableWithData();
40+
41+
assertEquals(pair.losing, beatTable.beatInformation(choice1, choice2, Direction.DIRECTION_BACKWARD));
42+
}
43+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.rulez.demokracia.pdengine;
2+
3+
import static org.junit.Assert.assertTrue;
4+
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
8+
import org.rulez.demokracia.pdengine.annotations.TestedFeature;
9+
import org.rulez.demokracia.pdengine.annotations.TestedOperation;
10+
import org.rulez.demokracia.pdengine.exception.ReportedException;
11+
import org.rulez.demokracia.pdengine.testhelpers.CreatedBeatTable;
12+
13+
@TestedFeature("Schulze method")
14+
@TestedOperation("compare beats")
15+
@TestedBehaviour("if beats tie, looses decide")
16+
public class BeatTableCompareBeatsLosingTest extends CreatedBeatTable {
17+
18+
@Before
19+
public void setUp() throws ReportedException {
20+
super.setUp();
21+
}
22+
23+
@Test
24+
public void compareBeats_gives_back_the_backward_lower_beat1() {
25+
setCompareBeatsAsResult(beats1, beats3);
26+
assertTrue(result.winning == beats1.winning && result.losing == beats1.losing);
27+
}
28+
29+
@Test
30+
public void compareBeats_gives_back_the_backward_lower_beat2() {
31+
setCompareBeatsAsResult(beats1, beats5);
32+
assertTrue(result.winning == beats5.winning && result.losing == beats5.losing);
33+
}
34+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.rulez.demokracia.pdengine;
2+
3+
import org.junit.Before;
4+
import org.junit.Test;
5+
import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
6+
import org.rulez.demokracia.pdengine.annotations.TestedFeature;
7+
import org.rulez.demokracia.pdengine.annotations.TestedOperation;
8+
import org.rulez.demokracia.pdengine.exception.ReportedException;
9+
import org.rulez.demokracia.pdengine.testhelpers.CreatedBeatTable;
10+
11+
@TestedFeature("Unimplemented")
12+
@TestedOperation("Unimplemented")
13+
@TestedBehaviour("Unimplemented")
14+
public class BeatTableCompareBeatsTieTest extends CreatedBeatTable {
15+
16+
@Before
17+
public void setUp() throws ReportedException {
18+
super.setUp();
19+
}
20+
21+
@Test
22+
public void compareBeats_is_not_yet_implemented_when_the_result_is_tie() {
23+
assertUnimplemented(() -> beatTable.compareBeats(beats1, beats1));
24+
}
25+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.rulez.demokracia.pdengine;
2+
3+
import static org.junit.Assert.assertTrue;
4+
5+
import org.junit.Before;
6+
import org.junit.Test;
7+
import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
8+
import org.rulez.demokracia.pdengine.annotations.TestedFeature;
9+
import org.rulez.demokracia.pdengine.annotations.TestedOperation;
10+
import org.rulez.demokracia.pdengine.exception.ReportedException;
11+
import org.rulez.demokracia.pdengine.testhelpers.CreatedBeatTable;
12+
13+
@TestedFeature("Schulze method")
14+
@TestedOperation("compare beats")
15+
@TestedBehaviour("if beats are different, the bigger wins")
16+
public class BeatTableCompareBeatsWinningTest extends CreatedBeatTable {
17+
18+
@Before
19+
public void setUp() throws ReportedException {
20+
super.setUp();
21+
}
22+
23+
@Test
24+
public void compareBeats_throws_an_exception_when_first_input_param_is_not_defined() {
25+
assertThrows(() -> beatTable.compareBeats(null, beats2)
26+
).assertMessageIs("Invalid Pair key");
27+
}
28+
29+
@Test
30+
public void compareBeats_throws_an_exception_when_second_input_param_is_not_defined() {
31+
assertThrows(() -> beatTable.compareBeats(beats1, null)
32+
).assertMessageIs("Invalid Pair key");
33+
}
34+
35+
@Test
36+
public void compareBeats_gives_back_the_forward_bigger_beat1() {
37+
setCompareBeatsAsResult(beats1, beats2);
38+
assertTrue(result.winning == beats1.winning && result.losing == beats1.losing);
39+
}
40+
41+
@Test
42+
public void compareBeats_gives_back_the_forward_bigger_beat2() {
43+
setCompareBeatsAsResult(beats4, beats3);
44+
assertTrue(result.winning == beats3.winning && result.losing == beats3.losing);
45+
}
46+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package org.rulez.demokracia.pdengine.testhelpers;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import org.junit.Before;
7+
import org.rulez.demokracia.pdengine.BeatTable;
8+
import org.rulez.demokracia.pdengine.Choice;
9+
import org.rulez.demokracia.pdengine.dataobjects.Pair;
10+
import org.rulez.demokracia.testhelpers.ThrowableTester;
11+
12+
public class CreatedBeatTable extends ThrowableTester{
13+
protected BeatTable beatTable;
14+
protected List<Choice> list;
15+
16+
protected Pair pair;
17+
protected Pair result;
18+
19+
protected Choice choice1;
20+
protected Choice choice2;
21+
protected Choice choice3;
22+
23+
protected Pair beats1;
24+
protected Pair beats2;
25+
protected Pair beats3;
26+
protected Pair beats4;
27+
protected Pair beats5;
28+
29+
@Before
30+
public void setUp() {
31+
beatTable = new BeatTable();
32+
list = new ArrayList<Choice>();
33+
pair = new Pair(4, 5);
34+
choice1 = new Choice("name1", "userName1");
35+
choice2 = new Choice("name2", "userName2");
36+
choice3 = new Choice("name3", "userName3");
37+
list.add(choice1);
38+
list.add(choice2);
39+
list.add(choice3);
40+
41+
beats1 = new Pair(150, 22);
42+
beats2 = new Pair(100, 40);
43+
beats3 = new Pair(150, 40);
44+
beats4 = new Pair(100, 22);
45+
beats5 = new Pair(150, 10);
46+
}
47+
48+
protected void createNewBeatTableWithData() {
49+
beatTable = new BeatTable(list);
50+
beatTable.setElement(choice1, choice2, pair);
51+
}
52+
53+
protected void createNewBeatTableWithComplexData() {
54+
createNewBeatTableWithData();
55+
beatTable.setElement(choice1, choice2, new Pair(14, 1));
56+
beatTable.setElement(choice1, choice3, new Pair(13, 2));
57+
beatTable.setElement(choice2, choice1, new Pair(12, 3));
58+
beatTable.setElement(choice2, choice3, new Pair(11, 4));
59+
beatTable.setElement(choice1, choice2, pair);
60+
}
61+
62+
protected void setGetElementAsResult(final Choice first, final Choice second) {
63+
result = beatTable.getElement(first, second);
64+
}
65+
66+
protected void setCompareBeatsAsResult(final Pair first, final Pair second) {
67+
result = beatTable.compareBeats(first, second);
68+
}
69+
}

src/test/java/org/rulez/demokracia/testhelpers/ThrowableTester.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,10 @@ public ThrowableTester assertException(final Class<? extends RuntimeException> k
3535
assertEquals(message, klass, thrown.getClass());
3636
return this;
3737
}
38+
39+
public ThrowableTester assertUnimplemented(final Thrower thrower) {
40+
assertThrows(thrower);
41+
assertEquals(UnsupportedOperationException.class, thrown.getClass());
42+
return this;
43+
}
3844
}

0 commit comments

Comments
 (0)