The Trunk: CollectionsTests-eem.342.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: CollectionsTests-eem.342.mcz

commits-2
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!


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: CollectionsTests-eem.342.mcz

Levente Uzonyi
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!

Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: CollectionsTests-eem.342.mcz

Eliot Miranda-2
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!
>