123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647 |
- <?php
- require_once(dirname(__FILE__) . '/scorer.php');
- class XmlReporter extends SimpleReporter {
- var $_indent;
- var $_namespace;
-
- function XmlReporter($namespace = false, $indent = ' ') {
- $this->SimpleReporter();
- $this->_namespace = ($namespace ? $namespace . ':' : '');
- $this->_indent = $indent;
- }
-
- function _getIndent($offset = 0) {
- return str_repeat(
- $this->_indent,
- count($this->getTestList()) + $offset);
- }
-
- function toParsedXml($text) {
- return str_replace(
- array('&', '<', '>', '"', '\''),
- array('&', '<', '>', '"', '''),
- $text);
- }
-
- function paintGroupStart($test_name, $size) {
- parent::paintGroupStart($test_name, $size);
- print $this->_getIndent();
- print "<" . $this->_namespace . "group size=\"$size\">\n";
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "name>" .
- $this->toParsedXml($test_name) .
- "</" . $this->_namespace . "name>\n";
- }
-
- function paintGroupEnd($test_name) {
- print $this->_getIndent();
- print "</" . $this->_namespace . "group>\n";
- parent::paintGroupEnd($test_name);
- }
-
- function paintCaseStart($test_name) {
- parent::paintCaseStart($test_name);
- print $this->_getIndent();
- print "<" . $this->_namespace . "case>\n";
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "name>" .
- $this->toParsedXml($test_name) .
- "</" . $this->_namespace . "name>\n";
- }
-
- function paintCaseEnd($test_name) {
- print $this->_getIndent();
- print "</" . $this->_namespace . "case>\n";
- parent::paintCaseEnd($test_name);
- }
-
- function paintMethodStart($test_name) {
- parent::paintMethodStart($test_name);
- print $this->_getIndent();
- print "<" . $this->_namespace . "test>\n";
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "name>" .
- $this->toParsedXml($test_name) .
- "</" . $this->_namespace . "name>\n";
- }
-
- function paintMethodEnd($test_name) {
- print $this->_getIndent();
- print "</" . $this->_namespace . "test>\n";
- parent::paintMethodEnd($test_name);
- }
-
- function paintPass($message) {
- parent::paintPass($message);
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "pass>";
- print $this->toParsedXml($message);
- print "</" . $this->_namespace . "pass>\n";
- }
-
- function paintFail($message) {
- parent::paintFail($message);
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "fail>";
- print $this->toParsedXml($message);
- print "</" . $this->_namespace . "fail>\n";
- }
-
- function paintError($message) {
- parent::paintError($message);
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "exception>";
- print $this->toParsedXml($message);
- print "</" . $this->_namespace . "exception>\n";
- }
-
- function paintException($exception) {
- parent::paintException($exception);
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "exception>";
- $message = 'Unexpected exception of type [' . get_class($exception) .
- '] with message ['. $exception->getMessage() .
- '] in ['. $exception->getFile() .
- ' line ' . $exception->getLine() . ']';
- print $this->toParsedXml($message);
- print "</" . $this->_namespace . "exception>\n";
- }
-
- function paintSkip($message) {
- parent::paintSkip($message);
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "skip>";
- print $this->toParsedXml($message);
- print "</" . $this->_namespace . "skip>\n";
- }
-
- function paintMessage($message) {
- parent::paintMessage($message);
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "message>";
- print $this->toParsedXml($message);
- print "</" . $this->_namespace . "message>\n";
- }
-
- function paintFormattedMessage($message) {
- parent::paintFormattedMessage($message);
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "formatted>";
- print "<![CDATA[$message]]>";
- print "</" . $this->_namespace . "formatted>\n";
- }
-
- function paintSignal($type, $payload) {
- parent::paintSignal($type, $payload);
- print $this->_getIndent(1);
- print "<" . $this->_namespace . "signal type=\"$type\">";
- print "<![CDATA[" . serialize($payload) . "]]>";
- print "</" . $this->_namespace . "signal>\n";
- }
-
- function paintHeader($test_name) {
- if (! SimpleReporter::inCli()) {
- header('Content-type: text/xml');
- }
- print "<?xml version=\"1.0\"";
- if ($this->_namespace) {
- print " xmlns:" . $this->_namespace .
- "=\"www.lastcraft.com/SimpleTest/Beta3/Report\"";
- }
- print "?>\n";
- print "<" . $this->_namespace . "run>\n";
- }
-
- function paintFooter($test_name) {
- print "</" . $this->_namespace . "run>\n";
- }
- }
- class NestingXmlTag {
- var $_name;
- var $_attributes;
-
- function NestingXmlTag($attributes) {
- $this->_name = false;
- $this->_attributes = $attributes;
- }
-
- function setName($name) {
- $this->_name = $name;
- }
-
- function getName() {
- return $this->_name;
- }
-
- function _getAttributes() {
- return $this->_attributes;
- }
- }
- class NestingMethodTag extends NestingXmlTag {
-
- function NestingMethodTag($attributes) {
- $this->NestingXmlTag($attributes);
- }
-
- function paintStart(&$listener) {
- $listener->paintMethodStart($this->getName());
- }
-
- function paintEnd(&$listener) {
- $listener->paintMethodEnd($this->getName());
- }
- }
- class NestingCaseTag extends NestingXmlTag {
-
- function NestingCaseTag($attributes) {
- $this->NestingXmlTag($attributes);
- }
-
- function paintStart(&$listener) {
- $listener->paintCaseStart($this->getName());
- }
-
- function paintEnd(&$listener) {
- $listener->paintCaseEnd($this->getName());
- }
- }
- class NestingGroupTag extends NestingXmlTag {
-
- function NestingGroupTag($attributes) {
- $this->NestingXmlTag($attributes);
- }
-
- function paintStart(&$listener) {
- $listener->paintGroupStart($this->getName(), $this->getSize());
- }
-
- function paintEnd(&$listener) {
- $listener->paintGroupEnd($this->getName());
- }
-
- function getSize() {
- $attributes = $this->_getAttributes();
- if (isset($attributes['SIZE'])) {
- return (integer)$attributes['SIZE'];
- }
- return 0;
- }
- }
- class SimpleTestXmlParser {
- var $_listener;
- var $_expat;
- var $_tag_stack;
- var $_in_content_tag;
- var $_content;
- var $_attributes;
-
- function SimpleTestXmlParser(&$listener) {
- $this->_listener = &$listener;
- $this->_expat = &$this->_createParser();
- $this->_tag_stack = array();
- $this->_in_content_tag = false;
- $this->_content = '';
- $this->_attributes = array();
- }
-
- function parse($chunk) {
- if (! xml_parse($this->_expat, $chunk)) {
- trigger_error('XML parse error with ' .
- xml_error_string(xml_get_error_code($this->_expat)));
- return false;
- }
- return true;
- }
-
- function &_createParser() {
- $expat = xml_parser_create();
- xml_set_object($expat, $this);
- xml_set_element_handler($expat, '_startElement', '_endElement');
- xml_set_character_data_handler($expat, '_addContent');
- xml_set_default_handler($expat, '_default');
- return $expat;
- }
-
- function _pushNestingTag($nested) {
- array_unshift($this->_tag_stack, $nested);
- }
-
- function &_getCurrentNestingTag() {
- return $this->_tag_stack[0];
- }
-
- function _popNestingTag() {
- return array_shift($this->_tag_stack);
- }
-
- function _isLeaf($tag) {
- return in_array($tag, array(
- 'NAME', 'PASS', 'FAIL', 'EXCEPTION', 'SKIP', 'MESSAGE', 'FORMATTED', 'SIGNAL'));
- }
-
- function _startElement($expat, $tag, $attributes) {
- $this->_attributes = $attributes;
- if ($tag == 'GROUP') {
- $this->_pushNestingTag(new NestingGroupTag($attributes));
- } elseif ($tag == 'CASE') {
- $this->_pushNestingTag(new NestingCaseTag($attributes));
- } elseif ($tag == 'TEST') {
- $this->_pushNestingTag(new NestingMethodTag($attributes));
- } elseif ($this->_isLeaf($tag)) {
- $this->_in_content_tag = true;
- $this->_content = '';
- }
- }
-
- function _endElement($expat, $tag) {
- $this->_in_content_tag = false;
- if (in_array($tag, array('GROUP', 'CASE', 'TEST'))) {
- $nesting_tag = $this->_popNestingTag();
- $nesting_tag->paintEnd($this->_listener);
- } elseif ($tag == 'NAME') {
- $nesting_tag = &$this->_getCurrentNestingTag();
- $nesting_tag->setName($this->_content);
- $nesting_tag->paintStart($this->_listener);
- } elseif ($tag == 'PASS') {
- $this->_listener->paintPass($this->_content);
- } elseif ($tag == 'FAIL') {
- $this->_listener->paintFail($this->_content);
- } elseif ($tag == 'EXCEPTION') {
- $this->_listener->paintError($this->_content);
- } elseif ($tag == 'SKIP') {
- $this->_listener->paintSkip($this->_content);
- } elseif ($tag == 'SIGNAL') {
- $this->_listener->paintSignal(
- $this->_attributes['TYPE'],
- unserialize($this->_content));
- } elseif ($tag == 'MESSAGE') {
- $this->_listener->paintMessage($this->_content);
- } elseif ($tag == 'FORMATTED') {
- $this->_listener->paintFormattedMessage($this->_content);
- }
- }
-
- function _addContent($expat, $text) {
- if ($this->_in_content_tag) {
- $this->_content .= $text;
- }
- return true;
- }
-
- function _default($expat, $default) {
- }
- }
- ?>
|