Skip to content

Commit 54dd969

Browse files
committed
Implement growable stack and max-depth tracking (#8)
1 parent 0e21e4d commit 54dd969

File tree

4 files changed

+198
-0
lines changed

4 files changed

+198
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
Class {
2+
#name : 'CTGrowableStackTest',
3+
#superclass : 'TestCase',
4+
#instVars : [
5+
'stack'
6+
],
7+
#category : 'Containers-Stack-Tests',
8+
#package : 'Containers-Stack-Tests'
9+
}
10+
11+
{ #category : 'running' }
12+
CTGrowableStackTest >> setUp [
13+
super setUp.
14+
stack := CTGrowableStack new
15+
]
16+
17+
{ #category : 'tests' }
18+
CTGrowableStackTest >> testIsEmpty [
19+
self assert: stack isEmpty.
20+
21+
stack push: 'x'.
22+
self deny: stack isEmpty.
23+
24+
stack pop.
25+
self assert: stack isEmpty.
26+
]
27+
28+
{ #category : 'tests' }
29+
CTGrowableStackTest >> testPop [
30+
stack push: 'first'.
31+
stack push: 'second'.
32+
33+
self assert: stack pop equals: 'second'.
34+
self assert: stack size equals: 1.
35+
self assert: stack pop equals: 'first'.
36+
self assert: stack isEmpty.
37+
]
38+
39+
{ #category : 'tests' }
40+
CTGrowableStackTest >> testPush [
41+
stack push: 'a'.
42+
43+
self assert: stack size equals: 1.
44+
self deny: stack isEmpty.
45+
self assert: stack top equals: 'a'.
46+
]
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
Class {
2+
#name : 'CTTrackedGrowableStackTest',
3+
#superclass : 'TestCase',
4+
#instVars : [
5+
'stack'
6+
],
7+
#category : 'Containers-Stack-Tests',
8+
#package : 'Containers-Stack-Tests'
9+
}
10+
11+
{ #category : 'running' }
12+
CTTrackedGrowableStackTest >> setUp [
13+
super setUp.
14+
stack := CTTrackedGrowableStack new
15+
]
16+
17+
{ #category : 'tests' }
18+
CTTrackedGrowableStackTest >> testErrorHandlingDoesNotAffectMaxDepth [
19+
self should: [ stack pop ] raise: Error.
20+
self assert: stack maxDepth equals: 0.
21+
22+
stack push: 'temp'.
23+
stack pop.
24+
25+
self should: [ stack pop ] raise: Error.
26+
self assert: stack maxDepth equals: 1.
27+
]
28+
29+
{ #category : 'tests' }
30+
CTTrackedGrowableStackTest >> testInitialMaxDepth [
31+
self assert: stack maxDepth equals: 0.
32+
self assert: stack isEmpty.
33+
]
34+
35+
{ #category : 'tests' }
36+
CTTrackedGrowableStackTest >> testMaxDepthAfterPop [
37+
stack push: 'apple'.
38+
stack push: 'banana'.
39+
self assert: stack maxDepth equals: 2.
40+
41+
stack pop.
42+
43+
self assert: stack size equals: 1.
44+
self assert: stack maxDepth equals: 2.
45+
]
46+
47+
{ #category : 'tests' }
48+
CTTrackedGrowableStackTest >> testMaxDepthWithFluctuations [
49+
stack push: 1.
50+
stack push: 2.
51+
stack pop.
52+
stack pop.
53+
54+
stack push: 3.
55+
stack push: 4.
56+
stack push: 5.
57+
58+
self assert: stack maxDepth equals: 3.
59+
]
60+
61+
{ #category : 'tests' }
62+
CTTrackedGrowableStackTest >> testMaxDepthWithLargeDataset [
63+
1 to: 100 do: [ :i | stack push: i ].
64+
65+
self assert: stack maxDepth equals: 100.
66+
self assert: stack size equals: 100.
67+
68+
1 to: 50 do: [ :i | stack pop ].
69+
70+
self assert: stack maxDepth equals: 100.
71+
self assert: stack size equals: 50.
72+
]
73+
74+
{ #category : 'tests' }
75+
CTTrackedGrowableStackTest >> testTopDoesNotAffectMaxDepth [
76+
stack push: 'hello'.
77+
self assert: stack maxDepth equals: 1.
78+
79+
self assert: stack top equals: 'hello'.
80+
self assert: stack maxDepth equals: 1.
81+
self assert: stack size equals: 1.
82+
]
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
Class {
2+
#name : 'CTGrowableStack',
3+
#superclass : 'Object',
4+
#instVars : [
5+
'elements'
6+
],
7+
#category : 'Containers-Stack',
8+
#package : 'Containers-Stack'
9+
}
10+
11+
{ #category : 'initialization' }
12+
CTGrowableStack >> initialize [
13+
super initialize.
14+
elements := OrderedCollection new
15+
]
16+
17+
{ #category : 'testing' }
18+
CTGrowableStack >> isEmpty [
19+
^ elements isEmpty
20+
]
21+
22+
{ #category : 'removing' }
23+
CTGrowableStack >> pop [
24+
self isEmpty ifTrue: [ self error: 'Stack is empty' ].
25+
^ elements removeLast
26+
]
27+
28+
{ #category : 'adding' }
29+
CTGrowableStack >> push: anObject [
30+
elements addLast: anObject.
31+
^ self
32+
]
33+
34+
{ #category : 'accessing' }
35+
CTGrowableStack >> size [
36+
^ elements size
37+
]
38+
39+
{ #category : 'accessing' }
40+
CTGrowableStack >> top [
41+
self isEmpty ifTrue: [ self error: 'Stack is empty' ].
42+
^ elements last
43+
]
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
Class {
2+
#name : 'CTTrackedGrowableStack',
3+
#superclass : 'CTGrowableStack',
4+
#instVars : [
5+
'maxDepth'
6+
],
7+
#category : 'Containers-Stack',
8+
#package : 'Containers-Stack'
9+
}
10+
11+
{ #category : 'initialization' }
12+
CTTrackedGrowableStack >> initialize [
13+
super initialize.
14+
maxDepth := 0
15+
]
16+
17+
{ #category : 'accessing' }
18+
CTTrackedGrowableStack >> maxDepth [
19+
^ maxDepth
20+
]
21+
22+
{ #category : 'adding' }
23+
CTTrackedGrowableStack >> push: anObject [
24+
super push: anObject.
25+
maxDepth := maxDepth max: self size.
26+
^ self
27+
]

0 commit comments

Comments
 (0)