Skip to content

Commit 5e5b9a5

Browse files
committed
Add remaining utility methods & comprehensive edge case testing
1 parent e2e737b commit 5e5b9a5

2 files changed

Lines changed: 165 additions & 0 deletions

File tree

src/Containers-AVL-Tree-Tests/CTAVLTreeTest.class.st

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,35 @@ CTAVLTreeTest >> testCollect [
7676
self assert: doubled asArray equals: #(40 60 80 100 140)
7777
]
7878

79+
{ #category : 'tests' }
80+
CTAVLTreeTest >> testComplexRotations [
81+
82+
"Test more complex rotation scenarios"
83+
tree addAll: #(50 30 70 20 40 60 80 10).
84+
self assert: tree validate.
85+
86+
"Add more elements to trigger multiple rotations"
87+
tree addAll: #(5 15 25 35 45).
88+
self assert: tree validate.
89+
90+
"Height should remain logarithmic"
91+
self assert: tree height <= 5
92+
]
93+
94+
{ #category : 'tests' }
95+
CTAVLTreeTest >> testCopy [
96+
97+
| copiedTree |
98+
tree addAll: #(50 30 70).
99+
copiedTree := tree copy.
100+
101+
self assert: copiedTree size equals: tree size.
102+
self assert: copiedTree asArray equals: tree asArray.
103+
copiedTree add: 99.
104+
self deny: (tree includes: 99).
105+
self assert: (copiedTree includes: 99)
106+
]
107+
79108
{ #category : 'tests' }
80109
CTAVLTreeTest >> testDetect [
81110

@@ -159,6 +188,16 @@ CTAVLTreeTest >> testEmpty [
159188
self assert: tree height equals: 0
160189
]
161190

191+
{ #category : 'tests' }
192+
CTAVLTreeTest >> testEmptyTreeOperations [
193+
194+
self assert: tree findMin isNil.
195+
self assert: tree findMax isNil.
196+
self deny: (tree includes: 42).
197+
198+
self deny: (tree anySatisfy: [ :each | true ])
199+
]
200+
162201
{ #category : 'tests' }
163202
CTAVLTreeTest >> testFindMinMax [
164203

@@ -199,6 +238,18 @@ CTAVLTreeTest >> testHeight [
199238
self assert: tree height equals: 2
200239
]
201240

241+
{ #category : 'tests' }
242+
CTAVLTreeTest >> testIfEmptyIfNotEmpty [
243+
244+
| result |
245+
result := tree ifEmpty: [ #empty ].
246+
self assert: result equals: #empty.
247+
248+
tree add: 42.
249+
result := tree ifNotEmpty: [ :t | #notEmpty ].
250+
self assert: result equals: #notEmpty
251+
]
252+
202253
{ #category : 'tests' }
203254
CTAVLTreeTest >> testInOrderTraversal [
204255

@@ -221,6 +272,17 @@ CTAVLTreeTest >> testIncludes [
221272
self deny: (tree includes: 99)
222273
]
223274

275+
{ #category : 'tests' }
276+
CTAVLTreeTest >> testIsLeaf [
277+
278+
tree add: 50.
279+
self assert: tree root isLeaf.
280+
281+
tree add: 30.
282+
self deny: tree root isLeaf.
283+
self assert: tree root left isLeaf
284+
]
285+
224286
{ #category : 'tests' }
225287
CTAVLTreeTest >> testLLRotation [
226288

@@ -243,6 +305,27 @@ CTAVLTreeTest >> testLRRotation [
243305
self assert: tree asArray equals: #(1 2 3)
244306
]
245307

308+
{ #category : 'tests' }
309+
CTAVLTreeTest >> testNegativeNumbers [
310+
311+
tree addAll: #(-10 -5 0 5 10).
312+
313+
self assert: tree findMin equals: -10.
314+
self assert: tree findMax equals: 10.
315+
self assert: tree asArray equals: #(-10 -5 0 5 10).
316+
self assert: tree validate
317+
]
318+
319+
{ #category : 'tests' }
320+
CTAVLTreeTest >> testParentChildRelationships [
321+
322+
tree addAll: #(50 30 70 20 40).
323+
324+
self assert: tree root parent isNil.
325+
self assert: tree root left parent equals: tree root.
326+
self assert: tree root right parent equals: tree root
327+
]
328+
246329
{ #category : 'tests' }
247330
CTAVLTreeTest >> testPostOrderTraversal [
248331

@@ -300,6 +383,31 @@ CTAVLTreeTest >> testRRRotation [
300383
self assert: tree asArray equals: #(1 2 3)
301384
]
302385

386+
{ #category : 'tests' }
387+
CTAVLTreeTest >> testRemovalCausingRebalancing [
388+
389+
tree addAll: #(50 30 70 20 40 60 80 10 25).
390+
391+
"Remove elements that should trigger rebalancing"
392+
tree remove: 10.
393+
tree remove: 20.
394+
tree remove: 25.
395+
396+
self assert: tree validate
397+
]
398+
399+
{ #category : 'tests' }
400+
CTAVLTreeTest >> testRemoveAll [
401+
402+
tree addAll: #(50 30 70 20 40).
403+
tree removeAll: #(30 70).
404+
405+
self assert: tree size equals: 3.
406+
self deny: (tree includes: 30).
407+
self deny: (tree includes: 70).
408+
self assert: tree validate
409+
]
410+
303411
{ #category : 'tests' }
304412
CTAVLTreeTest >> testRemoveLeafNode [
305413

@@ -355,6 +463,18 @@ CTAVLTreeTest >> testRemoveRoot [
355463
self assert: tree validate
356464
]
357465

466+
{ #category : 'tests' }
467+
CTAVLTreeTest >> testReverseInsertions [
468+
469+
15 to: 1 by: -1 do: [ :i |
470+
tree add: i.
471+
self assert: tree validate
472+
].
473+
474+
self assert: tree height <= 5.
475+
self assert: tree asArray equals: (1 to: 15) asArray
476+
]
477+
358478
{ #category : 'tests' }
359479
CTAVLTreeTest >> testSelect [
360480

@@ -365,6 +485,19 @@ CTAVLTreeTest >> testSelect [
365485
self assert: evens asArray equals: #(20 30 40 50 70)
366486
]
367487

488+
{ #category : 'tests' }
489+
CTAVLTreeTest >> testSequentialInsertions [
490+
491+
"Test inserting elements in order (worst case for unbalanced BST)"
492+
1 to: 15 do: [ :i |
493+
tree add: i.
494+
self assert: tree validate
495+
].
496+
497+
"Height should remain logarithmic"
498+
self assert: tree height <= 5
499+
]
500+
368501
{ #category : 'tests' }
369502
CTAVLTreeTest >> testValidation [
370503

src/Containers-AVL-Tree/CTAVLTree.class.st

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,15 @@ CTAVLTree >> collect: aBlock [
8787
^ result
8888
]
8989

90+
{ #category : 'copying' }
91+
CTAVLTree >> copy [
92+
93+
| newTree |
94+
newTree := self class new.
95+
self inOrderDo: [ :each | newTree add: each ].
96+
^ newTree
97+
]
98+
9099
{ #category : 'enumerating' }
91100
CTAVLTree >> detect: aBlock ifNone: absentBlock [
92101

@@ -175,6 +184,22 @@ CTAVLTree >> height [
175184
^ root height
176185
]
177186

187+
{ #category : 'testing' }
188+
CTAVLTree >> ifEmpty: aBlock [
189+
190+
^ self isEmpty
191+
ifTrue: [ aBlock value ]
192+
ifFalse: [ self ]
193+
]
194+
195+
{ #category : 'testing' }
196+
CTAVLTree >> ifNotEmpty: aBlock [
197+
198+
^ self isEmpty
199+
ifFalse: [ aBlock value: self ]
200+
ifTrue: [ self ]
201+
]
202+
178203
{ #category : 'enumerating' }
179204
CTAVLTree >> inOrderDo: aBlock [
180205

@@ -241,6 +266,13 @@ CTAVLTree >> remove: anObject ifAbsent: aBlock [
241266
^ anObject
242267
]
243268

269+
{ #category : 'removing' }
270+
CTAVLTree >> removeAll: aCollection [
271+
272+
aCollection do: [ :each | self remove: each ifAbsent: [ ] ].
273+
^ aCollection
274+
]
275+
244276
{ #category : 'accessing' }
245277
CTAVLTree >> root [
246278

0 commit comments

Comments
 (0)