Skip to content

Commit 5959c3c

Browse files
committed
Added conversion & iteration methods with tests
1 parent e5242e2 commit 5959c3c

File tree

2 files changed

+204
-0
lines changed

2 files changed

+204
-0
lines changed

src/Containers-Stack-Tests/CTStackTest.class.st

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,28 @@ CTStackTest >> testAlternatingPushPop [
2828
self assert: stack size equals: 2
2929
]
3030

31+
{ #category : 'tests' }
32+
CTStackTest >> testAsArray [
33+
34+
| result |
35+
stack push: 'first'; push: 'second'; push: 'third'.
36+
result := stack asArray.
37+
38+
self assert: result equals: #('third' 'second' 'first').
39+
"Elements from top to bottom"
40+
]
41+
42+
{ #category : 'tests' }
43+
CTStackTest >> testAsOrderedCollection [
44+
45+
| result |
46+
stack push: 'a'; push: 'b'; push: 'c'.
47+
result := stack asOrderedCollection.
48+
49+
self assert: result class equals: OrderedCollection.
50+
self assert: result asArray equals: #('c' 'b' 'a').
51+
]
52+
3153
{ #category : 'tests' }
3254
CTStackTest >> testAvailableSpace [
3355

@@ -48,6 +70,29 @@ CTStackTest >> testCapacity [
4870
self assert: stack capacity equals: 5. "Capacity doesn't change"
4971
]
5072

73+
{ #category : 'tests' }
74+
CTStackTest >> testCopyCreatesNewObject [
75+
76+
| copy |
77+
stack
78+
push: 'a';
79+
push: 'b'.
80+
copy := stack copy.
81+
self deny: stack identicalTo: copy
82+
]
83+
84+
{ #category : 'tests' }
85+
CTStackTest >> testCopyHasSameContents [
86+
87+
| copy |
88+
stack push: 'first'; push: 'second'; push: 'third'.
89+
copy := stack copy.
90+
91+
self assert: copy size equals: stack size.
92+
self assert: copy top equals: stack top.
93+
self assert: copy capacity equals: stack capacity
94+
]
95+
5196
{ #category : 'tests' }
5297
CTStackTest >> testDefaultStackCreation [
5398

@@ -60,6 +105,18 @@ CTStackTest >> testDefaultStackCreation [
60105
self assert: defaultStack availableSpace equals: 10
61106
]
62107

108+
{ #category : 'tests' }
109+
CTStackTest >> testDoIteration [
110+
111+
| elements |
112+
stack push: 'first'; push: 'second'; push: 'third'.
113+
elements := OrderedCollection new.
114+
115+
stack do: [ :each | elements add: each ].
116+
117+
self assert: elements asArray equals: #('third' 'second' 'first')
118+
]
119+
63120
{ #category : 'tests' }
64121
CTStackTest >> testIsEmpty [
65122

@@ -80,6 +137,45 @@ CTStackTest >> testIsFull [
80137
self deny: stack isFull
81138
]
82139

140+
{ #category : 'tests' }
141+
CTStackTest >> testLIFOOrdering [
142+
143+
stack push: 'first'; push: 'second'; push: 'third'; push: 'fourth'.
144+
145+
self assert: stack pop equals: 'fourth'.
146+
self assert: stack pop equals: 'third'.
147+
self assert: stack pop equals: 'second'.
148+
self assert: stack pop equals: 'first'
149+
]
150+
151+
{ #category : 'tests' }
152+
CTStackTest >> testLargeCapacityStack [
153+
154+
| largeStack |
155+
largeStack := CTStack new: 1000000.
156+
157+
1 to: 1000000 do: [ :i | largeStack push: i ].
158+
self assert: largeStack isFull.
159+
self assert: largeStack top equals: 1000000.
160+
161+
1000000 to: 1 by: -1 do: [ :i |
162+
self assert: largeStack pop equals: i
163+
].
164+
self assert: largeStack isEmpty
165+
]
166+
167+
{ #category : 'tests' }
168+
CTStackTest >> testPopAllElements [
169+
170+
stack push: 'a'; push: 'b'; push: 'c'.
171+
172+
stack pop; pop; pop.
173+
174+
self assert: stack isEmpty.
175+
self assert: stack size equals: 0.
176+
self assert: stack availableSpace equals: 5
177+
]
178+
83179
{ #category : 'tests' }
84180
CTStackTest >> testPopMultipleElements [
85181

@@ -189,6 +285,44 @@ CTStackTest >> testPushToFullStack [
189285
self should: [ stack push: 'overflow' ] raise: Error
190286
]
191287

288+
{ #category : 'removing' }
289+
CTStackTest >> testRemoveAll [
290+
291+
stack push: 'a'; push: 'b'; push: 'c'.
292+
stack removeAll.
293+
294+
self assert: stack isEmpty.
295+
self assert: stack size equals: 0.
296+
self assert: stack availableSpace equals: 5
297+
]
298+
299+
{ #category : 'tests' }
300+
CTStackTest >> testRemoveAllOnEmptyStack [
301+
302+
stack removeAll.
303+
304+
self assert: stack isEmpty.
305+
self assert: stack size equals: 0
306+
]
307+
308+
{ #category : 'tests' }
309+
CTStackTest >> testSearchExistingElement [
310+
311+
stack push: 'a'; push: 'b'; push: 'c'; push: 'b'.
312+
313+
self assert: (stack search: 'b') equals: 1. "Top element"
314+
self assert: (stack search: 'c') equals: 2.
315+
self assert: (stack search: 'a') equals: 4. "Bottom element"
316+
]
317+
318+
{ #category : 'tests' }
319+
CTStackTest >> testSearchNonExistentElement [
320+
321+
stack push: 'a'; push: 'b'; push: 'c'.
322+
323+
self assert: (stack search: 'x') equals: -1
324+
]
325+
192326
{ #category : 'tests' }
193327
CTStackTest >> testSize [
194328

src/Containers-Stack/CTStack.class.st

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,28 @@ CTStack class >> new: anInteger [
3434
yourself
3535
]
3636

37+
{ #category : 'converting' }
38+
CTStack >> asArray [
39+
40+
| result |
41+
self isEmpty ifTrue: [ ^ #() ].
42+
43+
result := Array new: self size.
44+
1 to: self size do: [ :i |
45+
result at: i put: (elements at: topIndex - i + 1)
46+
].
47+
^ result
48+
]
49+
50+
{ #category : 'converting' }
51+
CTStack >> asOrderedCollection [
52+
53+
| result |
54+
result := OrderedCollection new: self size.
55+
self do: [ :each | result add: each ].
56+
^ result
57+
]
58+
3759
{ #category : 'accessing' }
3860
CTStack >> availableSpace [
3961

@@ -46,6 +68,30 @@ CTStack >> capacity [
4668
^ capacity
4769
]
4870

71+
{ #category : 'copying' }
72+
CTStack >> copy [
73+
74+
75+
| copy |
76+
copy := self class new: capacity.
77+
self isEmpty ifTrue: [ ^ copy ].
78+
79+
1 to: topIndex do: [ :i |
80+
copy push: (elements at: i)
81+
].
82+
^ copy
83+
]
84+
85+
{ #category : 'enumerating' }
86+
CTStack >> do: aBlock [
87+
88+
self isEmpty ifTrue: [ ^ self ].
89+
90+
topIndex to: 1 by: -1 do: [ :i |
91+
aBlock value: (elements at: i)
92+
]
93+
]
94+
4995
{ #category : 'initialization' }
5096
CTStack >> initializeWithCapacity: anInteger [
5197

@@ -92,13 +138,37 @@ CTStack >> push: anObject [
92138
^ anObject
93139
]
94140

141+
{ #category : 'showing' }
142+
CTStack >> pushAll: aCollection [
143+
144+
aCollection do: [ :each | self push: each ].
145+
^ aCollection isEmpty ifFalse: [ aCollection last ] ifTrue: [ nil ]
146+
]
147+
95148
{ #category : 'removing' }
96149
CTStack >> removeAll [
97150

98151
1 to: topIndex do: [ :i | elements at: i put: nil ].
99152
topIndex := 0
100153
]
101154

155+
{ #category : 'accessing' }
156+
CTStack >> search: anObject [
157+
158+
"Return the 1-based position of anObject from the top of the stack.
159+
Return -1 if the object is not found.
160+
The top element is at position 1."
161+
162+
self isEmpty ifTrue: [ ^ -1 ].
163+
164+
topIndex to: 1 by: -1 do: [ :i |
165+
(elements at: i) = anObject ifTrue: [
166+
^ topIndex - i + 1
167+
]
168+
].
169+
^ -1
170+
]
171+
102172
{ #category : 'accessing' }
103173
CTStack >> size [
104174

0 commit comments

Comments
 (0)