Skip to content

Commit 8c32f51

Browse files
Add tests for error recovery scenarios
1 parent 865f44f commit 8c32f51

1 file changed

Lines changed: 215 additions & 0 deletions

File tree

Lines changed: 215 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,215 @@
1+
# frozen_string_literal: true
2+
3+
require_relative "../test_helper"
4+
5+
module Prism
6+
class ErrorRecoveryTest < TestCase
7+
def test_alias_global_variable_node_old_name_symbol
8+
result = Prism.parse("alias $a b")
9+
refute result.success?
10+
11+
node = result.value.statements.body.first
12+
assert_kind_of SymbolNode, node.old_name
13+
end
14+
15+
def test_alias_global_variable_node_old_name_missing
16+
result = Prism.parse("alias $a 42")
17+
refute result.success?
18+
19+
node = result.value.statements.body.first
20+
assert_kind_of MissingNode, node.old_name
21+
end
22+
23+
def test_alias_method_node_old_name_global_variable
24+
result = Prism.parse("alias a $b")
25+
refute result.success?
26+
27+
node = result.value.statements.body.first
28+
assert_kind_of GlobalVariableReadNode, node.old_name
29+
end
30+
31+
def test_alias_method_node_old_name_missing
32+
result = Prism.parse("alias a 42")
33+
refute result.success?
34+
35+
node = result.value.statements.body.first
36+
assert_kind_of MissingNode, node.old_name
37+
end
38+
39+
def test_class_node_constant_path_call
40+
result = Prism.parse("class 0.X; end")
41+
refute result.success?
42+
43+
node = result.value.statements.body.first
44+
assert_kind_of CallNode, node.constant_path
45+
end
46+
47+
def test_for_node_index_back_reference
48+
result = Prism.parse("for $& in a; end")
49+
refute result.success?
50+
51+
node = result.value.statements.body.first
52+
assert_kind_of BackReferenceReadNode, node.index
53+
end
54+
55+
def test_for_node_index_numbered_reference
56+
result = Prism.parse("for $1 in a; end")
57+
refute result.success?
58+
59+
node = result.value.statements.body.first
60+
assert_kind_of NumberedReferenceReadNode, node.index
61+
end
62+
63+
def test_for_node_index_missing
64+
result = Prism.parse("for in 1..10; end")
65+
refute result.success?
66+
67+
node = result.value.statements.body.first
68+
assert_kind_of MissingNode, node.index
69+
end
70+
71+
def test_interpolated_string_node_parts_xstring
72+
result = Prism.parse("<<~`FOO` \"bar\"\nls\nFOO\n")
73+
refute result.success?
74+
75+
node = result.value.statements.body.first
76+
assert node.parts.any? { |part| part.is_a?(XStringNode) }
77+
end
78+
79+
def test_interpolated_string_node_parts_interpolated_xstring
80+
result = Prism.parse("<<~`FOO` \"bar\"\n\#{ls}\nFOO\n")
81+
refute result.success?
82+
83+
node = result.value.statements.body.first
84+
assert node.parts.any? { |part| part.is_a?(InterpolatedXStringNode) }
85+
end
86+
87+
def test_module_node_constant_path_missing
88+
result = Prism.parse("module Parent module end")
89+
refute result.success?
90+
91+
node = result.value.statements.body.first.body.body.first
92+
assert_kind_of MissingNode, node.constant_path
93+
end
94+
95+
def test_multi_target_node_lefts_back_reference
96+
result = Prism.parse("a, (b, $&) = z")
97+
refute result.success?
98+
99+
node = result.value.statements.body.first.lefts.last
100+
assert node.lefts.any? { |left| left.is_a?(BackReferenceReadNode) }
101+
end
102+
103+
def test_multi_target_node_lefts_numbered_reference
104+
result = Prism.parse("a, (b, $1) = z")
105+
refute result.success?
106+
107+
node = result.value.statements.body.first.lefts.last
108+
assert node.lefts.any? { |left| left.is_a?(NumberedReferenceReadNode) }
109+
end
110+
111+
def test_multi_target_node_rights_back_reference
112+
result = Prism.parse("a, (*, $&) = z")
113+
refute result.success?
114+
115+
node = result.value.statements.body.first.lefts.last
116+
assert node.rights.any? { |right| right.is_a?(BackReferenceReadNode) }
117+
end
118+
119+
def test_multi_target_node_rights_numbered_reference
120+
result = Prism.parse("a, (*, $1) = z")
121+
refute result.success?
122+
123+
node = result.value.statements.body.first.lefts.last
124+
assert node.rights.any? { |right| right.is_a?(NumberedReferenceReadNode) }
125+
end
126+
127+
def test_multi_write_node_lefts_back_reference
128+
result = Prism.parse("$&, = z")
129+
refute result.success?
130+
131+
node = result.value.statements.body.first
132+
assert node.lefts.any? { |left| left.is_a?(BackReferenceReadNode) }
133+
end
134+
135+
def test_multi_write_node_lefts_numbered_reference
136+
result = Prism.parse("$1, = z")
137+
refute result.success?
138+
139+
node = result.value.statements.body.first
140+
assert node.lefts.any? { |left| left.is_a?(NumberedReferenceReadNode) }
141+
end
142+
143+
def test_multi_write_node_rights_back_reference
144+
result = Prism.parse("*, $& = z")
145+
refute result.success?
146+
147+
node = result.value.statements.body.first
148+
assert node.rights.any? { |right| right.is_a?(BackReferenceReadNode) }
149+
end
150+
151+
def test_multi_write_node_rights_numbered_reference
152+
result = Prism.parse("*, $1 = z")
153+
refute result.success?
154+
155+
node = result.value.statements.body.first
156+
assert node.rights.any? { |right| right.is_a?(NumberedReferenceReadNode) }
157+
end
158+
159+
def test_parameters_node_posts_keyword_rest
160+
result = Prism.parse("def f(**kwargs, ...); end")
161+
refute result.success?
162+
163+
node = result.value.statements.body.first.parameters
164+
assert node.posts.any? { |post| post.is_a?(KeywordRestParameterNode) }
165+
end
166+
167+
def test_parameters_node_posts_no_keywords
168+
result = Prism.parse("def f(**nil, ...); end")
169+
refute result.success?
170+
171+
node = result.value.statements.body.first.parameters
172+
assert node.posts.any? { |post| post.is_a?(NoKeywordsParameterNode) }
173+
end
174+
175+
def test_parameters_node_posts_forwarding
176+
result = Prism.parse("def f(..., ...); end")
177+
refute result.success?
178+
179+
node = result.value.statements.body.first.parameters
180+
assert node.posts.any? { |post| post.is_a?(ForwardingParameterNode) }
181+
end
182+
183+
def test_pinned_variable_node_variable_missing
184+
result = Prism.parse("foo in ^Bar")
185+
refute result.success?
186+
187+
node = result.value.statements.body.first.pattern
188+
assert_kind_of MissingNode, node.variable
189+
end
190+
191+
def test_rescue_node_reference_back_reference
192+
result = Prism.parse("begin; rescue => $&; end")
193+
refute result.success?
194+
195+
node = result.value.statements.body.first.rescue_clause
196+
assert_kind_of BackReferenceReadNode, node.reference
197+
end
198+
199+
def test_rescue_node_reference_numbered_reference
200+
result = Prism.parse("begin; rescue => $1; end")
201+
refute result.success?
202+
203+
node = result.value.statements.body.first.rescue_clause
204+
assert_kind_of NumberedReferenceReadNode, node.reference
205+
end
206+
207+
def test_rescue_node_reference_missing
208+
result = Prism.parse("begin; rescue =>; end")
209+
refute result.success?
210+
211+
node = result.value.statements.body.first.rescue_clause
212+
assert_kind_of MissingNode, node.reference
213+
end
214+
end
215+
end

0 commit comments

Comments
 (0)