Skip to content

Fixes #2 , #3 , #4 , #6 #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
98 changes: 83 additions & 15 deletions src/Containers-Queue-Tests/CTQueueTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -27,23 +27,16 @@ CTQueueTest >> testAdd [

{ #category : #tests }
CTQueueTest >> testAddGarantyFIFOOrder [
"Ensure elements are dequeued in FIFO order."
| queue |
queue := self queueClass new.
queue add: 'first added element'.
queue add: 'second added element'.
self assert: (queue at: 1) equals: 'first added element'.
self assert: (queue at: 2) equals: 'second added element'
]

{ #category : #tests }
CTQueueTest >> testDequeue [
| queue |
queue := self queueClass new.
queue queue: 1.
queue queue: 2.
queue queue: 3.
self assert: queue dequeue equals: 1.
self assert: queue dequeue equals: 2
queue add: 'first'.
queue add: 'second'.
queue add: 'third'.
self assert: queue remove equals: 'first'.
self assert: queue remove equals: 'second'.
self assert: queue remove equals: 'third'.
self assert: queue isEmpty.
]

{ #category : #tests }
Expand All @@ -60,3 +53,78 @@ CTQueueTest >> testQueue [
CTQueueTest >> testQueueGarantyFIFOOrder [
self assert: self queueClass new isEmpty
]

{ #category : #tests }
CTQueueTest >> testAddAll [
"Ensure queueAll adds multiple elements at once."
| queue |
queue := self queueClass new.
queue addAll: #(10 20 30 40).
self assert: queue remove equals: 10.
self assert: queue remove equals: 20.
self assert: queue remove equals: 30.
self assert: queue remove equals: 40.
]

{ #category : #tests }
CTQueueTest >> testEmptyQueueRemove [
| queue |
queue := self queueClass new.
self assert: queue remove isNil.
]

{ #category : #tests }
CTQueueTest >> testIsEmpty [
"Ensure isEmpty works correctly."
| queue |
queue := self queueClass new.
self assert: queue isEmpty.
queue add: 1.
self deny: queue isEmpty.
queue remove.
self assert: queue isEmpty.
]

{ #category : #tests }
CTQueueTest >> testPeek [
"Ensure peek returns the first element without removing it."
| queue |
queue := self queueClass new.
queue add: 42.
queue add: 99.
self assert: queue peek equals: 42.
self assert: queue size equals: 2. "Peek should not remove elements"
]

{ #category : #tests }
CTQueueTest >> testPoll [
"Ensure poll behaves correctly, returning nil when empty."
| queue |
queue := self queueClass new.
queue add: 'A'.
queue add: 'B'.
self assert: queue poll equals: 'A'.
self assert: queue poll equals: 'B'.
self assert: queue poll isNil.
]

{ #category : #tests }
CTQueueTest >> testRemove [
"Ensure remove behaves correctly, returning nil when empty."
| queue |
queue := self queueClass new.
queue add: 1.
queue add: 2.
queue add: 3.
self assert: queue remove equals: 1.
self assert: queue remove equals: 2
]

{ #category : #tests }
CTQueueTest >> testRemoveIfNone[
"Ensure dequeueIfNone works correctly."
| queue result |
queue := self queueClass new.
result := queue removeIfNone: [ 'fallback' ].
self assert: result equals: 'fallback'.
]
62 changes: 28 additions & 34 deletions src/Containers-Queue/CTQueue.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -13,47 +13,27 @@ Class {
#category : #'Containers-Queue'
}

{ #category : #testing }
{ #category : #adding }
CTQueue >> add: anElement [
"Add an element to the receiver. Note that the addition makes sure that when iterating over the receiver added first element are accessed first."

elements addLast: anElement.
^ anElement
]

{ #category : #testing }
{ #category : #adding }
CTQueue >> addAll: aCollection [
"Add the elements contained in the argument to the receiver. Note that the addition makes sure that when iterating over the receiver added first element are accessed first."

elements addAllLast: aCollection.
^ aCollection
]

{ #category : #accessing }
CTQueue >> at: anIndex [
"Accessed the element to the given index in the receiver according to the adding order."
^ elements at: anIndex
]

{ #category : #'adding/removing' }
CTQueue >> dequeue [
"Return the older element of the receiver.."

^ elements removeFirst
]

{ #category : #'adding/removing' }
CTQueue >> dequeueIfNone: aBlock [
"Return the older element of the receiver.."
elements ifEmpty: [ aBlock value ].
^ elements removeFirst
]

{ #category : #iterating }
CTQueue >> do: aBlock [
"iterates the elements of the receiver starting first by first added elements."

self do: aBlock
elements do: aBlock
]

{ #category : #testing }
Expand All @@ -74,18 +54,32 @@ CTQueue >> isEmpty [
^ elements isEmpty
]

{ #category : #'adding/removing' }
CTQueue >> queue: anElement [
"Add an element to the receiver. Note that the addition makes sure that when iterating over the receiver added first element are accessed first."
{ #category : #removing }
CTQueue >> remove [
"Return the older element of the receiver.."

elements addLast: anElement.
^ anElement
^ elements ifEmpty: [ nil ] ifNotEmpty: [ elements removeFirst ].
]

{ #category : #'adding/removing' }
CTQueue >> queueAll: aCollection [
"Add the elements contained in the argument to the receiver. Note that the addition makes sure that when iterating over the receiver added first element are accessed first."

elements addAllLast: aCollection.
^ aCollection
{ #category : #removing }
CTQueue >> removeIfNone: aBlock [
"Return the older element of the receiver.."
elements ifEmpty: [ ^ aBlock value ].
^ elements removeFirst
]

{ #category : #removing }
CTQueue >> poll [
"Returns and removes the front element, or nil if empty."
^ elements ifEmpty: [ nil ] ifNotEmpty: [ elements removeFirst ].
]

{ #category : #accessing }
CTQueue >> peek [
^ elements ifEmpty: [ nil ] ifNotEmpty: [ elements first ].
]

{ #category : #accessing }
CTQueue >> size [
^ elements size
]
Loading