[squeak-dev] Review Request: SparseLargeTable enumerate+tests.1.cs

Marcel Taeumel marcel.taeumel at hpi.de
Mon Feb 28 08:21:31 UTC 2022


Wohoo! More tests. :-) Thanks. That thing about #withIndexDo: sounds reasonable.

+1

Best,
Marcel
Am 26.02.2022 22:19:42 schrieb christoph.thiede at student.hpi.uni-potsdam.de <christoph.thiede at student.hpi.uni-potsdam.de>:
=============== Summary ===============

Change Set:        SparseLargeTable enumerate+tests
Date:            26 February 2022
Author:            Christoph Thiede

This changeset makes two revisions two the enumerating protocol of SparseLargeTable and adds a few test for SparseLargeTable/SpargeLargeArray. Details:

* Overrides #withIndexDo: to start from base index only
* Adds #sparseElementsAndIndicesDo: for efficient iterating over all non-default values
* Tests instance creation and enumeration for SparseLargeTable/SparseLargeArray

=============== Diff ===============

SparseLargeArrayTest
+ SparseLargeTableTest subclass: #SparseLargeArrayTest
+     instanceVariableNames: ''
+     classVariableNames: ''
+     poolDictionaries: ''
+     category: 'CollectionsTests-Arrayed'
+
+ SparseLargeArrayTest class
+     instanceVariableNames: ''
+
+ ""

SparseLargeArrayTest>>classUnderTest {accessing} · ct 2/26/2022 21:52
+ classUnderTest
+
+     ^ SparseLargeArray

SparseLargeArrayTest>>expectedFailures {accessing} · ct 2/26/2022 21:59
+ expectedFailures
+
+     ^ super expectedFailures ,
+         #(testAccessing testSparseElementsAndIndicesDo) "SparseLargeArray(SparseLargeTable)>>zapDefaultOnlyEntries fails for last chunk"

SparseLargeArrayTest>>testAccessingWithoutZapping {testing - accessing} · ct 2/26/2022 21:57
+ testAccessingWithoutZapping
+
+     | size chunkSize indices table |
+     size := 60.
+     chunkSize := 8.
+     indices := #(20 22 23 27 28 29 54 56 57 58).
+     table := self classUnderTest new: size chunkSize: chunkSize arrayClass: DoubleByteArray base: 11 defaultValue: 0.
+     indices do: [:index |
+         table at: index put: index squared].
+     self shouldRaiseError: [table at: 40 put: 2 << 15].
+     
+     self assert: size equals: table size.
+     self assert: chunkSize equals: table chunkSize.
+     
+     indices do: [:index |
+         self assert: index squared equals: ((table at: index))].

SparseLargeArrayTest>>testSparseElementsAndIndicesDoWithoutZapping {testing - accessing} · ct 2/26/2022 21:59
+ testSparseElementsAndIndicesDoWithoutZapping
+
+     | defaultValue indices table sparse |
+     defaultValue := 0.
+     indices := #(20 22 23 27 28 29 54 56 57 58).
+     table := self classUnderTest new: 60 chunkSize: 8 arrayClass: DoubleByteArray base: 11 defaultValue: defaultValue.
+     indices do: [:index |
+         table at: index put: index squared].
+     
+     sparse := Dictionary new.
+     table sparseElementsAndIndicesDo: [:element :index |
+         self deny: (sparse includesKey: index).
+         sparse at: index put: element].
+     
+     table withIndexDo: [:element :index |
+         self assert: element equals: (sparse at: index ifAbsent: [0])].

SparseLargeTable>>sparseElementsAndIndicesDo: {accessing} · ct 2/26/2022 22:06
+ sparseElementsAndIndicesDo: binaryBlock
+     "Evaluate binaryBlock for each element and index in the receiver that has a non-default value."
+
+     1 to: self basicSize do: [:chunkIndex |
+         (self basicAt: chunkIndex) ifNotNil: [:chunk |
+             chunk withIndexDo: [:element :innerIndex |
+                 element ~= defaultValue ifTrue: [
+                     binaryBlock value: element value: innerIndex + base - 1 + (chunkIndex - 1 * chunkSize)]]]].

SparseLargeTable>>withIndexDo: {enumerating} · ct 2/26/2022 22:02
+ withIndexDo: binaryBlock
+
+     self base to: self size do: [:index |
+         binaryBlock
+             value: (self at: index)
+             value: index].

SparseLargeTableTest
+ TestCase subclass: #SparseLargeTableTest
+     instanceVariableNames: ''
+     classVariableNames: ''
+     poolDictionaries: ''
+     category: 'CollectionsTests-Arrayed'
+
+ SparseLargeTableTest class
+     instanceVariableNames: ''
+
+ ""

SparseLargeTableTest>>classUnderTest {accessing} · ct 2/26/2022 21:51
+ classUnderTest
+
+     ^ SparseLargeTable

SparseLargeTableTest>>testAccessing {tests - accessing} · ct 2/26/2022 21:52
+ testAccessing
+
+     | size chunkSize indices table |
+     size := 60.
+     chunkSize := 8.
+     indices := #(20 22 23 27 28 29 54 56 57 58).
+     table := self classUnderTest new: size chunkSize: chunkSize arrayClass: DoubleByteArray base: 11 defaultValue: 0.
+     indices do: [:index |
+         table at: index put: index squared].
+     self shouldRaiseError: [table at: 40 put: 2 << 15].
+     table zapDefaultOnlyEntries.
+     
+     self assert: size equals: table size.
+     self assert: chunkSize equals: table chunkSize.
+     
+     indices do: [:index |
+         self assert: index squared equals: ((table at: index))].

SparseLargeTableTest>>testNew {tests - instance creation} · ct 2/26/2022 21:52
+ testNew
+     
+     | table |
+     table := self classUnderTest new.
+     self assert: 0 equals: table size.

SparseLargeTableTest>>testNewFrom {tests - instance creation} · ct 2/26/2022 21:52
+ testNewFrom
+
+     | array table |
+     array := Array streamContents: [:stream |
+         15 timesRepeat: [stream nextPutAll: #($a $b $b $b $b $c $c $a)]]. "must be longer than defaultChunkSize"
+     table := self classUnderTest newFrom: array.
+     self assert: array size equals: table size.
+     self assert: array equals: table asArray.

SparseLargeTableTest>>testNewWithAll {tests - instance creation} · ct 2/26/2022 21:52
+ testNewWithAll
+
+     | size table |
+     size := 150. "must be longer than defaultChunkSize"
+     table := self classUnderTest new: size withAll: 2.
+     self assert: size equals: table size.
+     self assert: (Array new: size withAll: 2) equals: table asArray.

SparseLargeTableTest>>testNewWithSize {tests - instance creation} · ct 2/26/2022 21:52
+ testNewWithSize
+
+     | size table |
+     size := 14.
+     table := self classUnderTest new: size chunkSize: 5.
+     self assert: size equals: table size.
+     1 to: size do: [:index | self assert: (table at: index) isNil].
+     self shouldRaiseError: [table at: 0].
+     self shouldRaiseError: [table at: size + 1].

SparseLargeTableTest>>testSparseElementsAndIndicesDo {tests - accessing} · ct 2/26/2022 21:52
+ testSparseElementsAndIndicesDo
+
+     | defaultValue indices table sparse |
+     defaultValue := 0.
+     indices := #(20 22 23 27 28 29 54 56 57 58).
+     table := self classUnderTest new: 60 chunkSize: 8 arrayClass: DoubleByteArray base: 11 defaultValue: defaultValue.
+     indices do: [:index |
+         table at: index put: index squared].
+     table zapDefaultOnlyEntries.
+     
+     sparse := Dictionary new.
+     table sparseElementsAndIndicesDo: [:element :index |
+         self deny: (sparse includesKey: index).
+         sparse at: index put: element].
+     
+     table withIndexDo: [:element :index |
+         self assert: element equals: (sparse at: index ifAbsent: [0])].

---
Sent from Squeak Inbox Talk [https://github.com/hpi-swa-lab/squeak-inbox-talk]
["SparseLargeTable enumerate+tests.1.cs"]
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220228/a6aec3aa/attachment.html>


More information about the Squeak-dev mailing list