class ElectionVote
attr_reader :votes
attr_reader :candidates
-
+
def initialize(votes=nil)
@votes = Hash.new unless defined?(@votes)
@candidates = Array.new unless defined?(@candidates)
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
protected
def verify_vote(vote=nil)
- not vote.instance_of?( Array )
+ vote ? true : false
end
def tally_vote(candidate)
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
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)
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|
class ElectionError < ArgumentError
end
+class InvalidVoteError < ElectionError
+ attr_accessor :voteobj
+ def initialize(msg=nil, voteobj=nil)
+ super(msg)
+ @voteobj=voteobj
+ end
+end