commit c828d15df07b03d3cc1c76e6ae94701cba1ee20e Author: fago Date: Sun Feb 28 18:13:32 2016 +0100 Add some more test coverage and undo some problematic changes. diff --git a/core/lib/Drupal/Core/TypedData/DataDefinition.php b/core/lib/Drupal/Core/TypedData/DataDefinition.php index 6e6f461..743fe70 100644 --- a/core/lib/Drupal/Core/TypedData/DataDefinition.php +++ b/core/lib/Drupal/Core/TypedData/DataDefinition.php @@ -6,16 +6,12 @@ */ namespace Drupal\Core\TypedData; -use Drupal\Core\DependencyInjection\DependencySerializationTrait; /** * A typed data definition class for defining data based on defined data types. */ class DataDefinition implements DataDefinitionInterface, \ArrayAccess { - use DependencySerializationTrait; - use TypedDataTrait; - /** * The array holding values for all definition keys. * diff --git a/core/lib/Drupal/Core/TypedData/TypedDataManager.php b/core/lib/Drupal/Core/TypedData/TypedDataManager.php index ca87977..adf91c9 100644 --- a/core/lib/Drupal/Core/TypedData/TypedDataManager.php +++ b/core/lib/Drupal/Core/TypedData/TypedDataManager.php @@ -122,10 +122,7 @@ public function createDataDefinition($data_type) { throw new \InvalidArgumentException("Invalid data type '$data_type' has been given"); } $class = $type_definition['definition_class']; - $data_definition = $class::createFromDataType($data_type); - $data_definition->setTypedDataManager($this); - - return $data_definition; + return $class::createFromDataType($data_type); } /** diff --git a/core/modules/config/tests/config_test/src/ConfigValidation.php b/core/modules/config/tests/config_test/src/ConfigValidation.php index 9da6862..19729e2 100644 --- a/core/modules/config/tests/config_test/src/ConfigValidation.php +++ b/core/modules/config/tests/config_test/src/ConfigValidation.php @@ -7,6 +7,7 @@ namespace Drupal\config_test; + class ConfigValidation { public static function validateLlama($object, $context) { diff --git a/core/tests/Drupal/KernelTests/Config/ConfigValidationTest.php b/core/tests/Drupal/KernelTests/Config/ConfigValidationTest.php index c9796dd..f75dd8b 100644 --- a/core/tests/Drupal/KernelTests/Config/ConfigValidationTest.php +++ b/core/tests/Drupal/KernelTests/Config/ConfigValidationTest.php @@ -6,11 +6,18 @@ */ namespace Drupal\KernelTests\Config; + +use Drupal\Core\TypedData\ComplexDataInterface; +use Drupal\Core\TypedData\ListInterface; +use Drupal\Core\TypedData\Type\IntegerInterface; +use Drupal\Core\TypedData\Type\StringInterface; use Drupal\KernelTests\KernelTestBase; use Symfony\Component\Validator\ConstraintViolationListInterface; /** - * Tests config validation mechanism + * Tests config validation mechanism. + * + * @group config */ class ConfigValidationTest extends KernelTestBase { @@ -28,6 +35,51 @@ protected function setUp() { $this->installConfig('config_test'); } + /** + * Verifies that the Typed Data API is implemented correctly. + */ + public function testTypedDataAPI() { + + /** @var \Drupal\Core\Config\TypedConfigManagerInterface $typed_config_manager */ + $typed_config_manager = \Drupal::service('config.typed'); + /** @var \Drupal\Core\Config\Schema\TypedConfigInterface $typed_config */ + $typed_config = $typed_config_manager->get('config_test.validation'); + + // Test a primitive. + $string_data = $typed_config->get('llama'); + $this->assertInstanceOf(StringInterface::class, $string_data); + $this->assertEquals('meh', $string_data->getValue()); + + // Test complex data. + $mapping = $typed_config->get('cat'); + /** @var \Drupal\Core\TypedData\ComplexDataInterface $mapping */ + $this->assertInstanceOf(ComplexDataInterface::class, $mapping); + $this->assertInstanceOf(StringInterface::class, $mapping->get('type')); + $this->assertEquals('kitten', $mapping->get('type')->getValue()); + $this->assertInstanceOf(IntegerInterface::class, $mapping->get('count')); + $this->assertEquals(2, $mapping->get('count')->getValue()); + // Verify the metadata is available. + $definitions = $mapping->getDataDefinition()->getPropertyDefinitions(); + $this->assertArrayHasKey('type', $definitions); + $this->assertArrayHasKey('count', $definitions); + $this->assertEquals('string', $definitions['type']->getDataType()); + $this->assertEquals('integer', $definitions['count']->getDataType()); + + // Test accessing sequences as list data. Other than sequences, lists do + // not support keys. The items appear just with numeric indices. + $sequence = $typed_config->get('giraffe'); + /** @var \Drupal\Core\TypedData\ListInterface $sequence */ + $this->assertInstanceOf(ListInterface::class, $sequence); + $this->assertInstanceOf(StringInterface::class, $sequence->get(0)); + $this->assertEquals('hum1', $sequence->get(0)->getValue()); + $this->assertEquals('hum2', $sequence->get(1)->getValue()); + $this->assertEquals(2, $sequence->count()); + // Verify the item metadata is available. + $definition = $sequence->getDataDefinition()->getItemDefinition(); + $this->assertEquals('string', $definition->getDataType()); + } + + public function testSimpleConfigValidation() { $config = \Drupal::configFactory()->getEditable('config_test.validation'); /** @var \Drupal\Core\Config\TypedConfigManagerInterface $typed_config_manager */