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 // Set up three properties, one of them being computed.
32 $property_definitions['0'] = $this->getMock('Drupal\Core\TypedData\DataDefinitionInterface');
33 $property_definitions['0']->expects($this->any())
34 ->method('isComputed')
36 $property_definitions['1'] = $this->getMock('Drupal\Core\TypedData\DataDefinitionInterface');
37 $property_definitions['1']->expects($this->any())
38 ->method('isComputed')
40 $property_definitions['2'] = $this->getMock('Drupal\Core\TypedData\DataDefinitionInterface');
41 $property_definitions['2']->expects($this->any())
42 ->method('isComputed')
45 $field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
46 $field_storage_definition->expects($this->any())
47 ->method('getPropertyDefinitions')
48 ->will($this->returnValue($property_definitions));
49 $field_definition = $this->getMock('Drupal\Core\Field\FieldDefinitionInterface');
50 $field_definition->expects($this->any())
51 ->method('getFieldStorageDefinition')
52 ->willReturn($field_storage_definition);
54 $field_list_a = new FieldItemList($field_definition);
55 $field_list_b = new FieldItemList($field_definition);
57 // Set up the mocking necessary for creating field items.
58 $field_type_manager->expects($this->any())
59 ->method('createFieldItem')
60 ->willReturnOnConsecutiveCalls($first_field_item, $second_field_item);
62 // Set the field item values.
63 if ($first_field_item instanceof FieldItemInterface) {
64 $field_list_a->setValue($first_field_item);
66 if ($second_field_item instanceof FieldItemInterface) {
67 $field_list_b->setValue($second_field_item);
70 $this->assertEquals($expected, $field_list_a->equals($field_list_b));
74 * Data provider for testEquals.
76 public function providerTestEquals() {
77 // Tests field item lists with no values.
80 /** @var \Drupal\Core\Field\FieldItemBase $field_item_a */
81 $field_item_a = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
82 $field_item_a->setValue([1]);
83 // Tests field item lists where one has a value and one does not.
84 $datasets[] = [FALSE, $field_item_a];
86 // Tests field item lists where both have the same value.
87 $datasets[] = [TRUE, $field_item_a, $field_item_a];
89 /** @var \Drupal\Core\Field\FieldItemBase $fv */
90 $field_item_b = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
91 $field_item_b->setValue([2]);
92 // Tests field item lists where both have the different values.
93 $datasets[] = [FALSE, $field_item_a, $field_item_b];
95 /** @var \Drupal\Core\Field\FieldItemBase $fv */
96 $field_item_c = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
97 $field_item_c->setValue(['0' => 1, '1' => 2]);
98 $field_item_d = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
99 $field_item_d->setValue(['1' => 2, '0' => 1]);
101 // Tests field item lists where both have the differently ordered values.
102 $datasets[] = [TRUE, $field_item_c, $field_item_d];
104 /** @var \Drupal\Core\Field\FieldItemBase $field_item_e */
105 $field_item_e = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
106 $field_item_e->setValue(['2']);
108 // Tests field item lists where both have same values but different data
110 $datasets[] = [TRUE, $field_item_b, $field_item_e];
112 /** @var \Drupal\Core\Field\FieldItemBase $field_item_f */
113 $field_item_f = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
114 $field_item_f->setValue(['0' => 1, '1' => 2, '2' => 3]);
115 /** @var \Drupal\Core\Field\FieldItemBase $field_item_g */
116 $field_item_g = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
117 $field_item_g->setValue(['0' => 1, '1' => 2, '2' => 4]);
119 // Tests field item lists where both have same values for the non-computed
120 // properties ('0' and '1') and a different value for the computed one
122 $datasets[] = [TRUE, $field_item_f, $field_item_g];
124 /** @var \Drupal\Core\Field\FieldItemBase $field_item_h */
125 $field_item_h = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
126 $field_item_h->setValue(['0' => 1, '1' => 2, '3' => 3]);
127 /** @var \Drupal\Core\Field\FieldItemBase $field_item_i */
128 $field_item_i = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
129 $field_item_i->setValue(['0' => 1, '1' => 2, '3' => 4]);
131 // Tests field item lists where both have same values for the non-computed
132 // properties ('0' and '1') and a different value for a property that does
134 $datasets[] = [TRUE, $field_item_h, $field_item_i];
142 public function testEqualsEmptyItems() {
143 /** @var \Drupal\Core\Field\FieldItemBase $fv */
144 $first_field_item = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
145 $first_field_item->setValue(['0' => 1, '1' => 2]);
146 $second_field_item = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
147 $second_field_item->setValue(['1' => 2, '0' => 1]);
148 $empty_field_item = $this->getMockForAbstractClass('Drupal\Core\Field\FieldItemBase', [], '', FALSE);
149 // Mock the field type manager and place it in the container.
150 $field_type_manager = $this->getMock('Drupal\Core\Field\FieldTypePluginManagerInterface');
151 $container = new ContainerBuilder();
152 $container->set('plugin.manager.field.field_type', $field_type_manager);
153 \Drupal::setContainer($container);
155 // Set up the properties of the field item.
156 $property_definitions['0'] = $this->getMock('Drupal\Core\TypedData\DataDefinitionInterface');
157 $property_definitions['0']->expects($this->any())
158 ->method('isComputed')
160 $property_definitions['1'] = $this->getMock('Drupal\Core\TypedData\DataDefinitionInterface');
161 $property_definitions['1']->expects($this->any())
162 ->method('isComputed')
165 $field_storage_definition = $this->getMock('Drupal\Core\Field\FieldStorageDefinitionInterface');
166 $field_storage_definition->expects($this->any())
167 ->method('getPropertyDefinitions')
168 ->will($this->returnValue($property_definitions));
169 $field_definition = $this->getMock('Drupal\Core\Field\FieldDefinitionInterface');
170 $field_definition->expects($this->any())
171 ->method('getFieldStorageDefinition')
172 ->willReturn($field_storage_definition);
174 $field_list_a = new FieldItemList($field_definition);
175 $field_list_b = new FieldItemList($field_definition);
177 // Set up the mocking necessary for creating field items.
178 $field_type_manager->expects($this->any())
179 ->method('createFieldItem')
180 ->willReturnOnConsecutiveCalls($first_field_item, $second_field_item, $empty_field_item, $empty_field_item);
182 // Set the field item values.
183 $field_list_a->setValue($first_field_item);
184 $field_list_b->setValue($second_field_item);
185 $field_list_a->appendItem($empty_field_item);
187 // Field list A has an empty item.
188 $this->assertEquals(FALSE, $field_list_a->equals($field_list_b));
190 // Field lists A and B have empty items.
191 $field_list_b->appendItem($empty_field_item);
192 $this->assertEquals(TRUE, $field_list_a->equals($field_list_b));
194 // Field list B has an empty item.
195 $field_list_a->filterEmptyItems();
196 $this->assertEquals(FALSE, $field_list_a->equals($field_list_b));
198 // Neither field lists A and B have empty items.
199 $field_list_b->filterEmptyItems();
200 $this->assertEquals(TRUE, $field_list_a->equals($field_list_b));
204 * @covers ::defaultValuesForm
206 public function testDefaultValuesForm() {
207 $field_definition = $this->getMock(FieldDefinitionInterface::class);
208 $field_definition->expects($this->any())
210 ->willReturn('field_type');
211 /** @var \Drupal\Core\Field\FieldItemList|\PHPUnit_Framework_MockObject_MockObject $field_list */
212 $field_list = $this->getMock(FieldItemList::class, ['defaultValueWidget'], [$field_definition]);
213 $field_list->expects($this->any())
214 ->method('defaultValueWidget')
217 $form_state = new FormState();
218 $string_translation = $this->getStringTranslationStub();
219 $field_list->setStringTranslation($string_translation);
221 $this->assertEquals('No widget available for: <em class="placeholder">field_type</em>.', $field_list->defaultValuesForm($form, $form_state)['#markup']);
225 * @covers ::defaultValuesFormValidate
227 public function testDefaultValuesFormValidate() {
228 $field_definition = $this->getMock(FieldDefinitionInterface::class);
229 /** @var \Drupal\Core\Field\FieldItemList|\PHPUnit_Framework_MockObject_MockObject $field_list */
230 $field_list = $this->getMock(FieldItemList::class, ['defaultValueWidget', 'validate'], [$field_definition]);
231 $field_list->expects($this->any())
232 ->method('defaultValueWidget')
234 $field_list->expects($this->never())
235 ->method('validate');
237 $form_state = new FormState();
239 $field_list->defaultValuesFormValidate([], $form, $form_state);
243 * @covers ::defaultValuesFormSubmit
245 public function testDefaultValuesFormSubmit() {
246 $field_definition = $this->getMock(FieldDefinitionInterface::class);
247 /** @var \Drupal\Core\Field\FieldItemList|\PHPUnit_Framework_MockObject_MockObject $field_list */
248 $field_list = $this->getMock(FieldItemList::class, ['defaultValueWidget', 'getValue'], [$field_definition]);
249 $field_list->expects($this->any())
250 ->method('defaultValueWidget')
253 $form_state = new FormState();
254 $field_list->expects($this->never())
255 ->method('getValue');
257 $this->assertNull($field_list->defaultValuesFormSubmit([], $form, $form_state));