forked from doloopwhile/PyExecJS
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_execjs.py
More file actions
executable file
·144 lines (116 loc) · 5.32 KB
/
test_execjs.py
File metadata and controls
executable file
·144 lines (116 loc) · 5.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/usr/bin/env python3
# -*- coding: ascii -*-
import sys
import os
import doctest
import six
import execjs
if sys.version_info < (2, 7):
import unittest2 as unittest
else:
import unittest
class RuntimeTestBase:
def test_context_call(self):
context = self.runtime.compile("id = function(v) { return v; }")
self.assertEqual("bar", context.call("id", "bar"))
def test_nested_context_call(self):
context = self.runtime.compile("a = {}; a.b = {}; a.b.id = function(v) { return v; }")
self.assertEqual("bar", context.call("a.b.id", "bar"))
def test_context_call_missing_function(self):
context = self.runtime.compile("")
with self.assertRaises(execjs.ProgramError):
context.call("missing")
def test_exec(self):
self.assertIsNone(self.runtime.exec_("1"))
self.assertIsNone(self.runtime.exec_("return"))
self.assertIsNone(self.runtime.exec_("return null"))
self.assertIsNone(self.runtime.exec_("return function() {}"))
self.assertIs(0, self.runtime.exec_("return 0"))
self.assertIs(True, self.runtime.exec_("return true"))
self.assertEqual("hello", self.runtime.exec_("return 'hello'"))
self.assertEqual([1, 2], self.runtime.exec_("return [1, 2]"))
self.assertEqual({"a": 1, "b": 2}, self.runtime.exec_("return {a:1,b:2}"))
self.assertEqual("\u3042", self.runtime.exec_('return "\u3042"')) # unicode char
self.assertEqual("\u3042", self.runtime.exec_(r'return "\u3042"')) # unicode char by escape sequence
self.assertEqual("\\", self.runtime.exec_('return "\\\\"'))
def test_eval(self):
self.assertIsNone(self.runtime.eval(""))
self.assertIsNone(self.runtime.eval(" "))
self.assertIsNone(self.runtime.eval("null"))
self.assertIsNone(self.runtime.eval("function(){}"))
self.assertIs(0, self.runtime.eval("0"))
self.assertIs(True, self.runtime.eval("true"))
self.assertEqual([1, 2], self.runtime.eval("[1, 2]"))
self.assertEqual([1, None], self.runtime.eval("[1, function() {}]"))
self.assertEqual("hello", self.runtime.eval("'hello'"))
self.assertEqual(["red", "yellow", "blue"], self.runtime.eval("'red yellow blue'.split(' ')"))
self.assertEqual({"a": 1, "b": 2}, self.runtime.eval("{a:1, b:2}"))
self.assertEqual({"a": True}, self.runtime.eval("{a:true,b:function (){}}"))
self.assertEqual("\u3042", self.runtime.eval('"\u3042"'))
self.assertEqual("\u3042", self.runtime.eval(r'"\u3042"'))
self.assertEqual(r"\\", self.runtime.eval(r'"\\\\"'))
def test_compile(self):
context = self.runtime.compile("foo = function() { return \"bar\"; }")
self.assertEqual("bar", context.exec_("return foo()"))
self.assertEqual("bar", context.eval("foo()"))
self.assertEqual("bar", context.call("foo"))
def test_this_is_global_scope(self):
self.assertIs(True, self.runtime.eval("this === (function() {return this})()"))
self.assertIs(True, self.runtime.exec_("return this === (function() {return this})()"))
def test_compile_large_scripts(self):
body = "var foo = 'bar';\n" * (10 ** 4)
code = "function foo() {\n" + body + "\n};\nreturn true"
self.assertTrue(self.runtime.exec_(code))
def test_syntax_error(self):
with self.assertRaises(execjs.RuntimeError):
self.runtime.exec_(")")
def test_thrown_exception(self):
with self.assertRaises(execjs.ProgramError):
self.runtime.exec_("throw 'hello'")
def test_broken_substitutions(self):
s = '#{source}#{encoded_source}#{json2_source}'
self.assertEqual(s, self.runtime.eval('"' + s + '"'))
class DefaultRuntimeTest(unittest.TestCase, RuntimeTestBase):
def setUp(self):
self.runtime = execjs
for name, runtime in list(execjs.runtimes().items()):
if not runtime.is_available():
continue
class_name = name.capitalize() + "RuntimeTest"
def f(runtime=runtime):
class RuntimeTest(unittest.TestCase, RuntimeTestBase):
def setUp(self):
self.runtime = runtime
RuntimeTest.__name__ = str(class_name) # 2.x compatibility
return RuntimeTest
exec("{class_name} = f()".format(class_name=class_name))
class CommonTest(unittest.TestCase):
def test_empty_path_environ(self):
"""
Some version of passenger-nginx set PATH empty.
"""
orig_path = os.environ['PATH']
try:
del os.environ['PATH']
ctx = execjs.compile("""
function add(x, y) {
return x + y;
}
""")
ctx.call("add", 1, 2)
finally:
os.environ['PATH'] = orig_path
def test_runtime_availability(self):
r = execjs.ExternalRuntime("fail", ["nonexistent"], "")
self.assertFalse(r.is_available())
r = execjs.ExternalRuntime("success", ["python"], "")
self.assertTrue(r.is_available())
def test_attributes_export(self):
for name in execjs.__all__:
self.assertTrue(hasattr(execjs, name), "{} is not defined".format(name))
def load_tests(loader, tests, ignore):
if six.PY3:
tests.addTests(doctest.DocTestSuite(execjs))
return tests
if __name__ == "__main__":
unittest.main()