1//
2//  ANTLRCommonTreeTest.m
3//  ANTLR
4//
5//  Created by Ian Michell on 26/05/2010.
6//  Copyright 2010 Ian Michell. All rights reserved.
7//
8
9#import "ANTLRBaseTree.h"
10#import "ANTLRCommonTreeTest.h"
11#import "ANTLRStringStream.h"
12#import "ANTLRCommonTree.h"
13#import "ANTLRCommonToken.h"
14#import "ANTLRError.h"
15#import "ANTLRRuntimeException.h"
16
17@implementation ANTLRCommonTreeTest
18
19-(void) test01InitAndRelease
20{
21	ANTLRCommonTree *tree = [ANTLRCommonTree newTree];
22	STAssertNotNil(tree, @"Tree was nil");
23	// FIXME: It doesn't do anything else, perhaps initWithTree should set something somewhere, java says no though...
24    return;
25}
26
27-(void) test02InitWithTree
28{
29	ANTLRCommonTree *tree = [ANTLRCommonTree newTree];
30	STAssertNotNil(tree, @"Tree was nil");
31    if (tree != nil)
32        STAssertEquals([tree getType], (NSInteger)ANTLRTokenTypeInvalid, @"Tree should have an invalid token type, because it has no token");
33    // [tree release];
34    return;
35}
36
37-(void) test03WithToken
38{
39	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
40	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
41	token.line = 1;
42	token.charPositionInLine = 4;
43	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
44	STAssertNotNil(tree, @"Tree was nil");
45    if (tree != nil)
46        STAssertNotNil(tree.token, @"Tree with token was nil");
47    if (tree != nil && tree.token != nil) {
48        STAssertEquals((NSUInteger) tree.token.line, (NSUInteger)1, [NSString stringWithFormat:@"Tree should be at line 1, but was at %d", tree.token.line] );
49        STAssertEquals((NSUInteger) tree.token.charPositionInLine, (NSUInteger)4, [NSString stringWithFormat:@"Char position should be 1, but was at %d", tree.token.charPositionInLine]);
50        STAssertNotNil(((ANTLRCommonToken *)tree.token).text, @"Tree with token with text was nil");
51    }
52    if (tree != nil && tree.token != nil && tree.token.text != nil)
53        STAssertTrue([tree.token.text isEqualToString:@"||"], @"Text was not ||");
54	//[tree release];
55    return;
56}
57
58-(void) test04InvalidTreeNode
59{
60	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:[ANTLRCommonToken invalidToken]];
61	STAssertNotNil(tree, @"Tree was nil");
62	STAssertEquals(tree.token.type, (NSInteger)ANTLRTokenTypeInvalid, @"Tree Token type was not ANTLRTokenTypeInvalid");
63	//[tree release];
64    return;
65}
66
67-(void) test05InitWithCommonTreeNode
68{
69	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
70	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
71	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
72	STAssertNotNil(tree, @"Tree was nil");
73	STAssertNotNil(tree.token, @"Tree token was nil");
74	ANTLRCommonTree *newTree = [ANTLRCommonTree newTreeWithTree:tree];
75	STAssertNotNil(newTree, @"New tree was nil");
76	STAssertNotNil(newTree.token, @"New tree token was nil");
77	STAssertEquals(newTree.token, tree.token, @"Tokens did not match");
78	STAssertEquals(newTree.startIndex, tree.startIndex, @"Token start index did not match %d:%d", newTree.startIndex, tree.startIndex);
79	STAssertEquals(newTree.stopIndex, tree.stopIndex, @"Token stop index did not match %d:%d", newTree.stopIndex, tree.stopIndex);
80	//[stream release];
81	//[tree release];
82	//[newTree release];
83	//[token release];
84    return;
85}
86
87-(void) test06CopyTree
88{
89	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
90	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
91	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
92	STAssertNotNil(tree, @"Tree was nil");
93	ANTLRCommonTree *newTree = (ANTLRCommonTree *)[tree copyWithZone:nil];
94	STAssertTrue([newTree isKindOfClass:[ANTLRCommonTree class]], @"Copied tree was not an ANTLRCommonTree");
95	STAssertNotNil(newTree, @"New tree was nil");
96	// STAssertEquals(newTree.token, tree.token, @"Tokens did not match");
97	STAssertEquals(newTree.stopIndex, tree.stopIndex, @"Token stop index did not match");
98	STAssertEquals(newTree.startIndex, tree.startIndex, @"Token start index did not match");
99	//[stream release];
100	//[tree release];
101	//[newTree release];
102	// [token release];
103    return;
104}
105
106-(void) test07Description
107{
108    NSString *aString;
109	ANTLRCommonTree *errorTree = [ANTLRCommonTree invalidNode];
110	STAssertNotNil(errorTree, @"Error tree node is nil");
111    if (errorTree != nil) {
112        aString = [errorTree description];
113        STAssertNotNil( aString, @"errorTree description returned nil");
114        if (aString != nil)
115            STAssertTrue([aString isEqualToString:@"<errornode>"], @"Not a valid error node description %@", aString);
116    }
117	//[errorTree release];
118
119	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
120	STAssertNotNil(tree, @"Tree is nil");
121    if (tree != nil)
122        STAssertNil([tree description], @"Tree description was not nil, was: %@", [tree description]);
123	//[tree release];
124
125	tree = [ANTLRCommonTree newTree];
126	STAssertNotNil(tree, @"Tree is nil");
127    if (tree != nil) {
128        aString = [tree description];
129        STAssertNotNil(aString, @"tree description returned nil");
130        if (aString != nil)
131            STAssertTrue([aString isEqualToString:@"nil"], @"Tree description was not empty", [tree description]);
132    }
133	//[tree release];
134
135	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
136	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
137	tree = [ANTLRCommonTree newTreeWithToken:token];
138	STAssertNotNil(tree, @"Tree node is nil");
139    aString = [tree description];
140    STAssertNotNil(aString, @"tree description returned nil");
141    if (aString != nil)
142        STAssertTrue([aString isEqualToString:@"||"], @"description was not || was instead %@", [tree description]);
143	//[tree release];
144    return;
145}
146
147-(void) test08Text
148{
149	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
150	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
151	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
152	STAssertNotNil(tree, @"Tree was nil");
153	STAssertTrue([tree.token.text isEqualToString:@"||"], @"Tree text was not valid, should have been || was %@", tree.token.text);
154	//[tree release];
155
156	// test nil (for line coverage)
157	tree = [ANTLRCommonTree newTree];
158	STAssertNotNil(tree, @"Tree was nil");
159	STAssertNil(tree.token.text, @"Tree text was not nil: %@", tree.token.text);
160    return;
161}
162
163-(void) test09AddChild
164{
165	// Create a new tree
166	ANTLRCommonTree *parent = [ANTLRCommonTree newTreeWithTokenType:555];
167    parent.token.line = 1;
168	parent.token.charPositionInLine = 1;
169
170	// Child tree
171	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
172	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
173	token.line = 1;
174	token.charPositionInLine = 4;
175	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
176
177	// Add a child to the parent tree
178	[parent addChild:tree];
179
180
181	STAssertNotNil(parent, @"parent was nil");
182    if (parent != nil)
183        STAssertNotNil(parent.token, @"parent was nil");
184	STAssertEquals((NSInteger)parent.token.line, (NSInteger)1, @"Tree should be at line 1 but is %d", parent.token.line);
185	STAssertEquals((NSInteger)parent.token.charPositionInLine, (NSInteger)1, @"Char position should be 1 but is %d", parent.token.charPositionInLine);
186
187	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)1, @"There should be 1 child but there were %d", [parent getChildCount]);
188	STAssertEquals((NSInteger)[[parent getChild:0] getChildIndex], (NSInteger)0, @"Child index should be 0 was : %d", [[parent getChild:0] getChildIndex]);
189	STAssertEquals([[parent getChild:0] getParent], parent, @"Parent not set for child");
190
191	//[parent release];
192    return;
193}
194
195-(void) test10AddChildren
196{
197	// Create a new tree
198	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
199
200	// Child tree
201	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
202	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
203	token.line = 1;
204	token.charPositionInLine = 4;
205	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
206
207	// Add a child to the parent tree
208	[parent addChild: tree];
209
210	ANTLRCommonTree *newParent = [ANTLRCommonTree newTree];
211	[newParent addChildren:parent.children];
212
213	STAssertEquals([newParent getChild:0], [parent getChild:0], @"Children did not match");
214    return;
215}
216
217-(void) test11AddSelfAsChild
218{
219	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
220	@try
221	{
222		[parent addChild:parent];
223	}
224	@catch (NSException *e)
225	{
226		STAssertTrue([[e name] isEqualToString:@"ANTLRIllegalArgumentException"], @"Got wrong kind of exception! %@", [e name]);
227		//[parent release];
228		return;
229	}
230	STFail(@"Did not get an exception when adding an empty child!");
231    return;
232}
233
234-(void) test12AddEmptyChildWithNoChildren
235{
236	ANTLRCommonTree *emptyChild = [ANTLRCommonTree newTree];
237	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
238	[parent addChild:emptyChild];
239	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)0, @"There were supposed to be no children!");
240	//[parent release];
241	//[emptyChild release];
242    return;
243}
244
245-(void) test13AddEmptyChildWithChildren
246{
247	// Create a new tree
248	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
249
250	// Child tree
251	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
252	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
253	token.line = 1;
254	token.charPositionInLine = 4;
255	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
256
257	// Add a child to the parent tree
258	[parent addChild: tree];
259
260	ANTLRCommonTree *newParent = [ANTLRCommonTree newTree];
261	[newParent addChild:parent];
262
263	STAssertEquals((NSInteger)[newParent getChildCount], (NSInteger)1, @"Parent should only have 1 child: %d", [newParent getChildCount]);
264	STAssertEquals([newParent getChild:0], tree, @"Child was not the correct object.");
265	//[parent release];
266	//[newParent release];
267	//[tree release];
268    return;
269}
270
271-(void) test14ChildAtIndex
272{
273	// Create a new tree
274	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
275
276	// Child tree
277	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
278	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
279	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
280
281	// Add a child to the parent tree
282	[parent addChild: tree];
283
284	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)1, @"There were either no children or more than 1: %d", [parent getChildCount]);
285
286	ANTLRCommonTree *child = [parent getChild:0];
287	STAssertNotNil(child, @"Child at index 0 should not be nil");
288	STAssertEquals(child, tree, @"Child and Original tree were not the same");
289	//[parent release];
290    return;
291}
292
293-(void) test15SetChildAtIndex
294{
295	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
296
297	// Child tree
298	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
299	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
300	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
301
302
303	tree = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
304	tree.token.text = @"<UP>";
305	[parent addChild:tree];
306
307	STAssertTrue([parent getChild:0] == tree, @"Trees don't match");
308	[parent setChild:0 With:tree];
309
310	ANTLRCommonTree *child = [parent getChild:0];
311	STAssertTrue([parent getChildCount] == 1, @"There were either no children or more than 1: %d", [parent getChildCount]);
312	STAssertNotNil(child, @"Child at index 0 should not be nil");
313	STAssertEquals(child, tree, @"Child and Original tree were not the same");
314	//[parent release];
315    return;
316}
317
318-(void) test16GetAncestor
319{
320	ANTLRCommonTree *parent = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
321	parent.token.text = @"<UP>";
322
323	ANTLRCommonTree *down = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
324	down.token.text = @"<DOWN>";
325
326	[parent addChild:down];
327
328	// Child tree
329	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
330	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
331	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
332
333	[down addChild:tree];
334	STAssertTrue([tree hasAncestor:ANTLRTokenTypeUP], @"Should have an ancestor of type ANTLRTokenTypeUP");
335
336	ANTLRCommonTree *ancestor = [tree getAncestor:ANTLRTokenTypeUP];
337	STAssertNotNil(ancestor, @"Ancestor should not be nil");
338	STAssertEquals(ancestor, parent, @"Acenstors do not match");
339	//[parent release];
340    return;
341}
342
343-(void) test17FirstChildWithType
344{
345	// Create a new tree
346	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
347
348	ANTLRCommonTree *up = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
349	ANTLRCommonTree *down = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
350
351	[parent addChild:up];
352	[parent addChild:down];
353
354	ANTLRCommonTree *found = (ANTLRCommonTree *)[parent getFirstChildWithType:ANTLRTokenTypeDOWN];
355	STAssertNotNil(found, @"Child with type DOWN should not be nil");
356    if (found != nil) {
357        STAssertNotNil(found.token, @"Child token with type DOWN should not be nil");
358        if (found.token != nil)
359            STAssertEquals((NSInteger)found.token.type, (NSInteger)ANTLRTokenTypeDOWN, @"Token type was not correct, should be down!");
360    }
361	found = (ANTLRCommonTree *)[parent getFirstChildWithType:ANTLRTokenTypeUP];
362	STAssertNotNil(found, @"Child with type UP should not be nil");
363    if (found != nil) {
364        STAssertNotNil(found.token, @"Child token with type UP should not be nil");
365        if (found.token != nil)
366            STAssertEquals((NSInteger)found.token.type, (NSInteger)ANTLRTokenTypeUP, @"Token type was not correct, should be up!");
367    }
368	//[parent release];
369    return;
370}
371
372-(void) test18SanityCheckParentAndChildIndexesForParentTree
373{
374	// Child tree
375	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
376	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
377	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
378
379	ANTLRCommonTree *parent = [ANTLRCommonTree newTreeWithTokenType:555];
380	STAssertNotNil(tree, @"tree should not be nil");
381	@try
382	{
383		[tree sanityCheckParentAndChildIndexes];
384	}
385	@catch (NSException * e)
386	{
387		STFail(@"Exception was thrown and this is not what's right...");
388	}
389
390	BOOL passed = NO;
391	@try
392	{
393		[tree sanityCheckParentAndChildIndexes:parent At:0];
394	}
395	@catch (NSException * e)
396	{
397		STAssertTrue([[e name] isEqualToString:@"ANTLRIllegalStateException"], @"Exception was not an ANTLRIllegalStateException but was %@", [e name]);
398		passed = YES;
399	}
400	if (!passed)
401	{
402		STFail(@"An exception should have been thrown");
403	}
404
405	STAssertNotNil(parent, @"parent should not be nil");
406	[parent addChild:tree];
407	@try
408	{
409		[tree sanityCheckParentAndChildIndexes:parent At:0];
410	}
411	@catch (NSException * e)
412	{
413		STFail(@"No exception should have been thrown!");
414	}
415    return;
416}
417
418-(void) test19DeleteChild
419{
420	// Child tree
421	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
422	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
423	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
424
425	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
426	[parent addChild:tree];
427
428	ANTLRCommonTree *deletedChild = [parent deleteChild:0];
429	STAssertEquals(deletedChild, tree, @"Children do not match!");
430	STAssertEquals((NSInteger)[parent getChildCount], (NSInteger)0, @"Child count should be zero!");
431    return;
432}
433
434-(void) test20TreeDescriptions
435{
436	// Child tree
437	ANTLRStringStream *stream = [ANTLRStringStream newANTLRStringStream:@"this||is||a||double||piped||separated||csv"];
438	ANTLRCommonToken *token = [ANTLRCommonToken newToken:stream Type:555 Channel:ANTLRTokenChannelDefault Start:4 Stop:5];
439	ANTLRCommonTree *tree = [ANTLRCommonTree newTreeWithToken:token];
440
441	// Description for tree
442	NSString *treeDesc = [tree treeDescription];
443    STAssertNotNil(treeDesc, @"Tree description should not be nil");
444    STAssertTrue([treeDesc isEqualToString:@"||"], @"Tree description was not || but rather %@", treeDesc);
445
446	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
447	STAssertTrue([[parent treeDescription] isEqualToString:@"nil"], @"Tree description was not nil was %@", [parent treeDescription]);
448	[parent addChild:tree];
449	treeDesc = [parent treeDescription];
450	STAssertTrue([treeDesc isEqualToString:@"||"], @"Tree description was not || but was: %@", treeDesc);
451
452	// Test non empty parent
453	ANTLRCommonTree *down = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
454	down.token.text = @"<DOWN>";
455
456	[tree addChild:down];
457	treeDesc = [parent treeDescription];
458	STAssertTrue([treeDesc isEqualToString:@"(|| <DOWN>)"], @"Tree description was wrong expected (|| <DOWN>) but got: %@", treeDesc);
459    return;
460}
461
462-(void) test21ReplaceChildrenAtIndexWithNoChildren
463{
464	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
465	ANTLRCommonTree *parent2 = [ANTLRCommonTree newTree];
466	ANTLRCommonTree *child = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
467	child.token.text = @"<DOWN>";
468	[parent2 addChild:child];
469	@try
470	{
471		[parent replaceChildrenFrom:1 To:2 With:parent2];
472	}
473	@catch (NSException *ex)
474	{
475		STAssertTrue([[ex name] isEqualToString:@"ANTLRIllegalArgumentException"], @"Expected an illegal argument exception... Got instead: %@", [ex name]);
476		return;
477	}
478	STFail(@"Exception was not thrown when I tried to replace a child on a parent with no children");
479    return;
480}
481
482-(void) test22ReplaceChildrenAtIndex
483{
484	ANTLRCommonTree *parent1 = [ANTLRCommonTree newTree];
485	ANTLRCommonTree *child1 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
486	[parent1 addChild:child1];
487	ANTLRCommonTree *parent2 = [ANTLRCommonTree newTree];
488	ANTLRCommonTree *child2 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
489	child2.token.text = @"<DOWN>";
490	[parent2 addChild:child2];
491
492	[parent2 replaceChildrenFrom:0 To:0 With:parent1];
493
494	STAssertEquals([parent2 getChild:0], child1, @"Child for parent 2 should have been from parent 1");
495    return;
496}
497
498-(void) test23ReplaceChildrenAtIndexWithChild
499{
500	ANTLRCommonTree *replacement = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
501	replacement.token.text = @"<UP>";
502	ANTLRCommonTree *parent = [ANTLRCommonTree newTree];
503	ANTLRCommonTree *child = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
504	child.token.text = @"<DOWN>";
505	[parent addChild:child];
506
507	[parent replaceChildrenFrom:0 To:0 With:replacement];
508
509	STAssertTrue([parent getChild:0] == replacement, @"Children do not match");
510    return;
511}
512
513-(void) test24ReplacechildrenAtIndexWithLessChildren
514{
515	ANTLRCommonTree *parent1 = [ANTLRCommonTree newTree];
516	ANTLRCommonTree *child1 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
517	[parent1 addChild:child1];
518
519	ANTLRCommonTree *parent2 = [ANTLRCommonTree newTree];
520
521	ANTLRCommonTree *child2 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeEOF];
522	[parent2 addChild:child2];
523
524	ANTLRCommonTree *child3 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
525	child2.token.text = @"<DOWN>";
526	[parent2 addChild:child3];
527
528	[parent2 replaceChildrenFrom:0 To:1 With:parent1];
529	STAssertEquals((NSInteger)[parent2 getChildCount], (NSInteger)1, @"Should have one child but has %d", [parent2 getChildCount]);
530	STAssertEquals([parent2 getChild:0], child1, @"Child for parent 2 should have been from parent 1");
531    return;
532}
533
534-(void) test25ReplacechildrenAtIndexWithMoreChildren
535{
536	ANTLRCommonTree *parent1 = [ANTLRCommonTree newTree];
537	ANTLRCommonTree *child1 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeUP];
538	[parent1 addChild:child1];
539	ANTLRCommonTree *child2 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeEOF];
540	[parent1 addChild:child2];
541
542	ANTLRCommonTree *parent2 = [ANTLRCommonTree newTree];
543
544	ANTLRCommonTree *child3 = [ANTLRCommonTree newTreeWithTokenType:ANTLRTokenTypeDOWN];
545	child2.token.text = @"<DOWN>";
546	[parent2 addChild:child3];
547
548	[parent2 replaceChildrenFrom:0 To:0 With:parent1];
549	STAssertEquals((NSInteger)[parent2 getChildCount], (NSInteger)2, @"Should have one child but has %d", [parent2 getChildCount]);
550	STAssertEquals([parent2 getChild:0], child1, @"Child for parent 2 should have been from parent 1");
551	STAssertEquals([parent2 getChild:1], child2, @"An extra child (child2) should be in the children collection");
552    return;
553}
554
555@end
556