forked from doloopwhile/PyExecJS
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_execjs.py
executable file
·143 lines (117 loc) · 5.31 KB
/
test_execjs.py
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
#!/usr/bin/env python3
# -*- coding: ascii -*-
from __future__ import unicode_literals
import sys
import os
import doctest
import execjs
import execjs.external_runtime
import execjs.pyv8runtime
import execjs.unavailable_runtime
import execjs._json2
import execjs._misc
import execjs._runner_sources
import execjs._runtimes
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 execjs.available_runtimes().items():
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 load_tests(loader, tests, ignore):
tests.addTests(doctest.DocTestSuite(execjs))
return tests
if __name__ == "__main__":
unittest.main()