initial checkin
authorJan Vrany <jan.vrany@fit.cvut.cz>
Fri, 13 Jan 2012 11:06:51 +0100
changeset 68 898a31eab2db
parent 67 73732acacfc1
child 69 4c4c6f784b18
initial checkin
reports/Builder__CoverageReport.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/reports/Builder__CoverageReport.st	Fri Jan 13 11:06:51 2012 +0100
@@ -0,0 +1,172 @@
+"{ Package: 'stx:goodies/builder/reports' }"
+
+"{ NameSpace: Builder }"
+
+TestReport subclass:#CoverageReport
+	instanceVariableNames:'packages wrappers covered'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Builder-Reports-Unfinished'
+!
+
+
+!CoverageReport methodsFor:'generating'!
+
+generate
+	| coverage |
+	covered := (wrappers select: [ :each | each hasRun ])
+		collect: [ :each | each reference ].
+	coverage := StandardFileStream 
+		forceNewFileNamed: suite name , '-Coverage.xml'.
+	[ self generateOn: coverage ]
+		ensure: [ coverage close ]
+!
+
+generateDataOn: aStream
+	| items |
+	aStream tab; nextPutAll: '<data>'; nextPut: Character lf.
+	aStream tab; tab; nextPutAll: '<all name="all classes">'; nextPut: Character lf.
+	self
+		generateType: 'class' indent: 3
+		total: (items := (packages gather: [ :each | each classes ]) asSet) size
+		actual: ((covered collect: [ :each | each actualClass theNonMetaClass ]) asSet
+			count: [ :each | items includes: each ])
+		on: aStream.
+	self
+		generateType: 'method' indent: 3
+		total: (items := (packages gather: [ :each | each methods ]) asSet) size 
+		actual: (covered count: [ :each | items includes: each ])
+		on: aStream.
+	packages do: [ :each | self generatePackage: each on: aStream ].
+	aStream tab; tab; nextPutAll: '</all>'; nextPut: Character lf.
+	aStream tab; nextPutAll: '</data>'; nextPut: Character lf
+!
+
+generateOn: aStream
+	aStream nextPutAll: '<?xml version="1.0" encoding="UTF-8"?>'; nextPut: Character lf.
+	aStream nextPutAll: '<report>'; nextPut: Character lf.
+	self generateStatsOn: aStream.
+	self generateDataOn: aStream.
+	aStream nextPutAll: '</report>'; nextPut: Character lf
+!
+
+generatePackage: aPackage class: aClass on: aStream
+	| items |
+	aStream tab: 4; nextPutAll: '<class name="'; nextPutAll: (self encode: aClass name); nextPutAll: '">'; nextPut: Character lf.
+	self
+		generateType: 'class' indent: 5
+		total: 1
+		actual: ((covered anySatisfy: [ :each | each actualClass theNonMetaClass = aClass ])
+			ifTrue: [ 1 ] ifFalse: [ 0 ])
+		on: aStream.
+	self
+		generateType: 'method' indent: 5
+		total: (items := aPackage coreMethodsForClass: aClass) size
+		actual: (covered count: [ :each | items includes: each ])
+		on: aStream.
+	items do: [ :each | self generatePackage: each method: each on: aStream ].	
+	aStream tab: 4; nextPutAll: '</class>'; nextPut: Character lf
+!
+
+generatePackage: aPackage method: aReference on: aStream
+	| items |
+	aStream tab: 5; nextPutAll: '<method name="'; nextPutAll: (self encode: aReference selector); nextPutAll: '">'; nextPut: Character lf.
+	self
+		generateType: 'method' indent: 6
+		total: 1
+		actual: ((covered includes: aReference) ifTrue: [ 1 ] ifFalse: [ 0 ])
+		on: aStream.
+	aStream tab: 5; nextPutAll: '</method>'; nextPut: Character lf
+!
+
+generatePackage: aPackage on: aStream
+	| items |
+	aStream tab: 3; nextPutAll: '<package name="'; nextPutAll: (self encode: (aPackage packageName copyReplaceAll: '-' with: '.')); nextPutAll: '">'; nextPut: Character lf.
+	self
+		generateType: 'class' indent: 4
+		total: (items := aPackage classes asSet) size
+		actual: ((covered collect: [ :each | each actualClass theNonMetaClass ]) asSet
+			count: [ :each | items includes: each ])
+		on: aStream.
+	self
+		generateType: 'method' indent: 4
+		total: (items := aPackage methods asSet) size
+		actual: (covered count: [ :each | items includes: each ])
+		on: aStream.
+	aPackage classes 
+		do: [ :class | self generatePackage: aPackage class: class on: aStream ].
+	aStream tab: 3; nextPutAll: '</package>'; nextPut: Character lf
+!
+
+generateStatsOn: aStream
+	aStream tab; nextPutAll: '<stats>'; nextPut: Character lf.
+	aStream tab; tab; nextPutAll: '<packages value="'; print: (packages size); nextPutAll: '"/>'; nextPut: Character lf.
+	aStream tab; tab; nextPutAll: '<classes value="'; print: (packages detectSum: [ :each | each classes size ]); nextPutAll: '"/>'; nextPut: Character lf.
+	aStream tab; tab; nextPutAll: '<methods value="'; print: (packages detectSum: [ :each | each methods size ]); nextPutAll: '"/>'; nextPut: Character lf.
+	aStream tab; nextPutAll: '</stats>'; nextPut: Character lf.
+!
+
+generateType: aString indent: anInteger total: totalInteger actual: actualInteger on: aStream
+	aStream tab: anInteger; nextPutAll: '<coverage type="'; nextPutAll: aString; nextPutAll: ', %" value="'; print: (totalInteger = 0 ifTrue: [ 0 ] ifFalse: [ (100.0 * actualInteger / totalInteger) rounded ]); nextPutAll: '% ('; print: actualInteger; nextPut: $/; print: totalInteger; nextPutAll: ')"/>'; nextPut: Character lf
+! !
+
+!CoverageReport methodsFor:'private'!
+
+addTestsIn: aTestAsserter to: aSet
+        (aTestAsserter isKindOf: TestSuite) ifTrue: [
+                aTestAsserter tests
+                        do: [ :each | self addTestsIn: each to: aSet ] ].
+        (aTestAsserter isKindOf: TestCase) ifTrue: [
+                (aTestAsserter class respondsTo: #packageNamesUnderTest) ifTrue: [
+                        aTestAsserter class packageNamesUnderTest
+                                do: [ :each | aSet add: (self halt:'Not ported')"(PackageInfo named: each)" ] ] ].
+        ^ aSet
+
+    "Modified: / 08-03-2011 / 22:12:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+ignoredSelectors
+	^ #(packageNamesUnderTest classNamesNotUnderTest)
+!
+
+methodsIn: aPackage
+	aPackage isNil ifTrue: [ ^ #() ].
+	^ aPackage methods reject: [ :method | 
+		(self ignoredSelectors includes: method methodSymbol)
+			or: [ method compiledMethod isAbstract
+			or: [ method compiledMethod refersToLiteral: #ignoreForCoverage ] ] ]
+!
+
+packagesIn: aTestAsserter
+	^ self addTestsIn: aTestAsserter to: Set new
+! !
+
+!CoverageReport methodsFor:'running'!
+
+setUp
+	super setUp.
+	wrappers := ((packages := self packagesIn: suite)
+		gather: [ :package | self methodsIn: package ])
+		collect: [ :each | HDTestCoverage on: each ].
+	wrappers do: [ :each | each install ]
+!
+
+tearDown
+	wrappers do: [ :each | each uninstall ].
+	super tearDown.
+	self generate
+! !
+
+!CoverageReport class methodsFor:'documentation'!
+
+version
+    ^ '$Header$'
+!
+
+version_CVS
+    ^ '$Header$'
+!
+
+version_SVN
+    ^ '§Id: Builder__CoverageReport.st 283 2011-11-07 08:54:02Z vranyj1 §'
+! !