home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Servidores / xampp-win32-1.6.7-installer.exe / php / PEAR / phing / tasks / ext / phpunit / PHPUnitTask.php < prev    next >
Encoding:
PHP Script  |  2007-10-31  |  8.8 KB  |  348 lines

  1. <?php
  2. /**
  3.  * $Id: PHPUnitTask.php 275 2007-10-31 08:01:03Z mrook $
  4.  *
  5.  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6.  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7.  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8.  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9.  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10.  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11.  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15.  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16.  *
  17.  * This software consists of voluntary contributions made by many individuals
  18.  * and is licensed under the LGPL. For more information please see
  19.  * <http://phing.info>.
  20.  */
  21.  
  22. require_once 'phing/Task.php';
  23. require_once 'phing/system/io/PhingFile.php';
  24. require_once 'phing/system/io/Writer.php';
  25. require_once 'phing/util/LogWriter.php';
  26.  
  27. /**
  28.  * Runs PHPUnit2/3 tests.
  29.  *
  30.  * @author Michiel Rook <michiel.rook@gmail.com>
  31.  * @version $Id: PHPUnitTask.php 275 2007-10-31 08:01:03Z mrook $
  32.  * @package phing.tasks.ext.phpunit
  33.  * @see BatchTest
  34.  * @since 2.1.0
  35.  */
  36. class PHPUnitTask extends Task
  37. {
  38.     private $batchtests = array();
  39.     private $formatters = array();
  40.     private $haltonerror = false;
  41.     private $haltonfailure = false;
  42.     private $failureproperty;
  43.     private $errorproperty;
  44.     private $printsummary = false;
  45.     private $testfailed = false;
  46.     private $codecoverage = false;
  47.     private $groups = array();
  48.     private $excludeGroups = array();
  49.  
  50.     /**
  51.      * Initialize Task.
  52.       * This method includes any necessary PHPUnit2 libraries and triggers
  53.      * appropriate error if they cannot be found.  This is not done in header
  54.      * because we may want this class to be loaded w/o triggering an error.
  55.      */
  56.     function init() {
  57.         if (version_compare(PHP_VERSION, '5.0.3') < 0) {
  58.             throw new BuildException("PHPUnit2Task requires PHP version >= 5.0.3.", $this->getLocation());
  59.         }
  60.         
  61.         /**
  62.          * Determine PHPUnit version number
  63.          */
  64.         @include_once 'PHPUnit/Runner/Version.php';
  65.         @include_once 'PHPUnit2/Runner/Version.php';
  66.  
  67.         if (class_exists('PHPUnit_Runner_Version'))
  68.         {
  69.             $version = PHPUnit_Runner_Version::id();
  70.         }
  71.         elseif (class_exists('PHPUnit2_Runner_Version'))
  72.         {
  73.             $version = PHPUnit2_Runner_Version::id();
  74.         }
  75.         else
  76.         {
  77.             throw new BuildException("PHPUnit task depends on PHPUnit 2 or 3 package being installed.", $this->getLocation());
  78.         }
  79.         
  80.         if (version_compare($version, "3.0.0") >= 0)
  81.         {
  82.             PHPUnitUtil::$installedVersion = 3;
  83.             if (version_compare($version, "3.2.0") >= 0)
  84.             {
  85.                 PHPUnitUtil::$installedMinorVersion = 2;
  86.             }
  87.         }
  88.         else
  89.         {
  90.             PHPUnitUtil::$installedVersion = 2;
  91.         }
  92.         
  93.         /**
  94.          * Other dependencies that should only be loaded when class is actually used.
  95.          */
  96.         require_once 'phing/tasks/ext/phpunit/PHPUnitTestRunner.php';
  97.         require_once 'phing/tasks/ext/phpunit/BatchTest.php';
  98.         require_once 'phing/tasks/ext/phpunit/FormatterElement.php';
  99.  
  100.         /**
  101.          * Add some defaults to the PHPUnit filter
  102.          */
  103.         if (PHPUnitUtil::$installedVersion == 3)
  104.         {
  105.             require_once 'PHPUnit/Util/Filter.php';
  106.             
  107.             // point PHPUnit_MAIN_METHOD define to non-existing method
  108.             define('PHPUnit_MAIN_METHOD', 'PHPUnitTask::undefined');
  109.             
  110.             PHPUnit_Util_Filter::addFileToFilter('PHPUnitTask.php', 'PHING');
  111.             PHPUnit_Util_Filter::addFileToFilter('PHPUnitTestRunner.php', 'PHING');
  112.             PHPUnit_Util_Filter::addFileToFilter('phing/Task.php', 'PHING');
  113.             PHPUnit_Util_Filter::addFileToFilter('phing/Target.php', 'PHING');
  114.             PHPUnit_Util_Filter::addFileToFilter('phing/Project.php', 'PHING');
  115.             PHPUnit_Util_Filter::addFileToFilter('phing/Phing.php', 'PHING');
  116.             PHPUnit_Util_Filter::addFileToFilter('phing.php', 'PHING');
  117.         }
  118.         else
  119.         {
  120.             require_once 'PHPUnit2/Util/Filter.php';
  121.             
  122.             PHPUnit2_Util_Filter::addFileToFilter('PHPUnitTask.php');
  123.             PHPUnit2_Util_Filter::addFileToFilter('PHPUnitTestRunner.php');
  124.             PHPUnit2_Util_Filter::addFileToFilter('phing/Task.php');
  125.             PHPUnit2_Util_Filter::addFileToFilter('phing/Target.php');
  126.             PHPUnit2_Util_Filter::addFileToFilter('phing/Project.php');
  127.             PHPUnit2_Util_Filter::addFileToFilter('phing/Phing.php');
  128.             PHPUnit2_Util_Filter::addFileToFilter('phing.php');
  129.         }
  130.     }
  131.     
  132.     function setFailureproperty($value)
  133.     {
  134.         $this->failureproperty = $value;
  135.     }
  136.     
  137.     function setErrorproperty($value)
  138.     {
  139.         $this->errorproperty = $value;
  140.     }
  141.     
  142.     function setHaltonerror($value)
  143.     {
  144.         $this->haltonerror = $value;
  145.     }
  146.  
  147.     function setHaltonfailure($value)
  148.     {
  149.         $this->haltonfailure = $value;
  150.     }
  151.  
  152.     function setPrintsummary($printsummary)
  153.     {
  154.         $this->printsummary = $printsummary;
  155.     }
  156.     
  157.     function setCodecoverage($codecoverage)
  158.     {
  159.         $this->codecoverage = $codecoverage;
  160.     }
  161.  
  162.     function setGroups($groups)
  163.     {
  164.         if (PHPUnitUtil::$installedVersion < 3 || (PHPUnitUtil::$installedVersion == 3 && PHPUnitUtil::$installedMinorVersion < 2))
  165.         {
  166.             $this->log("The 'groups' attribute is only available with PHPUnit 3.2.0 or newer", Project::MSG_WARN);
  167.         }
  168.         $token = ' ,;';
  169.         $this->groups = array();
  170.         $tok = strtok($groups, $token);
  171.         while ($tok !== false) {
  172.             $this->groups[] = $tok;
  173.             $tok = strtok($token);
  174.         }
  175.     }
  176.  
  177.     function setExcludeGroups($excludeGroups)
  178.     {
  179.         if (PHPUnitUtil::$installedVersion < 3 || (PHPUnitUtil::$installedVersion == 3 && PHPUnitUtil::$installedMinorVersion < 2))
  180.         {
  181.             $this->log("The 'excludeGroups' attribute is only available with PHPUnit 3.2.0 or newer", Project::MSG_WARN);
  182.         }
  183.         $token = ' ,;';
  184.         $this->excludeGroups = array();
  185.         $tok = strtok($groups, $token);
  186.         while ($tok !== false) {
  187.             $this->excludeGroups[] = $tok;
  188.             $tok = strtok($token);
  189.         }
  190.     }
  191.  
  192.     /**
  193.      * Add a new formatter to all tests of this task.
  194.      *
  195.      * @param FormatterElement formatter element
  196.      */
  197.     function addFormatter(FormatterElement $fe)
  198.     {
  199.         $this->formatters[] = $fe;
  200.     }
  201.  
  202.     /**
  203.      * The main entry point
  204.      *
  205.      * @throws BuildException
  206.      */
  207.     function main()
  208.     {
  209.         $tests = array();
  210.         
  211.         if ($this->printsummary)
  212.         {
  213.             $fe = new FormatterElement();
  214.             $fe->setType("summary");
  215.             $fe->setUseFile(false);
  216.             $this->formatters[] = $fe;
  217.         }
  218.         
  219.         foreach ($this->batchtests as $batchtest)
  220.         {
  221.             $tests = array_merge($tests, $batchtest->elements());
  222.         }            
  223.         
  224.         foreach ($this->formatters as $fe)
  225.         {
  226.             $formatter = $fe->getFormatter();            
  227.             $formatter->setProject($this->getProject());
  228.  
  229.             if ($fe->getUseFile())
  230.             {
  231.                 $destFile = new PhingFile($fe->getToDir(), $fe->getOutfile());
  232.                 
  233.                 $writer = new FileWriter($destFile->getAbsolutePath());
  234.  
  235.                 $formatter->setOutput($writer);
  236.             }
  237.             else
  238.             {
  239.                 $formatter->setOutput($this->getDefaultOutput());
  240.             }
  241.  
  242.             $formatter->startTestRun();
  243.         }
  244.         
  245.         foreach ($tests as $test)
  246.         {
  247.             $suite = NULL;
  248.             
  249.             if (is_subclass_of($test, 'PHPUnit_Framework_TestSuite') || is_subclass_of($test, 'PHPUnit2_Framework_TestSuite'))
  250.             {
  251.                 if (is_object($test))
  252.                 {
  253.                     $suite = $test;
  254.                 }
  255.                 else
  256.                 {
  257.                     $suite = new $test();
  258.                 }
  259.             }
  260.             else
  261.             {
  262.                 if (PHPUnitUtil::$installedVersion == 3)
  263.                 {
  264.                     require_once 'PHPUnit/Framework/TestSuite.php';
  265.                     $suite = new PHPUnit_Framework_TestSuite(new ReflectionClass($test));
  266.                 }
  267.                 else
  268.                 {
  269.                     require_once 'PHPUnit2/Framework/TestSuite.php';
  270.                     $suite = new PHPUnit2_Framework_TestSuite(new ReflectionClass($test));
  271.                 }
  272.             }
  273.             
  274.             $this->execute($suite);
  275.         }
  276.  
  277.         foreach ($this->formatters as $fe)
  278.         {
  279.             $formatter = $fe->getFormatter();
  280.             $formatter->endTestRun();
  281.         }
  282.         
  283.         if ($this->testfailed)
  284.         {
  285.             throw new BuildException("One or more tests failed");
  286.         }
  287.     }
  288.  
  289.     /**
  290.      * @throws BuildException
  291.      */
  292.     private function execute($suite)
  293.     {
  294.         $runner = new PHPUnitTestRunner($suite, $this->project, $this->groups, $this->excludeGroups);
  295.         
  296.         $runner->setCodecoverage($this->codecoverage);
  297.  
  298.         foreach ($this->formatters as $fe)
  299.         {
  300.             $formatter = $fe->getFormatter();
  301.  
  302.             $runner->addFormatter($formatter);
  303.         }
  304.  
  305.         $runner->run();
  306.  
  307.         $retcode = $runner->getRetCode();
  308.         
  309.         if ($retcode == PHPUnitTestRunner::ERRORS) {
  310.             if ($this->errorproperty) {
  311.                 $this->project->setNewProperty($this->errorproperty, true);
  312.             }
  313.             if ($this->haltonerror) {
  314.                 $this->testfailed = true;
  315.             }
  316.         } elseif ($retcode == PHPUnitTestRunner::FAILURES) {
  317.             if ($this->failureproperty) {
  318.                 $this->project->setNewProperty($this->failureproperty, true);
  319.             }
  320.             
  321.             if ($this->haltonfailure) {
  322.                 $this->testfailed = true;
  323.             }
  324.         }
  325.         
  326.     }
  327.  
  328.     private function getDefaultOutput()
  329.     {
  330.         return new LogWriter($this);
  331.     }
  332.  
  333.     /**
  334.      * Adds a set of tests based on pattern matching.
  335.      *
  336.      * @return BatchTest a new instance of a batch test.
  337.      */
  338.     function createBatchTest()
  339.     {
  340.         $batchtest = new BatchTest($this->getProject());
  341.  
  342.         $this->batchtests[] = $batchtest;
  343.  
  344.         return $batchtest;
  345.     }
  346. }
  347. ?>
  348.