Index: src/PHPT/Case.php =================================================================== --- src/PHPT/Case.php (revision 691) +++ src/PHPT/Case.php (working copy) @@ -28,17 +28,14 @@ { $reporter->onCaseStart($this); try { - if ($this->sections->filterByInterface('RunnableBefore')->valid()) { - foreach ($this->sections as $section) { - $section->run($this); - } + $runnable_before = $this->sections->filterByInterface('RunnableBefore'); + foreach ($runnable_before as $section) { + $section->run($this); } - $this->sections->filterByInterface(); $this->sections->FILE->run($this); - if ($this->sections->filterByInterface('RunnableAfter')->valid()) { - foreach ($this->sections as $section) { - $section->run($this); - } + $runnable_after = $this->sections->filterByInterface('RunnableAfter'); + foreach ($runnable_after as $section) { + $section->run($this); } $reporter->onCasePass($this); } catch (PHPT_Case_VetoException $veto) { @@ -46,7 +43,6 @@ } catch (PHPT_Case_FailureException $failure) { $reporter->onCaseFail($this, $failure); } - $this->sections->filterByInterface(); $reporter->onCaseEnd($this); } Index: src/PHPT/Case/Validator/CgiRequired.php =================================================================== --- src/PHPT/Case/Validator/CgiRequired.php (revision 691) +++ src/PHPT/Case/Validator/CgiRequired.php (working copy) @@ -17,7 +17,6 @@ public function is(PHPT_Case $case) { $return = $case->sections->filterByInterface('CgiExecutable')->valid(); - $case->sections->filterByInterface(); return $return; } } Index: src/PHPT/CodeRunner/CommandLine.php =================================================================== --- src/PHPT/CodeRunner/CommandLine.php (revision 691) +++ src/PHPT/CodeRunner/CommandLine.php (working copy) @@ -13,7 +13,7 @@ $this->_filename = $runner->filename; $this->_ini = (string)$runner->ini; $this->_args = (string)$runner->args; - $this->_executable = str_replace(' ', '\ ', (string)$runner->executable); + $this->_executable = $runner->executable; $this->_post_filename = (string)$runner->post_filename; } Index: src/PHPT/CodeRunner/Driver/WScriptShell.php =================================================================== --- src/PHPT/CodeRunner/Driver/WScriptShell.php (revision 691) +++ src/PHPT/CodeRunner/Driver/WScriptShell.php (working copy) @@ -23,9 +23,9 @@ } } if ($found == false) { - throw new PHPT_CodeRunner_InvalidExecutableException( - 'unable to locate PHP executable: ' . $this->executable - ); + //throw new PHPT_CodeRunner_InvalidExecutableException( + // 'unable to locate PHP executable: ' . $this->executable + //); } } @@ -69,7 +69,7 @@ $error = $this->_process->StdErr->ReadAll(); if (!empty($error)) { - throw new PHPT_CodeRunner_ExecutionException($error); + throw new PHPT_CodeRunner_ExecutionException($error, $this->_commandFactory()); } return $this->_process->StdOut->ReadAll(); @@ -93,6 +93,7 @@ { $return = ''; foreach ($this->environment as $key => $value) { + $value = str_replace('&', '^&', $value); $return .= "set {$key}={$value} & "; } return $return; Index: src/PHPT/CodeRunner/Factory.php =================================================================== --- src/PHPT/CodeRunner/Factory.php (revision 691) +++ src/PHPT/CodeRunner/Factory.php (working copy) @@ -33,7 +33,13 @@ 'php-cgi'; } - if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') { + if ( + strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && + ( + $runner->executable == 'php' || + $runner->executable == 'php-cgi' + ) + ) { $runner->executable = $runner->executable . '.exe'; } try { Index: src/PHPT/Section/ModifiableAbstract.php =================================================================== --- src/PHPT/Section/ModifiableAbstract.php (revision 691) +++ src/PHPT/Section/ModifiableAbstract.php (working copy) @@ -15,12 +15,10 @@ public function run(PHPT_Case $case) { - $sections = clone $case->sections; - if ($sections->filterByInterface($this->_modifier_name . 'Modifier')->valid()) { - $modifyMethod = 'modify' . $this->_modifier_name; - foreach ($sections as $section) { - $section->$modifyMethod($this); - } + $modifiers = $case->sections->filterByInterface($this->_modifier_name . 'Modifier'); + $modifyMethod = 'modify' . $this->_modifier_name; + foreach ($modifiers as $section) { + $section->$modifyMethod($this); } } Index: src/PHPT/Section/SKIPIF.php =================================================================== --- src/PHPT/Section/SKIPIF.php (revision 691) +++ src/PHPT/Section/SKIPIF.php (working copy) @@ -3,10 +3,12 @@ class PHPT_Section_SKIPIF implements PHPT_Section_RunnableBefore { private $_data = null; + private $_runner_factory = null; public function __construct($data) { $this->_data = $data; + $this->_runner_factory = new PHPT_CodeRunner_Factory(); } public function run(PHPT_Case $case) @@ -16,9 +18,7 @@ // @todo refactor to PHPT_CodeRunner file_put_contents($filename, $this->_data); - $response = array(); - exec('php -f ' . $filename, $response); - $response = implode("\n", $response); + $response = $this->_runner_factory->factory($case)->run($filename)->output; unlink($filename); if (preg_match('/^skip( - (.*))?/', $response, $matches)) { Index: src/PHPT/SectionList.php =================================================================== --- src/PHPT/SectionList.php (revision 691) +++ src/PHPT/SectionList.php (working copy) @@ -2,7 +2,6 @@ class PHPT_SectionList implements Iterator { - private $_raw_sections = array(); private $_sections = array(); private $_section_map = array(); private $_key_map = array(); @@ -15,14 +14,12 @@ } $name = strtoupper(str_replace('PHPT_Section_', '', get_class($section))); $key = $section instanceof PHPT_Section_Runnable ? $section->getPriority() . '.' . $name : $name; - $this->_raw_sections[$key] = $section; + $this->_sections[$key] = $section; $this->_section_map[$name] = $key; $this->_key_map[$key] = $name; } - ksort($this->_raw_sections); - - $this->_sections = $this->_raw_sections; + ksort($this->_sections); } public function current() @@ -52,21 +49,23 @@ public function filterByInterface($interface = null) { + $ret = new PHPT_SectionList(); + if (is_null($interface)) { - $this->_sections = $this->_raw_sections; - return $this; + $ret->_sections = $this->_sections; + return $ret; } $full_interface = 'PHPT_Section_' . $interface; - $this->_sections = array(); - foreach ($this->_raw_sections as $name => $section) { + $ret->_sections = array(); + foreach ($this->_sections as $name => $section) { if (!$section instanceof $full_interface) { continue; } - $this->_sections[$name] = $section; + $ret->_sections[$name] = $section; } - return $this; + return $ret; } public function has($name) @@ -74,11 +73,11 @@ if (!isset($this->_section_map[$name])) { return false; } - return isset($this->_raw_sections[$this->_section_map[$name]]); + return isset($this->_sections[$this->_section_map[$name]]); } public function __get($key) { - return $this->_raw_sections[$this->_section_map[$key]]; + return $this->_sections[$this->_section_map[$key]]; } } Index: tests/CodeRunner/Driver/WScriptShell/injects-ini-settings.phpt =================================================================== --- tests/CodeRunner/Driver/WScriptShell/injects-ini-settings.phpt (revision 691) +++ tests/CodeRunner/Driver/WScriptShell/injects-ini-settings.phpt (working copy) @@ -17,9 +17,9 @@ // sanity check $obj = new FoobarIni(); -assert('(string)$obj == " -d display_errors=1 "'); +assert('(string)$obj == " -d \"display_errors=1\" "'); $obj->display_errors = 0; -assert('(string)$obj == " -d display_errors=0 "'); +assert('(string)$obj == " -d \"display_errors=0\" "'); unset($obj); Index: tests/Section/File/restores-case-sections.phpt =================================================================== --- tests/Section/File/restores-case-sections.phpt (revision 691) +++ tests/Section/File/restores-case-sections.phpt (working copy) @@ -1,24 +0,0 @@ ---TEST-- -After PHPT_Section_FILE::run(), the sections property of the provide $case object -is restored to its unfiltered state ---FILE-- -sections = new PHPT_SectionList(array( - new PHPT_Section_ARGS('foo=bar'), -)); - -$section = new PHPT_Section_FILE('hello world'); -$section->run($case); - -assert('$case->sections->valid()'); - -?> -===DONE=== ---EXPECT-- -===DONE=== Index: tests/SectionList/filter-by-interface.phpt =================================================================== --- tests/SectionList/filter-by-interface.phpt (revision 691) +++ tests/SectionList/filter-by-interface.phpt (working copy) @@ -17,10 +17,10 @@ $data = array_merge($runnable, $non_runnable); $list = new PHPT_SectionList($data); -$list->filterByInterface('Runnable'); -assert('$list->valid()'); -$list->filterByInterface('EnvModifier'); -assert('$list->valid() == false'); +$runnable = $list->filterByInterface('Runnable'); +assert('$runnable->valid()'); +$env_modifier = $list->filterByInterface('EnvModifier'); +assert('$env_modifier->valid() == false'); ?> ===DONE=== Index: tests/SectionList/filter-resets-with-null.phpt =================================================================== --- tests/SectionList/filter-resets-with-null.phpt (revision 691) +++ tests/SectionList/filter-resets-with-null.phpt (working copy) @@ -1,36 +0,0 @@ ---TEST-- -If you call filterByInterface() with null or no-value, the full dataset is restored ---FILE-- - new PHPT_Section_ENV(''), - 'CLEAN' => new PHPT_Section_CLEAN(''), -); - -class PHPT_Section_FOO implements PHPT_Section { } -$non_runnable = array( - 'FOO' => new PHPT_Section_FOO(), -); - -$data = array_merge($runnable, $non_runnable); -$list = new PHPT_SectionList($data); -$list->filterByInterface('Runnable'); - -// sanity check -foreach ($list as $key => $value) { - assert('$runnable[$key] == $value'); -} - -$list->filterByInterface(); - -foreach ($list as $key => $value) { - assert('$data[$key] == $value'); -} - -?> -===DONE=== ---EXPECT-- -===DONE=== Index: tests/Util/Code/runAsFile-executes-in-file.phpt =================================================================== --- tests/Util/Code/runAsFile-executes-in-file.phpt (revision 691) +++ tests/Util/Code/runAsFile-executes-in-file.phpt (working copy) @@ -10,7 +10,7 @@ $util = new PHPT_Util_Code($code); -$file = dirname(__FILE__) . '/foobar.php'; +$file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'foobar.php'; $result = $util->runAsFile($file); assert('$result == $file'); Index: tests/Util/Code/runAsFile-returns-output-if-no-return.phpt =================================================================== --- tests/Util/Code/runAsFile-returns-output-if-no-return.phpt (revision 691) +++ tests/Util/Code/runAsFile-returns-output-if-no-return.phpt (working copy) @@ -9,7 +9,7 @@ $util = new PHPT_Util_Code($code); -$file = dirname(__FILE__) . '/foobar.php'; +$file = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'foobar.php'; $result = $util->runAsFile($file); assert('$result == $file');