1+ "
2+ SUnit tests for CTKeyedTree
3+ "
4+ Class {
5+ #name : #CTKeyedTreeTest ,
6+ #superclass : #TestCase ,
7+ #instVars : [
8+ ' tree' ,
9+ ' firstLevelOneSubTree'
10+ ],
11+ #category : ' Containers-KeyedTree-Tests'
12+ }
13+
14+ { #category : #running }
15+ CTKeyedTreeTest >> setUp [
16+ super setUp.
17+ firstLevelOneSubTree := CTKeyedTree new
18+ at: #two put: ' One-Two' ;
19+ at: #three put: ' One-Three' ;
20+ yourself .
21+ tree := CTKeyedTree new
22+ at: 1 put: firstLevelOneSubTree;
23+ at: 2 put: ' Two' ;
24+ yourself
25+ ]
26+
27+ { #category : #' tests - operation' }
28+ CTKeyedTreeTest >> t13 [
29+ ^ CTKeyedTree new
30+ at: 1 put: ' 1-3-1' ;
31+ at: 2 put: ' 1-3-2' ;
32+ yourself
33+ ]
34+
35+ { #category : #' tests - operation' }
36+ CTKeyedTreeTest >> t2 [
37+ ^ CTKeyedTree new
38+ at: 1 put: ' 1-1' ;
39+ at: 2 put: ' 1-2' ;
40+ at: 3 put: (self t13);
41+ yourself
42+ ]
43+
44+ { #category : #' tests - operation' }
45+ CTKeyedTreeTest >> t2AB [
46+ ^ CTKeyedTree new
47+ at: 1 put: ' 1-1' ;
48+ at: 2 put: ' 1-2' ;
49+ at: 3 put: (self tAB);
50+ yourself
51+ ]
52+
53+ { #category : #' tests - operation' }
54+ CTKeyedTreeTest >> tAB [
55+ ^ CTKeyedTree new
56+ at: #A put: ' 1-3-1' ;
57+ at: #B put: ' 1-3-2' ;
58+ yourself
59+ ]
60+
61+ { #category : #' tests - operation' }
62+ CTKeyedTreeTest >> testAllKeys [
63+ self assert: self t13 allKeys asArray equals: #(1 2) .
64+ self assert: self t2AB allKeys asArray equals: #(1 2 3 #A #B) .
65+ ]
66+
67+ { #category : #' tests - operation' }
68+ CTKeyedTreeTest >> testAllKeysEmptyTree [
69+ | emptyTree |
70+ emptyTree := CTKeyedTree new .
71+ self assert: emptyTree allKeys isEmpty.
72+ ]
73+
74+ { #category : #' tests - at' }
75+ CTKeyedTreeTest >> testAtPath [
76+ self assert: (tree atPath: #(1) ) equals: firstLevelOneSubTree.
77+ self assert: (tree atPath: #(1 two) ) equals: ' One-Two' .
78+ self assert: (tree atPath: #(1 three) ) equals: ' One-Three' .
79+ self assert: (tree atPath: #(2) ) equals: ' Two' .
80+ self should: [ tree atPath: #(2 4) ] raise: self defaultTestError.
81+ self should: [ tree atPath: #(1 two three) ] raise: self defaultTestError.
82+ self should: [ tree atPath: #(3) ] raise: self defaultTestError.
83+ ]
84+
85+ { #category : #' tests - at' }
86+ CTKeyedTreeTest >> testAtPathEmpty [
87+ | emptyTree |
88+ emptyTree := CTKeyedTree new .
89+ self should: [ emptyTree atPath: #(1) ] raise: self defaultTestError.
90+ ]
91+
92+ { #category : #tests }
93+ CTKeyedTreeTest >> testAtPathIfAbsent [
94+ " Test accessing elements using a path with an ifAbsent: block."
95+
96+ self assert: (tree atPath: #(1) ifAbsent: [ #missing ]) equals: firstLevelOneSubTree.
97+ self assert: (tree atPath: #(1 two) ifAbsent: [ #missing ]) equals: ' One-Two' .
98+ self assert: (tree atPath: #(1 three) ifAbsent: [ #missing ]) equals: ' One-Three' .
99+ self assert: (tree atPath: #(2) ifAbsent: [ #missing ]) equals: ' Two' .
100+ self assert: (tree atPath: #(2 4) ifAbsent: [ #missing ]) equals: #missing .
101+ self assert: (tree atPath: #(1 two three) ifAbsent: [ #missing ]) equals: #missing .
102+ self assert: (tree atPath: #(3) ifAbsent: [ #missing ]) equals: #missing
103+ ]
104+
105+ { #category : #' tests - at' }
106+ CTKeyedTreeTest >> testAtPathIfAbsentPut [
107+ self assert: (tree atPath: #(1) ifAbsentPut: [ #new ]) equals: firstLevelOneSubTree.
108+ self assert: (tree atPath: #(1 two) ifAbsentPut: [ #new ]) equals: ' One-Two' .
109+ self assert: (tree atPath: #(1 three) ifAbsentPut: [ #new ]) equals: ' One-Three' .
110+ self assert: (tree atPath: #(2) ifAbsentPut: [ #new ]) equals: ' Two' .
111+ self assert: (tree atPath: #(1 four one) ifAbsentPut: [ #anotherNew ]) equals: #anotherNew .
112+ self assert: (tree atPath: #(1 four one) ) equals: #anotherNew .
113+ self assert: (tree atPath: #(3) ifAbsentPut: [ #yetAnotherNew ]) equals: #yetAnotherNew .
114+ self assert: (tree atPath: #(3) ) equals: #yetAnotherNew .
115+ self should: [ tree atPath: #(2 4) ifAbsentPut: [ #new ] ] raise: self defaultTestError.
116+ ]
117+
118+ { #category : #' tests - at' }
119+ CTKeyedTreeTest >> testAtPathPut [
120+ self assert: (tree atPath: #(1 two) put: #new ) equals: #new .
121+ self assert: (tree atPath: #(1 two) ) equals: #new .
122+ self assert: (tree atPath: #(1 three) put: (firstLevelOneSubTree := CTKeyedTree new )) equals: firstLevelOneSubTree.
123+ self assert: (tree atPath: #(1 three $1) put: #anotherNew ) equals: #anotherNew .
124+ self assert: (tree atPath: #(1 three $1) ) equals: #anotherNew .
125+ self assert: (tree atPath: #(1 four one) put: #anotherNew ) equals: #anotherNew .
126+ self assert: (tree atPath: #(1 four one) ) equals: #anotherNew .
127+ self should: [ tree atPath: #(2 4) put: [ #new ] ] raise: self defaultTestError.
128+ ]
129+
130+ { #category : #' tests - copying' }
131+ CTKeyedTreeTest >> testCopy [
132+ | c t2 t3 |
133+ tree := CTKeyedTree new
134+ at: 1 put: (t2 := CTKeyedTree new
135+ at: #two put: ' One-Two' ;
136+ at: #three put: ' One-Three' ;
137+ at: #four put: (t3 := CTKeyedTree new );
138+ yourself );
139+ at: 2 put: ' Two' ;
140+ yourself .
141+ c := tree copy.
142+ self assert: c = tree.
143+ self deny: c == tree.
144+ self assert: (c at: 1 ) = t2.
145+ self deny: (c at: 1 ) == t2.
146+ self assert: (c atPath: #(1 four) ) = t3.
147+ self deny: (c atPath: #(1 four) ) == t3.
148+ ]
149+
150+ { #category : #' tests - operation' }
151+ CTKeyedTreeTest >> testFormattedText [
152+ self assert: self t13 formattedText equals:
153+ ' 1 : ' ' 1-3-1' '
154+ 2 : ' ' 1-3-2' '
155+ ' .
156+ self assert: self t2AB formattedText equals:
157+ ' 1 : ' ' 1-1' '
158+ 2 : ' ' 1-2' '
159+ 3
160+ #A : ' ' 1-3-1' '
161+ #B : ' ' 1-3-2' '
162+ ' .
163+ ]
164+
165+ { #category : #' tests - operation' }
166+ CTKeyedTreeTest >> testMerge [
167+ | t1 t2 t13 m subT1 subt11 wrapSubt11 |
168+ t13 := self t13.
169+ subT1 := self t2.
170+ subt11 := CTKeyedTree new
171+ at: 1 put: ' 1-1-1' ;
172+ at: 2 put: ' 1-1-2' ;
173+ yourself .
174+ wrapSubt11 := CTKeyedTree new
175+ at: 1 put: subt11;
176+ at: 2 put: ' 1-2*' ;
177+ yourself .
178+ t1 := CTKeyedTree new
179+ at: 1 put: subT1;
180+ at: 2 put: ' 2' ;
181+ yourself .
182+ t2 := CTKeyedTree new
183+ at: 1 put: wrapSubt11;
184+ at: 3 put: ' 3' ;
185+ yourself .
186+ m := t1 merge: t2.
187+ self assert: (m at: 2 ) equals: ' 2' .
188+ self assert: (m at: 3 ) equals: ' 3' .
189+ self assert: (m atPath: #(1 2) ) equals: ' 1-2*' .
190+ self assert: (m atPath: #(1 1 1) ) equals: ' 1-1-1' .
191+ self assert: (m atPath: #(1 1 2) ) equals: ' 1-1-2' .
192+ self assert: (m atPath: #(1 3 1) ) equals: ' 1-3-1' .
193+ self assert: (m atPath: #(1 3 2) ) equals: ' 1-3-2' .
194+ ]
195+
196+ { #category : #' tests - copying' }
197+ CTKeyedTreeTest >> testPostCopy [
198+ | original copy subTree |
199+ original := CTKeyedTree new
200+ at: 1 put: (subTree := CTKeyedTree new at: #a put: ' A' ; yourself );
201+ at: 2 put: ' B' ;
202+ yourself .
203+ copy := original copy.
204+ " Modify the copy and ensure the original is unaffected"
205+ (copy at: 1 ) at: #a put: ' Modified' .
206+ self assert: (copy atPath: #(1 a) ) equals: ' Modified' .
207+ self assert: (original atPath: #(1 a) ) equals: ' A' .
208+ self deny: (copy at: 1 ) == subTree.
209+ ]
210+
211+ { #category : #tests }
212+ CTKeyedTreeTest >> testPutFormattedTextOnLevelIndentString [
213+ " Test formatted text output with a custom indent string."
214+
215+ | stream |
216+ stream := String new writeStream.
217+ tree putFormattedTextOn: stream level: 1 indentString: ' >>' .
218+ self
219+ assert: stream contents
220+ equals:
221+ ' >>1
222+ >> #three : ' ' One-Three' '
223+ >> #two : ' ' One-Two' '
224+ >>2 : ' ' Two' '
225+ '
226+ ]
227+
228+ { #category : #' tests - removing' }
229+ CTKeyedTreeTest >> testRemovePath [
230+ self should: [ tree removePath: #(4) ] raise: self defaultTestError.
231+ self should: [ tree removePath: #(1 one) ] raise: self defaultTestError.
232+ self assert: (tree removePath: #(1 two) ) equals: ' One-Two' .
233+ self assert: (tree atPath: #(1 two) ifAbsent: [ #missing ]) equals: #missing .
234+ self assert: (tree removePath: #(2) ) equals: ' Two' .
235+ self assert: (tree atPath: #(2) ifAbsent: [ #missing ]) equals: #missing .
236+ ]
237+
238+ { #category : #' tests - removing' }
239+ CTKeyedTreeTest >> testRemovePathIfAbsent [
240+ self assert: (tree removePath: #(4) ifAbsent: [ #none ]) equals: #none .
241+ self assert: (tree removePath: #(1 2 3 4) ifAbsent: [ #none ]) equals: #none .
242+ self assert: (tree removePath: #(1 two) ifAbsent: [ #none ]) equals: ' One-Two' .
243+ self assert: (tree atPath: #(1 two) ifAbsent: [ #missing ]) equals: #missing .
244+ self assert: (tree removePath: #(2) ifAbsent: [ #none ]) equals: ' Two' .
245+ self assert: (tree atPath: #(2) ifAbsent: [ #missing ]) equals: #missing .
246+ ]
247+
248+ { #category : #tests }
249+ CTKeyedTreeTest >> testSortBlock [
250+ " Test the sort block for keys."
251+
252+ | treeWithMixedKeys sortedKeys |
253+ treeWithMixedKeys := CTKeyedTree new
254+ at: 2 put: ' Two' ;
255+ at: #a put: ' A' ;
256+ at: 1 put: ' One' ;
257+ yourself .
258+ sortedKeys := treeWithMixedKeys keys asSortedCollection: treeWithMixedKeys sortBlock.
259+ self assert: sortedKeys asArray equals: #(#a 1 2)
260+ ]
261+
262+ { #category : #' tests - operation' }
263+ CTKeyedTreeTest >> testSubtrees [
264+ | t1 t2 t3 t4 |
265+ t2 := self t2.
266+ t3 := self t13.
267+ t1 := CTKeyedTree new
268+ at: 1 put: t2;
269+ at: 2 put: ' 2' ;
270+ at: 3 put: (t4 := self t13);
271+ yourself .
272+ self assert: t1 subtrees equals: {t2. t4}.
273+ self assert: (t1 at: 1 ) subtrees equals: {t3}.
274+ ]
275+
276+ { #category : #' tests - operation' }
277+ CTKeyedTreeTest >> testSubtreesEmpty [
278+ | emptyTree |
279+ emptyTree := CTKeyedTree new .
280+ self assert: emptyTree subtrees isEmpty.
281+ ]
0 commit comments