diff --git a/src/Containers-Buffer-Tests/CTAbstractBufferTest.class.st b/src/Containers-Buffer-Tests/CTAbstractBufferTest.class.st new file mode 100644 index 0000000..3b1bf6b --- /dev/null +++ b/src/Containers-Buffer-Tests/CTAbstractBufferTest.class.st @@ -0,0 +1,237 @@ +" +Abstract test class containing common tests for both FIFO and LIFO buffer implementations. +Subclasses must implement setUp to create their specific buffer type. +" +Class { + #name : 'CTAbstractBufferTest', + #superclass : 'TestCase', + #instVars : [ + 'buffer' + ], + #category : 'Containers-Buffer-Tests', + #package : 'Containers-Buffer-Tests' +} + +{ #category : 'testing' } +CTAbstractBufferTest class >> isAbstract [ + + ^ self == CTAbstractBufferTest +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testAvailableSpace [ + + self assert: buffer availableSpace equals: 3. + buffer push: 'a'. + self assert: buffer availableSpace equals: 2. + buffer push: 'b'; push: 'c'. + self assert: buffer availableSpace equals: 0. + buffer pop. + self assert: buffer availableSpace equals: 1 +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testBufferCreationWithCapacity [ + + | testBuffer | + testBuffer := buffer class withCapacity: 5. + + self assert: testBuffer capacity equals: 5. + self assert: testBuffer size equals: 0. + self assert: testBuffer isEmpty. + self deny: testBuffer isFull. + self assert: testBuffer availableSpace equals: 5 +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testBufferCreationWithInvalidCapacity [ + + self should: [ buffer class withCapacity: 0 ] raise: Error. + self should: [ buffer class withCapacity: -1 ] raise: Error +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testClearBuffer [ + + buffer push: 'a'; push: 'b'; push: 'c'. + buffer clear. + + self assert: buffer isEmpty. + self assert: buffer size equals: 0. + self assert: buffer readIndex equals: 1. + self assert: buffer writeIndex equals: 1. + self assert: buffer availableSpace equals: 3 +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testCopyBufferContentsOrder [ + ^ self subclassResponsibility +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testDefaultBufferCreation [ + + | testBuffer | + testBuffer := buffer class new. + + self assert: testBuffer capacity equals: 10. + self assert: testBuffer isEmpty. + self assert: testBuffer readIndex equals: 1. + self assert: testBuffer writeIndex equals: 1 +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testDoIteration [ + ^ self subclassResponsibility +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testDoIterationAfterOverwrite [ + ^ self subclassResponsibility +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testEmptyBufferErrors [ + + self should: [ buffer peek ] raise: Error. + self should: [ buffer pop ] raise: Error +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testIndicesAfterClear [ + + buffer push: 'a'; push: 'b'; push: 'c'. + buffer pop. + buffer clear. + + self assert: buffer readIndex equals: 1. + self assert: buffer writeIndex equals: 1 +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testIsEmpty [ + + self assert: buffer isEmpty. + buffer push: 'test'. + self deny: buffer isEmpty. + buffer pop. + self assert: buffer isEmpty +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testIsFull [ + + self deny: buffer isFull. + buffer push: 'a'; push: 'b'; push: 'c'. + self assert: buffer isFull. + buffer pop. + self deny: buffer isFull +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testOverwriteBehavior [ + ^ self subclassResponsibility +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testOverwriteBehaviorWithAvailableSpace [ + + buffer push: 'a'; push: 'b'; push: 'c'. + self assert: buffer availableSpace equals: 0. + + buffer push: 'd'. + self assert: buffer availableSpace equals: 0. + self assert: buffer size equals: 3 +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testPeekAndPop [ + ^ self subclassResponsibility +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testPopAndPushSequence [ + + buffer + push: 'a'; + push: 'b'. + buffer pop. + buffer push: 'c'. + + self assert: buffer size equals: 2. + self deny: buffer isEmpty +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testPushAllCollection [ + + | result | + result := buffer pushAll: #('a' 'b' 'c'). + + self assert: buffer size equals: 3. + self assert: result equals: 'c'. + self assert: buffer isFull +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testPushMultipleElements [ + + buffer + push: 'first'; + push: 'second'; + push: 'third'. + + self assert: buffer size equals: 3. + self assert: buffer isFull. + self assert: buffer availableSpace equals: 0. +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testPushSingleElement [ + + buffer push: 'first'. + + self assert: buffer size equals: 1. + self deny: buffer isEmpty. + self deny: buffer isFull. + self assert: buffer availableSpace equals: 2. + self assert: buffer writeIndex equals: 2. + self assert: buffer readIndex equals: 1 +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testReadIndexAfterPop [ + ^ self subclassResponsibility +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testReadIndexBehaviorOnAdd [ + ^ self subclassResponsibility +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testReadIndexBehaviorOnOverwrite [ + ^ self subclassResponsibility +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testSize [ + + self assert: buffer size equals: 0. + buffer push: 'a'. + self assert: buffer size equals: 1. + buffer push: 'b'; push: 'c'. + self assert: buffer size equals: 3. + buffer pop. + self assert: buffer size equals: 2 +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testWriteIndexAfterPopAndOverwrite [ + ^ self subclassResponsibility +] + +{ #category : 'tests' } +CTAbstractBufferTest >> testWriteIndexBehavior [ + ^ self subclassResponsibility +] diff --git a/src/Containers-Buffer-Tests/CTBufferTest.class.st b/src/Containers-Buffer-Tests/CTBufferTest.class.st deleted file mode 100644 index 91338ff..0000000 --- a/src/Containers-Buffer-Tests/CTBufferTest.class.st +++ /dev/null @@ -1,583 +0,0 @@ -" -Comprehensive test suite for CTBuffer classes including CTFIFOBuffer and CTLIFOBuffer. -" -Class { - #name : 'CTBufferTest', - #superclass : 'TestCase', - #instVars : [ - 'fifoBuffer', - 'lifoBuffer' - ], - #category : 'Containers-Buffer-Tests', - #package : 'Containers-Buffer-Tests' -} - -{ #category : 'running' } -CTBufferTest >> setUp [ -super setUp. - fifoBuffer := CTFIFOBuffer withCapacity: 3. - lifoBuffer := CTLIFOBuffer withCapacity: 3 -] - -{ #category : 'tests' } -CTBufferTest >> testAvailableSpace [ - - self assert: fifoBuffer availableSpace equals: 3. - self assert: lifoBuffer availableSpace equals: 3. - - fifoBuffer push: 'a'. - lifoBuffer push: 'x'. - self assert: fifoBuffer availableSpace equals: 2. - self assert: lifoBuffer availableSpace equals: 2. - - fifoBuffer - push: 'b'; - push: 'c'. - lifoBuffer - push: 'y'; - push: 'z'. - self assert: fifoBuffer availableSpace equals: 0. - self assert: lifoBuffer availableSpace equals: 0. - - fifoBuffer pop. - lifoBuffer pop. - self assert: fifoBuffer availableSpace equals: 1. - self assert: lifoBuffer availableSpace equals: 1 -] - -{ #category : 'tests' } -CTBufferTest >> testBrowserHistory [ - - | browserHistory visitedPages | - browserHistory := CTLIFOBuffer withCapacity: 3. - visitedPages := OrderedCollection new. - - browserHistory push: 'https://google.com'. - browserHistory push: 'https://github.com/pharo-containers'. - browserHistory push: 'https://stackoverflow.com'. - browserHistory push: 'https://reddit.com'. - - visitedPages add: browserHistory pop. - self assert: visitedPages last equals: 'https://reddit.com'. - - browserHistory push: 'https://pharo.org'. - - [ browserHistory isEmpty ] whileFalse: [ - visitedPages add: browserHistory pop ]. - - self assert: visitedPages size equals: 4. - self assert: visitedPages first equals: 'https://reddit.com'. - self assert: (visitedPages at: 2) equals: 'https://pharo.org'. - self assert: (visitedPages at: 3) equals: 'https://stackoverflow.com'. - self - assert: visitedPages last - equals: 'https://github.com/pharo-containers' -] - -{ #category : 'tests' } -CTBufferTest >> testBufferCreationWithCapacity [ - - - | buffer | - buffer := CTFIFOBuffer withCapacity: 5. - - self assert: buffer capacity equals: 5. - self assert: buffer size equals: 0. - self assert: buffer isEmpty. - self deny: buffer isFull. - self assert: buffer availableSpace equals: 5 -] - -{ #category : 'tests' } -CTBufferTest >> testBufferCreationWithInvalidCapacity [ - - self should: [ CTFIFOBuffer withCapacity: 0 ] raise: Error. - self should: [ CTFIFOBuffer withCapacity: -1 ] raise: Error. - self should: [ CTLIFOBuffer withCapacity: 0 ] raise: Error -] - -{ #category : 'tests' } -CTBufferTest >> testChatMessageQueue [ - - | chatQueue displayedMessages | - chatQueue := CTFIFOBuffer withCapacity: 4. - displayedMessages := OrderedCollection new. - - chatQueue push: 'Alok: Hello everyone!'. - chatQueue push: 'Sebastian: Hey Alok!'. - chatQueue push: 'Gordana: How is everyone doing?'. - chatQueue push: 'Sebastian: Great to see you all!'. - - displayedMessages add: chatQueue pop. - self assert: displayedMessages last equals: 'Alok: Hello everyone!'. - - chatQueue push: 'Alok: Sorry I was late!'. - - [ chatQueue isEmpty ] whileFalse: [ - displayedMessages add: chatQueue pop ]. - - self assert: displayedMessages size equals: 5. - self assert: (displayedMessages at: 2) equals: 'Sebastian: Hey Alok!'. - self assert: displayedMessages last equals: 'Alok: Sorry I was late!' -] - -{ #category : 'tests' } -CTBufferTest >> testClearAfterOverwrite [ - - fifoBuffer - push: 'a'; - push: 'b'; - push: 'c'; - push: 'd'. - lifoBuffer - push: 'x'; - push: 'y'; - push: 'z'; - push: 'w'. - - fifoBuffer clear. - lifoBuffer clear. - - self assert: fifoBuffer isEmpty. - self assert: lifoBuffer isEmpty. - self assert: fifoBuffer size equals: 0. - self assert: lifoBuffer size equals: 0. - self assert: fifoBuffer availableSpace equals: 3. - self assert: lifoBuffer availableSpace equals: 3. - - fifoBuffer push: 'new'. - lifoBuffer push: 'new'. - self assert: fifoBuffer peek equals: 'new'. - self assert: lifoBuffer peek equals: 'new' -] - -{ #category : 'tests' } -CTBufferTest >> testClearBuffer [ - - fifoBuffer push: 'a'; push: 'b'; push: 'c'. - fifoBuffer clear. - - self assert: fifoBuffer isEmpty. - self assert: fifoBuffer size equals: 0. - self assert: fifoBuffer readIndex equals: 1. - self assert: fifoBuffer writeIndex equals: 1. - self assert: fifoBuffer availableSpace equals: 3 -] - -{ #category : 'tests' } -CTBufferTest >> testCopyBuffer [ - - | copy | - fifoBuffer push: 'a'; push: 'b'; push: 'c'. - copy := fifoBuffer copy. - - self assert: copy class equals: CTFIFOBuffer. - self assert: copy capacity equals: fifoBuffer capacity. - self assert: copy size equals: fifoBuffer size. - self deny: copy identicalTo: fifoBuffer. - - "Test that copy has same contents and order" - self assert: copy pop equals: 'a'. - self assert: copy pop equals: 'b'. - self assert: copy pop equals: 'c'. - - "Original should be unchanged" - self assert: fifoBuffer size equals: 3 -] - -{ #category : 'tests' } -CTBufferTest >> testDefaultBufferCreation [ - - | buffer | - buffer := CTFIFOBuffer new. - - self assert: buffer capacity equals: 10. - self assert: buffer isEmpty. - self assert: buffer readIndex equals: 1. - self assert: buffer writeIndex equals: 1 -] - -{ #category : 'tests' } -CTBufferTest >> testDoIteration [ - - | fifoElements lifoElements | - "FIFO: Iterates oldest to newest" - fifoBuffer - push: 'first'; - push: 'second'; - push: 'third'. - fifoElements := OrderedCollection new. - fifoBuffer do: [ :each | fifoElements add: each ]. - self - assert: fifoElements asArray - equals: #( 'first' 'second' 'third' ). - - "LIFO: Iterates newest to oldest" - lifoBuffer - push: 'first'; - push: 'second'; - push: 'third'. - lifoElements := OrderedCollection new. - lifoBuffer do: [ :each | lifoElements add: each ]. - self - assert: lifoElements asArray - equals: #( 'third' 'second' 'first' ) -] - -{ #category : 'tests' } -CTBufferTest >> testDoIterationAfterOverwrite [ - - | fifoElements lifoElements | - - "FIFO: After Overwrite" - fifoBuffer push: 'a'; push: 'b'; push: 'c'. - fifoBuffer push: 'd'. "Overwrites 'a'" - fifoElements := OrderedCollection new. - fifoBuffer do: [ :each | fifoElements add: each ]. - self assert: fifoElements asArray equals: #('b' 'c' 'd'). - - "LIFO: After Overwrite" - lifoBuffer push: 'a'; push: 'b'; push: 'c'. - lifoBuffer push: 'd'. "Overwrites 'a'" - lifoElements := OrderedCollection new. - lifoBuffer do: [ :each | lifoElements add: each ]. - self assert: lifoElements asArray equals: #('d' 'c' 'b') -] - -{ #category : 'tests' } -CTBufferTest >> testEmptyBufferErrors [ - - - self should: [ fifoBuffer peek ] raise: Error. - self should: [ fifoBuffer pop ] raise: Error. - self should: [ lifoBuffer peek ] raise: Error. - self should: [ lifoBuffer pop ] raise: Error -] - -{ #category : 'tests' } -CTBufferTest >> testIndicesAfterClear [ - - fifoBuffer - push: 'a'; - push: 'b'; - push: 'c'. - lifoBuffer - push: 'x'; - push: 'y'; - push: 'z'. - - fifoBuffer pop. - lifoBuffer pop. - - fifoBuffer clear. - lifoBuffer clear. - - self assert: fifoBuffer readIndex equals: 1. - self assert: fifoBuffer writeIndex equals: 1. - self assert: lifoBuffer readIndex equals: 1. - self assert: lifoBuffer writeIndex equals: 1 -] - -{ #category : 'tests' } -CTBufferTest >> testIsEmpty [ - - self assert: fifoBuffer isEmpty. - self assert: lifoBuffer isEmpty. - - fifoBuffer push: 'test'. - lifoBuffer push: 'test'. - self deny: fifoBuffer isEmpty. - self deny: lifoBuffer isEmpty. - - fifoBuffer pop. - lifoBuffer pop. - self assert: fifoBuffer isEmpty. - self assert: lifoBuffer isEmpty -] - -{ #category : 'tests' } -CTBufferTest >> testIsFull [ - - self deny: fifoBuffer isFull. - self deny: lifoBuffer isFull. - - fifoBuffer - push: 'a'; - push: 'b'; - push: 'c'. - lifoBuffer - push: 'x'; - push: 'y'; - push: 'z'. - - self assert: fifoBuffer isFull. - self assert: lifoBuffer isFull. - - fifoBuffer pop. - lifoBuffer pop. - self deny: fifoBuffer isFull. - self deny: lifoBuffer isFull -] - -{ #category : 'tests' } -CTBufferTest >> testOverwriteBehavior [ - - "FIFO: Overwrites oldest, readIndex points to next oldest" - fifoBuffer push: 'first'; push: 'second'; push: 'third'. - fifoBuffer push: 'fourth'. - self assert: fifoBuffer size equals: 3. - self assert: fifoBuffer isFull. - self assert: fifoBuffer peek equals: 'second'. "First was overwritten" - self assert: fifoBuffer readIndex equals: 2. - self assert: fifoBuffer writeIndex equals: 2. - - "LIFO: Overwrites oldest, readIndex points to newest" - lifoBuffer push: 'first'; push: 'second'; push: 'third'. - lifoBuffer push: 'fourth'. - self assert: lifoBuffer size equals: 3. - self assert: lifoBuffer isFull. - self assert: lifoBuffer peek equals: 'fourth'. "Newest element" - self assert: lifoBuffer readIndex equals: 1. - self assert: lifoBuffer writeIndex equals: 2 -] - -{ #category : 'tests' } -CTBufferTest >> testOverwriteBehaviorWithAvailableSpace [ - - fifoBuffer - push: 'a'; - push: 'b'; - push: 'c'. - lifoBuffer - push: 'x'; - push: 'y'; - push: 'z'. - - self assert: fifoBuffer availableSpace equals: 0. - self assert: lifoBuffer availableSpace equals: 0. - - fifoBuffer push: 'd'. - lifoBuffer push: 'w'. - - self assert: fifoBuffer availableSpace equals: 0. - self assert: lifoBuffer availableSpace equals: 0. - self assert: fifoBuffer size equals: 3. - self assert: lifoBuffer size equals: 3 -] - -{ #category : 'tests' } -CTBufferTest >> testPeekAndPop [ - - "FIFO: Oldest First" - fifoBuffer push: 'first'; push: 'second'; push: 'third'. - self assert: fifoBuffer peek equals: 'first'. - self assert: fifoBuffer size equals: 3. - self assert: fifoBuffer pop equals: 'first'. - self assert: fifoBuffer size equals: 2. - self assert: fifoBuffer peek equals: 'second'. - - "LIFO: Newest First" - lifoBuffer push: 'first'; push: 'second'; push: 'third'. - self assert: lifoBuffer peek equals: 'third'. - self assert: lifoBuffer size equals: 3. - self assert: lifoBuffer pop equals: 'third'. - self assert: lifoBuffer size equals: 2. - self assert: lifoBuffer peek equals: 'second' -] - -{ #category : 'tests' } -CTBufferTest >> testPopAndPushSequence [ - - fifoBuffer - push: 'a'; - push: 'b'. - fifoBuffer pop. - fifoBuffer push: 'c'. - - self assert: fifoBuffer size equals: 2. - self assert: fifoBuffer pop equals: 'b'. - self assert: fifoBuffer pop equals: 'c'. - self assert: fifoBuffer isEmpty. - - lifoBuffer - push: 'x'; - push: 'y'. - lifoBuffer pop. - lifoBuffer push: 'z'. - - self assert: lifoBuffer size equals: 2. - self assert: lifoBuffer pop equals: 'z'. - self assert: lifoBuffer pop equals: 'x'. - self assert: lifoBuffer isEmpty -] - -{ #category : 'tests' } -CTBufferTest >> testPushAllCollection [ - - | result | - result := fifoBuffer pushAll: #('a' 'b' 'c'). - - self assert: fifoBuffer size equals: 3. - self assert: result equals: 'c'. "Returns last element" - self assert: fifoBuffer isFull -] - -{ #category : 'tests' } -CTBufferTest >> testPushMultipleElements [ - - fifoBuffer push: 'first'; push: 'second'; push: 'third'. - - self assert: fifoBuffer size equals: 3. - self assert: fifoBuffer isFull. - self assert: fifoBuffer availableSpace equals: 0. - self assert: fifoBuffer writeIndex equals: 1. - self assert: fifoBuffer readIndex equals: 1 -] - -{ #category : 'tests' } -CTBufferTest >> testPushSingleElement [ - - fifoBuffer push: 'first'. - - self assert: fifoBuffer size equals: 1. - self deny: fifoBuffer isEmpty. - self deny: fifoBuffer isFull. - self assert: fifoBuffer availableSpace equals: 2. - self assert: fifoBuffer writeIndex equals: 2. - self assert: fifoBuffer readIndex equals: 1 -] - -{ #category : 'tests' } -CTBufferTest >> testReadIndexAfterPop [ - - "FIFO: readIndex moves to next oldest" - fifoBuffer push: 'a'; push: 'b'; push: 'c'. - fifoBuffer pop. - self assert: fifoBuffer readIndex equals: 2. - - "LIFO: readIndex moves to next newest" - lifoBuffer push: 'x'; push: 'y'; push: 'z'. - lifoBuffer pop. - self assert: lifoBuffer readIndex equals: 2 -] - -{ #category : 'tests' } -CTBufferTest >> testReadIndexBehaviorOnAdd [ - - "FIFO: readIndex stays on oldest" - fifoBuffer push: 'first'. - self assert: fifoBuffer readIndex equals: 1. - fifoBuffer push: 'second'. - self assert: fifoBuffer readIndex equals: 1. - fifoBuffer push: 'third'. - self assert: fifoBuffer readIndex equals: 1. - - "LIFO: readIndex moves to newest" - lifoBuffer push: 'first'. - self assert: lifoBuffer readIndex equals: 1. - lifoBuffer push: 'second'. - self assert: lifoBuffer readIndex equals: 2. - lifoBuffer push: 'third'. - self assert: lifoBuffer readIndex equals: 3 -] - -{ #category : 'tests' } -CTBufferTest >> testReadIndexBehaviorOnOverwrite [ - "FIFO: readIndex moves away from overwritten element" - - fifoBuffer - push: 'a'; - push: 'b'; - push: 'c'. - self assert: fifoBuffer readIndex equals: 1. - fifoBuffer push: 'd'. - self assert: fifoBuffer readIndex equals: 2. - fifoBuffer push: 'e'. - self assert: fifoBuffer readIndex equals: 3. - - "LIFO: readIndex points to newest element" - lifoBuffer - push: 'a'; - push: 'b'; - push: 'c'. - self assert: lifoBuffer readIndex equals: 3. - lifoBuffer push: 'd'. - self assert: lifoBuffer readIndex equals: 1. - lifoBuffer push: 'e'. - self assert: lifoBuffer readIndex equals: 2 -] - -{ #category : 'tests' } -CTBufferTest >> testSize [ - - self assert: fifoBuffer size equals: 0. - self assert: lifoBuffer size equals: 0. - - fifoBuffer push: 'a'. - lifoBuffer push: 'x'. - self assert: fifoBuffer size equals: 1. - self assert: lifoBuffer size equals: 1. - - fifoBuffer - push: 'b'; - push: 'c'. - lifoBuffer - push: 'y'; - push: 'z'. - self assert: fifoBuffer size equals: 3. - self assert: lifoBuffer size equals: 3. - - fifoBuffer pop. - lifoBuffer pop. - self assert: fifoBuffer size equals: 2. - self assert: lifoBuffer size equals: 2 -] - -{ #category : 'tests' } -CTBufferTest >> testWriteIndexAfterPopAndOverwrite [ - - | writeIndexAfterPop | - fifoBuffer - push: 'a'; - push: 'b'; - push: 'c'. - fifoBuffer pop. - - writeIndexAfterPop := fifoBuffer writeIndex. - - fifoBuffer push: 'd'. - fifoBuffer push: 'e'. - - self assert: fifoBuffer size equals: 3. - - lifoBuffer - push: 'x'; - push: 'y'; - push: 'z'. - lifoBuffer pop. - lifoBuffer push: 'w'. - - self assert: lifoBuffer size equals: 3. - self assert: lifoBuffer peek equals: 'w' -] - -{ #category : 'tests' } -CTBufferTest >> testWriteIndexBehavior [ - - self assert: fifoBuffer writeIndex equals: 1. - self assert: lifoBuffer writeIndex equals: 1. - - fifoBuffer push: 'a'. - lifoBuffer push: 'x'. - self assert: fifoBuffer writeIndex equals: 2. - self assert: lifoBuffer writeIndex equals: 2. - - fifoBuffer - push: 'b'; - push: 'c'. - lifoBuffer - push: 'y'; - push: 'z'. - self assert: fifoBuffer writeIndex equals: 1. - self assert: lifoBuffer writeIndex equals: 1 -] diff --git a/src/Containers-Buffer-Tests/CTFIFOBufferTest.class.st b/src/Containers-Buffer-Tests/CTFIFOBufferTest.class.st new file mode 100644 index 0000000..83379e1 --- /dev/null +++ b/src/Containers-Buffer-Tests/CTFIFOBufferTest.class.st @@ -0,0 +1,170 @@ +" +Test class for FIFO (First In, First Out) buffer implementation. +Tests FIFO-specific ordering behavior and includes real-world usage examples. +" +Class { + #name : 'CTFIFOBufferTest', + #superclass : 'CTAbstractBufferTest', + #category : 'Containers-Buffer-Tests', + #package : 'Containers-Buffer-Tests' +} + +{ #category : 'running' } +CTFIFOBufferTest >> setUp [ + super setUp. + buffer := CTFIFOBuffer withCapacity: 3 +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testChatMessageQueue [ + + | chatQueue displayedMessages | + chatQueue := CTFIFOBuffer withCapacity: 4. + displayedMessages := OrderedCollection new. + + chatQueue push: 'Alok: Hello everyone!'. + chatQueue push: 'Sebastian: Hey Alok!'. + chatQueue push: 'Gordana: How is everyone doing?'. + chatQueue push: 'Sebastian: Great to see you all!'. + + displayedMessages add: chatQueue pop. + self assert: displayedMessages last equals: 'Alok: Hello everyone!'. + + chatQueue push: 'Alok: Sorry I was late!'. + [ chatQueue isEmpty ] whileFalse: [ + displayedMessages add: chatQueue pop ]. + + self assert: displayedMessages size equals: 5. + self assert: (displayedMessages at: 2) equals: 'Sebastian: Hey Alok!'. + self assert: displayedMessages last equals: 'Alok: Sorry I was late!' +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testCopyBufferContentsOrder [ + + | copy | + buffer push: 'a'; push: 'b'; push: 'c'. + copy := buffer copy. + + self assert: copy pop equals: 'a'. + self assert: copy pop equals: 'b'. + self assert: copy pop equals: 'c' +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testDoIteration [ + + | elements | + buffer push: 'first'; push: 'second'; push: 'third'. + elements := OrderedCollection new. + buffer do: [ :each | elements add: each ]. + + self assert: elements asArray equals: #('first' 'second' 'third') +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testDoIterationAfterOverwrite [ + + | elements | + buffer push: 'a'; push: 'b'; push: 'c'. + buffer push: 'd'. + + elements := OrderedCollection new. + buffer do: [ :each | elements add: each ]. + self assert: elements asArray equals: #('b' 'c' 'd') +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testOverwriteBehavior [ + + buffer push: 'first'; push: 'second'; push: 'third'. + buffer push: 'fourth'. + + self assert: buffer size equals: 3. + self assert: buffer isFull. + self assert: buffer peek equals: 'second'. + self assert: buffer readIndex equals: 2. + self assert: buffer writeIndex equals: 2 +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testPeekAndPop [ + + buffer push: 'first'; push: 'second'; push: 'third'. + + self assert: buffer peek equals: 'first'. + self assert: buffer size equals: 3. + self assert: buffer pop equals: 'first'. + self assert: buffer size equals: 2. + self assert: buffer peek equals: 'second' +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testPopAndPushSequence [ + + buffer push: 'a'; push: 'b'. + self assert: buffer pop equals: 'a'. + buffer push: 'c'. + + self assert: buffer pop equals: 'b'. + self assert: buffer pop equals: 'c'. + self assert: buffer isEmpty +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testReadIndexAfterPop [ + + buffer push: 'a'; push: 'b'; push: 'c'. + buffer pop. + self assert: buffer readIndex equals: 2 +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testReadIndexBehaviorOnAdd [ + + buffer push: 'first'. + self assert: buffer readIndex equals: 1. + buffer push: 'second'. + self assert: buffer readIndex equals: 1. + buffer push: 'third'. + self assert: buffer readIndex equals: 1 +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testReadIndexBehaviorOnOverwrite [ + + buffer push: 'a'; push: 'b'; push: 'c'. + self assert: buffer readIndex equals: 1. + + buffer push: 'd'. + self assert: buffer readIndex equals: 2. + + buffer push: 'e'. + self assert: buffer readIndex equals: 3 +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testWriteIndexAfterPopAndOverwrite [ + + buffer push: 'a'; push: 'b'; push: 'c'. + self assert: buffer writeIndex equals: 1. + + buffer pop. + self assert: buffer writeIndex equals: 1. + + buffer push: 'd'. + self assert: buffer writeIndex equals: 2. + buffer push: 'e'. + self assert: buffer writeIndex equals: 3. + self assert: buffer size equals: 3 +] + +{ #category : 'tests' } +CTFIFOBufferTest >> testWriteIndexBehavior [ + + self assert: buffer writeIndex equals: 1. + buffer push: 'a'. + self assert: buffer writeIndex equals: 2. + buffer push: 'b'; push: 'c'. + self assert: buffer writeIndex equals: 1 +] diff --git a/src/Containers-Buffer-Tests/CTLIFOBufferTest.class.st b/src/Containers-Buffer-Tests/CTLIFOBufferTest.class.st new file mode 100644 index 0000000..8c2fff3 --- /dev/null +++ b/src/Containers-Buffer-Tests/CTLIFOBufferTest.class.st @@ -0,0 +1,171 @@ +" +Test class for LIFO (Last In, First Out) buffer implementation. +Tests LIFO-specific ordering behavior and includes real-world usage examples. +" +Class { + #name : 'CTLIFOBufferTest', + #superclass : 'CTAbstractBufferTest', + #category : 'Containers-Buffer-Tests', + #package : 'Containers-Buffer-Tests' +} + +{ #category : 'running' } +CTLIFOBufferTest >> setUp [ +super setUp. + buffer := CTLIFOBuffer withCapacity: 3 +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testBrowserHistory [ + +| browserHistory visitedPages | + browserHistory := CTLIFOBuffer withCapacity: 3. + visitedPages := OrderedCollection new. + + browserHistory push: 'https://google.com'. + browserHistory push: 'https://github.com/pharo-containers'. + browserHistory push: 'https://stackoverflow.com'. + browserHistory push: 'https://reddit.com'. + + visitedPages add: browserHistory pop. + self assert: visitedPages last equals: 'https://reddit.com'. + + browserHistory push: 'https://pharo.org'. + [ browserHistory isEmpty ] whileFalse: [ + visitedPages add: browserHistory pop ]. + + self assert: visitedPages size equals: 4. + self assert: visitedPages first equals: 'https://reddit.com'. + self assert: (visitedPages at: 2) equals: 'https://pharo.org'. + self assert: (visitedPages at: 3) equals: 'https://stackoverflow.com'. + self assert: visitedPages last equals: 'https://github.com/pharo-containers' +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testCopyBufferContentsOrder [ + + | copy | + buffer push: 'a'; push: 'b'; push: 'c'. + copy := buffer copy. + + self assert: copy pop equals: 'c'. + self assert: copy pop equals: 'b'. + self assert: copy pop equals: 'a' +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testDoIteration [ + + | elements | + buffer push: 'first'; push: 'second'; push: 'third'. + elements := OrderedCollection new. + buffer do: [ :each | elements add: each ]. + + self assert: elements asArray equals: #('third' 'second' 'first') +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testDoIterationAfterOverwrite [ + + | elements | + buffer push: 'a'; push: 'b'; push: 'c'. + buffer push: 'd'. + + elements := OrderedCollection new. + buffer do: [ :each | elements add: each ]. + self assert: elements asArray equals: #('d' 'c' 'b') +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testOverwriteBehavior [ + + buffer push: 'first'; push: 'second'; push: 'third'. + buffer push: 'fourth'. + + self assert: buffer size equals: 3. + self assert: buffer isFull. + self assert: buffer peek equals: 'fourth'. + self assert: buffer readIndex equals: 1. + self assert: buffer writeIndex equals: 2 +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testPeekAndPop [ + + buffer push: 'first'; push: 'second'; push: 'third'. + + self assert: buffer peek equals: 'third'. + self assert: buffer size equals: 3. + self assert: buffer pop equals: 'third'. + self assert: buffer size equals: 2. + self assert: buffer peek equals: 'second' +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testPopAndPushSequence [ + + buffer push: 'a'; push: 'b'. + self assert: buffer pop equals: 'b'. + buffer push: 'c'. + + self assert: buffer pop equals: 'c'. + self assert: buffer pop equals: 'a'. + self assert: buffer isEmpty +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testReadIndexAfterPop [ + + buffer push: 'x'; push: 'y'; push: 'z'. + buffer pop. + self assert: buffer readIndex equals: 2 +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testReadIndexBehaviorOnAdd [ + + buffer push: 'first'. + self assert: buffer readIndex equals: 1. + buffer push: 'second'. + self assert: buffer readIndex equals: 2. + buffer push: 'third'. + self assert: buffer readIndex equals: 3 +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testReadIndexBehaviorOnOverwrite [ + + buffer push: 'a'; push: 'b'; push: 'c'. + self assert: buffer readIndex equals: 3. + + buffer push: 'd'. + self assert: buffer readIndex equals: 1. + + buffer push: 'e'. + self assert: buffer readIndex equals: 2 +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testWriteIndexAfterPopAndOverwrite [ + + buffer push: 'a'; push: 'b'; push: 'c'. + self assert: buffer writeIndex equals: 1. + + buffer pop. + self assert: buffer writeIndex equals: 3. + + buffer push: 'd'. + self assert: buffer writeIndex equals: 1. + self assert: buffer size equals: 3. + self assert: buffer peek equals: 'd' +] + +{ #category : 'tests' } +CTLIFOBufferTest >> testWriteIndexBehavior [ + + self assert: buffer writeIndex equals: 1. + buffer push: 'a'. + self assert: buffer writeIndex equals: 2. + buffer push: 'b'; push: 'c'. + self assert: buffer writeIndex equals: 1 +] diff --git a/src/Containers-Buffer/CTAbstractBuffer.class.st b/src/Containers-Buffer/CTAbstractBuffer.class.st index 2377c63..155b9b1 100644 --- a/src/Containers-Buffer/CTAbstractBuffer.class.st +++ b/src/Containers-Buffer/CTAbstractBuffer.class.st @@ -61,12 +61,7 @@ CTAbstractBuffer >> clear [ { #category : 'copying' } CTAbstractBuffer >> copy [ - "Return a copy of the buffer with same contents" - - | copy | - copy := self class withCapacity: capacity. - self do: [ :each | copy push: each ]. - ^ copy + ^ self subclassResponsibility ] { #category : 'enumerating' } diff --git a/src/Containers-Buffer/CTFIFOBuffer.class.st b/src/Containers-Buffer/CTFIFOBuffer.class.st index 4710149..2d1bc21 100644 --- a/src/Containers-Buffer/CTFIFOBuffer.class.st +++ b/src/Containers-Buffer/CTFIFOBuffer.class.st @@ -8,6 +8,15 @@ Class { #package : 'Containers-Buffer' } +{ #category : 'copying' } +CTFIFOBuffer >> copy [ + + | copy | + copy := self class withCapacity: capacity. + self do: [ :each | copy push: each ]. + ^ copy +] + { #category : 'enumerating' } CTFIFOBuffer >> do: aBlock [ diff --git a/src/Containers-Buffer/CTLIFOBuffer.class.st b/src/Containers-Buffer/CTLIFOBuffer.class.st index b9d29ec..5245984 100644 --- a/src/Containers-Buffer/CTLIFOBuffer.class.st +++ b/src/Containers-Buffer/CTLIFOBuffer.class.st @@ -9,6 +9,26 @@ Class { #package : 'Containers-Buffer' } +{ #category : 'copying' } +CTLIFOBuffer >> copy [ + "Return a copy of the LIFO buffer with same contents and order" + + | copy index | + copy := self class withCapacity: capacity. + self isEmpty ifTrue: [ ^ copy ]. + + index := readIndex. + (currentSize - 1) timesRepeat: [ + index := index = 1 ifTrue: [ capacity ] ifFalse: [ index - 1 ] + ]. + + currentSize timesRepeat: [ + copy push: (elements at: index). + index := index \\ capacity + 1 + ]. + ^ copy +] + { #category : 'enumerating' } CTLIFOBuffer >> do: aBlock [