diff --git a/src/Containers-Queue-Tests/CTQueueTest.class.st b/src/Containers-Queue-Tests/CTQueueTest.class.st index 5f1cf60..d2b909b 100644 --- a/src/Containers-Queue-Tests/CTQueueTest.class.st +++ b/src/Containers-Queue-Tests/CTQueueTest.class.st @@ -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 } @@ -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'. +] \ No newline at end of file diff --git a/src/Containers-Queue/CTQueue.class.st b/src/Containers-Queue/CTQueue.class.st index 72e7221..e3aeefb 100644 --- a/src/Containers-Queue/CTQueue.class.st +++ b/src/Containers-Queue/CTQueue.class.st @@ -13,7 +13,7 @@ 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." @@ -21,7 +21,7 @@ CTQueue >> add: 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." @@ -29,31 +29,11 @@ CTQueue >> addAll: 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 } @@ -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 +] \ No newline at end of file