Cheers
I am at the moment experimenting with getting an AI to write test methods for
me.
The current results are a mixture of simple and advanced :-)
To get started I wanted to write tests for a class that does not go to the web,
file or UI, and doing something which is standard, but with no method comments.
So the experiments is for the class "Heap".
I have not really been successful, but now I have what I see as a breakthrough,
and wanted to know if anyone else had the same experience?
-- Kasper
Here is an example
Heap >> upHeap: anIndex
"Check the heap upwards for correctness starting at anIndex.
Everything below anIndex is ok."
| value k kDiv2 tmp |
anIndex = 0 ifTrue:[^self].
k := anIndex.
value := array at: anIndex.
[ (k > 1) and:[self sorts: value before: (tmp := array at: (kDiv2 := k
bitShift: -1))] ]
whileTrue:[
array at: k put: tmp.
self updateObjectIndex: k.
k := kDiv2].
array at: k put: value.
self updateObjectIndex: k
And the test build by AI is this:
testUpHeap
| arr |
"Test upHeap: for index 0, should do nothing"
refHeap upHeap: 0.
self assert: true. "No error, no change expected"
"Set up min-heap sort block"
refHeap sortBlock: [ :a :b | a <= b ].
"Test upHeap:1 on single element, no change"
arr := Array new: 10.
arr at: 1 put: 5.
refHeap instVarAt: 1 put: arr.
refHeap instVarAt: 2 put: 1.
refHeap upHeap: 1.
self assert: ((refHeap instVarAt: 1) at: 1) equals: 5.
"Test upHeap:2 with swap needed (smaller child)"
arr := Array new: 10.
arr at: 1 put: 3.
arr at: 2 put: 1.
refHeap instVarAt: 1 put: arr.
refHeap instVarAt: 2 put: 2.
refHeap upHeap: 2.
self assert: ((refHeap instVarAt: 1) at: 1) equals: 1.
self assert: ((refHeap instVarAt: 1) at: 2) equals: 3.
"Test upHeap:2 with no swap (larger child)"
arr := Array new: 10.
arr at: 1 put: 3.
arr at: 2 put: 4.
refHeap instVarAt: 1 put: arr.
refHeap instVarAt: 2 put: 2.
refHeap upHeap: 2.
self assert: ((refHeap instVarAt: 1) at: 1) equals: 3.
self assert: ((refHeap instVarAt: 1) at: 2) equals: 4.
"Test upHeap:3 with one swap to root"
arr := Array new: 10.
arr at: 1 put: 3.
arr at: 2 put: 4.
arr at: 3 put: 2.
refHeap instVarAt: 1 put: arr.
refHeap instVarAt: 2 put: 3.
refHeap upHeap: 3.
self assert: ((refHeap instVarAt: 1) at: 1) equals: 2.
self assert: ((refHeap instVarAt: 1) at: 2) equals: 4.
self assert: ((refHeap instVarAt: 1) at: 3 )equals: 3.
"Test upHeap:4 with multiple swaps"
arr := Array new: 10.
arr at: 1 put: 1.
arr at: 2 put: 3.
arr at: 3 put: 2.
arr at: 4 put: 0.
refHeap instVarAt: 1 put: arr.
refHeap instVarAt: 2 put: 4.
refHeap upHeap: 4.
self assert: ((refHeap instVarAt: 1) at: 1) equals: 0.
self assert: ((refHeap instVarAt: 1) at: 2) equals: 1.
self assert: ((refHeap instVarAt: 1) at: 3) equals: 2.
self assert: ((refHeap instVarAt: 1) at: 4 )equals: 3.
And the input to make it doit is
AIATest04 new build: Heap >> #upHeap::
I have added a tool call that allows Grok to call and execute Pharo code, so to
produce the test, it has executed these calls:
ApiToolExpression: Heap compileAllFrom: 'Collections-Sequenceable'. Heap
methods select: [:m | m selector = #upHeap:]. Heap instVarNames
ApiToolExpression: Heap instVarNames
ApiToolExpression: Heap >> #add: sourceCode
ApiToolExpression: (Heap >> #add:) sourceCode
ApiToolExpression: (Heap >> #reSort) sourceCode
ApiToolExpression: Heap new instVarNamed: #indexUpdateBlock