This repository has been archived by the owner on Jan 1, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 113
/
Copy pathtest_execjs.py
executable file
·141 lines (115 loc) · 5.25 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
#!/usr/bin/env python3
# -*- coding: ascii -*-
from __future__ import unicode_literals
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.Error):
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.Error):
self.runtime.exec_(")")
def test_thrown_exception(self):
with self.assertRaises(execjs.Error):
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
class NodeRuntimeTest(unittest.TestCase, RuntimeTestBase):
def setUp(self):
self.runtime = execjs.get('Node')
class NashornRuntimeTest(unittest.TestCase, RuntimeTestBase):
def setUp(self):
self.runtime = execjs.get('Nashorn')
class PhantomJSRuntimeTest(unittest.TestCase, RuntimeTestBase):
def setUp(self):
self.runtime = execjs.get('PhantomJS')
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()