ParseTree 2.2.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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