Initial version of code coverage report.
It mimics Cobertura report so it can be used in Jenkins with
proper plugin. However, it's very basic with limited functionality.
"{ Package: 'stx:goodies/builder/reports' }"
"{ NameSpace: Builder }"
Report subclass:#CoverageReport
instanceVariableNames:'instrumentedMethods'
classVariableNames:''
poolDictionaries:''
category:'Builder-Reports'
!
!CoverageReport methodsFor:'accessing-defaults'!
defaultFileSuffix
"Return a default filename suffix. Note that format suffix will be
appended too if not file is explicitely specified"
^'Coverage'
"Created: / 25-06-2013 / 01:12:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
defaultFormat
"raise an error: must be redefined in concrete subclass(es)"
^ Builder::CoverageReportFormat::Cobertura new
"Modified: / 25-06-2013 / 01:31:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
defaultName
packages isNil ifTrue:[
^'someClasses'.
].
^String streamContents:[:s|
packages do:[:packageOrClass|
s nextPutAll: packageOrClass printString
] separatedBy:[
s nextPut:$,;space
]
]
"Created: / 25-06-2013 / 01:29:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!CoverageReport methodsFor:'initialization'!
initialize
instrumentedMethods := Set new.
"Created: / 25-06-2013 / 01:40:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 25-06-2013 / 13:21:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
setupForClasses:classes
"raise an error: must be redefined in concrete subclass(es)"
classes do:[:each | self instrumentClass: each].
"Modified: / 25-06-2013 / 16:22:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
setupForPackages:pkgs
"raise an error: must be redefined in concrete subclass(es)"
pkgs do:[:each | self instrumentPackage: each ].
"Modified: / 25-06-2013 / 16:22:32 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!CoverageReport methodsFor:'instrumentation'!
instrumentClass:class
class instAndClassMethods do:[:method|
self instrumentMethod: method
]
"Created: / 25-06-2013 / 01:42:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
instrumentMethod:method
| class selector |
class := method mclass.
selector := method selector.
method isInstrumented ifFalse:[
InstrumentingCompiler compileMethod: method.
].
instrumentedMethods add: (class compiledMethodAt: selector)
"Created: / 25-06-2013 / 01:44:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 25-06-2013 / 13:21:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
instrumentPackage:pkg
Smalltalk allMethodsDo:[:method|
method package asSymbol == pkg asSymbol ifTrue:[
self instrumentMethod: method.
]
]
"Created: / 25-06-2013 / 01:42:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
"Modified: / 25-06-2013 / 17:51:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!CoverageReport methodsFor:'running'!
runReport
"Actually run the report. What to do (what classes/packages to check)
must be stored instance variables"
format write: instrumentedMethods.
"Modified: / 25-06-2013 / 13:13:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!CoverageReport class methodsFor:'documentation'!
version
^ '$Header$'
!
version_CVS
^ '$Header$'
!
version_SVN
^ '$Id$'
! !