1<?php
2/**
3 *  base include file for SimpleTest
4 *  @package    SimpleTest
5 *  @subpackage UnitTester
6 *  @version    $Id$
7 */
8
9/**#@+
10 *  include other SimpleTest class files
11 */
12require_once(dirname(__FILE__) . '/xml.php');
13require_once(dirname(__FILE__) . '/shell_tester.php');
14/**#@-*/
15
16/**
17 *    Runs an XML formated test in a separate process.
18 *    @package SimpleTest
19 *    @subpackage UnitTester
20 */
21class DetachedTestCase {
22    private $command;
23    private $dry_command;
24    private $size;
25
26    /**
27     *    Sets the location of the remote test.
28     *    @param string $command       Test script.
29     *    @param string $dry_command   Script for dry run.
30     *    @access public
31     */
32    function __construct($command, $dry_command = false) {
33        $this->command = $command;
34        $this->dry_command = $dry_command ? $dry_command : $command;
35        $this->size = false;
36    }
37
38    /**
39     *    Accessor for the test name for subclasses.
40     *    @return string       Name of the test.
41     *    @access public
42     */
43    function getLabel() {
44        return $this->command;
45    }
46
47    /**
48     *    Runs the top level test for this class. Currently
49     *    reads the data as a single chunk. I'll fix this
50     *    once I have added iteration to the browser.
51     *    @param SimpleReporter $reporter    Target of test results.
52     *    @returns boolean                   True if no failures.
53     *    @access public
54     */
55    function run(&$reporter) {
56        $shell = &new SimpleShell();
57        $shell->execute($this->command);
58        $parser = &$this->createParser($reporter);
59        if (! $parser->parse($shell->getOutput())) {
60            trigger_error('Cannot parse incoming XML from [' . $this->command . ']');
61            return false;
62        }
63        return true;
64    }
65
66    /**
67     *    Accessor for the number of subtests.
68     *    @return integer       Number of test cases.
69     *    @access public
70     */
71    function getSize() {
72        if ($this->size === false) {
73            $shell = &new SimpleShell();
74            $shell->execute($this->dry_command);
75            $reporter = &new SimpleReporter();
76            $parser = &$this->createParser($reporter);
77            if (! $parser->parse($shell->getOutput())) {
78                trigger_error('Cannot parse incoming XML from [' . $this->dry_command . ']');
79                return false;
80            }
81            $this->size = $reporter->getTestCaseCount();
82        }
83        return $this->size;
84    }
85
86    /**
87     *    Creates the XML parser.
88     *    @param SimpleReporter $reporter    Target of test results.
89     *    @return SimpleTestXmlListener      XML reader.
90     *    @access protected
91     */
92    protected function &createParser(&$reporter) {
93        return new SimpleTestXmlParser($reporter);
94    }
95}
96?>