TestResultReporter.st
author Stefan Vogel <sv@exept.de>
Tue, 05 Jul 2011 14:03:47 +0200
branchinitialV
changeset 232 1d1afa74b9ee
parent 222 8e6f482297fa
child 267 7d2e67524850
permissions -rw-r--r--
checkin from stx browser

"{ Package: 'stx:goodies/sunit' }"

Object subclass:#TestResultReporter
	instanceVariableNames:'result stream'
	classVariableNames:''
	poolDictionaries:''
	category:'SUnit-Report'
!


!TestResultReporter class methodsFor:'reporting'!

report: aTestResult format: format as: stringOrFilename

    self new report: aTestResult format: format as: stringOrFilename
!

report: aTestResult format: format on: stream

    self new report: aTestResult format: format on: stream
! !

!TestResultReporter methodsFor:'reporting'!

report:format
    |reportFormatSelector|

    reportFormatSelector := self reportFormatSelector:format.
    (self respondsTo: reportFormatSelector)
	ifTrue:[self perform: reportFormatSelector]
	ifFalse:[self error:'Unsupported format: ', format].
!

report: aTestResult format: format as: stringOrFilename

    | s |
    s := stringOrFilename asFilename writeStream.
    [ self report: aTestResult format: format on: s]
	ensure:[s close].
!

report: aTestResult format: aSymbol on: aStream

    result := aTestResult.
    stream := aStream.
    self report: aSymbol
!

reportFormatSelector:format
    ^ ('report' , format asString capitalized) asSymbol
! !

!TestResultReporter methodsFor:'reporting - xml'!

reportXml

    "JUnit like XML unittest report format"

    stream
	nextPutLine: '<?xml version="1.0"?>';
	nextPutLine: '<unittest-results>'.

    result passed   do:[:each|self reportXmlTest: each result: #success].
    result failures do:[:each|self reportXmlTest: each result: #failure].
    result errors   do:[:each|self reportXmlTest: each result: #error].

    stream
	nextPutLine: '</unittest-results>'
!

reportXmlTest: test result: testResult

    "
    Example:
    <test
	duration='0.0188629627228'
	status='error'
	fixture='bitten.tests.web_ui.SourceFileLinkFormatterTestCase'
	name='test_format_link_not_in_repos_with_line'
	file='/usr/src/trac-bitten-0.6b2.dfsg/bitten/tests/web_ui.py'>
    "

    | testClassName |
    testClassName := self sunitNameOf: test class.

    stream
	nextPutLine:'<test duration="0.0"'; "As we don't know the duration :-("
	tab; nextPutAll:'status="'; nextPutAll: testResult; nextPutLine:'"';
	tab; nextPutAll:'ficture="'; nextPutAll: testClassName; nextPutLine:'"';
	tab; nextPutAll:'name="'; nextPutAll: test selector; nextPutLine:'"';
	"I seems that some tools requires the file attributes. So we supply one :-)"
	tab; nextPutAll:'file="'; nextPutAll: testClassName , '.st'; nextPutLine:'">'.

    testResult ~= #success ifTrue:[self reportXmlTraceback: test].

    stream nextPutLine:'</test>'.
!

reportXmlTraceback: test

    "
	Prints a traceback to the stream.
	This is dialect-specific, so we have to check...
    "

    "Smalltalk/X dialect detection..."
    ((Smalltalk respondsTo: #isSmalltalkX) and:[Smalltalk isSmalltalkX])
	ifTrue:[^self reportXmlTracebackStX: test]
!

reportXmlTracebackStX: test

    stream nextPutLine:'<traceback><!![CDATA['.

    [ test debug ]
	on: GenericException
	do: [:ex|
	    ex suspendedContext fullPrintAllOn: stream].

    stream nextPutLine:']]></traceback>'.

    "Modified: / 07-12-2009 / 14:06:48 / Jan Vrany <jan.vrant@fit.cvut.cz>"
! !

!TestResultReporter methodsFor:'utilities'!

sunitNameOf: aClass

    "No all SUnit versions comes with sunitName
     (at least Smalltalk/X 3.1)"

    ^(aClass respondsTo:#sunitName)
	ifTrue:[aClass sunitName]
	ifFalse:[aClass printString]
! !

!TestResultReporter class methodsFor:'documentation'!

version
    ^ '$Id: TestResultReporter.st,v 1.1 2011-06-29 19:15:49 cg Exp $'
!

version_SVN
    ^ '§Id§'
! !