ParseTree 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,70 +0,0 @@
1
- #!/usr/local/bin/ruby -w
2
-
3
- $TESTING = true
4
-
5
- require 'composite_sexp_processor'
6
- require 'test/unit'
7
-
8
- class FakeProcessor1 < SexpProcessor # ZenTest SKIP
9
-
10
- def initialize
11
- super
12
- self.warn_on_default = false
13
- self.default_method = :default_processor
14
- self.expected = Array
15
- end
16
-
17
- def default_processor(exp)
18
- result = []
19
- result << exp.shift
20
- until exp.empty? do
21
- result << exp.shift.to_s + " woot"
22
- end
23
- result
24
- end
25
- end
26
-
27
- class TestCompositeSexpProcessor < Test::Unit::TestCase
28
-
29
- def setup
30
- @p = CompositeSexpProcessor.new
31
- end
32
-
33
- def test_process_default
34
- data = [1, 2, 3]
35
- result = @p.process(data.dup)
36
- assert_equal(data.dup, result)
37
- end
38
-
39
- def test_process_fake1
40
- data = [:x, 1, 2, 3]
41
- @p << FakeProcessor1.new
42
- result = @p.process(data.dup)
43
- assert_equal [:x, "1 woot", "2 woot", "3 woot"], result
44
- end
45
-
46
- def test_process_fake1_twice
47
- data = [:x, 1, 2, 3]
48
- @p << FakeProcessor1.new
49
- @p << FakeProcessor1.new
50
- result = @p.process(data.dup)
51
- assert_equal [:x, "1 woot woot", "2 woot woot", "3 woot woot"], result
52
- end
53
-
54
- def test_processors
55
- # everything is tested by test_append
56
- end
57
-
58
- def test_append
59
- assert_equal([], @p.processors)
60
-
61
- assert_raises(ArgumentError) do
62
- @p << 42
63
- end
64
-
65
- fp1 = FakeProcessor1.new
66
- @p << fp1
67
- assert_equal([fp1], @p.processors)
68
- end
69
-
70
- end
data/test/test_sexp.rb DELETED
@@ -1,313 +0,0 @@
1
- #!/usr/local/bin/ruby -w
2
-
3
- $TESTING = true
4
-
5
- require 'test/unit' if $0 == __FILE__ unless defined? $ZENTEST and $ZENTEST
6
- require 'test/unit/testcase'
7
- require 'sexp_processor'
8
- require 'stringio'
9
- require 'pp'
10
-
11
- class SexpTestCase < Test::Unit::TestCase
12
-
13
- unless defined? Mini then
14
- alias :refute_nil :assert_not_nil
15
- alias :refute_equal :assert_not_equal
16
- alias :assert_raises :assert_raise
17
- end
18
-
19
- # KEY for regex tests
20
- # :a == no change
21
- # :b == will change (but sometimes ONLY once)
22
- # :c == change to
23
-
24
- include SexpMatchSpecials
25
-
26
- def util_equals(x, y)
27
- result = x == y
28
- refute_nil result, "#{x.inspect} does not === #{y.inspect}"
29
- end
30
-
31
- def util_equals3(x, y)
32
- result = x === y
33
- refute_nil result, "#{x.inspect} does not === #{y.inspect}"
34
- end
35
-
36
- def setup
37
- @any = ANY()
38
- end
39
-
40
- def test_stupid
41
- # shuts up test/unit
42
- end
43
- end
44
-
45
- class TestSexp < SexpTestCase # ZenTest FULL
46
-
47
- class SexpFor
48
- def method
49
- 1
50
- end
51
- end
52
-
53
- def util_pretty_print(expect, input)
54
- io = StringIO.new
55
- PP.pp(input, io)
56
- io.rewind
57
- assert_equal(expect, io.read.chomp)
58
- end
59
-
60
- def setup
61
- super
62
- @sexp_class = Object.const_get(self.class.name[4..-1])
63
- @processor = SexpProcessor.new
64
- @sexp = @sexp_class.new(1, 2, 3)
65
- @basic_sexp = s(:lasgn, :var, s(:lit, 42))
66
- @re = s(:lit, 42)
67
- @bad1 = s(:lit, 24)
68
- @bad1 = s(:blah, 42)
69
- end
70
-
71
- def test_class_for
72
- sexp = Sexp.for SexpFor
73
- assert_equal s(:class, :"TestSexp::SexpFor"), sexp[0..1]
74
-
75
- sexp = Sexp.for SexpFor, :method
76
- assert_equal s(:defn, :method), sexp[0..1]
77
- end
78
-
79
- def test_class_from_array
80
- # raise NotImplementedError, 'Need to write test_class_from_array'
81
- end
82
-
83
- def test_class_index
84
- # raise NotImplementedError, 'Need to write test_class_index'
85
- end
86
-
87
- def test_array_type_eh
88
- assert_equal false, @sexp.array_type?
89
- @sexp.unshift :array
90
- assert_equal true, @sexp.array_type?
91
- end
92
-
93
- def test_each_of_type
94
- # TODO: huh... this tests fails if top level sexp :b is removed
95
- @sexp = s(:b, s(:a, s(:b, s(:a), :a, s(:b, :a), s(:b, s(:a)))))
96
- count = 0
97
- @sexp.each_of_type(:a) do |exp|
98
- count += 1
99
- end
100
- assert_equal(3, count, "must find 3 a's in #{@sexp.inspect}")
101
- end
102
-
103
- def test_equals2_array
104
- # can't use assert_equals because it uses array as receiver
105
- refute_equal(@sexp, [1, 2, 3],
106
- "Sexp must not be equal to equivalent array")
107
- # both directions just in case
108
- # HACK - this seems to be a bug in ruby as far as I'm concerned
109
- # assert_not_equal([1, 2, 3], @sexp,
110
- # "Sexp must not be equal to equivalent array")
111
- end
112
-
113
- def test_equals2_not_body
114
- sexp2 = s(1, 2, 5)
115
- refute_equal(@sexp, sexp2)
116
- end
117
-
118
- def test_equals2_sexp
119
- sexp2 = s(1, 2, 3)
120
- unless @sexp.class == Sexp then
121
- refute_equal(@sexp, sexp2)
122
- end
123
- end
124
-
125
- def test_equals3_any
126
- util_equals3 @any, s()
127
- util_equals3 @any, s(:a)
128
- util_equals3 @any, s(:a, :b, s(:c))
129
- end
130
-
131
- def test_equals3_full_match
132
- util_equals3 s(), s() # 0
133
- util_equals3 s(:blah), s(:blah) # 1
134
- util_equals3 s(:a, :b), s(:a, :b) # 2
135
- util_equals3 @basic_sexp, @basic_sexp.dup # deeper structure
136
- end
137
-
138
- def test_equals3_mismatch
139
- assert_nil s() === s(:a)
140
- assert_nil s(:a) === s()
141
- assert_nil s(:blah1) === s(:blah2)
142
- assert_nil s(:a) === s(:a, :b)
143
- assert_nil s(:a, :b) === s(:a)
144
- assert_nil s(:a1, :b) === s(:a2, :b)
145
- assert_nil s(:a, :b1) === s(:a, :b2)
146
- assert_nil @basic_sexp === @basic_sexp.dup.push(42)
147
- assert_nil @basic_sexp.dup.push(42) === @basic_sexp
148
- end
149
-
150
- def test_equals3_subset_match
151
- util_equals3 s(:a), s(s(:a), s(:b)) # left
152
- util_equals3 s(:a), s(:blah, s(:a ), s(:b)) # mid 1
153
- util_equals3 s(:a, 1), s(:blah, s(:a, 1), s(:b)) # mid 2
154
- util_equals3 @basic_sexp, s(:blah, @basic_sexp.dup, s(:b)) # mid deeper
155
- util_equals3 @basic_sexp, s(@basic_sexp.dup, s(:a), s(:b)) # left deeper
156
-
157
- util_equals3 s(:a), s(:blah, s(:blah, s(:a))) # left deeper
158
- end
159
-
160
- # def test_equalstilde_any
161
- # result = @basic_sexp =~ s(:lit, ANY())
162
- # p result
163
- # assert result
164
- # end
165
-
166
- def test_equalstilde_fancy
167
- assert_nil s(:b) =~ s(:a, s(:b), :c)
168
- refute_nil s(:a, s(:b), :c) =~ s(:b)
169
- end
170
-
171
- def test_equalstilde_plain
172
- result = @basic_sexp =~ @re
173
- assert result
174
- end
175
-
176
- def test_find_and_replace_all
177
- @sexp = s(:a, s(:b, s(:a), s(:b), s(:b, s(:a))))
178
- expected = s(:a, s(:a, s(:a), s(:a), s(:a, s(:a))))
179
-
180
- @sexp.find_and_replace_all(:b, :a)
181
-
182
- assert_equal(expected, @sexp)
183
- end
184
-
185
- def test_gsub
186
- assert_equal s(:c), s().gsub(s(), s(:c))
187
- assert_equal s(:c), s(:b).gsub(s(:b), s(:c))
188
- assert_equal s(:a), s(:a).gsub(s(:b), s(:c))
189
- assert_equal s(:a, s(:c)), s(:a, s(:b)).gsub(s(:b), s(:c))
190
-
191
- assert_equal(s(:a, s(:c), s(:c)),
192
- s(:a, s(:b), s(:b)).gsub(s(:b), s(:c)))
193
- assert_equal(s(:a, s(:c), s(:a, s(:c))),
194
- s(:a, s(:b), s(:a, s(:b))).gsub(s(:b), s(:c)))
195
- end
196
-
197
- def test_inspect
198
- k = @sexp_class
199
- n = k.name[0].chr.downcase
200
- assert_equal("#{n}()",
201
- k.new().inspect)
202
- assert_equal("#{n}(:a)",
203
- k.new(:a).inspect)
204
- assert_equal("#{n}(:a, :b)",
205
- k.new(:a, :b).inspect)
206
- assert_equal("#{n}(:a, #{n}(:b))",
207
- k.new(:a, k.new(:b)).inspect)
208
- end
209
-
210
- def test_method_missing
211
- assert_nil @sexp.not_there
212
- assert_equal s(:lit, 42), @basic_sexp.lit
213
- end
214
-
215
- def test_method_missing_ambigious
216
- assert_raises NoMethodError do
217
- pirate = s(:says, s(:arrr!), s(:arrr!), s(:arrr!))
218
- pirate.arrr!
219
- end
220
- end
221
-
222
- def test_method_missing_deep
223
- sexp = s(:blah, s(:a, s(:b, s(:c, :yay!))))
224
- assert_equal(s(:c, :yay!), sexp.a.b.c)
225
- end
226
-
227
- def test_method_missing_delete
228
- sexp = s(:blah, s(:a, s(:b, s(:c, :yay!))))
229
-
230
- assert_equal(s(:c, :yay!), sexp.a.b.c(true))
231
- assert_equal(s(:blah, s(:a, s(:b))), sexp)
232
- end
233
-
234
- def test_pretty_print
235
- util_pretty_print("s()",
236
- s())
237
- util_pretty_print("s(:a)",
238
- s(:a))
239
- util_pretty_print("s(:a, :b)",
240
- s(:a, :b))
241
- util_pretty_print("s(:a, s(:b))",
242
- s(:a, s(:b)))
243
- end
244
-
245
- def test_sexp_body
246
- assert_equal [2, 3], @sexp.sexp_body
247
- end
248
-
249
- def test_shift
250
- assert_equal(1, @sexp.shift)
251
- assert_equal(2, @sexp.shift)
252
- assert_equal(3, @sexp.shift)
253
-
254
- assert_raises(RuntimeError) do
255
- @sexp.shift
256
- end
257
- end
258
-
259
- def test_structure
260
- @sexp = s(:a, 1, 2, s(:b, 3, 4), 5, 6)
261
- backup = @sexp.deep_clone
262
- expected = s(:a, s(:b))
263
-
264
- assert_equal(expected, @sexp.structure)
265
- assert_equal(backup, @sexp)
266
- end
267
-
268
- def test_sub
269
- assert_equal s(:c), s().sub(s(), s(:c))
270
- assert_equal s(:c), s(:b).sub(s(:b), s(:c))
271
- assert_equal s(:a), s(:a).sub(s(:b), s(:c))
272
- assert_equal s(:a, s(:c)), s(:a, s(:c)).sub(s(:b), s(:c))
273
-
274
- assert_equal s(:a, s(:c), s(:b)), s(:a, s(:b), s(:b)).sub(s(:b), s(:c))
275
-
276
- assert_equal(s(:a, s(:c), s(:a)),
277
- s(:a, s(:b), s(:a)).sub(s(:b), s(:c)))
278
- assert_equal(s(:a, s(:c), s(:a, s(:a))),
279
- s(:a, s(:b), s(:a, s(:a))).sub(s(:b), s(:c)))
280
- assert_equal(s(:a, s(:a), s(:a, s(:c), s(:b))),
281
- s(:a, s(:a), s(:a, s(:b), s(:b))).sub(s(:b), s(:c)))
282
- assert_equal(s(:a, s(:c, s(:b))),
283
- s(:a, s(:b)).sub(s(:b), s(:c, s(:b))))
284
- end
285
-
286
- def test_to_a
287
- assert_equal([1, 2, 3], @sexp.to_a)
288
- end
289
-
290
- def test_to_s
291
- test_inspect
292
- end
293
- end
294
-
295
- class TestSexpAny < SexpTestCase
296
-
297
- def setup
298
- super
299
- end
300
-
301
- def test_equals
302
- util_equals @any, s()
303
- util_equals @any, s(:a)
304
- util_equals @any, s(:a, :b, s(:c))
305
- end
306
-
307
- def test_equals3
308
- util_equals3 @any, s()
309
- util_equals3 @any, s(:a)
310
- util_equals3 @any, s(:a, :b, s(:c))
311
- end
312
-
313
- end
@@ -1,297 +0,0 @@
1
- #!/usr/local/bin/ruby -w
2
-
3
- $TESTING = true
4
-
5
- require 'sexp_processor'
6
- require 'stringio'
7
- require 'test/unit'
8
- require 'pp'
9
-
10
- # Fake test classes:
11
-
12
- class TestProcessor < SexpProcessor # ZenTest SKIP
13
- attr_accessor :auto_shift_type
14
-
15
- def process_acc1(exp)
16
- out = self.expected.new(:acc2, exp.thing_three, exp.thing_two, exp.thing_one)
17
- exp.clear
18
- return out
19
- end
20
-
21
- def process_acc2(exp)
22
- out = []
23
- out << exp.thing_one
24
- end
25
-
26
- def process_specific(exp)
27
- name = exp.shift
28
- result = s(:blah)
29
- until exp.empty?
30
- result.push process(exp.shift)
31
- end
32
- result
33
- end
34
-
35
- def process_strip(exp)
36
- result = exp.deep_clone
37
- exp.clear
38
- result
39
- end
40
-
41
- def process_nonempty(exp)
42
- s(*exp)
43
- end
44
-
45
- def process_broken(exp)
46
- result = [*exp]
47
- exp.clear
48
- result
49
- end
50
-
51
- def process_expected(exp)
52
- exp.clear
53
- return {}
54
- end
55
-
56
- def process_string(exp)
57
- return exp.shift
58
- end
59
-
60
- def rewrite_rewritable(exp) # (a b c) => (a c b)
61
- return s(exp.shift, exp.pop, exp.shift)
62
- end
63
-
64
- def process_rewritable(exp)
65
- @n ||= 0
66
- exp.shift # name
67
- result = s(:rewritten)
68
- until exp.empty?
69
- result.push process(exp.shift)
70
- end
71
- result.push @n
72
- @n += 1
73
- result
74
- end
75
-
76
- def rewrite_major_rewrite(exp)
77
- exp[0] = :rewritable
78
- exp
79
- end
80
- end
81
-
82
- class TestProcessorDefault < SexpProcessor # ZenTest SKIP
83
- def initialize
84
- super
85
- self.default_method = :def_method
86
- end
87
-
88
- def def_method(exp)
89
- exp.clear
90
- self.expected.new(42)
91
- end
92
- end
93
-
94
- # Real test classes:
95
-
96
- class TestSexpProcessor < Test::Unit::TestCase
97
-
98
- def setup
99
- @processor = TestProcessor.new
100
- end
101
-
102
- def test_process_specific
103
- a = [:specific, [:x, 1], [:y, 2], [:z, 3]]
104
- expected = [:blah, [:x, 1], [:y, 2], [:z, 3]]
105
- assert_equal(expected, @processor.process(a))
106
- end
107
-
108
- def test_process_generic
109
- a = [:blah, 1, 2, 3]
110
- expected = a.deep_clone
111
- assert_equal(expected, @processor.process(a))
112
- end
113
-
114
- def test_process_default
115
- @processor = TestProcessorDefault.new
116
- @processor.warn_on_default = false
117
-
118
- a = s(:blah, 1, 2, 3)
119
- assert_equal(@processor.expected.new(42), @processor.process(a))
120
- end
121
-
122
- def test_process_not_sexp
123
- @processor = TestProcessor.new
124
- @processor.warn_on_default = false
125
-
126
- assert_raises SexpTypeError do
127
- @processor.process([:broken, 1, 2, 3])
128
- end
129
- end
130
-
131
- def test_process_unsupported_wrong
132
- @processor = TestProcessor.new
133
- @processor.unsupported << :strip
134
-
135
- assert_raises UnsupportedNodeError do
136
- @processor.process([:whatever])
137
- end
138
- end
139
-
140
- def test_unsupported_equal
141
- @processor.strict = true
142
- @processor.unsupported = [ :unsupported ]
143
- assert_raises UnsupportedNodeError do
144
- @processor.process([:unsupported, 42])
145
- end
146
- end
147
-
148
- def test_strict
149
- @processor.strict = true
150
- assert_raises UnknownNodeError do
151
- @processor.process([:blah, 1, 2, 3])
152
- end
153
- end
154
- def test_strict=; end #Handled
155
-
156
- def test_require_empty_false
157
- @processor.require_empty = false
158
-
159
- @processor.process([:nonempty, 1, 2, 3])
160
- end
161
-
162
- def test_require_empty_true
163
- assert_raises NotEmptyError do
164
- @processor.process([:nonempty, 1, 2, 3])
165
- end
166
- end
167
- def test_require_empty=; end # handled
168
-
169
- def test_process_strip
170
- @processor.auto_shift_type = true
171
- assert_equal([1, 2, 3], @processor.process(s(:strip, 1, 2, 3)))
172
- end
173
-
174
- def test_rewrite
175
- assert_equal(s(:rewritable, :b, :a),
176
- @processor.rewrite(s(:rewritable, :a, :b)))
177
- end
178
-
179
- def test_rewrite_different_type
180
- assert_equal(s(:rewritable, :b, :a),
181
- @processor.rewrite(s(:major_rewrite, :a, :b)))
182
- end
183
-
184
- def test_rewrite_deep
185
- assert_equal(s(:specific, s(:rewritable, :b, :a)),
186
- @processor.rewrite(s(:specific, s(:rewritable, :a, :b))))
187
- end
188
-
189
- def test_rewrite_not_empty
190
- insert = s(:rewritable, 1, 2, 2)
191
- expect = s(:rewritable, 2, 1)
192
- result = @processor.rewrite(insert)
193
- assert_equal(expect, result)
194
- assert_equal(s(2), insert) # post-processing
195
- end
196
-
197
- def test_process_rewrite
198
- assert_equal(s(:rewritten, s(:y, 2), s(:x, 1), 0),
199
- @processor.process(s(:rewritable, s(:x, 1), s(:y, 2))))
200
- end
201
-
202
- def test_process_rewrite_deep
203
- assert_equal(s(:blah, s(:rewritten, s(:b), s(:a), 0)),
204
- @processor.process(s(:specific, s(:rewritable, s(:a), s(:b)))))
205
- end
206
-
207
- def test_rewrite_depth_first
208
- inn = s(:specific,
209
- s(:rewritable,
210
- s(:a),
211
- s(:rewritable,
212
- s(:rewritable, s(:b), s(:c)),
213
- s(:d))))
214
- out = s(:specific,
215
- s(:rewritable,
216
- s(:rewritable,
217
- s(:d),
218
- s(:rewritable, s(:c), s(:b))),
219
- s(:a)))
220
-
221
- assert_equal(out, @processor.rewrite(inn))
222
- end
223
-
224
- def test_process_rewrite_depth_first
225
- inn = s(:specific,
226
- s(:rewritable,
227
- s(:a),
228
- s(:rewritable,
229
- s(:rewritable, s(:b), s(:c)),
230
- s(:d))))
231
- out = s(:blah,
232
- s(:rewritten,
233
- s(:rewritten,
234
- s(:d),
235
- s(:rewritten, s(:c), s(:b), 0), 1),
236
- s(:a), 2))
237
-
238
- assert_equal(out, @processor.process(inn))
239
- end
240
-
241
- def test_assert_type_hit
242
- @processor.assert_type([:blah, 1, 2, 3], :blah)
243
- end
244
-
245
- def test_assert_type_miss
246
- assert_raises SexpTypeError do
247
- @processor.assert_type([:thingy, 1, 2, 3], :blah)
248
- end
249
- end
250
-
251
- def test_generate
252
- # nothing to test at this time... soon.
253
- end
254
-
255
- def test_auto_shift_type
256
- @processor.auto_shift_type = false
257
- assert_equal(false, @processor.auto_shift_type)
258
- @processor.auto_shift_type = true
259
- assert_equal(true, @processor.auto_shift_type)
260
- end
261
- def test_auto_shift_type_equal; end # handled
262
-
263
- def test_default_method
264
- # default functionality tested in process_default
265
- assert_nil @processor.default_method
266
- @processor.default_method = :something
267
- assert_equal :something, @processor.default_method
268
- end
269
- def test_default_method=; end # handled
270
-
271
- def test_expected
272
- assert_equal Sexp, @processor.expected
273
- assert_raises SexpTypeError do
274
- @processor.process([:expected]) # should raise
275
- end
276
-
277
- @processor.process(s(:str, "string")) # shouldn't raise
278
-
279
- @processor.expected = Hash
280
- assert_equal Hash, @processor.expected
281
- assert !(Hash === s()), "Hash === s() should not be true"
282
-
283
- assert_raises SexpTypeError do
284
- @processor.process(s(:string, "string")) # should raise
285
- end
286
-
287
- @processor.process([:expected]) # shouldn't raise
288
- end
289
- def test_expected=; end # handled
290
-
291
- # Not Testing:
292
- def test_debug; end
293
- def test_debug=; end
294
- def test_warn_on_default; end
295
- def test_warn_on_default=; end
296
-
297
- end