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