Eliot Miranda uploaded a new version of CollectionsTests to project The Trunk:
http://source.squeak.org/trunk/CollectionsTests-eem.342.mcz ==================== Summary ==================== Name: CollectionsTests-eem.342 Author: eem Time: 19 September 2020, 1:11:15.902536 pm UUID: ba823c3b-42f7-4276-8a25-8c59d26a3346 Ancestors: CollectionsTests-ul.341 Refator SHaredQueue2Test so that now we also test SharedQueue. Add a test for peek and peekLast =============== Diff against CollectionsTests-ul.341 =============== Item was added: + TestCase subclass: #AbstractSharedQueueTest + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'CollectionsTests-Sequenceable'! Item was added: + ----- Method: AbstractSharedQueueTest class>>isAbstract (in category 'testing') ----- + isAbstract + ^self class == thisContext methodClass! Item was added: + ----- Method: AbstractSharedQueueTest>>queueClass (in category 'private') ----- + queueClass + ^self subclassResponsibility! Item was added: + ----- Method: AbstractSharedQueueTest>>testBasics (in category 'tests') ----- + testBasics + | q | + q := self queueClass new. + + self assert: nil equals: q nextOrNil. + + q nextPut: 5. + self assert: 5 equals: q nextOrNil. + self assert: nil equals: q nextOrNil! Item was added: + ----- Method: AbstractSharedQueueTest>>testContention1 (in category 'tests') ----- + testContention1 + "here is a test case that breaks the standard SharedQueue from Squeak 3.8" + + | q r1 r2 | + q := self queueClass new. + q nextPut: 5. + q nextPut: 10. + + self assert: 5 equals: q nextOrNil. + + [ r1 := q next ] fork. + [ r2 := q next ] fork. + Processor yield. "let the above two threads block" + + q nextPut: 10. + Processor yield. + + self assert: 10 equals: r1. + self assert: 10 equals: r2. + self assert: nil equals: q nextOrNil! Item was added: + ----- Method: AbstractSharedQueueTest>>testNextOrNilSuchThat (in category 'tests') ----- + testNextOrNilSuchThat + | q item | + q := self queueClass new. + q nextPut: 5. + q nextPut: 6. + + item := q nextOrNilSuchThat: [ :x | x even ]. + self assert: 6 equals: item. + + self assert: 5 equals: q nextOrNil. + self assert: nil equals: q nextOrNil! Item was added: + ----- Method: AbstractSharedQueueTest>>testPeeks (in category 'tests') ----- + testPeeks + | q | + q := self queueClass new. + + self assert: nil equals: q peek. + self assert: nil equals: q peekLast. + + q nextPut: #first; nextPut: #last. + + self assert: #first equals: q peek. + self assert: #last equals: q peekLast. + + self assert: #first equals: q next. + + self assert: #last equals: q peek. + self assert: #last equals: q peekLast! Item was changed: + AbstractSharedQueueTest subclass: #SharedQueue2Test - TestCase subclass: #SharedQueue2Test instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'CollectionsTests-Sequenceable'! Item was added: + ----- Method: SharedQueue2Test>>queueClass (in category 'private') ----- + queueClass + ^SharedQueue2! Item was removed: - ----- Method: SharedQueue2Test>>testBasics (in category 'tests') ----- - testBasics - | q | - q := SharedQueue2 new. - - self should: [ q nextOrNil = nil ]. - - q nextPut: 5. - self should: [ q nextOrNil = 5 ]. - self should: [ q nextOrNil = nil ]. - - ! Item was removed: - ----- Method: SharedQueue2Test>>testContention1 (in category 'tests') ----- - testContention1 - "here is a test case that breaks the standard SharedQueue from Squeak 3.8" - - | q r1 r2 | - q := SharedQueue2 new. - q nextPut: 5. - q nextPut: 10. - - self should: [ q nextOrNil = 5 ]. - - [ r1 := q next ] fork. - [ r2 := q next ] fork. - Processor yield. "let the above two threads block" - - q nextPut: 10. - Processor yield. - - self should: [ r1 = 10 ]. - self should: [ r2 = 10 ]. - self should: [ q nextOrNil = nil ]. - ! Item was removed: - ----- Method: SharedQueue2Test>>testNextOrNilSuchThat (in category 'tests') ----- - testNextOrNilSuchThat - | q item | - q := SharedQueue2 new. - q nextPut: 5. - q nextPut: 6. - - item := q nextOrNilSuchThat: [ :x | x even ]. - self should: [ item = 6 ]. - - self should: [ q nextOrNil = 5 ]. - self should: [ q nextOrNil = nil ]. - ! Item was added: + AbstractSharedQueueTest subclass: #SharedQueueTest + instanceVariableNames: '' + classVariableNames: '' + poolDictionaries: '' + category: 'CollectionsTests-Sequenceable'! Item was added: + ----- Method: SharedQueueTest>>queueClass (in category 'private') ----- + queueClass + ^SharedQueue! |
Hi Eliot,
The new test has revealed a difference in #nextOrNilSuchThat: between SharedQueue and SharedQueue2. In SharedQueue, if there's an element matching the argument block, all preceding elements are removed from the queue. That is not what I would expect from such method, and that behavior contradicts the method's comment. Fortunately, #nextOrNilSuchThat: has no real users in the Trunk. Etoys has EventSensor >> #hasDandDEvents which uses #nextOrNilSuchThat:, but that method won't remove any elements, just checks if there's a matching event. IMO, we should replace all uses of SharedQueue with SharedQueue2 for the 6.0 release. A bit of surgery will be required to safely migrate all alive instances... Levente On Sat, 19 Sep 2020, [hidden email] wrote: > Eliot Miranda uploaded a new version of CollectionsTests to project The Trunk: > http://source.squeak.org/trunk/CollectionsTests-eem.342.mcz > > ==================== Summary ==================== > > Name: CollectionsTests-eem.342 > Author: eem > Time: 19 September 2020, 1:11:15.902536 pm > UUID: ba823c3b-42f7-4276-8a25-8c59d26a3346 > Ancestors: CollectionsTests-ul.341 > > Refator SHaredQueue2Test so that now we also test SharedQueue. Add a test for peek and peekLast > > =============== Diff against CollectionsTests-ul.341 =============== > > Item was added: > + TestCase subclass: #AbstractSharedQueueTest > + instanceVariableNames: '' > + classVariableNames: '' > + poolDictionaries: '' > + category: 'CollectionsTests-Sequenceable'! > > Item was added: > + ----- Method: AbstractSharedQueueTest class>>isAbstract (in category 'testing') ----- > + isAbstract > + ^self class == thisContext methodClass! > > Item was added: > + ----- Method: AbstractSharedQueueTest>>queueClass (in category 'private') ----- > + queueClass > + ^self subclassResponsibility! > > Item was added: > + ----- Method: AbstractSharedQueueTest>>testBasics (in category 'tests') ----- > + testBasics > + | q | > + q := self queueClass new. > + > + self assert: nil equals: q nextOrNil. > + > + q nextPut: 5. > + self assert: 5 equals: q nextOrNil. > + self assert: nil equals: q nextOrNil! > > Item was added: > + ----- Method: AbstractSharedQueueTest>>testContention1 (in category 'tests') ----- > + testContention1 > + "here is a test case that breaks the standard SharedQueue from Squeak 3.8" > + > + | q r1 r2 | > + q := self queueClass new. > + q nextPut: 5. > + q nextPut: 10. > + > + self assert: 5 equals: q nextOrNil. > + > + [ r1 := q next ] fork. > + [ r2 := q next ] fork. > + Processor yield. "let the above two threads block" > + > + q nextPut: 10. > + Processor yield. > + > + self assert: 10 equals: r1. > + self assert: 10 equals: r2. > + self assert: nil equals: q nextOrNil! > > Item was added: > + ----- Method: AbstractSharedQueueTest>>testNextOrNilSuchThat (in category 'tests') ----- > + testNextOrNilSuchThat > + | q item | > + q := self queueClass new. > + q nextPut: 5. > + q nextPut: 6. > + > + item := q nextOrNilSuchThat: [ :x | x even ]. > + self assert: 6 equals: item. > + > + self assert: 5 equals: q nextOrNil. > + self assert: nil equals: q nextOrNil! > > Item was added: > + ----- Method: AbstractSharedQueueTest>>testPeeks (in category 'tests') ----- > + testPeeks > + | q | > + q := self queueClass new. > + > + self assert: nil equals: q peek. > + self assert: nil equals: q peekLast. > + > + q nextPut: #first; nextPut: #last. > + > + self assert: #first equals: q peek. > + self assert: #last equals: q peekLast. > + > + self assert: #first equals: q next. > + > + self assert: #last equals: q peek. > + self assert: #last equals: q peekLast! > > Item was changed: > + AbstractSharedQueueTest subclass: #SharedQueue2Test > - TestCase subclass: #SharedQueue2Test > instanceVariableNames: '' > classVariableNames: '' > poolDictionaries: '' > category: 'CollectionsTests-Sequenceable'! > > Item was added: > + ----- Method: SharedQueue2Test>>queueClass (in category 'private') ----- > + queueClass > + ^SharedQueue2! > > Item was removed: > - ----- Method: SharedQueue2Test>>testBasics (in category 'tests') ----- > - testBasics > - | q | > - q := SharedQueue2 new. > - > - self should: [ q nextOrNil = nil ]. > - > - q nextPut: 5. > - self should: [ q nextOrNil = 5 ]. > - self should: [ q nextOrNil = nil ]. > - > - ! > > Item was removed: > - ----- Method: SharedQueue2Test>>testContention1 (in category 'tests') ----- > - testContention1 > - "here is a test case that breaks the standard SharedQueue from Squeak 3.8" > - > - | q r1 r2 | > - q := SharedQueue2 new. > - q nextPut: 5. > - q nextPut: 10. > - > - self should: [ q nextOrNil = 5 ]. > - > - [ r1 := q next ] fork. > - [ r2 := q next ] fork. > - Processor yield. "let the above two threads block" > - > - q nextPut: 10. > - Processor yield. > - > - self should: [ r1 = 10 ]. > - self should: [ r2 = 10 ]. > - self should: [ q nextOrNil = nil ]. > - ! > > Item was removed: > - ----- Method: SharedQueue2Test>>testNextOrNilSuchThat (in category 'tests') ----- > - testNextOrNilSuchThat > - | q item | > - q := SharedQueue2 new. > - q nextPut: 5. > - q nextPut: 6. > - > - item := q nextOrNilSuchThat: [ :x | x even ]. > - self should: [ item = 6 ]. > - > - self should: [ q nextOrNil = 5 ]. > - self should: [ q nextOrNil = nil ]. > - ! > > Item was added: > + AbstractSharedQueueTest subclass: #SharedQueueTest > + instanceVariableNames: '' > + classVariableNames: '' > + poolDictionaries: '' > + category: 'CollectionsTests-Sequenceable'! > > Item was added: > + ----- Method: SharedQueueTest>>queueClass (in category 'private') ----- > + queueClass > + ^SharedQueue! |
Hi Levente,
> On Sep 27, 2020, at 3:13 PM, Levente Uzonyi <[hidden email]> wrote: > > Hi Eliot, > > The new test has revealed a difference in #nextOrNilSuchThat: between SharedQueue and SharedQueue2. > In SharedQueue, if there's an element matching the argument block, all preceding elements are removed from the queue. That is not what I would expect from such method, and that behavior contradicts the method's comment. > > Fortunately, #nextOrNilSuchThat: has no real users in the Trunk. > Etoys has EventSensor >> #hasDandDEvents which uses #nextOrNilSuchThat:, but that method won't remove any elements, just checks if there's a matching event. > > IMO, we should replace all uses of SharedQueue with SharedQueue2 for the 6.0 release. I don’t disagree :-) > A bit of surgery will be required to safely migrate all alive instances... We have two choices it seems to me 1. Keep the names the same 2. change the names so that SharedQueue becomes OldSharedQueue and SharedQueue2 becomes SharedQueue If we’re keeping the names then it’s likely that all instances will migrate simply through initialization of new event queues when new bout processes etc are defined at startup. If that’s the case we can do 2. later on when there are no instances of OldSharedQueue left. > > > Levente > >> On Sat, 19 Sep 2020, [hidden email] wrote: >> >> Eliot Miranda uploaded a new version of CollectionsTests to project The Trunk: >> http://source.squeak.org/trunk/CollectionsTests-eem.342.mcz >> >> ==================== Summary ==================== >> >> Name: CollectionsTests-eem.342 >> Author: eem >> Time: 19 September 2020, 1:11:15.902536 pm >> UUID: ba823c3b-42f7-4276-8a25-8c59d26a3346 >> Ancestors: CollectionsTests-ul.341 >> >> Refator SHaredQueue2Test so that now we also test SharedQueue. Add a test for peek and peekLast >> >> =============== Diff against CollectionsTests-ul.341 =============== >> >> Item was added: >> + TestCase subclass: #AbstractSharedQueueTest >> + instanceVariableNames: '' >> + classVariableNames: '' >> + poolDictionaries: '' >> + category: 'CollectionsTests-Sequenceable'! >> >> Item was added: >> + ----- Method: AbstractSharedQueueTest class>>isAbstract (in category 'testing') ----- >> + isAbstract >> + ^self class == thisContext methodClass! >> >> Item was added: >> + ----- Method: AbstractSharedQueueTest>>queueClass (in category 'private') ----- >> + queueClass >> + ^self subclassResponsibility! >> >> Item was added: >> + ----- Method: AbstractSharedQueueTest>>testBasics (in category 'tests') ----- >> + testBasics >> + | q | >> + q := self queueClass new. >> + + self assert: nil equals: q nextOrNil. >> + + q nextPut: 5. >> + self assert: 5 equals: q nextOrNil. >> + self assert: nil equals: q nextOrNil! >> >> Item was added: >> + ----- Method: AbstractSharedQueueTest>>testContention1 (in category 'tests') ----- >> + testContention1 >> + "here is a test case that breaks the standard SharedQueue from Squeak 3.8" >> + + | q r1 r2 | >> + q := self queueClass new. >> + q nextPut: 5. >> + q nextPut: 10. >> + + self assert: 5 equals: q nextOrNil. >> + + [ r1 := q next ] fork. >> + [ r2 := q next ] fork. >> + Processor yield. "let the above two threads block" >> + + q nextPut: 10. >> + Processor yield. >> + + self assert: 10 equals: r1. >> + self assert: 10 equals: r2. >> + self assert: nil equals: q nextOrNil! >> >> Item was added: >> + ----- Method: AbstractSharedQueueTest>>testNextOrNilSuchThat (in category 'tests') ----- >> + testNextOrNilSuchThat >> + | q item | >> + q := self queueClass new. >> + q nextPut: 5. >> + q nextPut: 6. >> + + item := q nextOrNilSuchThat: [ :x | x even ]. >> + self assert: 6 equals: item. >> + + self assert: 5 equals: q nextOrNil. >> + self assert: nil equals: q nextOrNil! >> >> Item was added: >> + ----- Method: AbstractSharedQueueTest>>testPeeks (in category 'tests') ----- >> + testPeeks >> + | q | >> + q := self queueClass new. >> + + self assert: nil equals: q peek. >> + self assert: nil equals: q peekLast. >> + + q nextPut: #first; nextPut: #last. >> + + self assert: #first equals: q peek. >> + self assert: #last equals: q peekLast. >> + + self assert: #first equals: q next. >> + + self assert: #last equals: q peek. >> + self assert: #last equals: q peekLast! >> >> Item was changed: >> + AbstractSharedQueueTest subclass: #SharedQueue2Test >> - TestCase subclass: #SharedQueue2Test >> instanceVariableNames: '' >> classVariableNames: '' >> poolDictionaries: '' >> category: 'CollectionsTests-Sequenceable'! >> >> Item was added: >> + ----- Method: SharedQueue2Test>>queueClass (in category 'private') ----- >> + queueClass >> + ^SharedQueue2! >> >> Item was removed: >> - ----- Method: SharedQueue2Test>>testBasics (in category 'tests') ----- >> - testBasics >> - | q | >> - q := SharedQueue2 new. >> - - self should: [ q nextOrNil = nil ]. >> - - q nextPut: 5. >> - self should: [ q nextOrNil = 5 ]. >> - self should: [ q nextOrNil = nil ]. >> - - ! >> >> Item was removed: >> - ----- Method: SharedQueue2Test>>testContention1 (in category 'tests') ----- >> - testContention1 >> - "here is a test case that breaks the standard SharedQueue from Squeak 3.8" >> - - | q r1 r2 | >> - q := SharedQueue2 new. >> - q nextPut: 5. >> - q nextPut: 10. >> - - self should: [ q nextOrNil = 5 ]. >> - - [ r1 := q next ] fork. >> - [ r2 := q next ] fork. >> - Processor yield. "let the above two threads block" >> - - q nextPut: 10. >> - Processor yield. >> - - self should: [ r1 = 10 ]. >> - self should: [ r2 = 10 ]. >> - self should: [ q nextOrNil = nil ]. >> - ! >> >> Item was removed: >> - ----- Method: SharedQueue2Test>>testNextOrNilSuchThat (in category 'tests') ----- >> - testNextOrNilSuchThat >> - | q item | >> - q := SharedQueue2 new. >> - q nextPut: 5. >> - q nextPut: 6. >> - - item := q nextOrNilSuchThat: [ :x | x even ]. >> - self should: [ item = 6 ]. >> - - self should: [ q nextOrNil = 5 ]. >> - self should: [ q nextOrNil = nil ]. >> - ! >> >> Item was added: >> + AbstractSharedQueueTest subclass: #SharedQueueTest >> + instanceVariableNames: '' >> + classVariableNames: '' >> + poolDictionaries: '' >> + category: 'CollectionsTests-Sequenceable'! >> >> Item was added: >> + ----- Method: SharedQueueTest>>queueClass (in category 'private') ----- >> + queueClass >> + ^SharedQueue! > |
Free forum by Nabble | Edit this page |