1
1
"
2
2
I'm a simple queue i.e., first in first out structure.
3
3
I support basic collection protocol and in addition enqueue and dequeue as in Scala.
4
-
5
-
6
4
"
7
5
Class {
8
6
#name : #CTQueueTest ,
@@ -25,6 +23,31 @@ CTQueueTest >> testAdd [
25
23
self assert: (queue includes: 2 )
26
24
]
27
25
26
+ { #category : #tests }
27
+ CTQueueTest >> testAddAll [
28
+ " Ensure queueAll adds multiple elements at once."
29
+ | queue |
30
+ queue := self queueClass new .
31
+ queue addAll: #(10 20 30 40) .
32
+ self assert: queue remove equals: 10 .
33
+ self assert: queue remove equals: 20 .
34
+ self assert: queue remove equals: 30 .
35
+ self assert: queue remove equals: 40 .
36
+ ]
37
+
38
+ { #category : #tests }
39
+ CTQueueTest >> testAddAllLargeCollection [
40
+ " Test adding a large collection via addAll."
41
+ | queue collection size |
42
+ queue := self queueClass new .
43
+ size := 50000 .
44
+ collection := (1 to: size) asArray.
45
+ queue addAll: collection.
46
+ self assert: queue size equals: size.
47
+ 1 to: size do: [ :i | self assert: queue remove equals: i ].
48
+ self assert: queue isEmpty.
49
+ ]
50
+
28
51
{ #category : #tests }
29
52
CTQueueTest >> testAddGarantyFIFOOrder [
30
53
" Ensure elements are dequeued in FIFO order."
@@ -40,37 +63,66 @@ CTQueueTest >> testAddGarantyFIFOOrder [
40
63
]
41
64
42
65
{ #category : #tests }
43
- CTQueueTest >> testEmptyQueue [
44
- self assert: self queueClass new isEmpty
66
+ CTQueueTest >> testAddNilElement [
67
+ " Test adding a nil element to the queue."
68
+ | queue |
69
+ queue := self queueClass new .
70
+ queue add: nil .
71
+ self assert: queue size equals: 1 .
72
+ self assert: queue peek isNil.
73
+ self assert: queue remove isNil.
74
+ self assert: queue isEmpty.
45
75
]
46
76
47
77
{ #category : #tests }
48
- CTQueueTest >> testQueue [
49
- self assert: self queueClass new isEmpty
78
+ CTQueueTest >> testDoIteration [
79
+ " Test iterating over the queue with do: in FIFO order."
80
+ | queue collected |
81
+ queue := self queueClass new .
82
+ queue addAll: #(10 20 30 40) .
83
+ collected := OrderedCollection new .
84
+ queue do: [ :each | collected add: each ].
85
+ self assert: collected asArray equals: #(10 20 30 40) .
86
+ self assert: queue size equals: 4 . " Iteration should not modify the queue"
50
87
]
51
88
52
89
{ #category : #tests }
53
- CTQueueTest >> testQueueGarantyFIFOOrder [
90
+ CTQueueTest >> testEmptyQueue [
54
91
self assert: self queueClass new isEmpty
55
92
]
56
93
57
94
{ #category : #tests }
58
- CTQueueTest >> testAddAll [
59
- " Ensure queueAll adds multiple elements at once."
95
+ CTQueueTest >> testEmptyQueueRemove [
60
96
| queue |
61
97
queue := self queueClass new .
62
- queue addAll: #(10 20 30 40) .
63
- self assert: queue remove equals: 10 .
64
- self assert: queue remove equals: 20 .
65
- self assert: queue remove equals: 30 .
66
- self assert: queue remove equals: 40 .
98
+ self assert: queue remove isNil.
67
99
]
68
100
69
101
{ #category : #tests }
70
- CTQueueTest >> testEmptyQueueRemove [
102
+ CTQueueTest >> testIncludes [
103
+ " Test the includes: method for existing and non-existing elements."
104
+ | queue |
105
+ queue := self queueClass new .
106
+ queue addAll: #(5 10 15) .
107
+ self assert: (queue includes: 10 ).
108
+ self deny: (queue includes: 20 ).
109
+ self assert: queue size equals: 3 . " includes: should not modify the queue"
110
+ ]
111
+
112
+ { #category : #tests }
113
+ CTQueueTest >> testInterleavedAddRemove [
114
+ " Test interleaved add and remove operations to ensure FIFO order and correctness."
71
115
| queue |
72
116
queue := self queueClass new .
73
- self assert: queue remove isNil.
117
+ queue add: 1 .
118
+ queue add: 2 .
119
+ self assert: queue remove equals: 1 .
120
+ queue add: 3 .
121
+ self assert: queue remove equals: 2 .
122
+ queue add: 4 .
123
+ self assert: queue remove equals: 3 .
124
+ self assert: queue remove equals: 4 .
125
+ self assert: queue isEmpty.
74
126
]
75
127
76
128
{ #category : #tests }
@@ -85,6 +137,31 @@ CTQueueTest >> testIsEmpty [
85
137
self assert: queue isEmpty.
86
138
]
87
139
140
+ { #category : #tests }
141
+ CTQueueTest >> testLargeQueuePerformance [
142
+ " Verify FIFO behavior and performance with a large queue."
143
+ | queue size startTime endTime duration maxDuration |
144
+ queue := self queueClass new .
145
+ size := 100000 .
146
+
147
+ " Measure time to add elements"
148
+ startTime := DateAndTime now.
149
+ 1 to: size do: [ :i | queue add: i ].
150
+ endTime := DateAndTime now.
151
+ duration := endTime - startTime.
152
+ maxDuration := 5 seconds. " Expect adding 100,000 elements to take less than 5 seconds"
153
+ self assert: duration < maxDuration description: ' Adding elements took too long' .
154
+
155
+ " Measure time to remove elements and verify FIFO order"
156
+ startTime := DateAndTime now.
157
+ 1 to: size do: [ :i | self assert: queue remove equals: i ].
158
+ endTime := DateAndTime now.
159
+ duration := endTime - startTime.
160
+ self assert: duration < maxDuration description: ' Removing elements took too long' .
161
+
162
+ self assert: queue isEmpty.
163
+ ]
164
+
88
165
{ #category : #tests }
89
166
CTQueueTest >> testPeek [
90
167
" Ensure peek returns the first element without removing it."
@@ -108,6 +185,16 @@ CTQueueTest >> testPoll [
108
185
self assert: queue poll isNil.
109
186
]
110
187
188
+ { #category : #tests }
189
+ CTQueueTest >> testQueue [
190
+ self assert: self queueClass new isEmpty
191
+ ]
192
+
193
+ { #category : #tests }
194
+ CTQueueTest >> testQueueGarantyFIFOOrder [
195
+ self assert: self queueClass new isEmpty
196
+ ]
197
+
111
198
{ #category : #tests }
112
199
CTQueueTest >> testRemove [
113
200
" Ensure remove behaves correctly, returning nil when empty."
@@ -121,21 +208,44 @@ CTQueueTest >> testRemove [
121
208
]
122
209
123
210
{ #category : #tests }
124
- CTQueueTest >> testRemoveIfNone[
125
- " Ensure dequeueIfNone works correctly."
211
+ CTQueueTest >> testRemoveIfNone [
212
+ " Ensure removeIfNone works correctly."
126
213
| queue result |
127
214
queue := self queueClass new .
128
215
result := queue removeIfNone: [ ' fallback' ].
129
216
self assert: result equals: ' fallback' .
130
217
]
131
218
132
219
{ #category : #tests }
133
- CTQueueTest >> testLargeQueuePerformance [
134
- " Verify FIFO behavior and performance with a large queue ."
135
- | queue size |
220
+ CTQueueTest >> testSizeAccuracy [
221
+ " Test that the size method accurately reflects the number of elements ."
222
+ | queue |
136
223
queue := self queueClass new .
137
- size := 1000 .
138
- 1 to: size do: [ :i | queue add: i ].
139
- 1 to: size do: [ :i | self assert: queue remove equals: i ].
224
+ self assert: queue size equals: 0 .
225
+ queue add: 1 .
226
+ self assert: queue size equals: 1 .
227
+ queue addAll: #(2 3 4) .
228
+ self assert: queue size equals: 4 .
229
+ queue remove.
230
+ self assert: queue size equals: 3 .
231
+ queue removeIfNone: [ nil ].
232
+ self assert: queue size equals: 2 .
233
+ ]
234
+
235
+ { #category : #tests }
236
+ CTQueueTest >> testStressAddRemove [
237
+ " Stress test with many add and remove operations."
238
+ | queue iterations |
239
+ queue := self queueClass new .
240
+ iterations := 10000 .
241
+ 1 to: iterations do: [ :i |
242
+ queue add: i.
243
+ self assert: queue size equals: 1 .
244
+ self assert: queue remove equals: i.
245
+ self assert: queue isEmpty.
246
+ ].
247
+ " Add multiple elements and remove them"
248
+ queue addAll: (1 to: 1000 ).
249
+ 1 to: 1000 do: [ :i | self assert: queue remove equals: i ].
140
250
self assert: queue isEmpty.
141
251
]
0 commit comments