11"
2- A CTBinarySearchTreeTest is a test class for testing the behavior of CTBinarySearchTree
2+ I test the Binary Search Tree implementation (CTBinarySearchTree).
3+
4+ I verify correctness of all tree operations including insertion, deletion, search, traversals, and collection protocol methods. I test edge cases like empty trees, single nodes, and complex removal scenarios.
5+
6+ I ensure the BST maintains its ordering property and handles duplicates correctly.
37"
48Class {
59 #name : ' CTBinarySearchTreeTest' ,
@@ -20,9 +24,8 @@ CTBinarySearchTreeTest >> setUp [
2024{ #category : ' tests' }
2125CTBinarySearchTreeTest >> testAddMultipleElements [
2226
23- tree add: 50 .
24- tree add: 30 .
25- tree add: 70 .
27+ tree addAll: #(50 30 70) .
28+
2629 self assert: tree size equals: 3
2730]
2831
@@ -34,13 +37,163 @@ CTBinarySearchTreeTest >> testAddSingleElement [
3437 self assert: tree size equals: 1
3538]
3639
40+ { #category : ' tests' }
41+ CTBinarySearchTreeTest >> testAsArray [
42+
43+
44+ | result |
45+ tree addAll: #(50 30 70 20 40) .
46+
47+ result := tree asArray.
48+ self assert: result equals: #(20 30 40 50 70)
49+ ]
50+
51+ { #category : ' tests' }
52+ CTBinarySearchTreeTest >> testBSTValidation [
53+
54+ | emptyTree |
55+ emptyTree := CTBinarySearchTree new .
56+ self assert: emptyTree validateBSTProperty.
57+
58+ tree addAll: #(50 30 70 20 40) .
59+ self assert: tree validateBSTProperty.
60+
61+ " Test after removal"
62+ tree remove: 30 .
63+ self assert: tree validateBSTProperty
64+ ]
65+
66+ { #category : ' tests' }
67+ CTBinarySearchTreeTest >> testClear [
68+
69+ tree addAll: #(1 2 3 4 5) .
70+ tree clear.
71+
72+ self assert: tree isEmpty.
73+ self assert: tree size equals: 0
74+ ]
75+
76+ { #category : ' tests' }
77+ CTBinarySearchTreeTest >> testCollectionMethods [
78+
79+ | doubled evens found |
80+ tree addAll: #(50 30 70 20 40) .
81+
82+
83+ doubled := tree collect: [ :each | each * 2 ].
84+ self assert: doubled asArray equals: #(40 60 80 100 140) .
85+
86+ evens := tree select: [ :each | each even ].
87+ self assert: evens asArray equals: #(20 30 40 50 70) .
88+
89+ found := tree detect: [ :each | each > 45 ] ifNone: [ nil ].
90+ self assert: found equals: 50 .
91+
92+ self assert: (tree anySatisfy: [ :each | each > 60 ]).
93+ self deny: (tree anySatisfy: [ :each | each > 100 ])
94+ ]
95+
96+ { #category : ' tests' }
97+ CTBinarySearchTreeTest >> testCopy [
98+
99+ | copiedTree |
100+ tree addAll: #(50 30 70) .
101+ copiedTree := tree copy.
102+
103+ self assert: copiedTree size equals: tree size.
104+ self assert: copiedTree asArray equals: tree asArray.
105+
106+ copiedTree add: 99 .
107+ self deny: (tree includes: 99 ).
108+ self assert: (copiedTree includes: 99 )
109+ ]
110+
111+ { #category : ' tests' }
112+ CTBinarySearchTreeTest >> testDoMethod [
113+
114+ | result |
115+ tree addAll: #(50 30 70 20 40) .
116+
117+ result := OrderedCollection new .
118+ tree do: [ :each | result add: each ].
119+
120+ self assert: result asArray equals: #(20 30 40 50 70)
121+ ]
122+
123+ { #category : ' tests' }
124+ CTBinarySearchTreeTest >> testDuplicateHandling [
125+
126+ tree addAll: #( 42 42 50 ) .
127+
128+ self assert: tree size equals: 2 .
129+
130+ self assert: (tree includes: 42 ).
131+ self assert: (tree includes: 50 )
132+ ]
133+
134+ { #category : ' tests' }
135+ CTBinarySearchTreeTest >> testElementsGreaterThan [
136+
137+ | result |
138+ tree addAll: #(50 30 70 20 40 60 80) .
139+
140+ result := tree elementsGreaterThan: 45 .
141+ self assert: result asArray equals: #(50 60 70 80) .
142+
143+ result := tree elementsGreaterThan: 80 .
144+ self assert: result isEmpty.
145+
146+ result := tree elementsGreaterThan: 10 .
147+ self assert: result asArray equals: #(20 30 40 50 60 70 80)
148+ ]
149+
150+ { #category : ' tests' }
151+ CTBinarySearchTreeTest >> testElementsLessThan [
152+
153+ | result |
154+ tree addAll: #(50 30 70 20 40 60 80) .
155+
156+ result := tree elementsLessThan: 45 .
157+ self assert: result asArray equals: #(20 30 40) .
158+
159+ result := tree elementsLessThan: 20 .
160+ self assert: result isEmpty.
161+
162+ result := tree elementsLessThan: 90 .
163+ self assert: result asArray equals: #(20 30 40 50 60 70 80)
164+ ]
165+
37166{ #category : ' tests' }
38167CTBinarySearchTreeTest >> testEmpty [
39168
40169 self assert: tree isEmpty.
41170 self assert: tree size equals: 0
42171]
43172
173+ { #category : ' tests' }
174+ CTBinarySearchTreeTest >> testEmptyTreeOperations [
175+
176+ | result |
177+ self assert: tree isEmpty.
178+ self assert: tree findMin isNil.
179+ self assert: tree findMax isNil.
180+ self deny: (tree includes: 42 ).
181+
182+ result := tree collect: [ :each | each * 2 ].
183+ self assert: result isEmpty.
184+
185+ self deny: (tree anySatisfy: [ :each | true ])
186+ ]
187+
188+ { #category : ' tests' }
189+ CTBinarySearchTreeTest >> testFindMinMax [
190+
191+ tree addAll: #(50 30 70 20 80) .
192+
193+ self assert: tree findMin equals: 20 .
194+ self assert: tree findMax equals: 80
195+ ]
196+
44197{ #category : ' tests' }
45198CTBinarySearchTreeTest >> testHeight [
46199
@@ -49,39 +202,31 @@ CTBinarySearchTreeTest >> testHeight [
49202 tree add: 50 .
50203 self assert: tree height equals: 1 .
51204
52- tree add: 30 .
53- self assert: tree height equals: 2 .
54-
55- tree add: 70 .
205+ tree addAll: #(30 70) .
56206 self assert: tree height equals: 2
57207]
58208
59209{ #category : ' tests' }
60210CTBinarySearchTreeTest >> testInOrderTraversal [
61211
62- | result |
63- tree add: 50 .
64- tree add: 30 .
65- tree add: 70 .
66- tree add: 20 .
67- tree add: 40 .
68-
212+ | result |
213+ tree addAll: #(50 30 70 20 40) .
214+
69215 result := OrderedCollection new .
70216 tree inOrderDo: [ :each | result add: each ].
71- self assert: result asArray equals: #( 20 30 40 50 70 )
217+
218+ self assert: result asArray equals: #(20 30 40 50 70)
72219]
73220
74221{ #category : ' tests' }
75222CTBinarySearchTreeTest >> testIncludes [
76223
77- tree add: 50 .
78- tree add: 30 .
79- tree add: 70 .
224+ tree addAll: #(50 30 70 20 40) .
80225
81226 self assert: (tree includes: 50 ).
82227 self assert: (tree includes: 30 ).
83- self assert : (tree includes: 70 ).
84- self deny: (tree includes: 99 )
228+ self deny : (tree includes: 99 ).
229+ self deny: (tree includes: 25 )
85230]
86231
87232{ #category : ' tests' }
@@ -94,3 +239,147 @@ CTBinarySearchTreeTest >> testIsLeaf [
94239 self deny: tree root isLeaf.
95240 self assert: tree root left isLeaf
96241]
242+
243+ { #category : ' tests' }
244+ CTBinarySearchTreeTest >> testNegativeNumbersTree [
245+
246+ | result |
247+ tree addAll: #(-10 -5 0 5 10) .
248+
249+ self assert: tree findMin equals: - 10 .
250+ self assert: tree findMax equals: 10 .
251+ result := tree asArray.
252+ self assert: result equals: #(-10 -5 0 5 10)
253+ ]
254+
255+ { #category : ' tests' }
256+ CTBinarySearchTreeTest >> testPostOrderTraversal [
257+
258+ | result |
259+ tree addAll: #( 50 30 70 20 ) .
260+
261+ result := OrderedCollection new .
262+ tree postOrderDo: [ :each | result add: each ].
263+
264+ self assert: result last equals: 50 .
265+ self assert: result asArray equals: #( 20 30 70 50 )
266+ ]
267+
268+ { #category : ' tests' }
269+ CTBinarySearchTreeTest >> testPreOrderTraversal [
270+
271+ | result |
272+ tree addAll: #( 50 30 70 20 ) .
273+
274+ result := OrderedCollection new .
275+ tree preOrderDo: [ :each | result add: each ].
276+ self assert: result first equals: 50 .
277+ self assert: result asArray equals: #(50 30 20 70)
278+ ]
279+
280+ { #category : ' tests' }
281+ CTBinarySearchTreeTest >> testPredecessorSuccessorWithNonExistentElement [
282+
283+ tree addAll: #( 50 30 70 20 40 60 80 ) .
284+
285+ self assert: (tree predecessorOf: 35 ) equals: 30 .
286+ self assert: (tree successorOf: 35 ) equals: 40
287+ ]
288+
289+ { #category : ' tests' }
290+ CTBinarySearchTreeTest >> testPredecessors [
291+
292+ tree addAll: #( 50 30 70 20 40 60 80 ) .
293+
294+ self assert: (tree predecessorOf: 50 ) equals: 40 .
295+ self assert: (tree predecessorOf: 30 ) equals: 20 .
296+ self assert: (tree predecessorOf: 20 ) isNil
297+ ]
298+
299+ { #category : ' tests' }
300+ CTBinarySearchTreeTest >> testRangeQuery [
301+
302+ | result temp |
303+ tree addAll: #( 50 30 70 20 40 60 80 ) .
304+
305+ result := tree elementsFrom: 35 to: 65 .
306+ temp := result asArray.
307+ self assert: result size equals: 3 .
308+ self assert: temp equals: #(40 50 60) .
309+
310+ " Test edge cases"
311+ result := tree elementsFrom: 10 to: 15 .
312+ self assert: result isEmpty.
313+
314+ result := tree elementsFrom: 15 to: 5 . " Invalid range"
315+ self assert: result isEmpty
316+ ]
317+
318+ { #category : ' tests' }
319+ CTBinarySearchTreeTest >> testRemoveLeafNode [
320+
321+ tree addAll: #(50 30 70 20) .
322+
323+ tree remove: 20 .
324+ self assert: tree size equals: 3 .
325+ self deny: (tree includes: 20 )
326+ ]
327+
328+ { #category : ' tests' }
329+ CTBinarySearchTreeTest >> testRemoveNodeWithOneChild [
330+
331+ tree addAll: #( 50 30 20 ) .
332+
333+ tree remove: 30 .
334+ self assert: tree size equals: 2 .
335+ self deny: (tree includes: 30 ).
336+ self assert: (tree includes: 20 )
337+ ]
338+
339+ { #category : ' tests' }
340+ CTBinarySearchTreeTest >> testRemoveNodeWithTwoChildren [
341+
342+ tree addAll: #(50 30 70 20 40) .
343+
344+ tree remove: 30 .
345+ self assert: tree size equals: 4 .
346+ self deny: (tree includes: 30 )
347+ ]
348+
349+ { #category : ' tests' }
350+ CTBinarySearchTreeTest >> testRemoveNonExistentElement [
351+
352+ | result |
353+
354+ tree addAll: #(50 30 70) .
355+ result := tree remove: 99 ifAbsent: [ #notFound ].
356+ self assert: result equals: #notFound .
357+ self assert: tree size equals: 3 .
358+
359+ self should: [ tree remove: 99 ] raise: Error
360+ ]
361+
362+ { #category : ' tests' }
363+ CTBinarySearchTreeTest >> testRemoveRoot [
364+ " Root with no children"
365+ tree add: 50 .
366+ tree remove: 50 .
367+ self assert: tree isEmpty.
368+
369+ " Root with two children"
370+ tree clear.
371+ tree addAll: #(50 30 70 20 40 60 80) .
372+ tree remove: 50 .
373+ self assert: tree size equals: 6 .
374+ self deny: (tree includes: 50 ).
375+ ]
376+
377+ { #category : ' tests' }
378+ CTBinarySearchTreeTest >> testSuccessors [
379+
380+ tree addAll: #(50 30 70 20 40 60 80) .
381+
382+ self assert: (tree successorOf: 50 ) equals: 60 .
383+ self assert: (tree successorOf: 70 ) equals: 80 .
384+ self assert: (tree successorOf: 80 ) isNil.
385+ ]
0 commit comments