diff --git a/admin/code/CMSBatchActionHandler.php b/admin/code/CMSBatchActionHandler.php index 95bbc7102..168067ea7 100644 --- a/admin/code/CMSBatchActionHandler.php +++ b/admin/code/CMSBatchActionHandler.php @@ -203,7 +203,7 @@ class CMSBatchActionHandler extends RequestHandler { * @return array See {@link register()} for the returned format. */ function batchActions() { - $actions = Config::inst()->get($this->class, 'batch_actions', Config::FIRST_SET) + $actions = Config::inst()->get($this->class, 'batch_actions', Config::FIRST_SET); if($actions) foreach($actions as $action) { if($action['recordClass'] != $this->recordClass) unset($action); } diff --git a/dev/TestRunner.php b/dev/TestRunner.php index 62993a58e..407c0a3fc 100644 --- a/dev/TestRunner.php +++ b/dev/TestRunner.php @@ -254,19 +254,20 @@ class TestRunner extends Controller { */ function runTests($classList, $coverage = false) { $startTime = microtime(true); - - // XDEBUG seem to cause problems with test execution :-( + + // disable xdebug, as it messes up test execution if(function_exists('xdebug_disable')) xdebug_disable(); - - ini_set('max_execution_time', 0); - + + ini_set('max_execution_time', 0); + $this->setUp(); - + // Optionally skip certain tests $skipTests = array(); if($this->request->getVar('SkipTests')) { $skipTests = explode(',', $this->request->getVar('SkipTests')); } + $classList = array_diff($classList, $skipTests); // run tests before outputting anything to the client @@ -281,16 +282,14 @@ class TestRunner extends Controller { // Remove the error handler so that PHPUnit can add its own restore_error_handler(); - self::$default_reporter->writeHeader("SilverStripe Test Runner"); - if (count($classList) > 1) { + if (count($classList) > 1) { self::$default_reporter->writeInfo("All Tests", "Running test cases: ",implode(", ", $classList)); - } else - if (count($classList) == 1) { - self::$default_reporter->writeInfo($classList[0], ""); + } elseif (count($classList) == 1) { + self::$default_reporter->writeInfo($classList[0], ''); } else { - // border case: no tests are available. - self::$default_reporter->writeInfo("", ""); + // border case: no tests are available. + self::$default_reporter->writeInfo('', ''); } // perform unit tests (use PhpUnitWrapper or derived versions) diff --git a/tests/core/ConfigTest.php b/tests/core/ConfigTest.php index a981933fb..841d6cb11 100644 --- a/tests/core/ConfigTest.php +++ b/tests/core/ConfigTest.php @@ -17,8 +17,94 @@ class ConfigTest_DefinesFooDoesntExtendObject { protected static $foo = 4; } +class ConfigStaticTest_First extends Config { + public static $first = array('test_1'); + public static $second = array('test_1'); + public static $third = 'test_1'; +} + +class ConfigStaticTest_Second extends ConfigStaticTest_First { + public static $first = array('test_2'); +} + +class ConfigStaticTest_Third extends ConfigStaticTest_Second { + public static $first = array('test_3'); + public static $second = array('test_3'); + public static $fourth = array('test_3'); +} + +class ConfigStaticTest_Fourth extends ConfigStaticTest_Third { + public static $fourth = array('test_4'); +} + +class ConfigStaticTest_Combined1 extends Config { + public static $first = array('test_1'); + public static $second = array('test_1'); +} + +class ConfigStaticTest_Combined2 extends ConfigStaticTest_Combined1 { + public static $first = array('test_2'); + public static $second = null; +} + +class ConfigStaticTest_Combined3 extends ConfigStaticTest_Combined2 { + public static $first = array('test_3'); + public static $second = array('test_3'); +} + class ConfigTest extends SapphireTest { + function testUpdateStatic() { + $this->assertEquals(Config::inst()->get('ConfigStaticTest_First', 'first', Config::FIRST_SET), array('test_1')); + $this->assertEquals(Config::inst()->get('ConfigStaticTest_Second', 'first', Config::FIRST_SET), array('test_2')); + $this->assertEquals(Config::inst()->get('ConfigStaticTest_Third', 'first', Config::FIRST_SET), array('test_3')); + + Config::inst()->update('ConfigStaticTest_First', 'first', array('test_1_2')); + Config::inst()->update('ConfigStaticTest_Third', 'first', array('test_3_2')); + Config::inst()->update('ConfigStaticTest_Fourth', 'first', array('test_4')); + + $this->assertEquals(Config::inst()->get('ConfigStaticTest_First', 'first', Config::FIRST_SET), array('test_1_2', 'test_1')); + + Config::inst()->update('ConfigStaticTest_Fourth', 'second', array('test_4')); + Config::inst()->update('ConfigStaticTest_Third', 'second', array('test_3_2')); + + $this->assertEquals(Config::inst()->get('ConfigStaticTest_Fourth', 'second', Config::FIRST_SET), array('test_4')); + $this->assertEquals(Config::inst()->get('ConfigStaticTest_Third', 'second', Config::FIRST_SET), array('test_3_2', 'test_3')); + + Config::inst()->remove('ConfigStaticTest_Third', 'second'); + Config::inst()->update('ConfigStaticTest_Third', 'second', array('test_3_2')); + $this->assertEquals(Config::inst()->get('ConfigStaticTest_Third', 'second', Config::FIRST_SET), array('test_3_2')); + } + + function testUninheritedStatic() { + $this->assertEquals(Config::inst()->get('ConfigStaticTest_First', 'third', Config::UNINHERITED), 'test_1'); + $this->assertEquals(Config::inst()->get('ConfigStaticTest_Fourth', 'third', Config::UNINHERITED), null); + + Config::inst()->update('ConfigStaticTest_First', 'first', array('test_1b')); + Config::inst()->update('ConfigStaticTest_Second', 'first', array('test_2b')); + + // Check that it can be applied to parent and subclasses, and queried directly + $this->assertContains('test_1b', Config::inst()->get('ConfigStaticTest_First', 'first', Config::UNINHERITED)); + $this->assertContains('test_2b', Config::inst()->get('ConfigStaticTest_Second', 'first', Config::UNINHERITED)); + + // But it won't affect subclasses - this is *uninherited* static + $this->assertNotContains('test_2b', Config::inst()->get('ConfigStaticTest_Third', 'first', Config::UNINHERITED)); + $this->assertNotContains('test_2b', Config::inst()->get('ConfigStaticTest_Fourth', 'first', Config::UNINHERITED)); + + // Subclasses that don't have the static explicitly defined should allow definition, also + // This also checks that set can be called after the first uninherited get() + // call (which can be buggy due to caching) + Config::inst()->update('ConfigStaticTest_Fourth', 'first', array('test_4b')); + $this->assertContains('test_4b', Config::inst()->get('ConfigStaticTest_Fourth', 'first', Config::UNINHERITED)); + } + + function testCombinedStatic() { + $this->assertEquals(Config::inst()->get('ConfigStaticTest_Combined3', 'first'), array('test_3', 'test_2', 'test_1')); + + // test that null values are ignored, but values on either side are still merged + $this->assertEquals(Config::inst()->get('ConfigStaticTest_Combined3', 'second'), array('test_3', 'test_1')); + } + function testMerges() { $result = array('A' => 1, 'B' => 2, 'C' => 3); Config::merge_array_low_into_high($result, array('C' => 4, 'D' => 5)); diff --git a/tests/core/ObjectStaticTest.php b/tests/core/ObjectStaticTest.php deleted file mode 100644 index 2a431a41d..000000000 --- a/tests/core/ObjectStaticTest.php +++ /dev/null @@ -1,136 +0,0 @@ -assertEquals(Object::get_static('ObjectStaticTest_First', 'first'), array('test_1')); - $this->assertEquals(Object::get_static('ObjectStaticTest_Second', 'first'), array('test_2')); - $this->assertEquals(Object::get_static('ObjectStaticTest_Third', 'first'), array('test_3')); - - Object::addStaticVars('ObjectStaticTest_First', array('first' => array('test_1_2'))); - Object::addStaticVars('ObjectStaticTest_Third', array('first' => array('test_3_2'))); - Object::addStaticVars('ObjectStaticTest_Fourth', array('first' => array('test_4'))); - - $this->assertEquals(Object::get_static('ObjectStaticTest_First', 'first', true), array('test_1_2', 'test_1')); - // @todo - This fails. Decide if we can ignore this particular behaviour (it seems weird and counter-intuitive anyway) - // $this->assertEquals(Object::get_static('ObjectStaticTest_Second', 'first', true), array('test_1_2', 'test_2')); - // $this->assertEquals(Object::get_static('ObjectStaticTest_Third', 'first', true), array('test_1_2', 'test_3_2', 'test_3')); - } - - /** - * Test {@link Object::addStaticVar()} correctly replaces static vars - */ - public function testAddStaticReplace() { - Object::addStaticVars('ObjectStaticTest_Fourth', array('second' => array('test_4')), true); - Object::addStaticVars('ObjectStaticTest_Third', array('second' => array('test_3_2'))); - - $this->assertEquals(Object::get_static('ObjectStaticTest_Fourth', 'second', true), array('test_4')); - $this->assertEquals(Object::get_static('ObjectStaticTest_Third', 'second', true), array('test_3_2', 'test_3')); - - Object::addStaticVars('ObjectStaticTest_Third', array('second' => array('test_3_2')), true); - $this->assertEquals(Object::get_static('ObjectStaticTest_Third', 'second', true), array('test_3_2')); - - Object::add_static_var('ObjectStaticTest_Third', 'fourth', array('test_3_2')); - // @todo - This fails. Decide if we can ignore this particular behaviour (it seems weird and counter-intuitive anyway) - // $this->assertEquals(Object::get_static('ObjectStaticTest_Fourth', 'fourth', true), array('test_3_2', 'test_4')); - - Object::add_static_var('ObjectStaticTest_Third', 'fourth', array('test_3_2'), true); - // @todo - This fails. Decide if we can ignore this particular behaviour (it seems weird and counter-intuitive anyway) - // $this->assertEquals(Object::get_static('ObjectStaticTest_Fourth', 'fourth', true), array('test_4', 'test_3_2')); - } - - /** - * Tests {@link Object::uninherited_static()} - */ - public function testUninherited() { - $this->assertEquals(Object::uninherited_static('ObjectStaticTest_First', 'third', true), 'test_1'); - $this->assertEquals(Object::uninherited_static('ObjectStaticTest_Fourth', 'third', true), null); - } - - public function testCombinedStatic() { - // test basic operation - $this->assertEquals ( - array('test_3', 'test_2', 'test_1'), Object::combined_static('ObjectStaticTest_Combined3', 'first') - ); - - // test that null values are ignored, but values on either side are still merged - $this->assertEquals ( - array('test_3', 'test_1'), Object::combined_static('ObjectStaticTest_Combined3', 'second') - ); - - // test the $ceiling param - // @todo - This fails, as it's been removed. Do we need it? - // $this->assertEquals ( - // array('test_3', 'test_2'), Object::combined_static('ObjectStaticTest_Combined3', 'first', 'ObjectStaticTest_Combined2') - // ); - } - - /** - * Checks that Object::add_static_var() also works for uninherited stats - */ - public function testAddStaticVarWorksForUninheritedStatics() { - Object::add_static_var('ObjectStaticTest_First', 'first', array('test_1b')); - Object::add_static_var('ObjectStaticTest_Second', 'first', array('test_2b')); - - // Check that it can be applied to parent and subclasses, and queried directly - $this->assertContains('test_1b', Object::uninherited_static('ObjectStaticTest_First', 'first')); - $this->assertContains('test_2b', Object::uninherited_static('ObjectStaticTest_Second', 'first')); - - // But it won't affect subclasses - this is *uninherited* static - $this->assertNotContains('test_2b', Object::uninherited_static('ObjectStaticTest_Third', 'first')); - $this->assertNotContains('test_2b', Object::uninherited_static('ObjectStaticTest_Fourth', 'first')); - - // Subclasses that don't have the static explicitly defined should allow definition, also - // This also checks that add_static_var can be called after the first uninherited_static() - // call (which can be buggy due to caching) - Object::add_static_var('ObjectStaticTest_Fourth', 'first', array('test_4b')); - $this->assertContains('test_4b', Object::uninherited_static('ObjectStaticTest_Fourth', 'first')); - } - -} - -/**#@+ - * @ignore - */ -class ObjectStaticTest_First extends Object { - public static $first = array('test_1'); - public static $second = array('test_1'); - public static $third = 'test_1'; -} - -class ObjectStaticTest_Second extends ObjectStaticTest_First { - public static $first = array('test_2'); -} - -class ObjectStaticTest_Third extends ObjectStaticTest_Second { - public static $first = array('test_3'); - public static $second = array('test_3'); - public static $fourth = array('test_3'); -} - -class ObjectStaticTest_Fourth extends ObjectStaticTest_Third { - public static $fourth = array('test_4'); -} - -class ObjectStaticTest_Combined1 extends Object { - public static $first = array('test_1'); - public static $second = array('test_1'); -} - -class ObjectStaticTest_Combined2 extends ObjectStaticTest_Combined1 { - public static $first = array('test_2'); - public static $second = null; -} - -class ObjectStaticTest_Combined3 extends ObjectStaticTest_Combined2 { - public static $first = array('test_3'); - public static $second = array('test_3'); -} diff --git a/tests/model/DataObjectTest.php b/tests/model/DataObjectTest.php index 7068501a5..e85ec0a99 100644 --- a/tests/model/DataObjectTest.php +++ b/tests/model/DataObjectTest.php @@ -1021,9 +1021,11 @@ class DataObjectTest extends SapphireTest { function testRelObject() { $captain = $this->objFromFixture('DataObjectTest_Player', 'captain1'); + // Test traversal of a single has_one $this->assertInstanceOf("Varchar", $captain->relObject('FavouriteTeam.Title')); $this->assertEquals("Team 1", $captain->relObject('FavouriteTeam.Title')->getValue()); + // Test direct field access $this->assertInstanceOf("Boolean", $captain->relObject('IsRetired')); $this->assertEquals(1, $captain->relObject('IsRetired')->getValue());