def test_list_modified_incorrect(self): func = self.lua.eval(""" function (arr) arr["foo"] = "bar" return arr end """) arr = python2lua(self.lua, [3, 4]) arr2 = func(arr) with pytest.raises(ValueError): lua2python(self.lua, arr2)
def __call__(self, *args): args = lua2python(self.lua, args) args_text = json.dumps(args, ensure_ascii=False, encoding="utf8")[1:-1] func_text = json.dumps([self.source], ensure_ascii=False, encoding='utf8')[1:-1] wrapper_script = """ (function(func_text){ try{ var func = eval("(" + func_text + ")"); return { result: func(%(args)s), error: false, } } catch(e){ return { error: true, error_repr: e.toString(), } } })(%(func_text)s) """ % {"func_text": func_text, "args": args_text} # print(wrapper_script) res = self.tab.runjs(wrapper_script) if not isinstance(res, dict): raise ScriptError("[lua] unknown error during JS function call: %r; %r" % (res, wrapper_script)) if res["error"]: raise ScriptError("[lua] error during JS function call: %r" % (res.get("error_repr", "<unknown error>"),)) return res.get("result")
def test_list_like_tables(self): # List-like tables are still returned as dicts; # only tables which were lists originally are lists. tbl = self.lua.eval("{5, 6}") self.assertEqual( lua2python(self.lua, tbl), {1: 5, 2: 6} )
def test_sparse_list(self): func1 = self.lua.eval(""" function (arr) arr[5] = "foo" return arr end """) func2 = self.lua.eval(""" function (arr) arr[100000] = "foo" return arr end """) arr = python2lua(self.lua, [1, 2]) arr1 = lua2python(self.lua, func1(arr)) self.assertEqual(arr1, [1, 2, None, None, "foo"]) with pytest.raises(ValueError): arr2 = lua2python(self.lua, func2(arr))
def test_list_modified_correct(self): func = self.lua.eval(""" function (arr) table.insert(arr, "bar") return arr end """) arr = python2lua(self.lua, [3, 4]) arr2 = func(arr) self.assertEqual(lua2python(self.lua, arr2), [3, 4, "bar"])
def test_lua_table_in_python_container(self): dct = { "foo": "foo", "bar": self.lua.table_from({"egg": "spam"}), "baz": [self.lua.table_from({"foo": "bar"})], } value = lua2python(self.lua, dct) self.assertEqual(value, { "foo": "foo", "bar": {"egg": "spam"}, "baz": [{"foo": "bar"}], })
def assertSurvivesConversion(self, obj, encoding='utf8'): lua_obj = python2lua(self.lua, obj, encoding=encoding) py_obj = lua2python(self.lua, lua_obj, encoding=encoding) self.assertEqual(obj, py_obj) self.assertEqual(obj.__class__, py_obj.__class__)
def lua2python(self, *args, **kwargs): kwargs.setdefault("binary", True) kwargs.setdefault("strict", True) return lua2python(self._lua, *args, **kwargs)
def lua2python(self, obj, **kwargs): kwargs.setdefault("binary", True) kwargs.setdefault("strict", True) return lua2python(self.lua, obj, **kwargs)
def assertSurvivesConversion(self, obj): lua_obj = python2lua(self.lua, obj) py_obj = lua2python(self.lua, lua_obj) self.assertEqual(obj, py_obj)
def lua2python(self, *args, **kwargs): kwargs.setdefault("encoding", 'utf8') kwargs.setdefault("strict", True) return lua2python(self._lua, *args, **kwargs)
def lua2python(self, obj): return lua2python(self.lua, obj, binary=True, strict=True)