Issue #2137947 by tim.plunkett, damiankloip: Finish unit tests for PluginBag and subclasses.

8.0.x
webchick 2013-11-22 21:12:11 -08:00
parent 5ef0824278
commit f17dcbf86c
8 changed files with 403 additions and 167 deletions

View File

@ -77,8 +77,7 @@ class DefaultPluginBag extends PluginBag {
if (!isset($configuration[$this->pluginKey])) {
throw new UnknownPluginException($instance_id);
}
$this->pluginInstances[$instance_id] = $this->manager->createInstance($configuration[$this->pluginKey], $configuration);
$this->addInstanceId($instance_id);
$this->set($instance_id, $this->manager->createInstance($configuration[$this->pluginKey], $configuration));
}
/**
@ -130,6 +129,15 @@ class DefaultPluginBag extends PluginBag {
return $instances;
}
/**
* {@inheritdoc}
*/
public function setInstanceIds(array $instance_ids) {
parent::setInstanceIds($instance_ids);
// Ensure the new order matches the original order.
$this->instanceIDs = $this->originalOrder = array_intersect_assoc($this->originalOrder, $this->instanceIDs);
}
/**
* Updates the configuration for a plugin instance.
*

View File

@ -54,7 +54,7 @@ class DefaultSinglePluginBag extends PluginBag {
* {@inheritdoc}
*/
protected function initializePlugin($instance_id) {
$this->pluginInstances[$instance_id] = $this->manager->createInstance($instance_id, $this->configuration);
$this->set($instance_id, $this->manager->createInstance($instance_id, $this->configuration));
}
}

View File

@ -77,6 +77,7 @@ abstract class PluginBag implements \Iterator, \Countable {
*/
public function set($instance_id, $value) {
$this->pluginInstances[$instance_id] = $value;
$this->addInstanceId($instance_id);
}
/**

View File

@ -1,66 +0,0 @@
<?php
/**
* @file
* Contains \Drupal\system\Tests\Plugin\PluginBagTest.
*/
namespace Drupal\system\Tests\Plugin;
use Drupal\plugin_test\Plugin\TestPluginBag;
use Drupal\plugin_test\Plugin\plugin_test\mock_block\MockTestPluginInterface;
/**
* Tests the generic plugin bag.
*
* @see \Drupal\Component\Plugin\PluginBag
* @see \Drupal\plugin_test\Plugin\TestPluginBag
*/
class PluginBagTest extends PluginTestBase {
public static function getInfo() {
return array(
'name' => 'Plugin Bag',
'description' => 'Tests the generic plugin bag.',
'group' => 'Plugin API',
);
}
/**
* Tests the generic plugin bag.
*/
protected function testPluginBag() {
// Setup the plugin bag as well as the available plugin definitions.
$plugin_bag = new TestPluginBag($this->mockBlockManager);
$definitions = $this->mockBlockManager->getDefinitions();
$first_instance_id = key($definitions);
foreach ($definitions as $instance_id => $definition) {
$this->assertTrue($plugin_bag->has($instance_id), format_string('Plugin instance @instance_id exits on the bag', array('@instance_id' => $instance_id)));
$this->assertTrue($plugin_bag->get($instance_id) instanceof $definition['class'], 'Getting the plugin from the bag worked.');
}
// A non existing instance_id shouldn't exist on the bag.
$random_name = $this->randomName();
$this->assertFalse($plugin_bag->has($random_name), 'A random instance_id should not exist on the plugin bag.');
// Set a new plugin instance to the bag, to test offsetSet.
$plugin_bag->set($random_name, $this->mockBlockManager->createInstance($first_instance_id, array()));
$this->assertTrue($plugin_bag->has($random_name), 'A random instance_id should exist after manual setting on the plugin bag.');
// Remove the previous added element and check whether it still exists.
$plugin_bag->remove($random_name);
$this->assertFalse($plugin_bag->has($random_name), 'A random instance_id should not exist on the plugin bag after removing.');
// Test that iterating over the plugins work.
$expected_instance_ids = array_keys($definitions);
$counter = 0;
foreach ($plugin_bag as $instance_id => $plugin) {
$this->assertEqual($expected_instance_ids[$counter], $instance_id, format_string('The iteration works as expected for plugin instance @instance_id', array('@instance_id' => $instance_id)));
$counter++;
}
$this->assertEqual(count($plugin_bag), count($expected_instance_ids), 'The amount of items in plugin bag is as expected.');
}
}

View File

@ -0,0 +1,99 @@
<?php
/**
* @file
* Contains \Drupal\Tests\Component\Plugin\ConfigurablePluginBagTest.
*/
namespace Drupal\Tests\Component\Plugin;
use Drupal\Component\Plugin\ConfigurablePluginInterface;
use Drupal\Component\Plugin\PluginBase;
/**
* Tests the default plugin bag with configurable plugins.
*
* @see \Drupal\Component\Plugin\ConfigurablePluginInterface
* @see \Drupal\Component\Plugin\DefaultPluginBag
*
* @group Drupal
* @group Drupal_Plugin
*/
class ConfigurablePluginBagTest extends PluginBagTestBase {
/**
* Stores all setup plugin instances.
*
* @var \Drupal\Component\Plugin\ConfigurablePluginInterface[]
*/
protected $pluginInstances;
/**
* {@inheritdoc}
*/
public static function getInfo() {
return array(
'name' => 'Configurable plugin bag',
'description' => 'Tests the plugin bag with configurable plugins.',
'group' => 'Plugin API',
);
}
/**
* {@inheritdoc}
*/
protected function getPluginMock($plugin_id, array $definition) {
return new TestConfigurablePlugin($this->config[$plugin_id], $plugin_id, $definition);
}
/**
* Tests the getConfiguration() method with configurable plugins.
*/
public function testConfigurableGetConfiguration() {
$this->setupPluginBag($this->exactly(3));
$config = $this->defaultPluginBag->getConfiguration();
$this->assertSame($this->config, $config);
}
/**
* Tests the setConfiguration() method with configurable plugins.
*/
public function testConfigurableSetConfiguration() {
$this->setupPluginBag($this->exactly(3));
$this->defaultPluginBag->getConfiguration();
$this->defaultPluginBag->setConfiguration('apple', array('value' => 'pineapple'));
$expected = $this->config;
$expected['apple'] = array('value' => 'pineapple');
$config = $this->defaultPluginBag->getConfiguration();
$this->assertSame($expected, $config);
$plugin = $this->pluginInstances['apple'];
$this->assertSame($expected['apple'], $plugin->getConfiguration());
}
}
class TestConfigurablePlugin extends PluginBase implements ConfigurablePluginInterface {
/**
* {@inheritdoc}
*/
public function getConfiguration() {
return $this->configuration;
}
/**
* {@inheritdoc}
*/
public function setConfiguration(array $configuration) {
$this->configuration = $configuration;
}
/**
* {@inheritdoc}
*/
public function defaultConfiguration() {
return array();
}
}

View File

@ -7,9 +7,6 @@
namespace Drupal\Tests\Component\Plugin;
use Drupal\Component\Plugin\DefaultPluginBag;
use Drupal\Tests\UnitTestCase;
/**
* Tests the default plugin bag.
*
@ -18,80 +15,26 @@ use Drupal\Tests\UnitTestCase;
* @group Drupal
* @group Drupal_Plugin
*/
class DefaultPluginBagTest extends UnitTestCase {
class DefaultPluginBagTest extends PluginBagTestBase {
/**
* The mocked plugin manager.
*
* @var \PHPUnit_Framework_MockObject_MockObject|\Drupal\Component\Plugin\PluginManagerInterface
* {@inheritdoc}
*/
protected $pluginManager;
/**
* The tested plugin bag.
*
* @var \PHPUnit_Framework_MockObject_MockObject|\Drupal\Component\Plugin\DefaultPluginBag
*/
protected $defaultPluginBag;
/**
* Stores all setup plugin instances.
*
* @var array
*/
protected $pluginInstances;
/**
* Contains the plugin configuration.
*
* @var array
*/
protected $config = array(
'banana' => array('id' => 'banana', 'key' => 'value'),
'cherry' => array('id' => 'cherry', 'key' => 'value'),
'apple' => array('id' => 'apple', 'key' => 'value'),
);
public static function getInfo() {
return array(
'name' => 'Default plugin bag',
'description' => 'Tests the default plugin bag.',
'group' => 'PHP Storage',
'group' => 'Plugin API',
);
}
protected function setUp() {
$this->pluginManager = $this->getMock('Drupal\Component\Plugin\PluginManagerInterface');
$definitions = $this->getPluginDefinitions();
$this->pluginManager->expects($this->any())
->method('getDefinitions')
->will($this->returnValue($definitions));
$this->pluginInstances = array();
$map = array();
foreach ($definitions as $plugin_id => $definition) {
// Create a mock plugin instance.
$mock = $this->getMock('Drupal\Component\Plugin\PluginInspectionInterface');
$mock->expects($this->any())
->method('getPluginId')
->will($this->returnValue($plugin_id));
$this->pluginInstances[$plugin_id] = $mock;
$map[] = array($plugin_id, $this->config[$plugin_id], $this->pluginInstances[$plugin_id]);
}
$this->pluginManager->expects($this->any())
->method('createInstance')
->will($this->returnValueMap($map));
$this->defaultPluginBag = new DefaultPluginBag($this->pluginManager, $this->config);
}
/**
* Tests the has method.
*
* @see \Drupal\Component\Plugin\DefaultPluginBag::has()
*/
public function testHas() {
$this->setupPluginBag();
$definitions = $this->getPluginDefinitions();
$this->assertFalse($this->defaultPluginBag->has($this->randomName()), 'Nonexistent plugin found.');
@ -107,9 +50,10 @@ class DefaultPluginBagTest extends UnitTestCase {
* @see \Drupal\Component\Plugin\DefaultPluginBag::get()
*/
public function testGet() {
$this->setupPluginBag($this->once());
$apple = $this->pluginInstances['apple'];
$this->assertEquals($apple, $this->defaultPluginBag->get('apple'));
$this->assertSame($apple, $this->defaultPluginBag->get('apple'));
}
/**
@ -118,45 +62,10 @@ class DefaultPluginBagTest extends UnitTestCase {
* @expectedException \Drupal\Component\Plugin\Exception\PluginException
*/
public function testGetNotExistingPlugin() {
$this->setupPluginBag();
$this->defaultPluginBag->get('pear');
}
/**
* Returns some example plugin definitions.
*
* @return array
* The example plugin definitions.
*/
protected function getPluginDefinitions() {
$definitions = array(
'apple' => array(
'id' => 'apple',
'label' => 'Apple',
'color' => 'green',
'class' => 'Drupal\plugin_test\Plugin\plugin_test\fruit\Apple',
'provider' => 'plugin_test',
),
'banana' => array(
'id' => 'banana',
'label' => 'Banana',
'color' => 'yellow',
'uses' => array(
'bread' => 'Banana bread',
),
'class' => 'Drupal\plugin_test\Plugin\plugin_test\fruit\Banana',
'provider' => 'plugin_test',
),
'cherry' => array(
'id' => 'cherry',
'label' => 'Cherry',
'color' => 'red',
'class' => 'Drupal\plugin_test\Plugin\plugin_test\fruit\Cherry',
'provider' => 'plugin_test',
),
);
return $definitions;
}
/**
* Provides test data for testSortHelper.
*
@ -185,6 +94,7 @@ class DefaultPluginBagTest extends UnitTestCase {
* @dataProvider providerTestSortHelper
*/
public function testSortHelper($plugin_id_1, $plugin_id_2, $expected) {
$this->setupPluginBag($this->any());
if ($expected != 0) {
$expected = $expected > 0 ? 1 : -1;
}
@ -197,6 +107,7 @@ class DefaultPluginBagTest extends UnitTestCase {
* @see \Drupal\Component\Plugin\DefaultPluginBag::getConfiguration()
*/
public function testGetConfiguration() {
$this->setupPluginBag($this->exactly(3));
// The expected order matches $this->config.
$expected = array('banana', 'cherry', 'apple');
@ -215,4 +126,92 @@ class DefaultPluginBagTest extends UnitTestCase {
$this->assertSame($expected, array_keys($ids), 'After sorting, the order of the instances is also sorted.');
}
/**
* Tests the removeInstanceId() method.
*
* @see \Drupal\Component\Plugin\DefaultPluginBag::removeInstanceId()
*/
public function testRemoveInstanceId() {
$this->setupPluginBag($this->exactly(2));
$this->defaultPluginBag->removeInstanceId('cherry');
$config = $this->defaultPluginBag->getConfiguration();
$this->assertArrayNotHasKey('cherry', $config, 'After removing an instance, the configuration is updated.');
}
/**
* Tests the setConfiguration() method.
*
* @see \Drupal\Component\Plugin\DefaultPluginBag::setConfiguration()
*/
public function testSetConfiguration() {
$this->setupPluginBag($this->exactly(4));
$expected = array(
'id' => 'cherry',
'key' => 'value',
'custom' => 'bananas',
);
$this->defaultPluginBag->setConfiguration('cherry', $expected);
$config = $this->defaultPluginBag->getConfiguration();
$this->assertSame($expected, $config['cherry']);
}
/**
* Tests the count() method.
*/
public function testCount() {
$this->setupPluginBag();
$this->assertSame(3, $this->defaultPluginBag->count());
}
/**
* Tests the clear() method.
*/
public function testClear() {
$this->setupPluginBag($this->exactly(6));
$this->defaultPluginBag->getConfiguration();
$this->defaultPluginBag->getConfiguration();
$this->defaultPluginBag->clear();
$this->defaultPluginBag->getConfiguration();
}
/**
* Tests the setInstanceIds() method.
*/
public function testSetInstanceIds() {
$this->setupPluginBag($this->any());
// Set the instance IDs in a different order than the original.
$this->defaultPluginBag->setInstanceIds(array(
'apple' => 'apple',
'cherry' => 'cherry',
));
$expected = array(
'cherry' => 'cherry',
'apple' => 'apple',
);
$config = $this->defaultPluginBag->getConfiguration();
$instance_ids = $this->defaultPluginBag->getInstanceIds();
$this->assertSame($expected, $instance_ids);
$this->assertSame(array_keys($expected), array_keys($config));
}
/**
* Tests the set() method.
*/
public function testSet() {
$this->setupPluginBag($this->exactly(4));
$instance = $this->pluginManager->createInstance('cherry', $this->config['cherry']);
$this->defaultPluginBag->set('cherry2', $instance);
$this->defaultPluginBag->setConfiguration('cherry2', $this->config['cherry']);
$expected = array(
'banana',
'cherry',
'apple',
'cherry2',
);
$config = $this->defaultPluginBag->getConfiguration();
$this->assertSame($expected, array_keys($config));
}
}

View File

@ -0,0 +1,57 @@
<?php
/**
* @file
* Contains \Drupal\Tests\Component\Plugin\DefaultSinglePluginBagTest.
*/
namespace Drupal\Tests\Component\Plugin;
use Drupal\Component\Plugin\DefaultSinglePluginBag;
/**
* Tests the default single plugin bag.
*
* @see \Drupal\Component\Plugin\DefaultSinglePluginBag
*
* @group Drupal
* @group Drupal_Plugin
*/
class DefaultSinglePluginBagTest extends PluginBagTestBase {
/**
* {@inheritdoc}
*/
public static function getInfo() {
return array(
'name' => 'Default single plugin bag',
'description' => 'Tests the default single plugin bag.',
'group' => 'Plugin API',
);
}
/**
* {@inheritdoc}
*/
protected function setupPluginBag(\PHPUnit_Framework_MockObject_Matcher_InvokedRecorder $create_count = NULL) {
$definitions = $this->getPluginDefinitions();
$this->pluginInstances['apple'] = $this->getPluginMock('apple', $definitions['apple']);
$create_count = $create_count ?: $this->never();
$this->pluginManager->expects($create_count)
->method('createInstance')
->will($this->returnValue($this->pluginInstances['apple']));
$this->defaultPluginBag = new DefaultSinglePluginBag($this->pluginManager, array_keys($this->pluginInstances), array('id' => 'apple', 'key' => 'value'));
}
/**
* Tests the get() method.
*/
public function testGet() {
$this->setupPluginBag($this->once());
$apple = $this->pluginInstances['apple'];
$this->assertSame($apple, $this->defaultPluginBag->get('apple'));
}
}

View File

@ -0,0 +1,138 @@
<?php
/**
* @file
* Contains \Drupal\Tests\Component\Plugin\PluginBagTestBase.
*/
namespace Drupal\Tests\Component\Plugin;
use Drupal\Component\Plugin\DefaultPluginBag;
use Drupal\Tests\UnitTestCase;
/**
* Provides a base class for plugin bag tests.
*/
abstract class PluginBagTestBase extends UnitTestCase {
/**
* The mocked plugin manager.
*
* @var \Drupal\Component\Plugin\PluginManagerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $pluginManager;
/**
* The tested plugin bag.
*
* @var \Drupal\Component\Plugin\DefaultPluginBag|\PHPUnit_Framework_MockObject_MockObject
*/
protected $defaultPluginBag;
/**
* Stores all setup plugin instances.
*
* @var \Drupal\Component\Plugin\PluginInspectionInterface[]
*/
protected $pluginInstances;
/**
* Contains the plugin configuration.
*
* @var array
*/
protected $config = array(
'banana' => array('id' => 'banana', 'key' => 'value'),
'cherry' => array('id' => 'cherry', 'key' => 'value'),
'apple' => array('id' => 'apple', 'key' => 'value'),
);
protected function setUp() {
$this->pluginManager = $this->getMock('Drupal\Component\Plugin\PluginManagerInterface');
$this->pluginManager->expects($this->any())
->method('getDefinitions')
->will($this->returnValue($this->getPluginDefinitions()));
}
/**
* Sets up the default plugin bag.
*
* @param \PHPUnit_Framework_MockObject_Matcher_InvokedRecorder|null $create_count
* (optional) The number of times that createInstance() is expected to be
* called. For example, $this->any(), $this->once(), $this->exactly(6).
* Defaults to $this->never().
*/
protected function setupPluginBag(\PHPUnit_Framework_MockObject_Matcher_InvokedRecorder $create_count = NULL) {
$this->pluginInstances = array();
$map = array();
foreach ($this->getPluginDefinitions() as $plugin_id => $definition) {
// Create a mock plugin instance.
$this->pluginInstances[$plugin_id] = $this->getPluginMock($plugin_id, $definition);
$map[] = array($plugin_id, $this->config[$plugin_id], $this->pluginInstances[$plugin_id]);
}
$create_count = $create_count ?: $this->never();
$this->pluginManager->expects($create_count)
->method('createInstance')
->will($this->returnValueMap($map));
$this->defaultPluginBag = new DefaultPluginBag($this->pluginManager, $this->config);
}
/**
* Returns a mocked plugin object.
*
* @param string $plugin_id
* The plugin ID.
* @param array $definition
* The plugin definition.
*
* @return \Drupal\Component\Plugin\PluginInspectionInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected function getPluginMock($plugin_id, array $definition) {
// Create a mock plugin instance.
$mock = $this->getMock('Drupal\Component\Plugin\PluginInspectionInterface');
$mock->expects($this->any())
->method('getPluginId')
->will($this->returnValue($plugin_id));
return $mock;
}
/**
* Returns some example plugin definitions.
*
* @return array
* The example plugin definitions.
*/
protected function getPluginDefinitions() {
$definitions = array(
'apple' => array(
'id' => 'apple',
'label' => 'Apple',
'color' => 'green',
'class' => 'Drupal\plugin_test\Plugin\plugin_test\fruit\Apple',
'provider' => 'plugin_test',
),
'banana' => array(
'id' => 'banana',
'label' => 'Banana',
'color' => 'yellow',
'uses' => array(
'bread' => 'Banana bread',
),
'class' => 'Drupal\plugin_test\Plugin\plugin_test\fruit\Banana',
'provider' => 'plugin_test',
),
'cherry' => array(
'id' => 'cherry',
'label' => 'Cherry',
'color' => 'red',
'class' => 'Drupal\plugin_test\Plugin\plugin_test\fruit\Cherry',
'provider' => 'plugin_test',
),
);
return $definitions;
}
}