The Trunk: CollectionsTests-ul.263.mcz

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

The Trunk: CollectionsTests-ul.263.mcz

commits-2
Levente Uzonyi uploaded a new version of CollectionsTests to project The Trunk:
http://source.squeak.org/trunk/CollectionsTests-ul.263.mcz

==================== Summary ====================

Name: CollectionsTests-ul.263
Author: ul
Time: 2 June 2016, 5:49:02.940363 pm
UUID: caaf5382-04e8-47fb-9db3-9b5e97cb3aed
Ancestors: CollectionsTests-mt.262

- added a few more heap tests

=============== Diff against CollectionsTests-mt.262 ===============

Item was changed:
  ----- Method: HeapTest>>heapSortExample (in category 'examples') -----
+ heapSortExample
+ "Sort a random collection of Floats and compare the results with #quicksort and #sort (using the merge-sort algorithm)."
+ "HeapTest new heapSortExample"
+
+ | arrayToSort n rnd array time |
+ Smalltalk garbageCollectMost.
+ n := 50000. "# of elements to sort"
- heapSortExample "HeapTest new heapSortExample"
- "Sort a random collection of Floats and compare the results with
- SortedCollection (using the quick-sort algorithm) and
- ArrayedCollection>>mergeSortFrom:to:by: (using the merge-sort algorithm)."
- | n rnd array  time sorted |
- n := 10000. "# of elements to sort"
  rnd := Random new.
+ array := Array new: n.
+ 1 to: n do: [ :index | array at: index put: rnd next ].
+ arrayToSort := array copy.
- array := (1 to: n) collect:[:i| rnd next].
  "First, the heap version"
+ self deny: arrayToSort isSorted.
+ time := [ (Heap on: arrayToSort) sort ] timeToRun.
+ self assert: arrayToSort isSorted.
+ Transcript cr; show: 'Time for heap-sort: ', time printString,' msecs'.
- time := Time millisecondsToRun:[
- sorted := Heap withAll: array.
- 1 to: n do:[:i| sorted removeFirst].
- ].
- Transcript cr; show:'Time for heap-sort: ', time printString,' msecs'.
  "The quicksort version"
+ arrayToSort copyFrom: array.
+ self deny: arrayToSort isSorted.
+ time := [ arrayToSort quickSort ] timeToRun.
+ self assert: arrayToSort isSorted.
+ Transcript cr; show: 'Time for quick-sort: ', time printString,' msecs'.
- time := Time millisecondsToRun:[
- sorted := SortedCollection withAll: array.
- ].
- Transcript cr; show:'Time for quick-sort: ', time printString,' msecs'.
  "The merge-sort version"
+ arrayToSort copyFrom: array.
+ self deny: arrayToSort isSorted.
+ time := [ arrayToSort sort ] timeToRun.
+ self assert: arrayToSort isSorted.
+ Transcript cr; show: 'Time for merge-sort: ', time printString,' msecs'!
- time := Time millisecondsToRun:[
- array mergeSortFrom: 1 to: array size by: [:v1 :v2| v1 <= v2].
- ].
- Transcript cr; show:'Time for merge-sort: ', time printString,' msecs'.
- !

Item was changed:
+ ----- Method: HeapTest>>test1 (in category 'tests') -----
- ----- Method: HeapTest>>test1 (in category 'testing') -----
  test1
  | data |
 
  "The first element of each array is the sort value, and the second will be updated by the heap with the index of the element within the heap."
  data :=  (1 to: 8) collect: [:i | {i*2. 0}].
 
  "Repeat with different data ordering."
  5 timesRepeat: [ | h |
  h := Heap new sortBlock: [:e1 :e2 | e1 first < e2 first].
  h indexUpdateBlock: [:array :index | array at: 2 put: index].
 
  data shuffled do: [:d | h add: d].
  data do: [:d | self should: (h at: d second) == d].
  ]!

Item was changed:
+ ----- Method: HeapTest>>testAdd (in category 'tests') -----
- ----- Method: HeapTest>>testAdd (in category 'basic tests') -----
  testAdd
  "self run: #testAdd"
 
  | heap |
  heap := Heap new.
  self assert: heap size = 0.
  heap add: 3.
  self assert: heap size = 1.
  self assert: heap isEmpty not.
  self assert: heap first = 3.
  self assert: (heap at: 1) = 3.
  heap add: 2.
  self assert: heap size = 2.
  self assert: heap first = 2.
  self assert: (heap at: 2) = 3.
  !

Item was added:
+ ----- Method: HeapTest>>testAddAndRemoveFirst (in category 'tests') -----
+ testAddAndRemoveFirst
+
+ | random heap validateHeap |
+ random := Random seed: 36rSqueak.
+ heap := Heap sortBlock: [ :a :b | a first >= b first ].
+ heap indexUpdateBlock: [ :element :newIndex | element at: 2 put: newIndex ].
+ validateHeap := [ heap isValidHeap and: [
+ heap do: [ :each | self assert: (heap at: each second) == each ] ] ].
+ validateHeap value.
+ self assert: 0 equals: heap size.
+ self assert: heap isEmpty.
+ 1 to: 100 do: [ :index |
+ heap add: { random next. nil }.
+ self assert: index equals: heap size.
+ validateHeap value ].
+ 1000 timesRepeat: [
+ | first |
+ first := heap removeFirst.
+ heap do: [ :each | self assert: (heap sortBlock value: first value: each) ].
+ heap add: { random next. nil }.
+ validateHeap value ]!

Item was changed:
+ ----- Method: HeapTest>>testAt (in category 'tests') -----
- ----- Method: HeapTest>>testAt (in category 'basic tests') -----
  testAt
  "self run: #testAt"
 
  | heap |
  heap := Heap new.
  heap add: 3.
  self assert: (heap at: 1) = 3.
  self should: [heap at: 2] raise: Error.
  heap add: 4.
  self assert: (heap at: 1) = 3.
  self assert: (heap at: 2) = 4.
 
  !

Item was added:
+ ----- Method: HeapTest>>testAtRaisesErrorWhenIndexIsInvalid (in category 'tests') -----
+ testAtRaisesErrorWhenIndexIsInvalid
+ " self run: #testAtRaisesErrorWhenIndexIsInvalid "
+
+ | heap |
+ heap := Heap new.
+ 1 to: 100 do: [ :index |
+ 1 to: heap size do: [ :each |
+ self assert: ((heap at: each) between: 1 and: heap size) ].
+ self
+ should: [ heap at: 0 ] raise: Error;
+ should: [ heap at: heap size + 1 ] raise: Error.
+ heap add: index ].!

Item was added:
+ ----- Method: HeapTest>>testCompact (in category 'tests') -----
+ testCompact
+ " self run: #testCompact "
+
+ | heap |
+ heap := Heap new.
+ 1 to: 100 do: [ :index |
+ | copy |
+ copy := heap copy.
+ copy compact.
+ self
+ assert: copy = heap;
+ assert: copy capacity <= heap capacity;
+ assert: copy capacity = copy size.
+ heap add: index ].!

Item was added:
+ ----- Method: HeapTest>>testCopy (in category 'tests') -----
+ testCopy
+
+ | heap |
+ heap := Heap new.
+ 1 to: 100 do: [ :index |
+ | copy |
+ copy := heap copy.
+ self
+ assert: copy = heap;
+ assert: heap = copy;
+ deny: copy == heap;
+ assert: copy sortBlock = heap sortBlock;
+ deny: copy array == heap array.
+ heap add: index ].!

Item was added:
+ ----- Method: HeapTest>>testCopyEmpty (in category 'tests') -----
+ testCopyEmpty
+
+ | heap |
+ heap := Heap new.
+ 1 to: 100 do: [ :index |
+ | copy |
+ copy := heap copyEmpty.
+ self
+ assert: copy isHeap;
+ assert: copy isEmpty;
+ assert: copy sortBlock = heap sortBlock.
+ heap add: index ].!

Item was changed:
+ ----- Method: HeapTest>>testDo (in category 'tests') -----
- ----- Method: HeapTest>>testDo (in category 'basic tests') -----
  testDo
  "self run: #testDo"
 
  | heap coll |
  heap := Heap withAll: #(1 3 5).
  coll := OrderedCollection new.
 
  heap do: [:each | coll add: each].
 
  self assert: coll = #(1 3 5) asOrderedCollection.
  !

Item was changed:
+ ----- Method: HeapTest>>testExamples (in category 'tests') -----
- ----- Method: HeapTest>>testExamples (in category 'testing') -----
  testExamples
  self heapExample.
  self heapSortExample.!

Item was changed:
+ ----- Method: HeapTest>>testFirst (in category 'tests') -----
- ----- Method: HeapTest>>testFirst (in category 'basic tests') -----
  testFirst
  "self run: #testFirst"
  | heap |
  heap := Heap new.
  heap add: 5.
  heap add: 12.
  heap add: 1.
  self assert: heap first = 1.
  heap removeFirst.
  self assert: heap first = 5.!

Item was changed:
+ ----- Method: HeapTest>>testHeap (in category 'tests') -----
- ----- Method: HeapTest>>testHeap (in category 'basic tests') -----
  testHeap
  "self run: #testHeap"
 
  | heap |
  heap := Heap new.
  self assert: heap isHeap.
 
  self assert: heap isEmpty.
  heap add: 1.
  self assert: heap isEmpty not
 
  !

Item was changed:
+ ----- Method: HeapTest>>testIfEqualIsTransitive (in category 'tests') -----
- ----- Method: HeapTest>>testIfEqualIsTransitive (in category 'testing') -----
  testIfEqualIsTransitive
  "This is http://bugs.squeak.org/view.php?id=6943"
 
      | anArray heap1 heap2 |
      anArray := #(1 2 3).
      heap1 := Heap withAll: (1 to: 3) sortBlock: [:a :b | a < b].
      heap2 := Heap withAll: (1 to: 3) sortBlock: [:a :b | b > a].
      self
  assert: (heap1 = anArray) & (heap2 = anArray) ==> (heap1 = heap2)
  description: 'Heap equality should be transitive'!

Item was changed:
+ ----- Method: HeapTest>>testRemove (in category 'tests') -----
- ----- Method: HeapTest>>testRemove (in category 'basic tests') -----
  testRemove
  "self run: #testRemove"
 
  | heap |
  heap := Heap new.
  self should: [heap removeFirst] raise: Error.
  heap add: 5.
+ self assert: 5 equals: heap removeFirst.
- heap removeFirst.
  self assert: heap size = 0.
  heap add: 5.
  self should: [heap removeAt: 2] raise: Error.!

Item was added:
+ ----- Method: HeapTest>>testSort (in category 'tests') -----
+ testSort
+
+ self testSortUsing: Heap new.
+ {
+ nil.
+ #<=.
+ [ :a :b | a <= b ].
+ [ :a :b | a >= b ]
+ } do: [ :each | self testSortUsing: (Heap sortBlock: each) ]!

Item was changed:
+ ----- Method: HeapTest>>testSortBlock (in category 'tests') -----
- ----- Method: HeapTest>>testSortBlock (in category 'basic tests') -----
  testSortBlock
  "self run: #testSortBlock"
 
  | heap |
  heap := Heap withAll: #(1 3 5).
  self assert: heap asArray = #(1 3 5).
 
  heap sortBlock: [ :e1 :e2 | e1 >= e2 ].
+ self assert: heap isValidHeap.
  self assert: heap asArray = #(5 3 1)
  !

Item was added:
+ ----- Method: HeapTest>>testSortUsing: (in category 'tests') -----
+ testSortUsing: aHeap
+
+ | random |
+ random := Random seed: 36rSqueak.
+ self assert: aHeap isValidHeap.
+ 1000 timesRepeat: [
+ aHeap add: random next.
+ self assert: aHeap isValidHeap ].
+ self deny: (aHeap asArray isSortedBy: aHeap sortBlock).
+ aHeap sort.
+ self assert: aHeap isValidHeap.
+ self assert: (aHeap asArray isSortedBy: aHeap sortBlock)
+ !

Item was added:
+ ----- Method: HeapTest>>testSortWithIndexUpdateBlock (in category 'tests') -----
+ testSortWithIndexUpdateBlock
+
+ | random heap validateHeap |
+ random := Random seed: 36rSqueak.
+ heap := Heap sortBlock: [ :a :b | a first <= b first ].
+ heap indexUpdateBlock: [ :element :newIndex | element at: 2 put: newIndex ].
+ validateHeap := [
+ heap isHeap
+ and: [ heap isValidHeap
+ and: [ heap do: [ :each | self assert: (heap at: each second) == each ] ] ] ].
+ validateHeap value.
+ 1000 timesRepeat: [
+ heap add: { random next. nil }.
+ validateHeap value ].
+ self deny: (heap asArray isSortedBy: heap sortBlock).
+ heap sort.
+ validateHeap value.
+ self assert: (heap asArray isSortedBy: heap sortBlock)
+ !