/** * Tests the ComplexData validation constraint validator. * * For testing a map including a constraint on one of its keys is defined. */ public function testValidation() { // Create a definition that specifies some ComplexData constraint. $definition = MapDataDefinition::create()->setPropertyDefinition('key', DataDefinition::create('integer'))->addConstraint('ComplexData', array('key' => array('AllowedValues' => array(1, 2, 3)))); // Test the validation. $typed_data = $this->typedData->create($definition, array('key' => 1)); $violations = $typed_data->validate(); $this->assertEqual($violations->count(), 0, 'Validation passed for correct value.'); // Test the validation when an invalid value is passed. $typed_data = $this->typedData->create($definition, array('key' => 4)); $violations = $typed_data->validate(); $this->assertEqual($violations->count(), 1, 'Validation failed for incorrect value.'); // Make sure the information provided by a violation is correct. $violation = $violations[0]; $this->assertEqual($violation->getMessage(), t('The value you selected is not a valid choice.'), 'The message for invalid value is correct.'); $this->assertEqual($violation->getRoot(), $typed_data, 'Violation root is correct.'); $this->assertEqual($violation->getInvalidValue(), 4, 'The invalid value is set correctly in the violation.'); // Test using the constraint with a map without the specified key. This // should be ignored as long as there is no NotNull or NotBlank constraint. $typed_data = $this->typedData->create($definition, array('foo' => 'bar')); $violations = $typed_data->validate(); $this->assertEqual($violations->count(), 0, 'Constraint on non-existing key is ignored.'); $definition = MapDataDefinition::create()->setPropertyDefinition('key', DataDefinition::create('integer'))->addConstraint('ComplexData', array('key' => array('NotNull' => array()))); $typed_data = $this->typedData->create($definition, array('foo' => 'bar')); $violations = $typed_data->validate(); $this->assertEqual($violations->count(), 1, 'Key is required.'); }
/** * {@inheritdoc} */ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { $properties['uri'] = DataDefinition::create('uri')->setLabel(t('URI')); $properties['title'] = DataDefinition::create('string')->setLabel(t('Link text')); $properties['options'] = MapDataDefinition::create()->setLabel(t('Options')); return $properties; }
/** * {@inheritdoc} */ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { // Prevent early t() calls by using the TranslatableMarkup. $properties['view_mode'] = DataDefinition::create('string')->setLabel(new TranslatableMarkup('View mode'))->setSetting('case_sensitive', FALSE)->setRequired(TRUE); $properties['default'] = DataDefinition::create('string')->setLabel(new TranslatableMarkup('Default name'))->setSetting('case_sensitive', FALSE)->setRequired(FALSE); $properties['panels_display'] = MapDataDefinition::create('map')->setLabel(new TranslatableMarkup('Panels display'))->setRequired(TRUE); return $properties; }
/** * {@inheritdoc} */ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { $properties['lat'] = DataDefinition::create('float')->setLabel(t('Latitude')); $properties['lng'] = DataDefinition::create('float')->setLabel(t('Longitude')); $properties['lat_sin'] = DataDefinition::create('float')->setLabel(t('Latitude sine')); $properties['lat_cos'] = DataDefinition::create('float')->setLabel(t('Latitude cosine')); $properties['lng_rad'] = DataDefinition::create('float')->setLabel(t('Longitude radian')); $properties['data'] = MapDataDefinition::create()->setLabel(t('Meta data')); return $properties; }
/** * {@inheritdoc} */ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { // Call the parent to define the target_id and entity properties. $properties = parent::propertyDefinitions($field_definition); $properties['handler'] = DataDefinition::create('string')->setLabel(t('Handler')); $properties['handler_settings'] = MapDataDefinition::create()->setLabel(t('Handler settings')); $properties['status'] = DataDefinition::create('integer')->setLabel(t('Status'))->setSetting('unsigned', TRUE); $properties['sent_count'] = DataDefinition::create('integer')->setLabel(t('Sent count'))->setSetting('unsigned', TRUE); $properties['subscribers'] = DataDefinition::create('integer')->setLabel(t('Subscribers'))->setSetting('unsigned', TRUE); return $properties; }
/** * Tests deriving metadata about maps. */ public function testMaps() { $map_definition = MapDataDefinition::create()->setPropertyDefinition('one', DataDefinition::create('string'))->setPropertyDefinition('two', DataDefinition::create('string'))->setPropertyDefinition('three', DataDefinition::create('string')); $this->assertTrue($map_definition instanceof ComplexDataDefinitionInterface); // Test retrieving metadata about contained properties. $this->assertEqual(array_keys($map_definition->getPropertyDefinitions()), array('one', 'two', 'three')); $this->assertEqual($map_definition->getPropertyDefinition('one')->getDataType(), 'string'); $this->assertNull($map_definition->getMainPropertyName()); $this->assertNull($map_definition->getPropertyDefinition('invalid')); // Test using the definition factory. $map_definition2 = $this->typedDataManager->createDataDefinition('map'); $this->assertTrue($map_definition2 instanceof ComplexDataDefinitionInterface); $map_definition2->setPropertyDefinition('one', DataDefinition::create('string'))->setPropertyDefinition('two', DataDefinition::create('string'))->setPropertyDefinition('three', DataDefinition::create('string')); $this->assertEqual($map_definition, $map_definition2); }
/** * Setups a typed data object used for test purposes. * * @param array $tree * An array of value, constraints and properties. * * @return \Drupal\Core\TypedData\TypedDataInterface|\PHPUnit_Framework_MockObject_MockObject */ protected function setupTypedData(array $tree, $name = '') { $callback = function ($value, ExecutionContextInterface $context) { $context->addViolation('violation: ' . (is_array($value) ? count($value) : $value)); }; $tree += ['constraints' => []]; if (isset($tree['properties'])) { $map_data_definition = MapDataDefinition::create(); $map_data_definition->addConstraint('Callback', ['callback' => $callback]); foreach ($tree['properties'] as $property_name => $property) { $sub_typed_data = $this->setupTypedData($property, $property_name); $map_data_definition->setPropertyDefinition($property_name, $sub_typed_data->getDataDefinition()); } $typed_data = $this->typedDataManager->create($map_data_definition, $tree['value'], $name); } else { /** @var \Drupal\Core\TypedData\TypedDataInterface $typed_data */ $typed_data = $this->typedDataManager->create(DataDefinition::create('string')->addConstraint('Callback', ['callback' => $callback]), $tree['value'], $name); } return $typed_data; }
/** * Tests using a typed data map. */ public function testTypedDataMaps() { // Test working with a simple map. $value = array('one' => 'eins', 'two' => 'zwei', 'three' => 'drei'); $definition = MapDataDefinition::create()->setPropertyDefinition('one', DataDefinition::create('string'))->setPropertyDefinition('two', DataDefinition::create('string'))->setPropertyDefinition('three', DataDefinition::create('string')); $typed_data = $this->createTypedData($definition, $value); // Test iterating. $count = 0; foreach ($typed_data as $item) { $this->assertTrue($item instanceof TypedDataInterface); $count++; } $this->assertEqual($count, 3); // Test retrieving metadata. $this->assertEqual(array_keys($typed_data->getDataDefinition()->getPropertyDefinitions()), array_keys($value)); $definition = $typed_data->getDataDefinition()->getPropertyDefinition('one'); $this->assertEqual($definition->getDataType(), 'string'); $this->assertNull($typed_data->getDataDefinition()->getPropertyDefinition('invalid')); // Test getting and setting properties. $this->assertEqual($typed_data->get('one')->getValue(), 'eins'); $this->assertEqual($typed_data->toArray(), $value); $typed_data->set('one', 'uno'); $this->assertEqual($typed_data->get('one')->getValue(), 'uno'); // Make sure the update is reflected in the value of the map also. $value = $typed_data->getValue(); $this->assertEqual($value, array('one' => 'uno', 'two' => 'zwei', 'three' => 'drei')); $properties = $typed_data->getProperties(); $this->assertEqual(array_keys($properties), array_keys($value)); $this->assertIdentical($properties['one'], $typed_data->get('one'), 'Properties are identical.'); // Test setting a not defined property. It shouldn't show up in the // properties, but be kept in the values. $typed_data->setValue(array('foo' => 'bar')); $this->assertEqual(array_keys($typed_data->getProperties()), array('one', 'two', 'three')); $this->assertEqual(array_keys($typed_data->getValue()), array('foo', 'one', 'two', 'three')); // Test getting the string representation. $typed_data->setValue(array('one' => 'eins', 'two' => '', 'three' => 'drei')); $this->assertEqual($typed_data->getString(), 'eins, drei'); // Test isEmpty and cloning. $this->assertFalse($typed_data->isEmpty()); $clone = clone $typed_data; $this->assertTrue($typed_data->getValue() === $clone->getValue()); $this->assertTrue($typed_data->get('one') !== $clone->get('one')); $clone->setValue(array()); $this->assertTrue($clone->isEmpty()); // Make sure the difference between NULL (not set) and an empty array is // kept. $typed_data->setValue(NULL); $this->assertNull($typed_data->getValue()); $typed_data->setValue(array()); $value = $typed_data->getValue(); $this->assertTrue(isset($value) && is_array($value)); // Test accessing invalid properties. $typed_data->setValue($value); try { $typed_data->get('invalid'); $this->fail('No exception has been thrown when getting an invalid value.'); } catch (\Exception $e) { $this->pass('Exception thrown:' . $e->getMessage()); } // Test setting invalid values. try { $typed_data->setValue('invalid'); $this->fail('No exception has been thrown when setting an invalid value.'); } catch (\Exception $e) { $this->pass('Exception thrown:' . $e->getMessage()); } // Test adding a new property to the map. $typed_data->getDataDefinition()->setPropertyDefinition('zero', DataDefinition::create('any')); $typed_data->set('zero', 'null'); $this->assertEqual($typed_data->get('zero')->getValue(), 'null'); $definition = $typed_data->get('zero')->getDataDefinition(); $this->assertEqual($definition->getDataType(), 'any', 'Definition for a new map entry returned.'); }
/** * {@inheritdoc} */ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { $properties['path'] = DataDefinition::create('string')->setLabel(t('Path')); $properties['query'] = MapDataDefinition::create()->setLabel(t('Query')); return $properties; }
/** * {@inheritdoc} */ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { $properties['plugin_type_id'] = DataDefinition::create('string')->setLabel(t('Plugin type ID'))->setReadOnly(TRUE); $properties['plugin_id'] = DataDefinition::create('plugin_id')->setLabel(t('Plugin ID')); $properties['plugin_configuration'] = MapDataDefinition::create('plugin_configuration')->setLabel(t('Plugin configuration')); $properties['plugin_instance'] = MapDataDefinition::create('plugin_instance')->setLabel(t('Plugin instance'))->setComputed(TRUE); return $properties; }
/** * {@inheritdoc} */ public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) { $properties = parent::propertyDefinitions($field_definition); $properties['plugin_instance'] = MapDataDefinition::create('payment_aware_plugin_instance')->setLabel(t('Plugin instance'))->setComputed(TRUE); return $properties; }