This is the way how to get the the source code that belongs to
uncovered bytecodes (expecting "trace" from the previous code)

class := Time.
selector := #print24:showSeconds:on:.
m := class >> selector.
usedBytecodes := ((trace at: class) at: selector ifAbsent: Set new).
allBytecodes := Set new.
m symbolicLinesDo: [:pc :lineForPC | allBytecodes add: pc ].
unusedBytecodes := allBytecodes copyWithoutAll: usedBytecodes.
        
dm := m debuggerMap.
source := (class sourceCodeAt: selector) asText.
unusedBytecodes do: [:pc |
        range := dm rangeForPC: pc contextIsActiveContext: false.
        source makeBoldFrom: range first to: range last.].
source asMorph openInWindow.

Cheers,
-- Pavel



On Tue, Feb 21, 2012 at 4:03 PM, Pavel Krivanek
<[email protected]> wrote:
> Hi,
>
> what about to intrroduce tests that will test coverage of tests? Some
> improved version of the code below. Are there some tool for Smalltalk
> showing uncovered lines of code? There are such tools in Java world
> :-) One little problem is that this code do not work on Linux because
> of a VM error that cause test failures on CI server too.
>
> Cheers,
>  Pavel
>
> | class test trace classTrace result  |
>
> class := Time.
> test := TimeTest.
>
> trace := Dictionary new.
>
> thisContext runSimulated: [test suite run]  contextAtEachStep: [ :current |
>        | cls sel methods bytecodes |
>        cls := current method methodClass.
>        sel := current method selector.
>        methods := trace at: cls ifAbsentPut: Dictionary new.
>        bytecodes := methods at: sel ifAbsentPut: Set new.
>        bytecodes add: current pc.]
>
> trace .
>
> result := String streamContents: [:s |
>
> classTrace := trace at: class ifAbsent: nil.
> classTrace
>        ifNil: [
>                s nextPutAll: 'Class ', class name, ' not called'; cr. ]
>        ifNotNil: [
>                s nextPutAll: class name; cr.
>                class selectorsDo: [:sel |
>                        | m usedBytecodes allBytecodes |
>                        m := class >> sel.
>                        usedBytecodes := (classTrace at: sel ifAbsent: Set 
> new) size.
>                        allBytecodes := 0.
>                        m symbolicLinesDo: [:pc :lineForPC | allBytecodes := 
> allBytecodes + 1 ]..
>                        s tab; nextPutAll: sel; nextPutAll: ' - '; nextPutAll:
> (usedBytecodes  /  allBytecodes * 100) asFloat asString; nextPutAll:
> '%'; cr. ]].
> ].
> result..

Reply via email to