Skip to content

Commit 91deca8

Browse files
szirbuczmagwas
authored andcommitted
Calculate winners ignores ignored choices #247 (#311)
* Calculate winners ignores ignored choices #247
1 parent 9913b96 commit 91deca8

File tree

6 files changed

+133
-1
lines changed

6 files changed

+133
-1
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.rulez.demokracia.pdengine;
2+
3+
import java.util.List;
4+
5+
public interface CanCalculateWinners {
6+
7+
List<String> calculateWinners(List<String> ignoredChoices);
8+
}

src/main/java/org/rulez/demokracia/pdengine/ComputedVote.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,27 @@
22

33
import java.io.Serializable;
44
import java.util.List;
5+
import java.util.Objects;
56
import java.util.Set;
67
import java.util.stream.Collectors;
78

8-
public class ComputedVote implements ComputedVoteInterface, Serializable {
9+
import org.rulez.demokracia.pdengine.dataobjects.Pair;
10+
11+
import jersey.repackaged.com.google.common.collect.Sets;
12+
import jersey.repackaged.com.google.common.collect.Sets.SetView;
13+
14+
public class ComputedVote implements CanCalculateWinners, ComputedVoteInterface, Serializable {
915

1016
private static final long serialVersionUID = 1L;
1117
private BeatTable beatTable;
1218
private final Vote vote;
1319
private BeatTable beatPathTable;
1420

21+
private transient WinnerCalculator winnerCalculator;
22+
1523
public ComputedVote(final Vote vote) {
1624
this.vote = vote;
25+
winnerCalculator = new WinnerCalculatorImpl();
1726
}
1827

1928
@Override
@@ -31,11 +40,35 @@ public void computeVote() {
3140
beatPathTable.computeTransitiveClosure();
3241
}
3342

43+
@Override
44+
public List<String> calculateWinners(final List<String> ignoredChoices) {
45+
BeatTable filteredBeatTable = ignoreChoices(ignoredChoices);
46+
return winnerCalculator.calculateWinners(filteredBeatTable);
47+
}
48+
3449
public BeatTable getBeatTable() {
3550
return beatTable;
3651
}
3752

3853
public BeatTable getBeatPathTable() {
3954
return beatPathTable;
4055
}
56+
57+
public void setWinnerCalculator(final WinnerCalculatorImpl winnerCalculator) {
58+
this.winnerCalculator = winnerCalculator;
59+
}
60+
61+
private BeatTable ignoreChoices(final List<String> ignoredChoices) {
62+
SetView<String> activeChoices = Sets.difference(Sets.newHashSet(beatPathTable.getKeyCollection()),
63+
Sets.newHashSet(ignoredChoices));
64+
BeatTable filteredBeatTable = new BeatTable(activeChoices);
65+
for (String key1 : activeChoices) {
66+
for (String key2 : activeChoices) {
67+
Pair source = beatTable.getElement(key1, key2);
68+
if (Objects.nonNull(source))
69+
filteredBeatTable.setElement(key1, key2, source);
70+
}
71+
}
72+
return filteredBeatTable;
73+
}
4174
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.rulez.demokracia.pdengine;
2+
3+
import java.util.List;
4+
5+
public interface WinnerCalculator {
6+
7+
List<String> calculateWinners(final BeatTable beatTable);
8+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.rulez.demokracia.pdengine;
2+
3+
import java.util.List;
4+
5+
public class WinnerCalculatorImpl implements WinnerCalculator {
6+
7+
@Override
8+
public List<String> calculateWinners(final BeatTable beatTable) {
9+
throw new UnsupportedOperationException();
10+
}
11+
12+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package org.rulez.demokracia.pdengine;
2+
3+
import static org.junit.Assert.*;
4+
import static org.mockito.Mockito.*;
5+
6+
import java.util.Arrays;
7+
import java.util.List;
8+
import java.util.stream.Collectors;
9+
10+
import org.junit.Before;
11+
import org.junit.Test;
12+
import org.mockito.ArgumentCaptor;
13+
import org.mockito.stubbing.Answer;
14+
import org.rulez.demokracia.pdengine.annotations.TestedBehaviour;
15+
import org.rulez.demokracia.pdengine.annotations.TestedFeature;
16+
import org.rulez.demokracia.pdengine.annotations.TestedOperation;
17+
import org.rulez.demokracia.pdengine.testhelpers.CreatedDefaultCastVoteWithRankedChoices;
18+
19+
@TestedFeature("Vote")
20+
@TestedOperation("calculate winners")
21+
public class CalculateWinnersTest extends CreatedDefaultCastVoteWithRankedChoices {
22+
23+
private final Answer<?> answerKeyCollection = (invocation) -> {
24+
BeatTable beatTable = (BeatTable) invocation.getArguments()[0];
25+
return beatTable.getKeyCollection().stream().collect(Collectors.toList());
26+
};
27+
28+
private ComputedVote computedVote;
29+
private final ArgumentCaptor<BeatTable> captor = ArgumentCaptor.forClass(BeatTable.class);
30+
31+
@Override
32+
@Before
33+
public void setUp() {
34+
super.setUp();
35+
getTheVote().votesCast = castVote;
36+
WinnerCalculatorImpl winnerCalculator = mock(WinnerCalculatorImpl.class);
37+
when(winnerCalculator.calculateWinners(captor.capture())).thenAnswer(answerKeyCollection);
38+
39+
computedVote = new ComputedVote(getTheVote());
40+
computedVote.computeVote();
41+
computedVote.setWinnerCalculator(winnerCalculator);
42+
}
43+
44+
@TestedBehaviour("only choices not in ignoredChoices are considered")
45+
@Test
46+
public void calculate_winners_returns_none_of_the_ignored_choices() {
47+
List<String> winners = computedVote.calculateWinners(Arrays.asList("A"));
48+
assertFalse(winners.contains("A"));
49+
50+
}
51+
52+
@TestedBehaviour("only choices not in ignoredChoices are considered")
53+
@Test
54+
public void calculate_winners_returns_not_ignored_winner() {
55+
List<String> winners = computedVote.calculateWinners(Arrays.asList("C"));
56+
assertBeatTableContainChoice(winners, "A");
57+
}
58+
59+
private void assertBeatTableContainChoice(final List<String> winners, final String choice) {
60+
assertTrue(winners.contains(choice));
61+
BeatTable capturedBeatTable = captor.getValue();
62+
assertNotNull(capturedBeatTable.getElement(choice, "B"));
63+
}
64+
65+
66+
}

src/test/java/org/rulez/demokracia/pdengine/UnimplementedTests.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,9 @@ public class UnimplementedTests extends ThrowableTester {
1616
public void the_getAssurances_method_is_not_implemented_yet() {
1717
assertUnimplemented(() -> new CastVote("proxyId", new ArrayList<>()).getAssurances());
1818
}
19+
20+
@Test
21+
public void the_calculateWinners_method_is_not_implemented_yet() {
22+
assertUnimplemented(() -> new WinnerCalculatorImpl().calculateWinners(null));
23+
}
1924
}

0 commit comments

Comments
 (0)