o Fix PureCondorcetVote to return all results, not just the winner
authorJoe Slag <joe@slagwerks.com>
Sun, 22 Apr 2007 15:45:48 +0000 (15:45 +0000)
committerJoe Slag <joe@slagwerks.com>
Sun, 22 Apr 2007 15:45:48 +0000 (15:45 +0000)
o Allow PureCondorcetVote to return ties, rather than loop infinitely

git-svn-id: svn://rubyforge.org/var/svn/rubyvote/trunk@25 1440c7f4-e209-0410-9a04-881b5eb134a8

lib/rubyvote/condorcet.rb
test/condorcet_test.rb

index e674115a89253359b62f18524280ed2c8f26c744..cee10db7919dcd95f013778dd900d024fc4b26b9 100644 (file)
@@ -120,8 +120,8 @@ class CondorcetVote < ElectionVote
 end
 
 class PureCondorcetVote < CondorcetVote
-  def result
-    PureCondorcetResult.new(self)
+  def resultFactory(init)
+    PureCondorcetResult.new(init)
   end
 end
 
@@ -177,6 +177,7 @@ class PureCondorcetResult < CondorcetResult
   end
 
   protected
+
   def condorcet
     votes = @election.votes
     candidates = @election.candidates
@@ -191,11 +192,18 @@ class PureCondorcetResult < CondorcetResult
       victors[winner] << loser
     end
 
-    winners = @election.candidates.find_all do |candidate|
-        victors[candidate].length == @election.candidates.length - 1
+    victory_margin = 1
+    while true
+      winners = @election.candidates.find_all do |candidate|
+        victors[candidate].length == @election.candidates.length - victory_margin
+      end
+      if winners.length > 0
+        @winners = winners
+        return @winners
+      else
+        victory_margin += 1
+      end
     end
-
-    @winners << winners if winners.length == 1
   end
 end
 
index 67d544e4f51d41e7136623a72c86d47c88d45fb4..aebc8f02027e59f1984a2a44000cde66fb85619e 100644 (file)
@@ -12,7 +12,19 @@ class TestCondorcetVote < Test::Unit::TestCase
     3.times {vote_array << "CBA".split("")}
     2.times {vote_array << "BAC".split("")}
 
-    assert_equal ["B"], PureCondorcetVote.new(vote_array).result.winners[0]
+    assert_equal "B", PureCondorcetVote.new(vote_array).result.winners[0]
+    assert_equal [['B'], ['A'], ['C']], PureCondorcetVote.new(vote_array).results
+  end
+
+  def test_condorcet_2
+    vote_array = Array.new
+    3.times {vote_array << "678".split("")}
+    3.times {vote_array << "768".split("")}
+    2.times {vote_array << "8".split("")}
+
+    v = PureCondorcetVote.new(vote_array)
+    assert_equal ["6", "7"], v.result.winners
+    assert_equal [['6', '7'], ['8']], v.results
   end
 
   def test_ssd

Benjamin Mako Hill || Want to submit a patch?