示例#1
0
    def test_partial(self):
        yield self.resetTables()
        
        task = two.task.Task(self.app, None, 1, 2, twcommon.misc.now())
        task.set_writable()
        ctx = EvalPropContext(task, loctx=self.loctx, level=LEVEL_EXECUTE)

        res = yield ctx.eval('functools.partial(int)()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 0)
        res = yield ctx.eval('functools.partial(int, "10")()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 10)
        res = yield ctx.eval('functools.partial(int)("11")', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 11)
        res = yield ctx.eval('functools.partial(int, "10", 4)()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 4)
        res = yield ctx.eval('functools.partial(int)("11", 4)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 5)
        res = yield ctx.eval('functools.partial(int, "12")(4)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 6)
        res = yield ctx.eval('functools.partial(int, "10", base=5)()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 5)
        res = yield ctx.eval('functools.partial(int)("11", base=5)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 6)
        res = yield ctx.eval('functools.partial(int, "12")(base=5)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 7)
        
        res = yield ctx.eval('propint = code("int(x, base=base)", args="x, base=None")', evaltype=EVALTYPE_CODE)
        res = yield ctx.eval('functools.partial(propint, "10", base=6)()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 6)
        res = yield ctx.eval('functools.partial(propint)("11", base=6)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 7)
        res = yield ctx.eval('functools.partial(propint, "12")(base=6)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 8)

        res = yield ctx.eval('functools.partial(ObjectId, "528d3862689e9d17a7a96473")()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, ObjectId('528d3862689e9d17a7a96473'))
        res = yield ctx.eval('functools.partial(ObjectId)("528d3862689e9d17a7a96474")', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, ObjectId('528d3862689e9d17a7a96474'))
        
        res = yield ctx.eval('functools.partial(location)()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, self.exlocid)
        res = yield ctx.eval('functools.partial(location)(None)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, self.exlocid)

        with self.assertRaises(TypeError):
            res = yield ctx.eval('functools.partial(foo)()', locals={'foo':open}, evaltype=EVALTYPE_CODE)
示例#2
0
    def test_assignments(self):
        yield self.resetTables()
        
        task = two.task.Task(self.app, None, 1, 2, twcommon.misc.now())
        task.set_writable()
        ctx = EvalPropContext(task, loctx=self.loctx, level=LEVEL_EXECUTE)
        
        res = yield ctx.eval('z = 7\nz', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 7)
        res = yield ctx.eval('x1,x2 = 1,2\n[x2,x1]', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, [2,1])
        res = yield ctx.eval('ls[1] = 7\nls', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, [1,7,3])
        res = yield ctx.eval('ls[0:2] = [6,5,4]\nls', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, [6,5,4,3])
        res = yield ctx.eval('map["one"] = "ONE"\nmap', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, {'one':'ONE', 'two':2, 'three':3})
        res = yield ctx.eval('z1=z2=_z3=9\nz1,z2,_z3', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, (9,9,9))
        
        res = yield ctx.eval('ls[:] = (8,7,6,5)\nls', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, [8,7,6,5])
        res = yield ctx.eval('ls[-2:] = (9,10)\nls', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, [8,7,9,10])

        res = yield ctx.eval('z = [None,True,2,3.5,"x",[],{},datetime.now,ObjectId("5251ff29689e9dc10a0a7018")]\nz', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, [None,True,2,3.5,"x",[],{},task.starttime,ObjectId("5251ff29689e9dc10a0a7018")])
        res = yield ctx.eval('z = {"x":2,"y":{},"z":[],"w":datetime.now}\nz', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, {"x":2,"y":{},"z":[],"w":task.starttime})
        res = yield ctx.eval('z = (1,"z",True)\nz', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, (1,"z",True))
        
        with self.assertRaises(TypeError):
            yield ctx.eval('notvalid = set()', evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            yield ctx.eval('notvalid = {"$x":123}', evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            yield ctx.eval('notvalid = {"x.y":123}', evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            yield ctx.eval('notvalid = {"x":set()}', evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            yield ctx.eval('notvalid = [player]', evaltype=EVALTYPE_CODE)
示例#3
0
    def test_callables(self):
        yield self.resetTables()
        
        task = two.task.Task(self.app, None, 1, 2, twcommon.misc.now())
        task.set_writable()
        ctx = EvalPropContext(task, loctx=self.loctx, level=LEVEL_EXECUTE)

        @tornado.gen.coroutine
        def deffunc(key, code, args=None):
            prop = { 'type':'code', 'text':code }
            if args is not None:
                prop['args'] = args
            res = yield ctx.eval('%s = %s' % (key, repr(prop)),
                                 evaltype=EVALTYPE_CODE)

        yield deffunc('func', 'return 3')
        res = yield ctx.eval('func()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 3)
        res = yield ctx.eval('func', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 3)
        res = yield ctx.eval('[func]', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, [{'type':'code', 'text':'return 3'}])
        with self.assertRaises(TypeError):
            res = yield ctx.eval('func+1', evaltype=EVALTYPE_CODE)
        
        yield deffunc('func', '4')
        res = yield ctx.eval('func()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 4)
        
        yield deffunc('func2', 'func')
        res = yield ctx.eval('func2()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 4)
        
        yield deffunc('func', 'return 5\nreturn 6')
        res = yield ctx.eval('func()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 5)
        res = yield ctx.eval('func2()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 5)
        
        yield deffunc('func', 'if 3>2:\n  return 6\nreturn 7')
        res = yield ctx.eval('func()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 6)
        
        yield deffunc('func', 'if 3<2:\n  return 6\nreturn 7')
        res = yield ctx.eval('func2()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 7)
        
        yield deffunc('func', 'nosuch')
        with self.assertRaises(twcommon.excepts.SymbolError):
            res = yield ctx.eval('func()', evaltype=EVALTYPE_CODE)
        with self.assertRaises(twcommon.excepts.SymbolError):
            res = yield ctx.eval('func2()', evaltype=EVALTYPE_CODE)
            
        yield deffunc('func', 'q+1', 'q')
        res = yield ctx.eval('func(4)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 5)
        res = yield ctx.eval('func(q=5)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 6)
        with self.assertRaises(TypeError):
            res = yield ctx.eval('func()', evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            res = yield ctx.eval('func(qq=1)', evaltype=EVALTYPE_CODE)
        
        yield deffunc('func', 'q+2', 'q=1')
        res = yield ctx.eval('func(4)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 6)
        res = yield ctx.eval('func()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 3)
        
        yield deffunc('func', 'w+q', 'w, q=1')
        res = yield ctx.eval('func(4)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 5)
        res = yield ctx.eval('func(4,3)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 7)
        res = yield ctx.eval('func(q=2,w=3)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 5)
        with self.assertRaises(TypeError):
            res = yield ctx.eval('func(q=1)', evaltype=EVALTYPE_CODE)
        res = yield ctx.eval('func(*[4,5])', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 9)
        res = yield ctx.eval('func(*[6], **{"q":7})', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, 13)

        yield deffunc('func', '(ls, map)', '*ls, **map')
        res = yield ctx.eval('func()', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, ((), {}))
        res = yield ctx.eval('func(1,2)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, ((1,2), {}))
        res = yield ctx.eval('func(q=3)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, ((), {'q':3}))
        res = yield ctx.eval('func(2,q=3)', evaltype=EVALTYPE_CODE)
        self.assertEqual(res, ((2,), {'q':3}))
        
        with self.assertRaises(TypeError):
            res = yield ctx.eval('_x=1\n_x()', evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            res = yield ctx.eval('_()', evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            res = yield ctx.eval('player()', evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            res = yield ctx.eval('foo()', locals={'foo':object()}, evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            res = yield ctx.eval('foo()', locals={'foo':object}, evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            res = yield ctx.eval('foo("bar")', locals={'foo':open}, evaltype=EVALTYPE_CODE)
        with self.assertRaises(TypeError):
            res = yield ctx.eval('foo()', locals={'foo':input}, evaltype=EVALTYPE_CODE)
        res = yield ctx.eval('foo()', locals={'foo':str}, evaltype=EVALTYPE_CODE)
        self.assertEqual(res, '')