From: Joe Slag Date: Sun, 22 Apr 2007 15:45:48 +0000 (+0000) Subject: o Fix PureCondorcetVote to return all results, not just the winner X-Git-Url: https://projects.mako.cc/source/rubyvote/commitdiff_plain/f7c9e07cba2bbd115e1ae82b1a407b1c6e603775?ds=sidebyside o Fix PureCondorcetVote to return all results, not just the winner 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 --- diff --git a/lib/rubyvote/condorcet.rb b/lib/rubyvote/condorcet.rb index e674115..cee10db 100644 --- a/lib/rubyvote/condorcet.rb +++ b/lib/rubyvote/condorcet.rb @@ -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 diff --git a/test/condorcet_test.rb b/test/condorcet_test.rb index 67d544e..aebc8f0 100644 --- a/test/condorcet_test.rb +++ b/test/condorcet_test.rb @@ -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