def test_cgp_grey_animal_kingdom(self): """Tests CGP Grey example STV election 'Politics in the Animal Kingdom' Link: https://www.youtube.com/watch?v=l8XOZJkozfI Expected winners: Gorilla, Monkey, Tiger """ # Setup tarsier = Candidate('tarsier', name='Tarsier') gorilla = Candidate('gorilla', name='Gorilla') monkey = Candidate('monkey', name='Monkey') tiger = Candidate('tiger', name='Tiger') lynx = Candidate('lynx', name='Lynx') expected_winners = set([gorilla, monkey, tiger]) seats = 3 tiebreak_alphanumeric = 'abcdefghijklmnopqrstuvwxyz' num_ballots = 10000 ballots = ( ballots_for_candidates([tarsier, gorilla], int( .05 * num_ballots)) + ballots_for_candidates( [gorilla, tarsier, monkey], int(.28 * num_ballots)) + ballots_for_candidates([monkey], int(.33 * num_ballots)) + ballots_for_candidates([tiger], int(.21 * num_ballots)) + ballots_for_candidates([lynx, tiger, tarsier, monkey, gorilla], int(.13 * num_ballots))) # Test election = Election(seats=seats, ballots=ballots, random_alphanumeric=tiebreak_alphanumeric) results = election.compute_results() self.assertEqual(expected_winners, results.candidates_elected)
def test_wikipedia_food_selection(self): """Tests Wikipedia's example STV election, using choices of food. Link: https://en.wikipedia.org/wiki/Single_transferable_vote#Example Expected winners: Chocolate, Oranges, Strawberries """ # Setup chocolate = Candidate('chocolate', name='Chocolate') oranges = Candidate('oranges', name='Oranges') pears = Candidate('pears', name='Pears') strawberries = Candidate('strawberries', name='Strawberries') sweets = Candidate('sweets', name='Sweets') expected_winners = set([chocolate, oranges, strawberries]) seats = 3 tiebreak_alphanumeric = 'abcdefghijklmnopqrstuvwxyz' ballots = (ballots_for_candidates([oranges], 4) + ballots_for_candidates([pears, oranges], 2) + ballots_for_candidates([chocolate, strawberries], 8) + ballots_for_candidates([chocolate, sweets], 4) + ballots_for_candidates([strawberries], 1) + ballots_for_candidates([sweets], 1)) # Test election = Election(seats=seats, ballots=ballots, random_alphanumeric=tiebreak_alphanumeric) results = election.compute_results() self.assertEqual(expected_winners, results.candidates_elected)
def test_florida_2000_presidential(self): """Tests the 2000 Florida presidential election, scaled 1%. An example of a election between two major candidates and a third-party. For the sake of ranking votes, this test assumes that Nader supporters prefer Gore to Bush by a 2:1 margin, which is not necessarily true. Expected winners: Gore Round 0 Ballots: 29127 * [Bush] 29122 * [Gore] 324 * [Nader, Bush] 649 * [Nader, Gore] Votes: Bush: 29127 Gore: 29122 Nader: 974 Threshold: (29127+29122+974) / (1+1) + 1 = 29612.5 Result: Nader is eliminated Round 1 Ballots: 29452 * [Bush] 29972 * [Gore] Votes: Bush: 29452 Gore: 29972 Threshold: (29452+29972) / (1+1) + 1 = 29612.5 Result: Gore is elected """ # Setup bush = Candidate('gbush', name='George Bush') gore = Candidate('agore', name='Al Gore') nader = Candidate('rnader', name='Ralph Nader') expected_winners = set([gore]) seats = 1 tiebreak_alphanumeric = 'abcdefghijklmnopqrstuvwxyz' ballots = (ballots_for_candidates([bush], 29127) + ballots_for_candidates([gore], 29122) + ballots_for_candidates([nader, bush], 324) + ballots_for_candidates([nader, gore], 649)) # Test election = Election(seats=seats, ballots=ballots, random_alphanumeric=tiebreak_alphanumeric) results = election.compute_results() self.assertEqual(expected_winners, results.candidates_elected)
def test_cgp_grey_stv_election_walkthrough(self): """Tests CGP Grey example STV election 'Extra: STV Election Walkthrough' Link: https://www.youtube.com/watch?v=Ac9070OIMUg Expected winners: Gorilla, Silverback, Owl, Turtle, Tiger """ # Setup tarsier = Candidate('tarsier', name='Tarsier') gorilla = Candidate('gorilla', name='Gorilla') silverback = Candidate('silverback', name='Silverback') owl = Candidate('owl', name='Owl') turtle = Candidate('turtle', name='Turtle') snake = Candidate('snake', name='Snake') tiger = Candidate('tiger', name='Tiger') lynx = Candidate('lynx', name='Lynx') jackalope = Candidate('jackalope', name='Jackalope') buffalo = Candidate('buffalo', name='Buffalo') expected_winners = set([gorilla, silverback, owl, turtle, tiger]) seats = 5 tiebreak_alphanumeric = 'abcdefghijklmnopqrstuvwxyz' num_ballots = 10000 ballots = ( ballots_for_candidates([tarsier, silverback], int( .05 * num_ballots)) + ballots_for_candidates( [gorilla, silverback], int(.21 * num_ballots)) + ballots_for_candidates([gorilla, tarsier, silverback], int(.11 * num_ballots)) + ballots_for_candidates([silverback], int(.03 * num_ballots)) + ballots_for_candidates([owl, turtle], int(.33 * num_ballots)) + ballots_for_candidates([turtle], int(.01 * num_ballots)) + ballots_for_candidates([snake, turtle], int(.01 * num_ballots)) + ballots_for_candidates([tiger], int(.16 * num_ballots)) + ballots_for_candidates([lynx, tiger], int(.04 * num_ballots)) + ballots_for_candidates([jackalope], int(.02 * num_ballots)) + ballots_for_candidates([buffalo, jackalope], int( .02 * num_ballots)) + ballots_for_candidates( [buffalo, jackalope, turtle], int(.01 * num_ballots))) # Test election = Election(seats=seats, ballots=ballots, random_alphanumeric=tiebreak_alphanumeric) results = election.compute_results() self.assertEqual(expected_winners, results.candidates_elected)
def castVote(self, vote): for i in range(10): vote = Vote(Voter("Bad Voter {}".format(i)), Candidate("Bad Candidate")) block = block(vote, self.chain.last) # mostly invalid proof proof = hash(block) self.chain.addBlock(block, proof) self.announceNewBlock() return true
def setUp(self): self.nCandidates = 3 self.nVoters = 10 self.nNodes = 5 self.candidates = [Candidate("Candidate %s" % i) for i in range(self.nCandidates)] self.voters = [Voter("Voter %s" % i) for i in range(self.nVoters)] self.network = Network() for i in range(self.nNodes): self.network.addNode()
def candidate_from_input(candidate_input): """Returns a Candidate representing the input string. Args: candidate_input: String representing user input for a Candidate. The expected format is 'uid' or optionally 'uid (name)'. Returns: Candidate representing the input uid (and optionally name). """ if input_string_is_no_confidence(candidate_input): return NoConfidence() else: expr = '(.*?)\s*\((.*?)\)' regex = re.compile(expr) result = regex.match(candidate_input) if result is not None: uid = result.group(1) name = result.group(2) else: uid = candidate_input name = None return Candidate(uid, name=name)
def candidates_for_ids(candidate_ids): """Returns an ordered list of Candidates for an ordered list of ids. This is helpful for tests where candidates on ballots can be defined as short strings (i.e. 'A', 'B', 'NC') in the test cases, which can then be converted to proper Candidates. Args: candidate_ids: List of strings representing candidate ids. Returns: List of Candidates corresponding to the given ids. """ candidate_for_id = { 'NC': NoConfidence(), 'A': Candidate('dgund', name='Devin Gund'), 'B': Candidate('gwashington', name='George Washington'), 'C': Candidate('jadams', name='John Adams'), 'D': Candidate('tjefferson', name='Thomas Jefferson'), 'E': Candidate('jmadison', name='James Madison'), 'F': Candidate('jmonroe', name='James Monroe'), 'G': Candidate('jqadams', name='John Quincy Adams'), 'H': Candidate('ajackson', name='Andrew Jackson'), 'I': Candidate('mvburen', name='Martin Van Buren'), 'J': Candidate('wharrison', name='William Harrison'), 'K': Candidate('jtyler', name='John Tyler'), 'L': Candidate('jpolk', name='James Polk'), 'M': Candidate('ztaylor', name='Zachary Taylor'), 'N': Candidate('mfillmore', name='Millard Fillmore'), 'O': Candidate('fpierce', name='Franklin Pierce'), 'P': Candidate('jbuchanan', name='James Buchanan'), 'Q': Candidate('alincoln', name='Abraham Lincoln'), 'R': Candidate('ajohnson', name='Andrew Johnson'), 'S': Candidate('ugrant', name='Ulysses Grant'), 'T': Candidate('rhayes', name='Rutherford Hayes'), 'U': Candidate('jgarfield', name='James Garfield'), 'V': Candidate('carthur', name='Chester Arthur'), 'W': Candidate('gcleveland', name='Grover Cleveland'), 'X': Candidate('bharrison', name='Benjamin Harrison'), 'Y': Candidate('wmckinley', name='William McKinley'), 'Z': Candidate('troosevelt', name='Theodore Roosevelt'), } candidates = [] for candidate_id in candidate_ids: candidates.append(candidate_for_id[candidate_id]) return candidates
import unittest from block import Block from election import Vote, Voter, Candidate from blockchain import Blockchain, InvalidBlockchain # Voters Amany = Voter("Amany") Anthony = Voter("Anthony") Owen = Voter("Owen") # Candidates James = Candidate("James") Marcus = Candidate("Marcus") Ronny = Candidate("Ronny") ab = { 'jy': Vote(Amany, James), 'mc': Vote(Amany, Marcus), 'rk': Vote(Amany, Ronny) } ak = { 'jy': Vote(Anthony, James), 'mc': Vote(Anthony, Marcus), 'rk': Vote(Anthony, Ronny) } on = { 'jy': Vote(Owen, James), 'mc': Vote(Owen, Marcus),