From ca21f7527ba633db0457aa6cffc691c1eb4925ca Mon Sep 17 00:00:00 2001 From: Joe Slag Date: Mon, 19 Mar 2007 17:38:50 +0000 Subject: [PATCH] Condorcet methods determine all candidates before tallying, in case of incomplete votes git-svn-id: svn://rubyforge.org/var/svn/rubyvote/trunk@18 1440c7f4-e209-0410-9a04-881b5eb134a8 --- lib/rubyvote/condorcet.rb | 16 +++++++++++++--- test/condorcet_test.rb | 19 ++++++++++++++++--- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lib/rubyvote/condorcet.rb b/lib/rubyvote/condorcet.rb index f4ed7b7..68b3c70 100644 --- a/lib/rubyvote/condorcet.rb +++ b/lib/rubyvote/condorcet.rb @@ -33,6 +33,19 @@ class CondorcetVote < ElectionVote + def initialize(votes=nil) + unless defined?(@candidates) + @candidates = Array.new + votes.each do |vote_row| + vote_row = vote_row.flatten if vote_row.class == Array + vote_row.each do |vote| + @candidates << vote unless @candidates.include?(vote) + end + end + end + super(votes) + end + def tally_vote(vote=nil) vote.each_with_index do |winner, index| @@ -67,9 +80,6 @@ class CondorcetVote < ElectionVote @candidates << loser unless @candidates.include?( loser ) end end - - @candidates << winner unless @candidates.include?( winner ) || - winner.class == Array end end diff --git a/test/condorcet_test.rb b/test/condorcet_test.rb index c885a71..ea1b19c 100644 --- a/test/condorcet_test.rb +++ b/test/condorcet_test.rb @@ -68,9 +68,22 @@ class TestCondorcetVote < Test::Unit::TestCase 4.times {vote_array << ["C"]} 2.times {vote_array << "DBC".split("")} - assert_equal "B", CloneproofSSDVote.new(vote_array).result.winners[0] - assert_equal [['B'], ['C'], ['D'], ['A']], - CloneproofSSDVote.new(vote_array).result.get_full_results + result = CloneproofSSDVote.new(vote_array).result + assert_equal "B", result.winners[0] + assert_equal [['B'], ['C'], ['D'], ['A']], result.get_full_results + end + + def test_ssd_incomplete_votes_2 + vote_array = Array.new + 4.times {vote_array << ["C"]} + 3.times {vote_array << "ABCD".split("")} + 2.times {vote_array << "DABC".split("")} + 2.times {vote_array << "DBCA".split("")} + 2.times {vote_array << "DBC".split("")} + + result = CloneproofSSDVote.new(vote_array).result + assert_equal "B", result.winners[0] + assert_equal [['B'], ['C'], ['D'], ['A']], result.get_full_results end end -- 2.30.2