cast 0.0.1 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/CHANGELOG +63 -0
- data/Gemfile +9 -0
- data/LICENSE +22 -0
- data/README.markdown +1924 -0
- data/Rakefile +29 -0
- data/cast.gemspec +18 -0
- data/ext/cast.c +6 -0
- data/ext/cast.h +141 -0
- data/ext/extconf.rb +2 -0
- data/ext/parser.c +287 -0
- data/ext/yylex.re +340 -0
- data/lib/cast.rb +11 -9
- data/lib/cast/c.y +904 -0
- data/lib/{c_nodes.rb → cast/c_nodes.rb} +188 -392
- data/lib/{to_debug.rb → cast/inspect.rb} +18 -20
- data/lib/cast/node.rb +741 -0
- data/lib/{node_list.rb → cast/node_list.rb} +175 -176
- data/lib/{parse.rb → cast/parse.rb} +86 -65
- data/lib/cast/preprocessor.rb +59 -0
- data/lib/cast/tempfile.rb +33 -0
- data/lib/{to_s.rb → cast/to_s.rb} +133 -80
- data/lib/cast/version.rb +11 -0
- data/test/c_nodes_test.rb +224 -0
- data/test/lexer_test.rb +335 -0
- data/test/{test_node_list.rb → node_list_test.rb} +401 -413
- data/test/{test_node.rb → node_test.rb} +186 -214
- data/test/parse_test.rb +2068 -0
- data/test/{test_parser.rb → parser_test.rb} +145 -58
- data/test/preprocessor_test.rb +85 -0
- data/test/render_test.rb +2116 -0
- data/test/test_helper.rb +198 -0
- metadata +83 -52
- data/README +0 -6
- data/doc/index.html +0 -2513
- data/install.rb +0 -14
- data/lib/c.tab.rb +0 -3433
- data/lib/c.y +0 -935
- data/lib/node.rb +0 -744
- data/test/common.rb +0 -174
- data/test/run.rb +0 -5
- data/test/test_c_nodes.rb +0 -160
- data/test/test_parse.rb +0 -2014
@@ -1,26 +1,16 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
require 'common'
|
10
|
-
require 'stringio'
|
11
|
-
|
12
|
-
require 'pp'
|
13
|
-
class C::Node
|
14
|
-
def pretty_print q
|
15
|
-
q.text self.to_debug
|
16
|
-
end
|
17
|
-
end
|
1
|
+
######################################################################
|
2
|
+
#
|
3
|
+
# Tests for Node core functionality.
|
4
|
+
#
|
5
|
+
######################################################################
|
6
|
+
|
7
|
+
require 'test_helper'
|
18
8
|
|
19
9
|
Chain = C::NodeChain
|
20
10
|
|
21
|
-
|
22
|
-
|
23
|
-
|
11
|
+
#
|
12
|
+
# Some Node classes.
|
13
|
+
#
|
24
14
|
class X < C::Node
|
25
15
|
child :a
|
26
16
|
initializer :a
|
@@ -48,12 +38,11 @@ class V < C::Node
|
|
48
38
|
initializer :a
|
49
39
|
end
|
50
40
|
|
51
|
-
class NodeInitializeTest < Test
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
###
|
41
|
+
class NodeInitializeTest < Minitest::Test
|
42
|
+
|
43
|
+
# ------------------------------------------------------------------
|
44
|
+
# initialize
|
45
|
+
# ------------------------------------------------------------------
|
57
46
|
|
58
47
|
def test_initialize_w
|
59
48
|
w = W.new
|
@@ -92,11 +81,10 @@ class NodeInitializeTest < Test::Unit::TestCase
|
|
92
81
|
assert_same(x2, z.b)
|
93
82
|
end
|
94
83
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
###
|
84
|
+
# ------------------------------------------------------------------
|
85
|
+
# Node.new_at
|
86
|
+
# ------------------------------------------------------------------
|
87
|
+
|
100
88
|
def test_new_at
|
101
89
|
pos = C::Node::Pos.new('somefile', 5, 10)
|
102
90
|
xa = X.new
|
@@ -106,7 +94,7 @@ class NodeInitializeTest < Test::Unit::TestCase
|
|
106
94
|
end
|
107
95
|
end
|
108
96
|
|
109
|
-
class NodeEqualTest < Test
|
97
|
+
class NodeEqualTest < Minitest::Test
|
110
98
|
def str
|
111
99
|
"(struct s){.a = 1, [2] = {3, 4}, .b [5] = 6, 7}"
|
112
100
|
end
|
@@ -120,7 +108,7 @@ class NodeEqualTest < Test::Unit::TestCase
|
|
120
108
|
five = C::IntLiteral.new(5)
|
121
109
|
six = C::IntLiteral.new(6)
|
122
110
|
seven = C::IntLiteral.new(7)
|
123
|
-
|
111
|
+
|
124
112
|
mi0 = C::MemberInit.new(Chain[ma], one)
|
125
113
|
mi10 = C::MemberInit.new(nil, three)
|
126
114
|
mi11 = C::MemberInit.new(nil, four)
|
@@ -134,59 +122,58 @@ class NodeEqualTest < Test::Unit::TestCase
|
|
134
122
|
return c
|
135
123
|
end
|
136
124
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
###
|
125
|
+
# ------------------------------------------------------------------
|
126
|
+
# ==, eql?
|
127
|
+
# ------------------------------------------------------------------
|
128
|
+
|
142
129
|
def test_eq
|
143
|
-
|
130
|
+
# copy should be equal
|
144
131
|
assert_equal(node, node)
|
145
132
|
assert(node.eql?(node))
|
146
133
|
|
147
|
-
|
134
|
+
# change any one field and it should be not_equal
|
148
135
|
n = node
|
149
136
|
n.type = nil
|
150
|
-
|
137
|
+
refute_equal(node, n)
|
151
138
|
assert(!node.eql?(n))
|
152
139
|
|
153
140
|
n = node
|
154
141
|
n.member_inits[0].member[0] = C::Member.new('c')
|
155
|
-
|
142
|
+
refute_equal(node, n)
|
156
143
|
assert(!node.eql?(n))
|
157
144
|
copy = node.dup
|
158
145
|
|
159
146
|
n = node
|
160
147
|
n.member_inits[2].member[1] = C::IntLiteral.new(8)
|
161
|
-
|
148
|
+
refute_equal(node, n)
|
162
149
|
assert(!node.eql?(n))
|
163
150
|
|
164
|
-
|
151
|
+
# add a member's init and it should be not_equal
|
165
152
|
n = node
|
166
153
|
n.member_inits[3].init = C::IntLiteral.new(9)
|
167
|
-
|
154
|
+
refute_equal(node, n)
|
168
155
|
assert(!node.eql?(n))
|
169
156
|
|
170
|
-
|
157
|
+
# change a member's init and it should be not_equal
|
171
158
|
n = node
|
172
159
|
n.member_inits[0].init = C::IntLiteral.new(10)
|
173
|
-
|
160
|
+
refute_equal(node, n)
|
174
161
|
assert(!node.eql?(n))
|
175
162
|
|
176
|
-
|
163
|
+
# add a member specifier and it should be not_equal
|
177
164
|
n = node
|
178
165
|
n.member_inits[3].member = Chain[C::Member.new('d')]
|
179
|
-
|
166
|
+
refute_equal(node, n)
|
180
167
|
assert(!node.eql?(n))
|
181
168
|
|
182
|
-
|
169
|
+
# pop a member and it should be not_equal
|
183
170
|
n = node
|
184
171
|
n.member_inits.pop
|
185
|
-
|
172
|
+
refute_equal(node, n)
|
186
173
|
assert(!node.eql?(n))
|
187
174
|
|
188
|
-
|
189
|
-
|
175
|
+
# assign a field a copy of what's there and it should still be
|
176
|
+
# equal
|
190
177
|
n = node
|
191
178
|
n.member_inits[0].member[0] = C::Member.new('a')
|
192
179
|
assert_equal(node, n)
|
@@ -198,17 +185,16 @@ class NodeEqualTest < Test::Unit::TestCase
|
|
198
185
|
assert(node.eql?(n))
|
199
186
|
end
|
200
187
|
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
###
|
188
|
+
# ------------------------------------------------------------------
|
189
|
+
# hash
|
190
|
+
# ------------------------------------------------------------------
|
191
|
+
|
206
192
|
def test_hash
|
207
|
-
|
193
|
+
# copy should be equal
|
208
194
|
assert_equal(node.hash, node.hash)
|
209
195
|
|
210
|
-
|
211
|
-
|
196
|
+
# should be equal after assigning to a field a copy of what's
|
197
|
+
# there
|
212
198
|
n = node
|
213
199
|
n.member_inits[0].member[0] = C::Member.new('a')
|
214
200
|
assert_equal(node.hash, n.hash)
|
@@ -219,11 +205,9 @@ class NodeEqualTest < Test::Unit::TestCase
|
|
219
205
|
end
|
220
206
|
end
|
221
207
|
|
222
|
-
class NodeCopyTest < Test
|
208
|
+
class NodeCopyTest < Minitest::Test
|
223
209
|
def setup
|
224
|
-
|
225
|
-
|
226
|
-
|
210
|
+
# (struct s){.a = 1, [2] = {3, 4}, .b [5] = 6, 7}
|
227
211
|
|
228
212
|
@c_t_n = 's'
|
229
213
|
@c_t = C::Struct.new(@c_t_n)
|
@@ -273,11 +257,10 @@ class NodeCopyTest < Test::Unit::TestCase
|
|
273
257
|
end
|
274
258
|
attr_accessor :c, :d, :e
|
275
259
|
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
###
|
260
|
+
# ------------------------------------------------------------------
|
261
|
+
# dup, clone
|
262
|
+
# ------------------------------------------------------------------
|
263
|
+
|
281
264
|
def check_node value
|
282
265
|
cres = yield(c)
|
283
266
|
dres = yield(d)
|
@@ -290,20 +273,20 @@ class NodeCopyTest < Test::Unit::TestCase
|
|
290
273
|
assert_same(value, dres)
|
291
274
|
assert_same(value, eres)
|
292
275
|
end
|
293
|
-
|
276
|
+
assert_raises(NoMethodError){dres.new_method}
|
294
277
|
case value.object_id
|
295
278
|
when @c.object_id, @c_mis1_i_mis0.object_id
|
296
279
|
assert_same(100, eres.new_method)
|
297
280
|
else
|
298
|
-
|
281
|
+
assert_raises(NoMethodError){eres.new_method}
|
299
282
|
end
|
300
283
|
end
|
301
284
|
|
302
285
|
def test_copy
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
286
|
+
# each element should be equal, but not the same, except for
|
287
|
+
# immediate values
|
288
|
+
#
|
289
|
+
# (struct s){.a = 1, [2] = {3, 4}, .b [5] = 6, 7}
|
307
290
|
assert_tree(c)
|
308
291
|
assert_tree(d)
|
309
292
|
assert_tree(e)
|
@@ -348,14 +331,14 @@ class NodeCopyTest < Test::Unit::TestCase
|
|
348
331
|
end
|
349
332
|
end
|
350
333
|
|
351
|
-
class NodeWalkTest < Test
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
def yields
|
334
|
+
class NodeWalkTest < Minitest::Test
|
335
|
+
#
|
336
|
+
# Collect and return the args yielded to `node.send(method)' as an
|
337
|
+
# Array, each element of which is an array of args yielded.
|
338
|
+
#
|
339
|
+
# Also, assert that the return value of the method is `exp'.
|
340
|
+
#
|
341
|
+
def yields(method, node, exp)
|
359
342
|
ret = []
|
360
343
|
out = node.send(method) do |*args|
|
361
344
|
ret << args
|
@@ -365,18 +348,18 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
365
348
|
return ret
|
366
349
|
end
|
367
350
|
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
def assert_equal_yields
|
351
|
+
#
|
352
|
+
# Assert exp and out are equal, where elements are compared with
|
353
|
+
# Array#same_list?. That is, exp[i].same_list?(out[i]) for all i.
|
354
|
+
#
|
355
|
+
def assert_equal_yields(exp, out)
|
373
356
|
if exp.zip(out).all?{|a,b| a.same_list?(b)}
|
374
357
|
assert(true)
|
375
358
|
else
|
376
359
|
flunk("walk not equal: #{walk_str(out)} (expected #{walk_str(exp)})")
|
377
360
|
end
|
378
361
|
end
|
379
|
-
def walk_str
|
362
|
+
def walk_str(walk)
|
380
363
|
walk.is_a? ::Array or
|
381
364
|
raise "walk_str: expected ::Array"
|
382
365
|
if walk.empty?
|
@@ -404,17 +387,16 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
404
387
|
end
|
405
388
|
end
|
406
389
|
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
## depth_first
|
390
|
+
# ------------------------------------------------------------------
|
391
|
+
# depth_first, reverse_depth_first
|
392
|
+
# ------------------------------------------------------------------
|
393
|
+
|
394
|
+
def check_depth_firsts(node, exp)
|
395
|
+
# depth_first
|
414
396
|
out = yields(:depth_first, node, node)
|
415
397
|
assert_equal_yields exp, out
|
416
398
|
|
417
|
-
|
399
|
+
# reverse_depth_first
|
418
400
|
exp = exp.reverse.map! do |ev, node|
|
419
401
|
if ev == :ascending
|
420
402
|
[:descending, node]
|
@@ -427,13 +409,13 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
427
409
|
end
|
428
410
|
|
429
411
|
def test_depth_first
|
430
|
-
|
412
|
+
# empty node
|
431
413
|
d = C::Int.new
|
432
414
|
d.longness = 1
|
433
415
|
check_depth_firsts(d,
|
434
416
|
[[:descending, d], [:ascending, d]])
|
435
417
|
|
436
|
-
|
418
|
+
# one-storey -- populate both the list child and nonlist child
|
437
419
|
d = C::Declaration.new(C::Int.new)
|
438
420
|
d.declarators << C::Declarator.new
|
439
421
|
d.declarators[0].name = 'one'
|
@@ -450,7 +432,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
450
432
|
[:ascending, d]
|
451
433
|
])
|
452
434
|
|
453
|
-
|
435
|
+
# multi-layer
|
454
436
|
d.declarators[0].indirect_type = C::Function.new
|
455
437
|
d.declarators[0].indirect_type.params = Chain[]
|
456
438
|
d.declarators[0].indirect_type.params << C::Parameter.new(C::Int.new, 'i')
|
@@ -478,8 +460,8 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
478
460
|
])
|
479
461
|
end
|
480
462
|
|
481
|
-
def check_depth_first_prunes
|
482
|
-
|
463
|
+
def check_depth_first_prunes(pruned_nodes, node, exp)
|
464
|
+
# depth_first
|
483
465
|
out = yields(:depth_first, node, node) do |ev, node|
|
484
466
|
if ev.equal? :descending
|
485
467
|
if pruned_nodes.any?{|n| n.equal? node}
|
@@ -488,7 +470,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
488
470
|
end
|
489
471
|
end
|
490
472
|
assert_equal_yields exp, out
|
491
|
-
|
473
|
+
#
|
492
474
|
ret = catch :prune do
|
493
475
|
node.depth_first do |ev, node|
|
494
476
|
throw :prune, :x if ev.equal? :ascending
|
@@ -497,7 +479,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
497
479
|
end
|
498
480
|
assert_same(:x, ret)
|
499
481
|
|
500
|
-
|
482
|
+
# reverse_depth_first
|
501
483
|
exp = exp.reverse.map! do |ev, node|
|
502
484
|
if ev.equal? :ascending
|
503
485
|
[:descending, node]
|
@@ -513,7 +495,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
513
495
|
end
|
514
496
|
end
|
515
497
|
assert_equal_yields exp, out
|
516
|
-
|
498
|
+
#
|
517
499
|
ret = catch :prune do
|
518
500
|
node.reverse_depth_first do |ev, node|
|
519
501
|
throw :prune, :x if ev.equal? :ascending
|
@@ -524,13 +506,13 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
524
506
|
end
|
525
507
|
|
526
508
|
def test_depth_first_prune
|
527
|
-
|
509
|
+
# empty node
|
528
510
|
d = C::Int.new
|
529
511
|
d.longness = 1
|
530
512
|
check_depth_first_prunes([d], d,
|
531
513
|
[[:descending, d], [:ascending, d]])
|
532
514
|
|
533
|
-
|
515
|
+
# one-storey -- populate both the list child and nonlist child
|
534
516
|
d = C::Declaration.new(C::Int.new)
|
535
517
|
d.declarators << C::Declarator.new
|
536
518
|
d.declarators[0].name = 'one'
|
@@ -544,7 +526,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
544
526
|
[:ascending, d]
|
545
527
|
])
|
546
528
|
|
547
|
-
|
529
|
+
# multi-layer
|
548
530
|
d.type = C::Struct.new('S')
|
549
531
|
d.type.members = Chain[]
|
550
532
|
d.type.members << C::Declaration.new(C::Int.new)
|
@@ -567,13 +549,11 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
567
549
|
])
|
568
550
|
end
|
569
551
|
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
### ----------------------------------------------------------------
|
574
|
-
###
|
552
|
+
# ------------------------------------------------------------------
|
553
|
+
# each, reverse_each
|
554
|
+
# ------------------------------------------------------------------
|
575
555
|
|
576
|
-
def iter_str
|
556
|
+
def iter_str(iter)
|
577
557
|
iter.is_a? ::Array or
|
578
558
|
raise "iter_str: expected ::Array"
|
579
559
|
if iter.empty?
|
@@ -592,7 +572,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
592
572
|
return s.string
|
593
573
|
end
|
594
574
|
end
|
595
|
-
def check_each
|
575
|
+
def check_each(node, exp)
|
596
576
|
exp.map!{|n| [n]}
|
597
577
|
|
598
578
|
out = yields(:each, node, node)
|
@@ -603,34 +583,31 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
603
583
|
assert_equal_yields exp, out
|
604
584
|
end
|
605
585
|
def test_each
|
606
|
-
|
586
|
+
# empty
|
607
587
|
parent = X.new
|
608
588
|
check_each(parent, [])
|
609
589
|
|
610
|
-
|
590
|
+
# one child
|
611
591
|
x1 = X.new
|
612
592
|
parent = X.new(x1)
|
613
593
|
check_each(parent, [x1])
|
614
594
|
|
615
|
-
|
595
|
+
# two children
|
616
596
|
x1, x2 = 2.of{X.new}
|
617
597
|
parent = Y.new(x1, x2)
|
618
598
|
check_each(parent, [x1, x2])
|
619
599
|
|
620
|
-
|
600
|
+
# three with some nil and some fields
|
621
601
|
x1, x2, x3, x4, x5 = 5.of{X.new}
|
622
602
|
parent = Z.new(x1, x2, nil, x4, x5)
|
623
603
|
check_each(parent, [x1, x5])
|
624
604
|
end
|
625
605
|
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
### postorder, reverse_postorder
|
630
|
-
### ----------------------------------------------------------------
|
631
|
-
###
|
606
|
+
# ------------------------------------------------------------------
|
607
|
+
# preorder, reverse_preorder, postorder, reverse_postorder
|
608
|
+
# ------------------------------------------------------------------
|
632
609
|
|
633
|
-
def check_preorder
|
610
|
+
def check_preorder(node, exp)
|
634
611
|
exp.map!{|n| [n]}
|
635
612
|
|
636
613
|
out = yields(:preorder, node, node)
|
@@ -640,7 +617,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
640
617
|
exp.reverse!
|
641
618
|
assert_equal_yields exp, out
|
642
619
|
end
|
643
|
-
def check_postorder
|
620
|
+
def check_postorder(node, exp)
|
644
621
|
exp.map!{|n| [n]}
|
645
622
|
|
646
623
|
out = yields(:postorder, node, node)
|
@@ -651,12 +628,12 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
651
628
|
assert_equal_yields exp, out
|
652
629
|
end
|
653
630
|
def test_preorder
|
654
|
-
|
631
|
+
# empty node
|
655
632
|
d = C::Int.new
|
656
633
|
d.longness = 1
|
657
634
|
check_preorder(d, [d])
|
658
635
|
|
659
|
-
|
636
|
+
# one-storey -- populate both the list child and nonlist child
|
660
637
|
d = C::Declaration.new(C::Int.new)
|
661
638
|
d.declarators << C::Declarator.new
|
662
639
|
d.declarators[0].name = 'one'
|
@@ -671,7 +648,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
671
648
|
d.declarators[1]
|
672
649
|
])
|
673
650
|
|
674
|
-
|
651
|
+
# multi-layer
|
675
652
|
d.declarators[0].indirect_type = C::Function.new
|
676
653
|
d.declarators[0].indirect_type.params = Chain[]
|
677
654
|
d.declarators[0].indirect_type.params << C::Parameter.new(C::Int.new, 'i')
|
@@ -692,12 +669,12 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
692
669
|
])
|
693
670
|
end
|
694
671
|
def test_postorder
|
695
|
-
|
672
|
+
# empty node
|
696
673
|
d = C::Int.new
|
697
674
|
d.longness = 1
|
698
675
|
check_preorder(d, [d])
|
699
676
|
|
700
|
-
|
677
|
+
# one-storey -- populate both the list child and nonlist child
|
701
678
|
d = C::Declaration.new(C::Int.new)
|
702
679
|
d.declarators << C::Declarator.new
|
703
680
|
d.declarators[0].name = 'one'
|
@@ -712,7 +689,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
712
689
|
d
|
713
690
|
])
|
714
691
|
|
715
|
-
|
692
|
+
# multi-layer
|
716
693
|
d.declarators[0].indirect_type = C::Function.new
|
717
694
|
d.declarators[0].indirect_type.params = Chain[]
|
718
695
|
d.declarators[0].indirect_type.params << C::Parameter.new(C::Int.new, 'i')
|
@@ -732,7 +709,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
732
709
|
d
|
733
710
|
])
|
734
711
|
end
|
735
|
-
def check_preorder_prune
|
712
|
+
def check_preorder_prune(method, pruned_nodes, root, exp)
|
736
713
|
exp.map!{|n| [n]}
|
737
714
|
|
738
715
|
out = yields(method, root, root) do |node|
|
@@ -744,13 +721,13 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
744
721
|
end
|
745
722
|
|
746
723
|
def test_preorder_prune
|
747
|
-
|
724
|
+
# empty node
|
748
725
|
d = C::Int.new
|
749
726
|
d.longness = 1
|
750
727
|
check_preorder_prune(:preorder, [d], d, [d])
|
751
728
|
check_preorder_prune(:reverse_preorder, [d], d, [d])
|
752
729
|
|
753
|
-
|
730
|
+
# one-storey -- populate both the list child and nonlist child
|
754
731
|
d = C::Declaration.new(C::Int.new)
|
755
732
|
d.declarators << C::Declarator.new
|
756
733
|
d.declarators[0].name = 'one'
|
@@ -769,7 +746,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
769
746
|
d.type,
|
770
747
|
])
|
771
748
|
|
772
|
-
|
749
|
+
# multi-layer
|
773
750
|
d.type = C::Struct.new('S')
|
774
751
|
d.type.members = Chain[]
|
775
752
|
d.type.members << C::Declaration.new(C::Int.new)
|
@@ -798,14 +775,12 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
798
775
|
])
|
799
776
|
end
|
800
777
|
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
### ----------------------------------------------------------------
|
805
|
-
###
|
778
|
+
# ------------------------------------------------------------------
|
779
|
+
# next, prev, list_next, list_prev
|
780
|
+
# ------------------------------------------------------------------
|
806
781
|
|
807
782
|
def test_next_prev
|
808
|
-
|
783
|
+
# list parent
|
809
784
|
i1 = C::Int.new
|
810
785
|
i2 = C::Int.new
|
811
786
|
list = Chain[i1, i2]
|
@@ -814,7 +789,7 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
814
789
|
assert_same(i1, i2.prev)
|
815
790
|
assert_nil(i1.prev)
|
816
791
|
|
817
|
-
|
792
|
+
# node parent
|
818
793
|
i1 = C::IntLiteral.new(1)
|
819
794
|
i2 = C::IntLiteral.new(2)
|
820
795
|
a = C::Add.new(i1, i2)
|
@@ -823,14 +798,14 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
823
798
|
assert_same(i1, i2.prev)
|
824
799
|
assert_nil(i1.prev)
|
825
800
|
|
826
|
-
|
801
|
+
# no parent
|
827
802
|
i = C::Int.new
|
828
|
-
|
829
|
-
|
803
|
+
assert_raises(C::Node::NoParent){i.next}
|
804
|
+
assert_raises(C::Node::NoParent){i.prev}
|
830
805
|
end
|
831
806
|
|
832
807
|
def test_list_next_prev
|
833
|
-
|
808
|
+
# list parent
|
834
809
|
i1 = C::Int.new
|
835
810
|
i2 = C::Int.new
|
836
811
|
list = Chain[i1, i2]
|
@@ -839,28 +814,28 @@ class NodeWalkTest < Test::Unit::TestCase
|
|
839
814
|
assert_same(i1, i2.list_prev)
|
840
815
|
assert_nil(i1.list_prev)
|
841
816
|
|
842
|
-
|
817
|
+
# node parent
|
843
818
|
i1 = C::IntLiteral.new(1)
|
844
819
|
i2 = C::IntLiteral.new(2)
|
845
820
|
a = C::Add.new(i1, i2)
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
821
|
+
assert_raises(C::Node::BadParent){i1.list_next}
|
822
|
+
assert_raises(C::Node::BadParent){i2.list_next}
|
823
|
+
assert_raises(C::Node::BadParent){i1.list_prev}
|
824
|
+
assert_raises(C::Node::BadParent){i2.list_prev}
|
850
825
|
|
851
|
-
|
826
|
+
# no parent
|
852
827
|
i = C::Int.new
|
853
|
-
|
854
|
-
|
828
|
+
assert_raises(C::Node::NoParent){i.list_next}
|
829
|
+
assert_raises(C::Node::NoParent){i.list_prev}
|
855
830
|
end
|
856
831
|
end
|
857
832
|
|
858
|
-
class NodeTreeTest < Test
|
833
|
+
class NodeTreeTest < Minitest::Test
|
859
834
|
def setup
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
835
|
+
# @c = "(int){[1] = 10,
|
836
|
+
# .x = 20,
|
837
|
+
# [2] .y = 30
|
838
|
+
# }
|
864
839
|
@c = C::CompoundLiteral.new
|
865
840
|
c.type = C::Int.new
|
866
841
|
c.member_inits << C::MemberInit.new
|
@@ -978,26 +953,26 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
978
953
|
assert_tree(mi)
|
979
954
|
assert_same_list([mi1, mi2, mis[1], mis[2]], c.member_inits)
|
980
955
|
|
981
|
-
|
956
|
+
assert_raises(C::Node::NoParent){mi.replace_with(nil)}
|
982
957
|
i1 = C::Int.new
|
983
958
|
i2 = C::Int.new
|
984
|
-
|
959
|
+
assert_raises(ArgumentError){c.type.replace_with(i1, i2)}
|
985
960
|
end
|
986
961
|
|
987
962
|
def test_node_swap_with
|
988
|
-
|
963
|
+
# swap with itself -- attached
|
989
964
|
x = X.new
|
990
965
|
parent = X.new(x)
|
991
966
|
assert_same(x, x.swap_with(x))
|
992
967
|
assert_same(parent, x.parent)
|
993
968
|
assert_same(x, parent.a)
|
994
969
|
|
995
|
-
|
970
|
+
# swap with itself -- detached
|
996
971
|
x = X.new
|
997
972
|
assert_same(x, x.swap_with(x))
|
998
973
|
assert_nil(x.parent)
|
999
974
|
|
1000
|
-
|
975
|
+
# both attached
|
1001
976
|
x = X.new
|
1002
977
|
y = X.new
|
1003
978
|
xp = X.new(x)
|
@@ -1008,7 +983,7 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1008
983
|
assert_same(yp, x.parent)
|
1009
984
|
assert_same(y, xp.a)
|
1010
985
|
|
1011
|
-
|
986
|
+
# only receiver attached
|
1012
987
|
x = X.new
|
1013
988
|
y = X.new
|
1014
989
|
xp = X.new(x)
|
@@ -1017,7 +992,7 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1017
992
|
assert_same(xp, y.parent)
|
1018
993
|
assert_same(y, xp.a)
|
1019
994
|
|
1020
|
-
|
995
|
+
# only arg attached
|
1021
996
|
x = X.new
|
1022
997
|
y = X.new
|
1023
998
|
yp = X.new(y)
|
@@ -1026,7 +1001,7 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1026
1001
|
assert_same(x, yp.a)
|
1027
1002
|
assert_nil(y.parent)
|
1028
1003
|
|
1029
|
-
|
1004
|
+
# neither attached
|
1030
1005
|
x = X.new
|
1031
1006
|
y = X.new
|
1032
1007
|
assert_same(x, x.swap_with(y))
|
@@ -1034,16 +1009,15 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1034
1009
|
assert_nil(y.parent)
|
1035
1010
|
end
|
1036
1011
|
|
1037
|
-
|
1038
|
-
|
1039
|
-
|
1040
|
-
|
1041
|
-
###
|
1012
|
+
# ------------------------------------------------------------------
|
1013
|
+
# insert_next, insert_prev
|
1014
|
+
# ------------------------------------------------------------------
|
1015
|
+
|
1042
1016
|
def test_node_insert_next_detached
|
1043
1017
|
x1, x2 = 2.of{X.new}
|
1044
|
-
|
1018
|
+
assert_raises(C::Node::NoParent){x1.insert_next}
|
1045
1019
|
assert_nil(x1.parent)
|
1046
|
-
|
1020
|
+
assert_raises(C::Node::NoParent){x1.insert_next(x2)}
|
1047
1021
|
assert_nil(x1.parent)
|
1048
1022
|
assert_nil(x2.parent)
|
1049
1023
|
end
|
@@ -1051,9 +1025,9 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1051
1025
|
parent = X.new
|
1052
1026
|
x1, x2 = 2.of{X.new}
|
1053
1027
|
parent.a = x1
|
1054
|
-
|
1028
|
+
assert_raises(C::Node::BadParent){x1.insert_next}
|
1055
1029
|
assert_same(parent, x1.parent)
|
1056
|
-
|
1030
|
+
assert_raises(C::Node::BadParent){x1.insert_next(x2)}
|
1057
1031
|
assert_same(parent, x1.parent)
|
1058
1032
|
assert_nil(x2.parent)
|
1059
1033
|
end
|
@@ -1072,9 +1046,9 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1072
1046
|
|
1073
1047
|
def test_node_insert_prev_detached
|
1074
1048
|
a1, a2 = 2.of{X.new}
|
1075
|
-
|
1049
|
+
assert_raises(C::Node::NoParent){a1.insert_prev}
|
1076
1050
|
assert_nil(a1.parent)
|
1077
|
-
|
1051
|
+
assert_raises(C::Node::NoParent){a1.insert_prev(a2)}
|
1078
1052
|
assert_nil(a1.parent)
|
1079
1053
|
assert_nil(a2.parent)
|
1080
1054
|
end
|
@@ -1082,9 +1056,9 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1082
1056
|
parent = X.new
|
1083
1057
|
x1, x2 = 2.of{X.new}
|
1084
1058
|
parent.a = x1
|
1085
|
-
|
1059
|
+
assert_raises(C::Node::BadParent){x1.insert_prev}
|
1086
1060
|
assert_same(parent, x1.parent)
|
1087
|
-
|
1061
|
+
assert_raises(C::Node::BadParent){x1.insert_prev(x2)}
|
1088
1062
|
assert_same(parent, x1.parent)
|
1089
1063
|
assert_nil(x2.parent)
|
1090
1064
|
end
|
@@ -1101,33 +1075,31 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1101
1075
|
assert_same_list([x2, x3, x4, x1], parent)
|
1102
1076
|
end
|
1103
1077
|
|
1104
|
-
|
1105
|
-
|
1106
|
-
|
1107
|
-
### ----------------------------------------------------------------
|
1108
|
-
###
|
1078
|
+
# ------------------------------------------------------------------
|
1079
|
+
# node_after, node_before
|
1080
|
+
# ------------------------------------------------------------------
|
1109
1081
|
|
1110
1082
|
def test_node_after_before
|
1111
|
-
|
1083
|
+
# node not a child
|
1112
1084
|
x1, x2 = 2.of{X.new}
|
1113
1085
|
parent = X.new(x1)
|
1114
|
-
|
1115
|
-
|
1086
|
+
assert_raises(ArgumentError){parent.node_after(x2)}
|
1087
|
+
assert_raises(ArgumentError){parent.node_before(x2)}
|
1116
1088
|
|
1117
1089
|
x1, x2 = 2.of{X.new}
|
1118
1090
|
parent = Z.new(nil, x1, nil, x2, nil)
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1091
|
+
assert_raises(ArgumentError){parent.node_after(x1)}
|
1092
|
+
assert_raises(ArgumentError){parent.node_after(x2)}
|
1093
|
+
assert_raises(ArgumentError){parent.node_before(x1)}
|
1094
|
+
assert_raises(ArgumentError){parent.node_before(x2)}
|
1123
1095
|
|
1124
|
-
|
1096
|
+
# one child
|
1125
1097
|
x = X.new
|
1126
1098
|
parent = X.new(x)
|
1127
1099
|
assert_nil(parent.node_after(x))
|
1128
1100
|
assert_nil(parent.node_before(x))
|
1129
1101
|
|
1130
|
-
|
1102
|
+
# two children
|
1131
1103
|
x1 = X.new
|
1132
1104
|
x2 = X.new
|
1133
1105
|
parent = Y.new(x1, x2)
|
@@ -1136,7 +1108,7 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1136
1108
|
assert_same(x1, parent.node_before(x2))
|
1137
1109
|
assert_nil(parent.node_before(x1))
|
1138
1110
|
|
1139
|
-
|
1111
|
+
# skip over stuff in the middle
|
1140
1112
|
x1, x2, x3, x4, x5 = 5.of{X.new}
|
1141
1113
|
parent = Z.new(x1, x2, nil, x4, x5)
|
1142
1114
|
assert_same(x5, parent.node_after(x1))
|
@@ -1144,7 +1116,7 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1144
1116
|
assert_same(x1, parent.node_before(x5))
|
1145
1117
|
assert_nil(parent.node_before(x1))
|
1146
1118
|
|
1147
|
-
|
1119
|
+
# skip over stuff at the end
|
1148
1120
|
x1, x2, x3, x4, x5 = 5.of{X.new}
|
1149
1121
|
parent = Z.new(nil, x2, x3, x4, nil)
|
1150
1122
|
assert_nil(parent.node_after(x3))
|
@@ -1152,20 +1124,20 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1152
1124
|
end
|
1153
1125
|
|
1154
1126
|
def test_remove_node
|
1155
|
-
|
1127
|
+
# node not a child
|
1156
1128
|
x1, x2, x3 = 3.of{X.new}
|
1157
1129
|
parent = Z.new(x1, x2)
|
1158
|
-
|
1159
|
-
|
1130
|
+
assert_raises(ArgumentError){parent.remove_node(x2)}
|
1131
|
+
assert_raises(ArgumentError){parent.remove_node(x3)}
|
1160
1132
|
|
1161
|
-
|
1133
|
+
# one child
|
1162
1134
|
x = X.new
|
1163
1135
|
parent = X.new(x)
|
1164
1136
|
assert_same(parent, parent.remove_node(x))
|
1165
1137
|
assert_tree(parent)
|
1166
1138
|
assert_tree(x)
|
1167
1139
|
|
1168
|
-
|
1140
|
+
# two children
|
1169
1141
|
x1, x2 = 2.of{X.new}
|
1170
1142
|
parent = Y.new(x1, x2)
|
1171
1143
|
assert_same(parent, parent.remove_node(x2))
|
@@ -1176,13 +1148,13 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1176
1148
|
end
|
1177
1149
|
|
1178
1150
|
def test_replace_node
|
1179
|
-
|
1151
|
+
# node not a child
|
1180
1152
|
x1, x2, x3, x4 = 3.of{X.new}
|
1181
1153
|
parent = Z.new(x1, x2)
|
1182
|
-
|
1183
|
-
|
1154
|
+
assert_raises(ArgumentError){parent.replace_node(x2, x4)}
|
1155
|
+
assert_raises(ArgumentError){parent.replace_node(x3, x4)}
|
1184
1156
|
|
1185
|
-
|
1157
|
+
# no newnode
|
1186
1158
|
x = X.new
|
1187
1159
|
parent = X.new(x)
|
1188
1160
|
assert_same(parent, parent.replace_node(x))
|
@@ -1190,32 +1162,32 @@ class NodeTreeTest < Test::Unit::TestCase
|
|
1190
1162
|
assert_tree(x)
|
1191
1163
|
assert_nil(parent.a)
|
1192
1164
|
|
1193
|
-
|
1165
|
+
# >1 newnode
|
1194
1166
|
x1, x2, x3 = 3.of{X.new}
|
1195
1167
|
parent = X.new(x1)
|
1196
|
-
|
1168
|
+
assert_raises(ArgumentError){parent.replace_node(x1, x2, x3)}
|
1197
1169
|
|
1198
|
-
|
1170
|
+
# one child
|
1199
1171
|
x1, x2 = 2.of{X.new}
|
1200
1172
|
parent = X.new(x1)
|
1201
1173
|
assert_same(parent, parent.replace_node(x1, x2))
|
1202
1174
|
assert_tree(parent)
|
1203
1175
|
assert_tree(x1)
|
1204
1176
|
assert_same(x2, parent.a)
|
1205
|
-
|
1177
|
+
#
|
1206
1178
|
assert_same(parent, parent.replace_node(x2, nil))
|
1207
1179
|
assert_tree(parent)
|
1208
1180
|
assert_tree(x2)
|
1209
1181
|
assert_nil(parent.a)
|
1210
1182
|
|
1211
|
-
|
1183
|
+
# two children
|
1212
1184
|
x1, x2, x3 = 3.of{X.new}
|
1213
1185
|
parent = Y.new(x1, x2)
|
1214
1186
|
assert_same(parent, parent.replace_node(x2, x3))
|
1215
1187
|
assert_tree(parent)
|
1216
1188
|
assert_tree(x2)
|
1217
1189
|
assert_same(x3, parent.b)
|
1218
|
-
|
1190
|
+
#
|
1219
1191
|
assert_same(parent, parent.replace_node(x3, nil))
|
1220
1192
|
assert_tree(parent)
|
1221
1193
|
assert_tree(x3)
|