_loaded[$name])) { return $this->_loaded[$name]; } $objectClass = $name . 'GenericObject'; $this->_loaded[$name] = new $objectClass($this, $settings); $enable = isset($settings['enabled']) ? $settings['enabled'] : true; if ($enable === true) { $this->_enabled[] = $name; } return $this->_loaded[$name]; } } class ObjectCollectionTest extends CakeTestCase { /** * setup * * @return void */ function setup() { $this->Objects = new GenericObjectCollection(); } /** * teardown * * @return void */ function teardown() { unset($this->Objects); } /** * test triggering callbacks on loaded helpers * * @return void */ function testLoad() { $result = $this->Objects->load('First'); $this->assertInstanceOf('FirstGenericObject', $result); $this->assertInstanceOf('FirstGenericObject', $this->Objects->First); $result = $this->Objects->attached(); $this->assertEquals(array('First'), $result, 'attached() results are wrong.'); $this->assertTrue($this->Objects->enabled('First')); $result = $this->Objects->load('First'); $this->assertSame($result, $this->Objects->First); } /** * test unload() * * @return void */ function testUnload() { $this->Objects->load('First'); $this->Objects->load('Second'); $result = $this->Objects->attached(); $this->assertEquals(array('First', 'Second'), $result, 'loaded objects are wrong'); $this->Objects->unload('First'); $this->assertFalse(isset($this->Objects->First)); $this->assertTrue(isset($this->Objects->Second)); $result = $this->Objects->attached(); $this->assertEquals(array('Second'), $result, 'loaded objects are wrong'); $result = $this->Objects->enabled(); $this->assertEquals(array('Second'), $result, 'enabled objects are wrong'); } /** * Tests set() * * @return void */ function testSet() { $this->Objects->load('First'); $result = $this->Objects->attached(); $this->assertEquals(array('First'), $result, 'loaded objects are wrong'); $result = $this->Objects->set('First', new SecondGenericObject()); $this->assertIsA($result['First'], 'SecondGenericObject', 'set failed'); $result = $this->Objects->set('Second', new SecondGenericObject()); $this->assertIsA($result['Second'], 'SecondGenericObject', 'set failed'); $this->assertEquals(count($result), 2); } /** * creates mock classes for testing * * @return void */ protected function _makeMockClasses() { if (!class_exists('TriggerMockFirstGenericObject')) { $this->getMock('FirstGenericObject', array(), array(), 'TriggerMockFirstGenericObject', false); } if (!class_exists('TriggerMockSecondGenericObject')) { $this->getMock('SecondGenericObject', array(), array(), 'TriggerMockSecondGenericObject', false); } } /** * test triggering callbacks. * * @return void */ function testTrigger() { $this->_makeMockClasses(); $this->Objects->load('TriggerMockFirst'); $this->Objects->load('TriggerMockSecond'); $this->mockObjects[] = $this->Objects->TriggerMockFirst; $this->mockObjects[] = $this->Objects->TriggerMockSecond; $this->Objects->TriggerMockFirst->expects($this->once()) ->method('callback') ->will($this->returnValue(true)); $this->Objects->TriggerMockSecond->expects($this->once()) ->method('callback') ->will($this->returnValue(true)); $this->assertTrue($this->Objects->trigger('callback')); } /** * test that the initalize callback is triggered on all components even those that are disabled. * * @return void */ function testTriggerWithTriggerDisabledObjects() { $this->_makeMockClasses(); $this->Objects->load('TriggerMockFirst', array(), false); $this->Objects->load('TriggerMockSecond'); $this->mockObjects[] = $this->Objects->TriggerMockFirst; $this->mockObjects[] = $this->Objects->TriggerMockSecond; $this->Objects->TriggerMockFirst->expects($this->once()) ->method('callback') ->will($this->returnValue(true)); $this->Objects->TriggerMockSecond->expects($this->once()) ->method('callback') ->will($this->returnValue(true)); $result = $this->Objects->trigger('callback', array(), array('triggerDisabled' => true)); $this->assertTrue($result); } /** * test trigger and disabled objects * * @return void */ function testTriggerWithDisabledObjects() { $this->_makeMockClasses(); $this->Objects->load('TriggerMockFirst'); $this->Objects->load('TriggerMockSecond'); $this->mockObjects[] = $this->Objects->TriggerMockFirst; $this->mockObjects[] = $this->Objects->TriggerMockSecond; $this->Objects->TriggerMockFirst->expects($this->once()) ->method('callback') ->will($this->returnValue(true)); $this->Objects->TriggerMockSecond->expects($this->never()) ->method('callback') ->will($this->returnValue(true)); $this->Objects->disable('TriggerMockSecond'); $this->assertTrue($this->Objects->trigger('callback', array())); } /** * test that the collectReturn option works. * * @return void */ function testTriggerWithCollectReturn() { $this->_makeMockClasses(); $this->Objects->load('TriggerMockFirst'); $this->Objects->load('TriggerMockSecond'); $this->mockObjects[] = $this->Objects->TriggerMockFirst; $this->mockObjects[] = $this->Objects->TriggerMockSecond; $this->Objects->TriggerMockFirst->expects($this->once()) ->method('callback') ->will($this->returnValue(array('one', 'two'))); $this->Objects->TriggerMockSecond->expects($this->once()) ->method('callback') ->will($this->returnValue(array('three', 'four'))); $result = $this->Objects->trigger('callback', array(), array('collectReturn' => true)); $expected = array( array('one', 'two'), array('three', 'four') ); $this->assertEquals($expected, $result); } /** * test that trigger with break & breakOn works. * * @return void */ function testTriggerWithBreak() { $this->_makeMockClasses(); $this->Objects->load('TriggerMockFirst'); $this->Objects->load('TriggerMockSecond'); $this->mockObjects[] = $this->Objects->TriggerMockFirst; $this->mockObjects[] = $this->Objects->TriggerMockSecond; $this->Objects->TriggerMockFirst->expects($this->once()) ->method('callback') ->will($this->returnValue(false)); $this->Objects->TriggerMockSecond->expects($this->never()) ->method('callback'); $result = $this->Objects->trigger( 'callback', array(), array('break' => true, 'breakOn' => false) ); $this->assertFalse($result); } /** * test that trigger with modParams works. * * @return void */ function testTriggerWithModParams() { $this->_makeMockClasses(); $this->Objects->load('TriggerMockFirst'); $this->Objects->load('TriggerMockSecond'); $this->mockObjects[] = $this->Objects->TriggerMockFirst; $this->mockObjects[] = $this->Objects->TriggerMockSecond; $this->Objects->TriggerMockFirst->expects($this->once()) ->method('callback') ->with(array('value')) ->will($this->returnValue(array('new value'))); $this->Objects->TriggerMockSecond->expects($this->once()) ->method('callback') ->with(array('new value')) ->will($this->returnValue(array('newer value'))); $result = $this->Objects->trigger( 'callback', array(array('value')), array('modParams' => 0) ); $this->assertEquals(array('newer value'), $result); } /** * test that setting modParams to an index that doesn't exist doesn't cause errors. * * @expectedException CakeException * @return void */ function testTriggerModParamsInvalidIndex() { $this->_makeMockClasses(); $this->Objects->load('TriggerMockFirst'); $this->Objects->load('TriggerMockSecond'); $this->mockObjects[] = $this->Objects->TriggerMockFirst; $this->mockObjects[] = $this->Objects->TriggerMockSecond; $this->Objects->TriggerMockFirst->expects($this->never()) ->method('callback'); $this->Objects->TriggerMockSecond->expects($this->never()) ->method('callback'); $result = $this->Objects->trigger( 'callback', array(array('value')), array('modParams' => 2) ); } /** * test that returrning null doesn't modify parameters. * * @return void */ function testTriggerModParamsNullIgnored() { $this->_makeMockClasses(); $this->Objects->load('TriggerMockFirst'); $this->Objects->load('TriggerMockSecond'); $this->mockObjects[] = $this->Objects->TriggerMockFirst; $this->mockObjects[] = $this->Objects->TriggerMockSecond; $this->Objects->TriggerMockFirst->expects($this->once()) ->method('callback') ->with(array('value')) ->will($this->returnValue(null)); $this->Objects->TriggerMockSecond->expects($this->once()) ->method('callback') ->with(array('value')) ->will($this->returnValue(array('new value'))); $result = $this->Objects->trigger( 'callback', array(array('value')), array('modParams' => 0) ); $this->assertEquals(array('new value'), $result); } /** * test normalizeObjectArray * * @return void */ function testnormalizeObjectArray() { $components = array( 'Html', 'Foo.Bar' => array('one', 'two'), 'Something', 'Banana.Apple' => array('foo' => 'bar') ); $result = ObjectCollection::normalizeObjectArray($components); $expected = array( 'Html' => array('class' => 'Html', 'settings' => array()), 'Bar' => array('class' => 'Foo.Bar', 'settings' => array('one', 'two')), 'Something' => array('class' => 'Something', 'settings' => array()), 'Apple' => array('class' => 'Banana.Apple', 'settings' => array('foo' => 'bar')), ); $this->assertEquals($expected, $result); } }