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))
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())
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)
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
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
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)
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))
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))
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)
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')
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')
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)
def testElectionNames(self): "valid name" self.assertTrue('cfer' in electionRuleNames()) self.assertTrue('cfer-batch' in electionRuleNames())
def testRuleNames(self): "check the list of rule names" self.assertTrue(len(electionRuleNames()) >= 1, 'at least one rule name')
def testElectionNames(self): 'meek-prf is a valid name' self.assertTrue('meek-prf' in electionRuleNames())
def testRuleNameMpls(self): "check the list of names for mpls" self.assertTrue('mpls' in electionRuleNames(), 'one of the rule names is mpls')
def testElectionNames(self): "meek & warren are valid names" self.assertTrue('meek' in electionRuleNames()) self.assertTrue('warren' in electionRuleNames())
def testRuleName(self): "check the list of names for qpq" self.assertTrue('qpq' in electionRuleNames(), 'one of the rule names is qpq')
def testElectionNames(self): "wigm-prf is valid name" self.assertTrue('wigm-prf' in electionRuleNames())
def testRuleNames(self): "check the list of rule names" self.assertTrue( len(electionRuleNames()) >= 1, 'at least one rule name')
def testElectionNames(self): "wigm is a valid name" self.assertTrue('wigm' in electionRuleNames())
def testRuleName(self): "check the list of names for scotland" self.assertTrue('scotland' in electionRuleNames(), 'one of the rule names is scotland')
def testElectionNames(self): "wigm is a valid name" self.assertTrue("wigm" in electionRuleNames())