rogue_parser 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,394 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ require 'test/unit'
4
+ require 'ruby_parser'
5
+
6
+ $: << File.expand_path('~/Work/p4/zss/src/ParseTree/dev/lib')
7
+ $: << File.expand_path('~/Work/p4/zss/src/ParseTree/dev/test')
8
+
9
+ require 'pt_testcase'
10
+
11
+ class TestRubyParser < Test::Unit::TestCase # ParseTreeTestCase
12
+
13
+ # Regular ParseTreeTestCase tests
14
+ eval ParseTreeTestCase.testcases.map { |node, data|
15
+ next if node.to_s =~ /bmethod|dmethod/
16
+ next if Array === data['Ruby'] # runtime only crap
17
+ "def test_#{node}
18
+ rb = #{data['Ruby'].inspect}
19
+ pt = #{data['ParseTree'].inspect}
20
+
21
+ assert_not_nil rb, \"Ruby for #{node} undefined\"
22
+ assert_not_nil pt, \"ParseTree for #{node} undefined\"
23
+
24
+ assert_equal Sexp.from_array(pt), @processor.parse(rb)
25
+ end"
26
+ }.compact.join("\n")
27
+
28
+ if false then
29
+ require 'parse_tree'
30
+
31
+ # Regular ParseTreeTestCase tests
32
+ eval ParseTreeTestCase.testcases.map { |node, data|
33
+ next if node.to_s =~ /bmethod|dmethod/
34
+ next if Array === data['Ruby'] # runtime only crap
35
+ "def test_nl_#{node}
36
+ rb = #{data['Ruby'].inspect}
37
+ pt = ParseTree.new(true).parse_tree_for_string(rb).first
38
+
39
+ assert_not_nil rb, \"Ruby for #{node} undefined\"
40
+ assert_not_nil pt, \"ParseTree for #{node} undefined\"
41
+
42
+ assert_equal Sexp.from_array(pt), @processor.parse(rb)
43
+ end"
44
+ }.compact.join("\n")
45
+ end
46
+
47
+ # Scour the world and compare against ParseTree
48
+ if ENV['ZOMGPONIES'] or File.exist? 'zomgponies' then
49
+ require 'parse_tree'
50
+
51
+ base = "/usr/lib/ruby"
52
+ base = "unit"
53
+
54
+ files = Dir[File.join(base, "**/*.rb")]
55
+
56
+ # these files/patterns cause parse_tree_show to bus error (or just suck):
57
+ files.reject! { |f| f =~ /environments.environment|rss.maker.base|rails_generator|ferret.browser|rubinius.spec.core.module.(constants|name|remove_const)_spec|tkextlib.tcllib.tablelist/ }
58
+
59
+ # these are rejected for dasgn_curr ordering failures... I'll fix them later.
60
+ # (or mri parse errors--I should have separated them out)
61
+ files.reject! { |f| f =~ /lib.flog|lib.autotest.notify|lib.analyzer.tools.rails.stat|flog.lib.flog|rakelib.struct.generator|rubinius.kernel.core.array|lib.rbosa.rb|src.rbosa.rb|spec.spec.mocks.mock.spec.rb|dsl.shared.behaviour.spec.rb|spec.spec.dsl.behaviour.spec|lib.hpricot.parse.rb|resolve.rb|parsers.parse.f95|rubinius.shotgun.lib.primitives.ltm|rubinius.lib.bin.compile|rubinius.kernel.core.object|rubinius.kernel.core.file|rubinius.compiler2.garnet.bindingagent|ruby_to_c_test_r2ctestcase|lib.more.like.this|resolv\.rb|test.r2ctestcase/ }
62
+
63
+ warn "Generating #{files.size} tests from #{base}"
64
+
65
+ eval files.map { |file|
66
+ name = file[base.size..-1].gsub(/\W+/, '_')
67
+
68
+ loc = `wc -l #{file}`.strip.to_i
69
+
70
+ "def test#{name}_#{loc}
71
+ file = #{file.inspect}
72
+ rb = File.read(file)
73
+
74
+ pt = ParseTree.new.parse_tree_for_string rb
75
+ assert_not_nil pt, \"ParseTree for #{name} undefined\"
76
+
77
+ rp = @processor.parse rb
78
+ assert_equal Sexp.from_array(pt).first, rp, \"RP different from PT\"
79
+ File.unlink #{file.inspect}
80
+ end"
81
+ }.compact.join("\n")
82
+ end
83
+
84
+ def setup
85
+ super
86
+
87
+ # puts self.name
88
+
89
+ @processor = RubyParser.new
90
+ end
91
+
92
+ def test_block_append
93
+ head = s(:args)
94
+ tail = s(:zsuper)
95
+ expected = s(:block, s(:args), s(:zsuper))
96
+ assert_equal expected, @processor.block_append(head, tail)
97
+ end
98
+
99
+ def test_block_append_begin_begin
100
+ head = s(:begin, s(:args))
101
+ tail = s(:begin, s(:args))
102
+ expected = s(:block, s(:args), s(:begin, s(:args)))
103
+ assert_equal expected, @processor.block_append(head, tail)
104
+ end
105
+
106
+ def test_block_append_block
107
+ head = s(:block, s(:args))
108
+ tail = s(:zsuper)
109
+ expected = s(:block, s(:args), s(:zsuper))
110
+ assert_equal expected, @processor.block_append(head, tail)
111
+ end
112
+
113
+ def test_block_append_nil_head
114
+ head = nil
115
+ tail = s(:zsuper)
116
+ expected = s(:zsuper)
117
+ assert_equal expected, @processor.block_append(head, tail)
118
+ end
119
+
120
+ def test_block_append_nil_tail
121
+ head = s(:args)
122
+ tail = nil
123
+ expected = s(:args)
124
+ assert_equal expected, @processor.block_append(head, tail)
125
+ end
126
+
127
+ def test_block_append_tail_block
128
+ head = s(:vcall, :f1)
129
+ tail = s(:block, s(:undef, s(:lit, :x)), s(:undef, s(:lit, :y)))
130
+ expected = s(:block,
131
+ s(:vcall, :f1),
132
+ s(:block, s(:undef, s(:lit, :x)), s(:undef, s(:lit, :y))))
133
+ assert_equal expected, @processor.block_append(head, tail)
134
+ end
135
+
136
+ def test_call_env
137
+ @processor.env[:a] = :lvar
138
+ expected = s(:call, s(:lvar, :a), :happy)
139
+
140
+ assert_equal expected, @processor.parse('a.happy')
141
+ end
142
+
143
+ def test_dasgn_icky2
144
+ rb = "a do\n v = nil\n begin\n yield\n rescue Exception => v\n break\n end\nend"
145
+ pt = s(:iter,
146
+ s(:fcall, :a),
147
+ nil,
148
+ s(:block,
149
+ s(:dasgn_curr, :v, s(:nil)),
150
+ s(:begin,
151
+ s(:rescue,
152
+ s(:yield),
153
+ s(:resbody,
154
+ s(:array, s(:const, :Exception)),
155
+ s(:block, s(:dasgn_curr, :v, s(:gvar, :$!)), s(:break)))))))
156
+
157
+ assert_equal pt, @processor.parse(rb)
158
+ end
159
+
160
+ def test_class_comments
161
+ rb = "# blah 1\n# blah 2\n\nclass X\n # blah 3\n def blah\n # blah 4\n end\nend"
162
+ pt = s(:class, :X, nil,
163
+ s(:scope,
164
+ s(:defn, :blah, s(:scope, s(:block, s(:args), s(:nil))))))
165
+
166
+ actual = @processor.parse(rb)
167
+ assert_equal pt, actual
168
+
169
+ assert_equal "# blah 1\n# blah 2\n\n", actual.comments
170
+ assert_equal "# blah 3\n", actual.scope.defn.comments
171
+ end
172
+
173
+ def test_module_comments
174
+ rb = "# blah 1\n \n # blah 2\n\nmodule X\n # blah 3\n def blah\n # blah 4\n end\nend"
175
+ pt = s(:module, :X,
176
+ s(:scope,
177
+ s(:defn, :blah, s(:scope, s(:block, s(:args), s(:nil))))))
178
+
179
+ actual = @processor.parse(rb)
180
+ assert_equal pt, actual
181
+ assert_equal "# blah 1\n\n# blah 2\n\n", actual.comments
182
+ assert_equal "# blah 3\n", actual.scope.defn.comments
183
+ end
184
+
185
+ def test_defn_comments
186
+ rb = "# blah 1\n# blah 2\n\ndef blah\nend"
187
+ pt = s(:defn, :blah, s(:scope, s(:block, s(:args), s(:nil))))
188
+
189
+ actual = @processor.parse(rb)
190
+ assert_equal pt, actual
191
+ assert_equal "# blah 1\n# blah 2\n\n", actual.comments
192
+ end
193
+
194
+ def test_defs_comments
195
+ rb = "# blah 1\n# blah 2\n\ndef self.blah\nend"
196
+ pt = s(:defs, s(:self), :blah, s(:scope, s(:args)))
197
+
198
+ actual = @processor.parse(rb)
199
+ assert_equal pt, actual
200
+ assert_equal "# blah 1\n# blah 2\n\n", actual.comments
201
+ end
202
+
203
+ def test_do_bug # TODO: rename
204
+ rb = "a 1\na.b do |c|\n # do nothing\nend"
205
+ pt = s(:block,
206
+ s(:fcall, :a, s(:array, s(:lit, 1))),
207
+ s(:iter, s(:call, s(:vcall, :a), :b), s(:dasgn_curr, :c)))
208
+
209
+ assert_equal pt, @processor.parse(rb)
210
+ end
211
+
212
+ def test_dstr_evstr
213
+ rb = "\"#\{'a'}#\{b}\""
214
+ pt = s(:dstr, "a", s(:evstr, s(:vcall, :b)))
215
+
216
+ assert_equal pt, @processor.parse(rb)
217
+ end
218
+
219
+ def test_dstr_str
220
+ rb = "\"#\{'a'} b\""
221
+ pt = s(:str, "a b")
222
+
223
+ assert_equal pt, @processor.parse(rb)
224
+ end
225
+
226
+ def test_empty
227
+ rb = ""
228
+ pt = nil
229
+
230
+ assert_equal pt, @processor.parse(rb)
231
+ end
232
+
233
+ def test_evstr_evstr
234
+ rb = "\"#\{a}#\{b}\""
235
+ pt = s(:dstr, "", s(:evstr, s(:vcall, :a)), s(:evstr, s(:vcall, :b)))
236
+
237
+ assert_equal pt, @processor.parse(rb)
238
+ end
239
+
240
+ def test_evstr_str
241
+ rb = "\"#\{a} b\""
242
+ pt = s(:dstr, "", s(:evstr, s(:vcall, :a)), s(:str, " b"))
243
+
244
+ assert_equal pt, @processor.parse(rb)
245
+ end
246
+
247
+ def test_lasgn_env
248
+ rb = 'a = 42'
249
+ pt = s(:lasgn, :a, s(:lit, 42))
250
+ expected_env = { :a => :lvar }
251
+
252
+ assert_equal pt, @processor.parse(rb)
253
+ assert_equal expected_env, @processor.env.all
254
+ end
255
+
256
+ def test_list_append
257
+ lhs, rhs = s(:array, s(:lit, :iter)), s(:when, s(:const, :BRANCHING), nil)
258
+ expected = s(:array, s(:lit, :iter), s(:when, s(:const, :BRANCHING), nil))
259
+
260
+ assert_equal expected, @processor.list_append(lhs, rhs)
261
+ end
262
+
263
+ def test_literal_concat_dstr_dstr
264
+ lhs = s(:dstr, "Failed to download spec ",
265
+ s(:evstr, s(:vcall, :spec_name)),
266
+ s(:str, " from "),
267
+ s(:evstr, s(:vcall, :source_uri)),
268
+ s(:str, ":\n"))
269
+ rhs = s(:dstr, "\t",
270
+ s(:evstr, s(:call, s(:ivar, :@fetch_error), :message)))
271
+ expected = s(:dstr, "Failed to download spec ",
272
+ s(:evstr, s(:vcall, :spec_name)),
273
+ s(:str, " from "),
274
+ s(:evstr, s(:vcall, :source_uri)),
275
+ s(:str, ":\n"),
276
+ s(:str, "\t"),
277
+ s(:evstr, s(:call, s(:ivar, :@fetch_error), :message)))
278
+
279
+ assert_equal expected, @processor.literal_concat(lhs, rhs)
280
+ end
281
+
282
+ def test_literal_concat_dstr_evstr
283
+ lhs, rhs = s(:dstr, "a"), s(:evstr, s(:vcall, :b))
284
+ expected = s(:dstr, "a", s(:evstr, s(:vcall, :b)))
285
+
286
+ assert_equal expected, @processor.literal_concat(lhs, rhs)
287
+ end
288
+
289
+ def test_literal_concat_evstr_evstr
290
+ lhs, rhs = s(:evstr, s(:lit, 1)), s(:evstr, s(:lit, 2))
291
+ expected = s(:dstr, "", s(:evstr, s(:lit, 1)), s(:evstr, s(:lit, 2)))
292
+
293
+ assert_equal expected, @processor.literal_concat(lhs, rhs)
294
+ end
295
+
296
+ def test_literal_concat_str_evstr
297
+ lhs, rhs = s(:str, ""), s(:evstr, s(:str, "blah"))
298
+
299
+ assert_equal s(:str, "blah"), @processor.literal_concat(lhs, rhs)
300
+ end
301
+
302
+ def test_logop_12
303
+ lhs = s(:lit, 1)
304
+ rhs = s(:lit, 2)
305
+ exp = s(:and, s(:lit, 1), s(:lit, 2))
306
+
307
+ assert_equal exp, @processor.logop(:and, lhs, rhs)
308
+ end
309
+
310
+ def test_logop_1234_5
311
+ lhs = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:and, s(:lit, 3), s(:lit, 4))))
312
+ rhs = s(:lit, 5)
313
+ exp = s(:and,
314
+ s(:lit, 1),
315
+ s(:and,
316
+ s(:lit, 2),
317
+ s(:and,
318
+ s(:lit, 3),
319
+ s(:and,
320
+ s(:lit, 4),
321
+ s(:lit, 5)))))
322
+
323
+ assert_equal exp, @processor.logop(:and, lhs, rhs)
324
+ end
325
+
326
+ def test_logop_123_4
327
+ lhs = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:lit, 3)))
328
+ rhs = s(:lit, 4)
329
+ exp = s(:and,
330
+ s(:lit, 1),
331
+ s(:and,
332
+ s(:lit, 2),
333
+ s(:and,
334
+ s(:lit, 3),
335
+ s(:lit, 4))))
336
+
337
+ assert_equal exp, @processor.logop(:and, lhs, rhs)
338
+ end
339
+
340
+ def test_logop_12_3
341
+ lhs = s(:and, s(:lit, 1), s(:lit, 2))
342
+ rhs = s(:lit, 3)
343
+ exp = s(:and, s(:lit, 1), s(:and, s(:lit, 2), s(:lit, 3)))
344
+
345
+ assert_equal exp, @processor.logop(:and, lhs, rhs)
346
+ end
347
+
348
+ def test_logop_nested_mix
349
+ lhs = s(:or, s(:vcall, :a), s(:vcall, :b))
350
+ rhs = s(:and, s(:vcall, :c), s(:vcall, :d))
351
+ exp = s(:or,
352
+ s(:or, s(:vcall, :a), s(:vcall, :b)),
353
+ s(:and, s(:vcall, :c), s(:vcall, :d)))
354
+
355
+ lhs.paren = true
356
+ rhs.paren = true
357
+
358
+ assert_equal exp, @processor.logop(:or, lhs, rhs)
359
+ end
360
+
361
+ def test_str_evstr
362
+ rb = "\"a #\{b}\""
363
+ pt = s(:dstr, "a ", s(:evstr, s(:vcall, :b)))
364
+
365
+ assert_equal pt, @processor.parse(rb)
366
+ end
367
+
368
+ def test_str_pct_Q_nested
369
+ rb = "%Q[before [#\{nest}] after]"
370
+ pt = s(:dstr, "before [", s(:evstr, s(:vcall, :nest)), s(:str, "] after"))
371
+
372
+ assert_equal pt, @processor.parse(rb)
373
+ end
374
+
375
+ def test_str_str
376
+ rb = "\"a #\{'b'}\""
377
+ pt = s(:str, "a b")
378
+
379
+ assert_equal pt, @processor.parse(rb)
380
+ end
381
+
382
+ def test_str_str_str
383
+ rb = "\"a #\{'b'} c\""
384
+ pt = s(:str, "a b c")
385
+
386
+ assert_equal pt, @processor.parse(rb)
387
+ end
388
+ end
389
+
390
+ __END__
391
+
392
+ # blah18.rb
393
+
394
+ assert_equal("sub", $_)
@@ -0,0 +1,177 @@
1
+ require 'test/unit'
2
+ require 'ruby_parser_extras'
3
+
4
+ class TestStackState < Test::Unit::TestCase
5
+ def test_stack_state
6
+ s = StackState.new :test
7
+ s.push true
8
+ s.push false
9
+ s.lexpop
10
+ assert_equal [false, true], s.stack
11
+ end
12
+
13
+ def test_is_in_state
14
+ s = StackState.new :test
15
+ assert_equal false, s.is_in_state
16
+ s.push false
17
+ assert_equal false, s.is_in_state
18
+ s.push true
19
+ assert_equal true, s.is_in_state
20
+ s.push false
21
+ assert_equal false, s.is_in_state
22
+ end
23
+
24
+ def test_lexpop
25
+ s = StackState.new :test
26
+ assert_equal [false], s.stack
27
+ s.push true
28
+ s.push false
29
+ assert_equal [false, true, false], s.stack
30
+ s.lexpop
31
+ assert_equal [false, true], s.stack
32
+ end
33
+
34
+ def test_pop
35
+ s = StackState.new :test
36
+ assert_equal [false], s.stack
37
+ s.push true
38
+ assert_equal [false, true], s.stack
39
+ assert_equal true, s.pop
40
+ assert_equal [false], s.stack
41
+ end
42
+
43
+ def test_push
44
+ s = StackState.new :test
45
+ assert_equal [false], s.stack
46
+ s.push true
47
+ s.push false
48
+ assert_equal [false, true, false], s.stack
49
+ end
50
+ end
51
+
52
+ class TestEnvironment < Test::Unit::TestCase
53
+ def deny t
54
+ assert ! t
55
+ end
56
+
57
+ def setup
58
+ @env = Environment.new
59
+ @env[:blah] = 42
60
+ assert_equal 42, @env[:blah]
61
+ end
62
+
63
+ def test_use
64
+ @env.use :blah
65
+ expected = [{ :blah => true }]
66
+ assert_equal expected, @env.instance_variable_get(:"@use")
67
+ end
68
+
69
+ def test_use_scoped
70
+ @env.use :blah
71
+ @env.extend
72
+ expected = [{}, { :blah => true }]
73
+ assert_equal expected, @env.instance_variable_get(:"@use")
74
+ end
75
+
76
+ def test_used_eh
77
+ @env.extend :dynamic
78
+ @env[:x] = :dvar
79
+ @env.use :x
80
+ assert_equal true, @env.used?(:x)
81
+ end
82
+
83
+ def test_used_eh_none
84
+ assert_equal nil, @env.used?(:x)
85
+ end
86
+
87
+ def test_used_eh_scoped
88
+ self.test_used_eh
89
+ @env.extend :dynamic
90
+ assert_equal true, @env.used?(:x)
91
+ end
92
+
93
+ def test_var_scope_dynamic
94
+ @env.extend :dynamic
95
+ assert_equal 42, @env[:blah]
96
+ @env.unextend
97
+ assert_equal 42, @env[:blah]
98
+ end
99
+
100
+ def test_var_scope_static
101
+ @env.extend
102
+ assert_equal nil, @env[:blah]
103
+ @env.unextend
104
+ assert_equal 42, @env[:blah]
105
+ end
106
+
107
+ def test_dynamic
108
+ expected1 = {}
109
+ expected2 = { :x => 42 }
110
+
111
+ assert_equal expected1, @env.dynamic
112
+ begin
113
+ @env.extend :dynamic
114
+ assert_equal expected1, @env.dynamic
115
+
116
+ @env[:x] = 42
117
+ assert_equal expected2, @env.dynamic
118
+
119
+ begin
120
+ @env.extend :dynamic
121
+ assert_equal expected2, @env.dynamic
122
+ @env.unextend
123
+ end
124
+
125
+ assert_equal expected2, @env.dynamic
126
+ @env.unextend
127
+ end
128
+ assert_equal expected1, @env.dynamic
129
+ end
130
+
131
+ def test_all_dynamic
132
+ expected = { :blah => 42 }
133
+
134
+ @env.extend :dynamic
135
+ assert_equal expected, @env.all
136
+ @env.unextend
137
+ assert_equal expected, @env.all
138
+ end
139
+
140
+ def test_all_static
141
+ @env.extend
142
+ expected = { }
143
+ assert_equal expected, @env.all
144
+
145
+ @env.unextend
146
+ expected = { :blah => 42 }
147
+ assert_equal expected, @env.all
148
+ end
149
+
150
+ def test_dynamic_eh
151
+ assert_equal false, @env.dynamic?
152
+ @env.extend :dynamic
153
+ assert_equal true, @env.dynamic?
154
+ @env.extend
155
+ assert_equal false, @env.dynamic?
156
+ end
157
+
158
+ def test_all_static_deeper
159
+ expected0 = { :blah => 42 }
160
+ expected1 = { :blah => 42, :blah2 => 24 }
161
+ expected2 = { :blah => 27 }
162
+
163
+ @env.extend :dynamic
164
+ @env[:blah2] = 24
165
+ assert_equal expected1, @env.all
166
+
167
+ @env.extend
168
+ @env[:blah] = 27
169
+ assert_equal expected2, @env.all
170
+
171
+ @env.unextend
172
+ assert_equal expected1, @env.all
173
+
174
+ @env.unextend
175
+ assert_equal expected0, @env.all
176
+ end
177
+ end