/
error_spec.rb
144 lines (125 loc) · 3.95 KB
/
error_spec.rb
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
require File.expand_path('../spec_helper', File.dirname(__FILE__))
describe Rhino::JSError do
it "works as a StandardError with a message being passed" do
js_error = Rhino::JSError.new 'an error message'
lambda { js_error.to_s && js_error.inspect }.should_not raise_error
js_error.cause.should be nil
js_error.message.should == 'an error message'
js_error.javascript_backtrace.should be nil
end
it "might wrap a RhinoException wrapped in a NativeException like error" do
# JRuby's NativeException.new(rhino_e) does not work as it is
# intended to handle Java exceptions ... no new on the Ruby side
native_error_class = Class.new(RuntimeError) do
def initialize(cause)
@cause = cause
end
def cause
@cause
end
end
rhino_e = Rhino::JS::JavaScriptException.new("42".to_java)
js_error = Rhino::JSError.new native_error_class.new(rhino_e)
lambda { js_error.to_s && js_error.inspect }.should_not raise_error
js_error.cause.should be rhino_e
js_error.message.should == '42'
js_error.javascript_backtrace.should_not be nil
end
it "keeps the thrown javascript object value" do
begin
Rhino::Context.eval "throw { foo: 'bar' }"
rescue => e
e.should be_a(Rhino::JSError)
e.value.should be_a(Rhino::JS::NativeObject)
e.value['foo'].should == 'bar'
e.message.should == e.value.to_s
else
fail "expected to rescue"
end
end
it "keeps the thrown javascript string value" do
begin
Rhino::Context.eval "throw 'mehehehe'"
rescue => e
e.should be_a(Rhino::JSError)
e.value.should == 'mehehehe'
e.message.should == e.value.to_s
else
fail "expected to rescue"
end
end
it "contains the native error as the cause" do
begin
Rhino::Context.eval "throw 42"
rescue => e
e.cause.should_not be nil
e.cause.should be_a Java::OrgMozillaJavascript::JavaScriptException
e.cause.getValue.should == 42
e.cause.lineNumber.should == 1
e.cause.sourceName.should == '<eval>'
else
fail "expected to rescue"
end
end
it "has a correct javascript backtrace" do
begin
Rhino::Context.eval "throw 42"
rescue => e
e.javascript_backtrace.should be_a Enumerable
e.javascript_backtrace.size.should == 1
e.javascript_backtrace[0].should == "at <eval>:1"
e.javascript_backtrace(true).should be_a Enumerable
e.javascript_backtrace(true).size.should == 1
element = e.javascript_backtrace(true)[0]
element.file_name.should == '<eval>'
element.function_name.should be nil
element.line_number.should == 1
else
fail "expected to rescue"
end
end
it "contains function name in javascript backtrace" do
begin
Rhino::Context.eval "function fortyTwo() { throw 42 }\n fortyTwo()"
rescue => e
e.javascript_backtrace.size.should == 2
e.javascript_backtrace[0].should == "at <eval>:1 (fortyTwo)"
e.javascript_backtrace[1].should == "at <eval>:2"
else
fail "expected to rescue"
end
end
it "backtrace starts with the javascript part" do
begin
Rhino::Context.eval "throw 42"
rescue => e
e.backtrace.should be_a Array
e.backtrace[0].should == "at <eval>:1"
e.backtrace[1].should_not be nil
else
fail "expected to rescue"
end
end
it "inspect shows the javascript value" do
begin
Rhino::Context.eval "throw '42'"
rescue => e
e.inspect.should == '#<Rhino::JSError: 42>'
e.to_s.should == '42'
else
fail "expected to rescue"
end
end
it "raises correct error from function#apply" do
begin
context = Rhino::Context.new
context.eval "function foo() { throw 'bar' }"
context['foo'].apply(nil)
rescue => e
e.should be_a Rhino::JSError
e.value.should == 'bar'
else
fail "expected to rescue"
end
end
end