o Test that elections with a single vote return the expected result.
authorJoe Slag <joe@slagwerks.com>
Tue, 20 Mar 2007 15:39:48 +0000 (15:39 +0000)
committerJoe Slag <joe@slagwerks.com>
Tue, 20 Mar 2007 15:39:48 +0000 (15:39 +0000)
o Caught a bug for elections whose votes aren't strings of length 1.

git-svn-id: svn://rubyforge.org/var/svn/rubyvote/trunk@20 1440c7f4-e209-0410-9a04-881b5eb134a8

lib/rubyvote/condorcet.rb
test/condorcet_test.rb

index 96a103b..340be92 100644 (file)
@@ -133,6 +133,7 @@ class CondorcetResult < ElectionResult
     votes = @election.votes unless votes
 
     defeats = Array.new
+    candidates = [candidates] unless candidates.class == Array
     candidates.each do |candidate|
       candidates.each do |challenger|
         next if candidate == challenger
@@ -204,6 +205,7 @@ class CloneproofSSDResult < CondorcetResult
       # see the array with the standard defeats
       transitive_defeats = self.defeats(candidates, votes)
 
+      candidates = [candidates] unless candidates.class == Array
       candidates.each do |cand1|
         candidates.each do |cand2|
           candidates.each do |cand3|
index ea1b19c..82ff292 100644 (file)
@@ -86,4 +86,16 @@ class TestCondorcetVote < Test::Unit::TestCase
     assert_equal [['B'], ['C'], ['D'], ['A']], result.get_full_results
   end
 
+  # 
+  # At one point, we happened to be getting correct results due to the
+  # happy accident that, for example, 'B'.each returns 'B'. The
+  # following election with a single integer vote catches that
+  # condition.
+  #
+  def test_ssd_single_vote
+    result = CloneproofSSDVote.new([[78]]).result
+    assert_equal 78, result.winners[0]
+    assert_equal [[78]], result.get_full_results
+  end
+
 end

Benjamin Mako Hill || Want to submit a patch?