3 namespace Drupal\Tests\Core\Field;
5 use Drupal\Core\DependencyInjection\ContainerBuilder;
6 use Drupal\Core\Field\FieldDefinitionInterface;
7 use Drupal\Core\Field\FieldItemInterface;
8 use Drupal\Core\Field\FieldItemList;
9 use Drupal\Core\Form\FormState;
10 use Drupal\Tests\UnitTestCase;
13 * @coversDefaultClass \Drupal\Core\Field\FieldItemList
16 class FieldItemListTest extends UnitTestCase {
21 * @dataProvider providerTestEquals
23 public function testEquals($expected, FieldItemInterface $first_field_item = NULL, FieldItemInterface $second_field_item = NULL) {
25 // Mock the field type manager and place it in the container.
26 $field_type_manager = $this->getMock('Drupal\Core\Field\FieldTypePluginManagerInterface');
27 $container = new ContainerBuilder();
28 $container->set('plugin.manager.field.field_type', $field_type_manager);
29 \Drupal::setContainer($container);
31 $field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
32 $field_storage_definition->expects($this->any())
33 ->method('getColumns')
34 ->willReturn([0 => '0', 1 => '1']);
35 $field_definition = $this->getMock('Drupal\Core\Field\FieldDefinitionInterface');
36 $field_definition->expects($this->any())
37 ->method('getFieldStorageDefinition')
38 ->willReturn($field_storage_definition);
40 $field_list_a = new FieldItemList($field_definition);
41 $field_list_b = new FieldItemList($field_definition);
43 // Set up the mocking necessary for creating field items.
44 $field_type_manager->expects($this->any())
45 ->method('createFieldItem')
46 ->willReturnOnConsecutiveCalls($first_field_item, $second_field_item);
48 // Set the field item values.
49 if ($first_field_item instanceof FieldItemInterface) {
50 $field_list_a->setValue($first_field_item);
52 if ($second_field_item instanceof FieldItemInterface) {
53 $field_list_b->setValue($second_field_item);
56 $this->assertEquals($expected, $field_list_a->equals($field_list_b));
60 * Data provider for testEquals.
62 public function providerTestEquals() {
63 // Tests field item lists with no values.
66 /** @var \Drupal\Core\Field\FieldItemBase $field_item_a */
67 $field_item_a = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
68 $field_item_a->setValue([1]);
69 // Tests field item lists where one has a value and one does not.
70 $datasets[] = [FALSE, $field_item_a];
72 // Tests field item lists where both have the same value.
73 $datasets[] = [TRUE, $field_item_a, $field_item_a];
75 /** @var \Drupal\Core\Field\FieldItemBase $fv */
76 $field_item_b = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
77 $field_item_b->setValue([2]);
78 // Tests field item lists where both have the different values.
79 $datasets[] = [FALSE, $field_item_a, $field_item_b];
81 /** @var \Drupal\Core\Field\FieldItemBase $fv */
82 $field_item_c = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
83 $field_item_c->setValue(['0' => 1, '1' => 2]);
84 $field_item_d = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
85 $field_item_d->setValue(['1' => 2, '0' => 1]);
87 // Tests field item lists where both have the differently ordered values.
88 $datasets[] = [TRUE, $field_item_c, $field_item_d];
90 /** @var \Drupal\Core\Field\FieldItemBase $field_item_e */
91 $field_item_e = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
92 $field_item_e->setValue(['2']);
94 // Tests field item lists where both have same values but different data
96 $datasets[] = [TRUE, $field_item_b, $field_item_e];
104 public function testEqualsEmptyItems() {
105 /** @var \Drupal\Core\Field\FieldItemBase $fv */
106 $first_field_item = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
107 $first_field_item->setValue(['0' => 1, '1' => 2]);
108 $second_field_item = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
109 $second_field_item->setValue(['1' => 2, '0' => 1]);
110 $empty_field_item = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
111 // Mock the field type manager and place it in the container.
112 $field_type_manager = $this->getMock('Drupal\Core\Field\FieldTypePluginManagerInterface');
113 $container = new ContainerBuilder();
114 $container->set('plugin.manager.field.field_type', $field_type_manager);
115 \Drupal::setContainer($container);
117 $field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
118 $field_storage_definition->expects($this->any())
119 ->method('getColumns')
120 ->willReturn([0 => '0', 1 => '1']);
121 $field_definition = $this->getMock('Drupal\Core\Field\FieldDefinitionInterface');
122 $field_definition->expects($this->any())
123 ->method('getFieldStorageDefinition')
124 ->willReturn($field_storage_definition);
126 $field_list_a = new FieldItemList($field_definition);
127 $field_list_b = new FieldItemList($field_definition);
129 // Set up the mocking necessary for creating field items.
130 $field_type_manager->expects($this->any())
131 ->method('createFieldItem')
132 ->willReturnOnConsecutiveCalls($first_field_item, $second_field_item, $empty_field_item, $empty_field_item);
134 // Set the field item values.
135 $field_list_a->setValue($first_field_item);
136 $field_list_b->setValue($second_field_item);
137 $field_list_a->appendItem($empty_field_item);
139 // Field list A has an empty item.
140 $this->assertEquals(FALSE, $field_list_a->equals($field_list_b));
142 // Field lists A and B have empty items.
143 $field_list_b->appendItem($empty_field_item);
144 $this->assertEquals(TRUE, $field_list_a->equals($field_list_b));
146 // Field list B has an empty item.
147 $field_list_a->filterEmptyItems();
148 $this->assertEquals(FALSE, $field_list_a->equals($field_list_b));
150 // Neither field lists A and B have empty items.
151 $field_list_b->filterEmptyItems();
152 $this->assertEquals(TRUE, $field_list_a->equals($field_list_b));
156 * @covers ::defaultValuesForm
158 public function testDefaultValuesForm() {
159 $field_definition = $this->getMock(FieldDefinitionInterface::class);
160 $field_definition->expects($this->any())
162 ->willReturn('field_type');
163 /** @var \Drupal\Core\Field\FieldItemList|\PHPUnit_Framework_MockObject_MockObject $field_list */
164 $field_list = $this->getMock(FieldItemList::class, ['defaultValueWidget'], [$field_definition]);
165 $field_list->expects($this->any())
166 ->method('defaultValueWidget')
169 $form_state = new FormState();
170 $string_translation = $this->getStringTranslationStub();
171 $field_list->setStringTranslation($string_translation);
173 $this->assertEquals('No widget available for: <em class="placeholder">field_type</em>.', $field_list->defaultValuesForm($form, $form_state)['#markup']);
177 * @covers ::defaultValuesFormValidate
179 public function testDefaultValuesFormValidate() {
180 $field_definition = $this->getMock(FieldDefinitionInterface::class);
181 /** @var \Drupal\Core\Field\FieldItemList|\PHPUnit_Framework_MockObject_MockObject $field_list */
182 $field_list = $this->getMock(FieldItemList::class, ['defaultValueWidget', 'validate'], [$field_definition]);
183 $field_list->expects($this->any())
184 ->method('defaultValueWidget')
186 $field_list->expects($this->never())
187 ->method('validate');
189 $form_state = new FormState();
191 $field_list->defaultValuesFormValidate([], $form, $form_state);
195 * @covers ::defaultValuesFormSubmit
197 public function testDefaultValuesFormSubmit() {
198 $field_definition = $this->getMock(FieldDefinitionInterface::class);
199 /** @var \Drupal\Core\Field\FieldItemList|\PHPUnit_Framework_MockObject_MockObject $field_list */
200 $field_list = $this->getMock(FieldItemList::class, ['defaultValueWidget', 'getValue'], [$field_definition]);
201 $field_list->expects($this->any())
202 ->method('defaultValueWidget')
205 $form_state = new FormState();
206 $field_list->expects($this->never())
207 ->method('getValue');
209 $this->assertNull($field_list->defaultValuesFormSubmit([], $form, $form_state));