[limb-svn] r6218 - in 3.x/trunk/limb/tests_runner: src tests tests/cases

svn at limb-project.com svn at limb-project.com
Mon Aug 6 16:16:32 MSD 2007


Author: pachanga
Date: 2007-08-06 16:16:32 +0400 (Mon, 06 Aug 2007)
New Revision: 6218
URL: http://fisheye.limb-project.com/changelog/limb/?cs=6218

Modified:
   3.x/trunk/limb/tests_runner/src/lmbDetachedFixture.class.php
   3.x/trunk/limb/tests_runner/src/lmbTestGroup.class.php
   3.x/trunk/limb/tests_runner/src/lmbTestRunner.class.php
   3.x/trunk/limb/tests_runner/src/lmbTestTreeDirNode.class.php
   3.x/trunk/limb/tests_runner/src/lmbTestTreeFileNode.class.php
   3.x/trunk/limb/tests_runner/src/lmbTestTreeNode.class.php
   3.x/trunk/limb/tests_runner/src/lmbTestTreeShallowDirNode.class.php
   3.x/trunk/limb/tests_runner/src/lmbTestWebUI.class.php
   3.x/trunk/limb/tests_runner/tests/cases/lmbTestGroupTest.class.php
   3.x/trunk/limb/tests_runner/tests/cases/lmbTestTreeDirNodeTest.class.php
   3.x/trunk/limb/tests_runner/tests/cases/lmbTestTreeFilePathNodeTest.class.php
   3.x/trunk/limb/tests_runner/tests/test_self.php
Log:
-- parent test fixtures are setup in a more proper way, before this fixtures were setup only down from the current node while parent ones were ignored. The fix is a bit hackish yet it fixes quite a serious bug, some refactoring may be applied in the future
-- lmbTestGroup allows to have many nested fixtures
-- lmbTestTreeNode splits test case creation and test case preparation into 2 methods: _doCreateTestCase() and _prepareTestCase($test)



Modified: 3.x/trunk/limb/tests_runner/src/lmbDetachedFixture.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/src/lmbDetachedFixture.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/src/lmbDetachedFixture.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -1,4 +1,4 @@
-<?php
+<?php
 /*
  * Limb PHP Framework
  *
@@ -7,45 +7,45 @@
  * @license    LGPL http://www.gnu.org/copyleft/lesser.html 
  */
 
-/**
- * class lmbDetachedFixture.
- *
- * @package tests_runner
- * @version $Id$
+/**
+ * class lmbDetachedFixture.
+ *
+ * @package tests_runner
+ * @version $Id$
  */
-class lmbDetachedFixture
-{
-  protected $_setup;
-  protected $_teardown;
-  protected $_container = array();
-
-  function __construct($setup, $teardown)
-  {
-    $this->_setup = $setup;
-    $this->_teardown = $teardown;
-  }
-
-  function setUp()
-  {
-    if(file_exists($this->_setup))
-      include($this->_setup);
-  }
-
-  function tearDown()
-  {
-    if(file_exists($this->_teardown))
-      include($this->_teardown);
-  }
-
-  function __set($name, $value)
-  {
-    $this->_container[$name] = $value;
-  }
-
-  function __get($name)
-  {
-    if(isset($this->_container[$name]))
-      return $this->_container[$name];
-  }
-}
-?>
\ No newline at end of file
+class lmbDetachedFixture
+{
+  protected $_setup;
+  protected $_teardown;
+  protected $_container = array();
+
+  function __construct($setup, $teardown)
+  {
+    $this->_setup = $setup;
+    $this->_teardown = $teardown;
+  }
+
+  function setUp()
+  {
+    if(file_exists($this->_setup))
+      include($this->_setup);
+  }
+
+  function tearDown()
+  {
+    if(file_exists($this->_teardown))
+      include($this->_teardown);
+  }
+
+  function __set($name, $value)
+  {
+    $this->_container[$name] = $value;
+  }
+
+  function __get($name)
+  {
+    if(isset($this->_container[$name]))
+      return $this->_container[$name];
+  }
+}
+?>

Modified: 3.x/trunk/limb/tests_runner/src/lmbTestGroup.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/src/lmbTestGroup.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/src/lmbTestGroup.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -15,13 +15,14 @@
  */
 class lmbTestGroup extends TestSuite
 {
-  protected $_fixture;
-  protected $_container = array();
+  protected $_fixtures = array();
 
-  function useFixture($fixture)
+  function addFixture($fixture)
   {
-    $this->_fixture = $fixture;
-    $this->_setUpFixture();
+    $this->_fixtures[] = $fixture;
+    //fixture is setup once added, since fixture may contain some stuff 
+    //required even before actual tests execution
+    $fixture->setup();
   }
 
   function run($reporter)
@@ -33,16 +34,10 @@
     return $res;
   }
 
-  protected function _setUpFixture()
-  {
-    if($this->_fixture)
-      $this->_fixture->setUp();
-  }
-
   protected function _tearDownFixture()
   {
-    if($this->_fixture)
-      $this->_fixture->tearDown();
+    foreach(array_reverse($this->_fixtures) as $fixture)
+      $fixture->tearDown();
   }
 }
-?>
\ No newline at end of file
+?>

Modified: 3.x/trunk/limb/tests_runner/src/lmbTestRunner.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/src/lmbTestRunner.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/src/lmbTestRunner.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -127,4 +127,4 @@
   }
 }
 
-?>
\ No newline at end of file
+?>

Modified: 3.x/trunk/limb/tests_runner/src/lmbTestTreeDirNode.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/src/lmbTestTreeDirNode.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/src/lmbTestTreeDirNode.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -24,10 +24,10 @@
   protected static $file_filter;
   protected $loaded;
 
-  function createTestCase()
+  function createTestCase($is_first = true)
   {
     $this->_loadChildren();
-    return parent :: createTestCase();
+    return parent :: createTestCase($is_first);
   }
 
   static function getFileFilter()

Modified: 3.x/trunk/limb/tests_runner/src/lmbTestTreeFileNode.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/src/lmbTestTreeFileNode.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/src/lmbTestTreeFileNode.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -39,7 +39,7 @@
   protected function _doCreateTestCase()
   {
     require_once($this->file);
-    $suite = new TestSuite(basename($this->file));
+    $suite = new lmbTestGroup(basename($this->file));
     $candidates = $this->_getClassesDefinedInFile();
     $loader = new SimpleFileLoader();
     foreach($loader->selectRunnableTests($candidates) as $class)

Modified: 3.x/trunk/limb/tests_runner/src/lmbTestTreeNode.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/src/lmbTestTreeNode.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/src/lmbTestTreeNode.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -41,6 +41,18 @@
     return $this->children;
   }
 
+  function getParents()
+  {
+    $parents = array();
+    $node = $this->parent;
+    while($node)
+    {
+      array_unshift($parents, $node);
+      $node = $node->getParent();
+    }
+    return $parents;
+  }  
+
   protected function _loadChildren(){}
 
   function findChildByPath($path)
@@ -98,24 +110,56 @@
     return $this->_doCreateTestCase()->getLabel();
   }
 
-  function createTestCase()
+  function createTestCase($is_first = true)
   {
+    if($is_first && $this->_hasSkippedParents())
+      return null;
+
     $test = $this->_doCreateTestCase();
-    $children = $this->getChildren();//using getter instead of raw property, since child classes may need customization
+
+    //all parents are traversed in case some test customization is required
+    if($is_first)
+    {
+      foreach($this->getParents() as $node)
+        $node->_prepareTestCase($test);
+    }
+
+    $this->_prepareTestCase($test);
+    //using getter instead of raw property, since child classes may need lazy loading 
+    $children = $this->getChildren();
     foreach($children as $child)
     {
       if($child->isSkipped())
         continue;
-      $child->init();
-      $test->addTestCase($child->createTestCase());
+      $child->init();//obsolete stuff
+      $test->addTestCase($child->createTestCase(false));
     }
     return $test;
   }
 
+  protected function _hasSkippedParents()
+  {
+    if(!$this->parent)
+      return false;
+
+    $parent = $this->parent;
+    while($parent)
+    {
+      if($parent->isSkipped())
+        return true;
+      $parent = $parent->getParent();
+    }
+    return false;
+  }
+
   protected function _doCreateTestCase()
   {
-    return new TestSuite();
+    //we need to delay inclusion of SimpleTest as much as possible
+    require_once(dirname(__FILE__) . '/lmbTestGroup.class.php');
+    return new lmbTestGroup();
   }
+
+  protected function _prepareTestCase($test){}
 }
 
 ?>

Modified: 3.x/trunk/limb/tests_runner/src/lmbTestTreeShallowDirNode.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/src/lmbTestTreeShallowDirNode.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/src/lmbTestTreeShallowDirNode.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -61,10 +61,15 @@
 
     $label = $this->_getDirectoryLabel();
     $test = new lmbTestGroup($label);
+    return $test;
+  }
+
+  protected function _prepareTestCase($test)
+  {
     $fixture = new lmbDetachedFixture($this->dir . '/.setup.php',
                                       $this->dir . '/.teardown.php');
-    $test->useFixture($fixture);
-    return $test;
+    //set this fixture to be the first one
+    $test->addFixture($fixture);
   }
 
   protected function _getDirectoryLabel()

Modified: 3.x/trunk/limb/tests_runner/src/lmbTestWebUI.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/src/lmbTestWebUI.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/src/lmbTestWebUI.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -189,4 +189,4 @@
   }
 }
 
-?>
\ No newline at end of file
+?>

Modified: 3.x/trunk/limb/tests_runner/tests/cases/lmbTestGroupTest.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/tests/cases/lmbTestGroupTest.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/tests/cases/lmbTestGroupTest.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -12,6 +12,26 @@
 
 Mock :: generate('lmbDetachedFixture', 'MockDetachedFixture');
 
+class DetachedFixtureStub
+{
+  protected $me;
+
+  function __construct($name)
+  {
+    $this->me = $name;
+  }
+
+  function setUp()
+  {
+    echo 'setup ' . $this->me;
+  }
+
+  function tearDown()
+  {
+    echo 'teardown ' . $this->me;
+  }
+}
+
 class lmbTestGroupTest extends lmbTestRunnerBase
 {
   function setUp()
@@ -25,7 +45,7 @@
     $this->_rmdir(LIMB_VAR_DIR);
   }
 
-  function testUseFixture()
+  function testAddFixture()
   {
     $fixture = new MockDetachedFixture();
 
@@ -33,12 +53,29 @@
     $fixture->expectOnce('tearDown');
 
     $group = new lmbTestGroup(LIMB_VAR_DIR);
-    $group->useFixture($fixture);
+    $group->addFixture($fixture);
 
     ob_start();
     $group->run(new SimpleReporter());
     ob_end_clean();
   }
+
+  function testSeveralFixtures()
+  {
+    $fixture1 = new DetachedFixtureStub('1');
+    $fixture2 = new DetachedFixtureStub('2');
+
+    $group = new lmbTestGroup(LIMB_VAR_DIR);
+
+    //fixture is setup once added
+    ob_start();
+    $group->addFixture($fixture1);
+    $group->addFixture($fixture2);
+
+    $group->run(new SimpleReporter());
+    $str = ob_get_contents();
+    ob_end_clean(); 
+    $this->assertEqual($str, 'setup 1setup 2teardown 2teardown 1');
+  }
 }
-
 ?>

Modified: 3.x/trunk/limb/tests_runner/tests/cases/lmbTestTreeDirNodeTest.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/tests/cases/lmbTestTreeDirNodeTest.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/tests/cases/lmbTestTreeDirNodeTest.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -239,6 +239,28 @@
 
     $this->_runNodeAndAssertOutput($root_node, '');
   }
+
+  function testParentFixturesAreExecuted()
+  {
+    mkdir($this->var_dir . '/a');
+    mkdir($this->var_dir . '/a/b');
+
+    file_put_contents($this->var_dir . '/a/.setup.php', '<?php echo "setup"; ?>');
+    file_put_contents($this->var_dir . '/a/.teardown.php', '<?php echo "teardown"; ?>');
+
+    file_put_contents($this->var_dir . '/a/b/.setup.php', '<?php echo "setup2"; ?>');
+    file_put_contents($this->var_dir . '/a/b/.teardown.php', '<?php echo "teardown2"; ?>');
+
+    $test1 = new GeneratedTestClass();
+    $test2 = new GeneratedTestClass();
+
+    file_put_contents($this->var_dir . '/a/b/bar_test.php', $test1->generate());
+    file_put_contents($this->var_dir . '/a/b/foo_test.php', $test2->generate());
+
+    $node = new lmbTestTreeDirNode($this->var_dir);
+    $child = $node->findChildByPath('/0/0/1');
+    $this->_runNodeAndAssertOutput($child, "setupsetup2" . $test2->getOutput() . "teardown2teardown");
+  }
 }
 
 ?>

Modified: 3.x/trunk/limb/tests_runner/tests/cases/lmbTestTreeFilePathNodeTest.class.php
===================================================================
--- 3.x/trunk/limb/tests_runner/tests/cases/lmbTestTreeFilePathNodeTest.class.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/tests/cases/lmbTestTreeFilePathNodeTest.class.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -142,6 +142,28 @@
     $this->assertIsA($kids[0], 'lmbTestTreeDirNode');
     $this->assertEqual($kids[0]->getDir(), realpath($this->var_dir . '/a/b'));
   }
+
+  function testParentFixturesAreExecuted()
+  {
+    mkdir($this->var_dir . '/a');
+    mkdir($this->var_dir . '/a/b');
+
+    file_put_contents($this->var_dir . '/a/.setup.php', '<?php echo "setup"; ?>');
+    file_put_contents($this->var_dir . '/a/.teardown.php', '<?php echo "teardown"; ?>');
+
+    file_put_contents($this->var_dir . '/a/b/.setup.php', '<?php echo "setup2"; ?>');
+    file_put_contents($this->var_dir . '/a/b/.teardown.php', '<?php echo "teardown2"; ?>');
+
+    $test1 = new GeneratedTestClass();
+    $test2 = new GeneratedTestClass();
+
+    file_put_contents($this->var_dir . '/a/b/bar_test.php', $test1->generate());
+    file_put_contents($this->var_dir . '/a/b/foo_test.php', $test2->generate());
+
+    $node = new lmbTestTreeFilePathNode($this->var_dir . '/a', -1);
+    $child = $node->findChildByPath('/0/0/1');
+    $this->_runNodeAndAssertOutput($child, "setupsetup2" . $test2->getOutput() . "teardown2teardown");
+  }
 }
 
 ?>

Modified: 3.x/trunk/limb/tests_runner/tests/test_self.php
===================================================================
--- 3.x/trunk/limb/tests_runner/tests/test_self.php	2007-08-06 11:48:22 UTC (rev 6217)
+++ 3.x/trunk/limb/tests_runner/tests/test_self.php	2007-08-06 12:16:32 UTC (rev 6218)
@@ -9,7 +9,6 @@
 
 if(isset($argv[1]))
   define('SIMPLE_TEST', $argv[1]);
-
 require_once(dirname(__FILE__) . '/cases/.setup.php');
 
 $group = new TestSuite();
@@ -19,4 +18,4 @@
 if(!$res = $group->run(new TextReporter()))
   exit(1);
 
-?>
\ No newline at end of file
+?>



More information about the limb-svn mailing list