Mercurial > openrpg
changeset 518:4a9b26a1cd4b
small parser fix that was found out by the unit tests
unit test fix since the new parser resurns diffrent results then the old one
author | digitalxero |
---|---|
date | Mon, 15 Mar 2010 18:54:09 -0600 |
parents | 23cd3f41252c |
children | e80ca31361e7 |
files | orpg/dieroller/_base.py orpg/tests/test_client.py orpg/tests/test_dieroller.py |
diffstat | 3 files changed, 36 insertions(+), 38 deletions(-) [+] |
line wrap: on
line diff
--- a/orpg/dieroller/_base.py Mon Mar 15 18:22:41 2010 -0600 +++ b/orpg/dieroller/_base.py Mon Mar 15 18:54:09 2010 -0600 @@ -2,7 +2,6 @@ import random import traceback import re -import time from collections import deque, namedtuple from orpg.external.pyparsing import (Word, alphas, Literal, CaselessLiteral, @@ -209,15 +208,11 @@ return self._rollers.keys() def process_roll(self, roll_string): - try: - st = time.time() - if isinstance(self._roller, BaseRoller): - return self._roller(roll_string) - else: - #Ok we are using an OLD roller, so have fun with eval and shit - return self.proccessRoll(roll_string) - finally: - print (time.time()-st) + if isinstance(self._roller, BaseRoller): + return self._roller(roll_string) + else: + #Ok we are using an OLD roller, so have fun with eval and shit + return self.proccessRoll(roll_string) def _get_roller(self): return self._roller.name @@ -402,7 +397,7 @@ def _set_die(self, value): if not isinstance(value, int): try: - value = int(value) + value = int(eval(value)) except ValueError: raise TypeError("die must be an int") self._die = value @@ -413,7 +408,7 @@ def _set_sides(self, value): if not isinstance(value, int): try: - value = int(value) + value = int(eval(value)) except ValueError: raise TypeError("die must be an int") self._sides = value @@ -455,13 +450,7 @@ multop = mult | div expop = Literal( "^" ) - die_expr = Combine(ZeroOrMore(CaselessLiteral("q").\ - setParseAction(roller._set_quiet).\ - suppress()) + number +\ - CaselessLiteral("d") +\ - (CaselessLiteral("f").\ - setParseAction(roller.fudge_roll) | number)).\ - setParseAction(roller.roll) + die_expr = Forward() func_name = Word(alphas, alphanums + '_').setResultsName("name") func_arg = ZeroOrMore(Word(alphanums, nums)) @@ -477,6 +466,16 @@ roll_expr = Forward() + die_expr << Combine(ZeroOrMore(CaselessLiteral("q").\ + setParseAction(roller._set_quiet).\ + suppress()) +\ + ((lpar + roll_expr + rpar) | number)+\ + CaselessLiteral("d") +\ + (CaselessLiteral("f").\ + setParseAction(roller.fudge_roll) |\ + ((lpar + roll_expr + rpar) | number))).\ + setParseAction(roller.roll) + atom = ( OneOrMore(die_expr + ZeroOrMore(func_expr)) | (floatnumber | integer).setParseAction(roller._push) |
--- a/orpg/tests/test_client.py Mon Mar 15 18:22:41 2010 -0600 +++ b/orpg/tests/test_client.py Mon Mar 15 18:54:09 2010 -0600 @@ -23,9 +23,6 @@ def test_ping_timer_exists(client): assert hasattr(client, 'ping_timer') -def test_DiceManager_exists(client): - assert hasattr(client, 'DiceManager') - def test_password_manager_exists(client): assert hasattr(client, 'password_manager')
--- a/orpg/tests/test_dieroller.py Mon Mar 15 18:22:41 2010 -0600 +++ b/orpg/tests/test_dieroller.py Mon Mar 15 18:54:09 2010 -0600 @@ -13,29 +13,31 @@ class TestDiceRolls: params = { 'test_roll': [ - [dict(roll='[1d20]', min_roll=1, max_roll=20) for x in xrange(100)], - [dict(roll='[1d20.minroll(5)]', min_roll=5, + [dict(roll='1d20', min_roll=1, max_roll=20) for x in xrange(100)], + [dict(roll='1d20.minroll(5)', min_roll=5, max_roll=20) for x in xrange(100)], - [dict(roll='[4d6.each(5)]', min_roll=1, max_roll=6, - num_results=4, extra=5) for x in xrange(100)], - [dict(roll='[4d6.takeHighest(3)]', min_roll=1, num_results=3, + [dict(roll='4d6.each(5)', min_roll=1, max_roll=6, + num_results=8, extra=5) for x in xrange(100)], + [dict(roll='4d6.takeHighest(3)', min_roll=1, num_results=3, max_roll=6) for x in xrange(100)], - [dict(roll='[(1+2+1)d6.takeHighest(3)]', min_roll=1, num_results=3, + [dict(roll='(1+2+1)d6.takeHighest(3)', min_roll=1, num_results=3, max_roll=6) for x in xrange(100)], - [dict(roll='[4d6.takeHighest(3).minroll(3)]', min_roll=3, + [dict(roll='4d6.takeHighest(3).minroll(3)', min_roll=3, num_results=3, max_roll=6) for x in xrange(100)]], } def test_roll(self, roll, min_roll, max_roll, num_results=1, extra=None): - from orpg.dieroller.utils import roller_manager - mgr = roller_manager() - results = eval(mgr.proccessRoll(roll)) + from orpg.dieroller import roller_manager + r = roller_manager.process_roll(roll) + r = r.split('-->') + print r + r = r[1].split('=') + print r + r = r[1][1:].strip() + print r + results = eval(r) assert isinstance(results, list) - assert len(results[0]) == num_results + assert len(results) == num_results for r in results: - if extra is not None: - assert r[0][0] >= min_roll and r[0][0] <= max_roll - assert r[0][1] == extra - else: - assert r[0] >= min_roll and r[0] <= max_roll \ No newline at end of file + assert r >= min_roll and r <= max_roll \ No newline at end of file