Example #1
0
 def testElectionDumps(self):
     "try several counts & dumps"
     blts = ('42', '42t', '42u', 'M135', '513', 'SC', 'SCw', 'SC-Vm-12')
     rulenames = droop.electionRuleNames()
     for blt in blts:
         for rulename in rulenames:
             self.assertTrue(doDumpCompare(dict(rule=rulename), blt), '%s %s.blt' % (rulename, blt))
Example #2
0
 def testDroopOptions(self):
     "test [droop ...]"
     if 'meek' in droop.electionRuleNames():
         b = '''3 2 [droop arithmetic=fixed precision=4] 4 1 2 0 2 3 0 0
             "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), dict(rule='meek'))
         self.assertEqual(E.V.precision, 4)
         E = Election(ElectionProfile(data=b), dict(rule='meek',
                                                    precision=6))
         self.assertEqual(E.V.precision, 6)
         b = '''3 2 [droop rational precision=4] 4 1 2 0 2 3 0 0
             "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), dict(rule='meek'))
         self.assertEqual(E.V.name, 'rational')
         b = '''3 2 [droop meek] 4 1 2 0 2 3 0 0 "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), dict())
         self.assertEqual(E.rule.method, 'meek')
         E = Election(ElectionProfile(data=b), None)
         self.assertEqual(E.rule.method, 'meek')
         b = '''3 2 [droop dump meek] 4 1 2 0 2 3 0 0 "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), None)
         self.assertTrue(E.options.getopt('dump'))
         b = '''3 2 [droop dump=true meek] 4 1 2 0 2 3 0 0
             "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), None)
         self.assertTrue(E.options.getopt('dump'))
         b = '''3 2 [droop dump=false meek] 4 1 2 0 2 3 0 0
             "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), None)
         self.assertFalse(E.options.getopt('dump'))
         # fake a path to test double-path logic
         b = '''3 2 [droop 42.blt 513.blt meek] 4 1 2 0 2 3 0 0
             "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         self.assertRaises(UsageError, Election, ElectionProfile(data=b),
                           dict())
Example #3
0
 def testDroopOptions(self):
     "test [droop ...]"
     if 'meek' in droop.electionRuleNames():
         b = '''3 2 [droop arithmetic=fixed precision=4] 4 1 2 0 2 3 0 0 
             "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), dict(rule='meek'))
         self.assertEqual(E.V.precision, 4)
         E = Election(ElectionProfile(data=b), dict(rule='meek', precision=6))
         self.assertEqual(E.V.precision, 6)
         b = '''3 2 [droop rational precision=4] 4 1 2 0 2 3 0 0 
             "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), dict(rule='meek'))
         self.assertEqual(E.V.name, 'rational')
         b = '''3 2 [droop meek] 4 1 2 0 2 3 0 0 "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), dict())
         self.assertEqual(E.rule.method, 'meek')
         E = Election(ElectionProfile(data=b), None)
         self.assertEqual(E.rule.method, 'meek')
         b = '''3 2 [droop dump meek] 4 1 2 0 2 3 0 0 "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), None)
         self.assertTrue(E.options.getopt('dump'))
         b = '''3 2 [droop dump=true meek] 4 1 2 0 2 3 0 0 
             "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), None)
         self.assertTrue(E.options.getopt('dump'))
         b = '''3 2 [droop dump=false meek] 4 1 2 0 2 3 0 0 
             "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         E = Election(ElectionProfile(data=b), None)
         self.assertFalse(E.options.getopt('dump'))
         # fake a path to test double-path logic
         b = '''3 2 [droop 42.blt 513.blt meek] 4 1 2 0 2 3 0 0 
             "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''
         self.assertRaises(UsageError, Election, ElectionProfile(data=b), dict())
Example #4
0
 def testMethod(self):
     "method is meek or wigm or qpq for each rule"
     for name in electionRuleNames():
         Rule = electionRule(name)
         method = Rule.method
         self.assertTrue(method in ('meek', 'wigm', 'qpq'),
                         'bad method "%s"' % method)
Example #5
0
def usage(subject=None):
    "usage and help"

    helps = Election.makehelp()
    helpers = sorted(helps.keys())

    u = '\n%s v%s\n' % (droop.common.droopName, droop.common.droopVersion)
    u += '\nUsage:\n'
    u += '%s options ballotfile\n' % me
    u += '  options:\n'
    u += '    rule name (%s)\n' % ','.join(droop.electionRuleNames())
    u += '    arithmetic class name (%s)\n' % ','.join(
        droop.values.arithmeticNames)
    u += '    profile=reps, to profile the count, running reps repetitions\n'
    u += '    dump, to dump a csv of the election actions\n'
    u += '    rule- or arithmetic-specific options:\n'
    u += '      precision=n: decimal digits of precision (fixed, guarded)\n'
    u += '      guard=n: guard digits (guarded; default to guard=precision)\n'
    u += '      dp=n: display precision (rational)\n'
    u += '      omega=n: meek iteration terminates when surplus < 1/10^omega\n'
    u += '\n'
    u += '  help is available on the following subjects:\n'
    u += '    %s' % ' '.join(helpers)
    helps['usage'] = u

    if not subject:
        return u
    if subject in helps:
        return '\n%s' % helps[subject]
    return 'no help available on %s' % subject
Example #6
0
def usage(subject=None):
    "usage and help"
    
    helps = Election.makehelp()
    helpers = sorted(helps.keys())

    u =  '\n%s v%s\n' % (droop.common.droopName, droop.common.droopVersion)
    u += '\nUsage:\n'
    u += '%s options ballotfile\n' % me
    u += '  options:\n'
    u += '    rule name (%s)\n' % ','.join(droop.electionRuleNames())
    u += '    arithmetic class name (%s)\n' % ','.join(droop.values.arithmeticNames)
    u += '    profile=reps, to profile the count, running reps repetitions\n'
    u += '    dump, to dump a csv of the election actions\n'
    u += '    rule- or arithmetic-specific options:\n'
    u += '      precision=n: decimal digits of precision (fixed, guarded)\n'
    u += '      guard=n: guard digits (guarded; default to guard=precision)\n'
    u += '      dp=n: display precision (rational)\n'
    u += '      omega=n: meek iteration terminates when surplus < 1/10^omega\n'
    u += '\n'
    u += '  help is available on the following subjects:\n'
    u += '    %s' % ' '.join(helpers)
    helps['usage'] = u

    if not subject:
        return u
    if subject in helps:
        return '\n%s' % helps[subject]
    return 'no help available on %s' % subject
Example #7
0
 def testReportHelps(self):
     "helps gives us back a string"
     for name in electionRuleNames():
         Rule = electionRule(name)
         helps = dict()
         Rule.helps(helps, name)
         self.assertTrue(isinstance(helps[name], str), 'expected help string for %s' % name)
Example #8
0
 def testElectionDumpRules(self):
     "run rule-specific counts"
     rulenames = droop.electionRuleNames()
     for rulename in rulenames:
         bltdir = os.path.join(testdir, 'blt', rulename)
         if os.path.isdir(bltdir):
             for blt in [blt for blt in os.listdir(bltdir) if blt.endswith('.blt')]:
                 self.assertTrue(doDumpCompare(dict(rule=rulename), blt, rulename), '%s/%s' % (rulename, blt))
Example #9
0
 def testElectionDumps(self):
     "try several counts & dumps"
     blts = ('42', '42t', '42u', 'M135', '513', 'SC', 'SCw', 'SC-Vm-12')
     rulenames = droop.electionRuleNames()
     for blt in blts:
         for rulename in rulenames:
             self.assertTrue(doDumpCompare(dict(rule=rulename), blt),
                             '%s %s.blt' % (rulename, blt))
Example #10
0
 def testReportHelps(self):
     "helps gives us back a string"
     for name in electionRuleNames():
         Rule = electionRule(name)
         helps = dict()
         Rule.helps(helps, name)
         self.assertTrue(isinstance(helps[name], str),
                         'expected help string for %s' % name)
Example #11
0
 def testElectionDumpRules(self):
     "run rule-specific counts"
     rulenames = droop.electionRuleNames()
     for rulename in rulenames:
         bltdir = os.path.join(testdir, 'blt', rulename)
         if os.path.isdir(bltdir):
             for blt in [
                     blt for blt in os.listdir(bltdir)
                     if blt.endswith('.blt')
             ]:
                 self.assertTrue(
                     doDumpCompare(dict(rule=rulename), blt, rulename),
                     '%s/%s' % (rulename, blt))
Example #12
0
    def testRules(self):
        "basic test of each rule"
        b = '''3 2 4 1 2 0 2 3 0 0 "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''

        profile = ElectionProfile(data=b)
        for rulename in droop.electionRuleNames():
            options = dict(rule=rulename)
            E = Election(profile, options)
            self.assertTrue(E.rule.__class__.__name__ == 'Rule', 'bad rule class')
            self.assertTrue(len(options) >= 1, 'rule should set/leave at least one option')
            self.assertTrue(E.options.getopt('arithmetic') in ('fixed', 'integer', 'guarded', 'rational'),
                'legal arithmetic')
            candidates = E.C
            self.assertTrue("Castor" in [c.name for c in candidates])
            self.assertTrue("Castor" in [str(c) for c in candidates])
            self.assertTrue(1 in [c for c in candidates])
            for c in candidates:
                self.assertEqual(c.order, c.tieOrder)
            E.count()
            self.assertEqual(len(E.elected), E.nSeats)
Example #13
0
    def testReports(self):
        "look at election outputs"
        b = '''3 2 4 1 2 0 2 3 0 0 "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''

        profile = ElectionProfile(data=b)
        rulename = droop.electionRuleNames()[0]   # pick the first rule arbitrarily
        E = Election(profile, dict(rule=rulename))
        E.count()
        self.assertEqual(E.report().find('interrupted'), -1)
        self.assertTrue(E.report(intr=True).find('interrupted') > 0)
        E = Election(profile, dict(rule=rulename))
        E.count()
        self.assertEqual(E.dump().find('interrupted'), -1)
        self.assertTrue(E.dump(intr=True).find('interrupted') > 0)
        E = Election(profile, dict(rule=rulename))
        E.count()
        self.assertEqual(E.json().find('interrupted'), -1)
        self.assertTrue(E.json(intr=True).find('interrupted') > 0)
        r = E.record()
        self.assertTrue(r, dict)
        self.assertEqual(r['actions'][-1]['tag'], 'log')
Example #14
0
    def testReports(self):
        "look at election outputs"
        b = '''3 2 4 1 2 0 2 3 0 0 "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''

        profile = ElectionProfile(data=b)
        rulename = droop.electionRuleNames()[
            0]  # pick the first rule arbitrarily
        E = Election(profile, dict(rule=rulename))
        E.count()
        self.assertEqual(E.report().find('interrupted'), -1)
        self.assertTrue(E.report(intr=True).find('interrupted') > 0)
        E = Election(profile, dict(rule=rulename))
        E.count()
        self.assertEqual(E.dump().find('interrupted'), -1)
        self.assertTrue(E.dump(intr=True).find('interrupted') > 0)
        E = Election(profile, dict(rule=rulename))
        E.count()
        self.assertEqual(E.json().find('interrupted'), -1)
        self.assertTrue(E.json(intr=True).find('interrupted') > 0)
        r = E.record()
        self.assertTrue(r, dict)
        self.assertEqual(r['actions'][-1]['tag'], 'log')
Example #15
0
    def testRules(self):
        "basic test of each rule"
        b = '''3 2 4 1 2 0 2 3 0 0 "Castor" "Pollux" "Helen" "Pollux and Helen should tie"'''

        profile = ElectionProfile(data=b)
        for rulename in droop.electionRuleNames():
            options = dict(rule=rulename)
            E = Election(profile, options)
            self.assertTrue(E.rule.__class__.__name__ == 'Rule',
                            'bad rule class')
            self.assertTrue(
                len(options) >= 1, 'rule should set/leave at least one option')
            self.assertTrue(
                E.options.getopt('arithmetic')
                in ('fixed', 'integer', 'guarded', 'rational'),
                'legal arithmetic')
            candidates = E.C
            self.assertTrue("Castor" in [c.name for c in candidates])
            self.assertTrue("Castor" in [str(c) for c in candidates])
            self.assertTrue(1 in [c for c in candidates])
            for c in candidates:
                self.assertEqual(c.order, c.tieOrder)
            E.count()
            self.assertEqual(len(E.elected), E.nSeats)
Example #16
0
 def testElectionNames(self):
     "valid name"
     self.assertTrue('cfer' in electionRuleNames())
     self.assertTrue('cfer-batch' in electionRuleNames())
Example #17
0
 def testRuleNames(self):
     "check the list of rule names"
     self.assertTrue(len(electionRuleNames()) >= 1, 'at least one rule name')
Example #18
0
 def testElectionNames(self):
     'meek-prf is a valid name'
     self.assertTrue('meek-prf' in electionRuleNames())
Example #19
0
 def testRuleNameMpls(self):
     "check the list of names for mpls"
     self.assertTrue('mpls' in electionRuleNames(),
                     'one of the rule names is mpls')
Example #20
0
 def testElectionNames(self):
     "meek & warren are valid names"
     self.assertTrue('meek' in electionRuleNames())
     self.assertTrue('warren' in electionRuleNames())
Example #21
0
 def testRuleName(self):
     "check the list of names for qpq"
     self.assertTrue('qpq' in electionRuleNames(),
                     'one of the rule names is qpq')
Example #22
0
 def testElectionNames(self):
     "wigm-prf is valid name"
     self.assertTrue('wigm-prf' in electionRuleNames())
Example #23
0
 def testRuleNames(self):
     "check the list of rule names"
     self.assertTrue(
         len(electionRuleNames()) >= 1, 'at least one rule name')
Example #24
0
 def testRuleNameMpls(self):
     "check the list of names for mpls"
     self.assertTrue('mpls' in electionRuleNames(), 'one of the rule names is mpls')
Example #25
0
 def testElectionNames(self):
     "meek & warren are valid names"
     self.assertTrue('meek' in electionRuleNames())
     self.assertTrue('warren' in electionRuleNames())
Example #26
0
 def testRuleName(self):
     "check the list of names for qpq"
     self.assertTrue('qpq' in electionRuleNames(), 'one of the rule names is qpq')
Example #27
0
 def testElectionNames(self):
     "wigm is a valid name"
     self.assertTrue('wigm' in electionRuleNames())
Example #28
0
 def testRuleName(self):
     "check the list of names for scotland"
     self.assertTrue('scotland' in electionRuleNames(),
                     'one of the rule names is scotland')
Example #29
0
 def testElectionNames(self):
     'meek-prf is a valid name'
     self.assertTrue('meek-prf' in electionRuleNames())
Example #30
0
 def testElectionNames(self):
     "wigm is a valid name"
     self.assertTrue("wigm" in electionRuleNames())
Example #31
0
 def testRuleName(self):
     "check the list of names for scotland"
     self.assertTrue('scotland' in electionRuleNames(), 'one of the rule names is scotland')
Example #32
0
 def testMethod(self):
     "method is meek or wigm or qpq for each rule"
     for name in electionRuleNames():
         Rule = electionRule(name)
         method = Rule.method
         self.assertTrue(method in ('meek', 'wigm', 'qpq'), 'bad method "%s"' % method)