From edff22dc7bd8517bff039e3346f2a85bf0aed754 Mon Sep 17 00:00:00 2001 From: Joe Slag Date: Mon, 9 Apr 2007 18:33:54 +0000 Subject: [PATCH 1/1] simplify access to full results - now available as voteobject.results, instead of voteobject.result.get_full_results. git-svn-id: svn://rubyforge.org/var/svn/rubyvote/trunk@22 1440c7f4-e209-0410-9a04-881b5eb134a8 --- lib/rubyvote/condorcet.rb | 43 +++++++++++++++++++++++++++------------ lib/rubyvote/election.rb | 6 ------ test/condorcet_test.rb | 37 ++++++++++++++++++++------------- 3 files changed, 53 insertions(+), 33 deletions(-) diff --git a/lib/rubyvote/condorcet.rb b/lib/rubyvote/condorcet.rb index 3269261..b0471ec 100644 --- a/lib/rubyvote/condorcet.rb +++ b/lib/rubyvote/condorcet.rb @@ -33,6 +33,8 @@ class CondorcetVote < ElectionVote + attr_accessor :results + def initialize(votes=nil) unless defined?(@candidates) @candidates = Array.new @@ -44,6 +46,7 @@ class CondorcetVote < ElectionVote end end super(votes) + @results = Array.new end def tally_vote(vote=nil) @@ -80,21 +83,45 @@ class CondorcetVote < ElectionVote end end + def results + if @results.size < 2 && (not @candidates.empty?) + tabulate + end + @results + end + def result - resultFactory( self ) + find_only_winner unless @winner + @winner end protected + def verify_vote(vote=nil) vote.instance_of?( Array ) and vote == vote.uniq end + def tabulate + find_only_winner unless @winner + until @candidates.empty? + aResult = resultFactory( self ) + @results << aResult.winners + filter_out(aResult) + end + end + + def find_only_winner + @winner = resultFactory( self ) + @results << @winner.winners + filter_out(@winner) + end + end class PureCondorcetVote < CondorcetVote - def resultFactory(init) - PureCondorcetResult.new(init) + def result + PureCondorcetResult.new(self) end end @@ -103,16 +130,6 @@ class CloneproofSSDVote < CondorcetVote CloneproofSSDResult.new(init) end - def result - top_result = resultFactory( self ) - until @candidates.empty? - aResult = resultFactory( self ) - top_result.full_results << aResult - filter_out(aResult) - end - top_result - end - end diff --git a/lib/rubyvote/election.rb b/lib/rubyvote/election.rb index 4d51d78..3d816a8 100644 --- a/lib/rubyvote/election.rb +++ b/lib/rubyvote/election.rb @@ -114,7 +114,6 @@ end class ElectionResult attr_reader :winners - attr_accessor :full_results def initialize(voteobj=nil) unless voteobj and voteobj.kind_of?( ElectionVote ) @@ -123,7 +122,6 @@ class ElectionResult @election = voteobj @winners = Array.new - @full_results = Array.new end def winner @@ -134,10 +132,6 @@ class ElectionResult @winners.length > 0 end - def get_full_results - @full_results.collect {|x| x.winners} - end - end class PluralityResult < ElectionResult diff --git a/test/condorcet_test.rb b/test/condorcet_test.rb index f0dd1cc..67d544e 100644 --- a/test/condorcet_test.rb +++ b/test/condorcet_test.rb @@ -28,7 +28,7 @@ class TestCondorcetVote < Test::Unit::TestCase assert_equal "E", CloneproofSSDVote.new(vote_array).result.winners[0] assert_equal [['E'], ['A'], ['C'], ['B'], ['D']], - CloneproofSSDVote.new(vote_array).result.get_full_results + CloneproofSSDVote.new(vote_array).results end def test_ssd2 @@ -45,7 +45,7 @@ class TestCondorcetVote < Test::Unit::TestCase assert_equal "D", CloneproofSSDVote.new(vote_array).result.winners[0] assert_equal [['D'], ['A'], ['C'], ['B']], - CloneproofSSDVote.new(vote_array).result.get_full_results + CloneproofSSDVote.new(vote_array).results end def test_ssd3 @@ -57,7 +57,7 @@ class TestCondorcetVote < Test::Unit::TestCase assert_equal "B", CloneproofSSDVote.new(vote_array).result.winners[0] assert_equal [['B'], ['C'], ['D'], ['A']], - CloneproofSSDVote.new(vote_array).result.get_full_results + CloneproofSSDVote.new(vote_array).results end def test_ssd_incomplete_votes @@ -68,9 +68,9 @@ class TestCondorcetVote < Test::Unit::TestCase 4.times {vote_array << ["C"]} 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 + vote = CloneproofSSDVote.new(vote_array) + assert_equal "B", vote.result.winners[0] + assert_equal [['B'], ['C'], ['D'], ['A']], vote.results end def test_ssd_incomplete_votes_2 @@ -81,9 +81,9 @@ class TestCondorcetVote < Test::Unit::TestCase 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 + vote = CloneproofSSDVote.new(vote_array) + assert_equal "B", vote.result.winners[0] + assert_equal [['B'], ['C'], ['D'], ['A']], vote.results end # @@ -93,9 +93,9 @@ class TestCondorcetVote < Test::Unit::TestCase # condition. # def test_ssd_single_vote - result = CloneproofSSDVote.new([[78]]).result - assert_equal 78, result.winners[0] - assert_equal [[78]], result.get_full_results + vote = CloneproofSSDVote.new([[78]]) + assert_equal 78, vote.result.winners[0] + assert_equal [[78]], vote.results end def test_ssd_sparse @@ -103,8 +103,17 @@ class TestCondorcetVote < Test::Unit::TestCase vote_array << ['B', 'D'] vote_array << ['A', 'C'] vote_array << ['E', 'C'] - result = CloneproofSSDVote.new(vote_array).result - assert_equal 5, result.get_full_results.flatten.size + results = CloneproofSSDVote.new(vote_array).results + assert_equal 5, results.flatten.size + end + + def test_ssd_sparse_2 + vote_array = Array.new + vote_array << [65, 63, 64] + vote_array << [64, 65, 66, 63] + vote = CloneproofSSDVote.new(vote_array) + assert_equal 65, vote.result.winners[0] + assert_equal [[65, 64], [63, 66]], vote.results end end -- 2.39.5