X-Git-Url: https://projects.mako.cc/source/selectricity/blobdiff_plain/f0a53d67fa85d76b36a55d9a4a887360eca8d864..e8094b780ec0f30ac06b4de4c4f3a9c2bffe209d:/lib/rubyvote/election.rb?ds=sidebyside diff --git a/lib/rubyvote/election.rb b/lib/rubyvote/election.rb index 66e4c2a..3655a03 100644 --- a/lib/rubyvote/election.rb +++ b/lib/rubyvote/election.rb @@ -34,7 +34,7 @@ class ElectionVote attr_reader :votes attr_reader :candidates - + def initialize(votes=nil) @votes = Hash.new unless defined?(@votes) @candidates = Array.new unless defined?(@candidates) @@ -42,7 +42,11 @@ class ElectionVote if votes if votes.instance_of?( Array ) votes.each do |vote| - self.tally_vote(vote) if self.verify_vote(vote) + if self.verify_vote(vote) + self.tally_vote(vote) + else + raise InvalidVoteError.new("Invalid vote object", vote) + end end else raise ElectionError, "Votes must be in the form of an array.", caller @@ -62,10 +66,6 @@ class ElectionVote self.verify_vote(vote) end - def filter_out(winner) - @candidates.delete_if {|x| winner.winners.include?(x)} - end - end class PluralityVote < ElectionVote @@ -75,7 +75,7 @@ class PluralityVote < ElectionVote protected def verify_vote(vote=nil) - not vote.instance_of?( Array ) + vote ? true : false end def tally_vote(candidate) @@ -115,7 +115,7 @@ end class ElectionResult attr_reader :winners attr_reader :election - + def initialize(voteobj=nil) unless voteobj and voteobj.kind_of?( ElectionVote ) raise ArgumentError, "You must pass a ElectionVote array.", caller @@ -130,14 +130,15 @@ class ElectionResult end def winner? - @winners.length > 0 + @winners.length > 0 and not @winners[0].nil? end - + end class PluralityResult < ElectionResult attr_reader :ranked_candidates - + attr_reader :points + def initialize(voteobj=nil) super(voteobj) @@ -148,6 +149,8 @@ class PluralityResult < ElectionResult b[1] <=> a[1] end.collect {|a| a[0]} + @points = @election.votes + # winners are anyone who has the same number of votes as the # first person @winners = @ranked_candidates.find_all do |i| @@ -164,3 +167,10 @@ end class ElectionError < ArgumentError end +class InvalidVoteError < ElectionError + attr_accessor :voteobj + def initialize(msg=nil, voteobj=nil) + super(msg) + @voteobj=voteobj + end +end