8927597452a29e9bea64a5bc72d976df256d72fe
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Field / FieldItemListTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\Field;
4
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;
11
12 /**
13  * @coversDefaultClass \Drupal\Core\Field\FieldItemList
14  * @group Field
15  */
16 class FieldItemListTest extends UnitTestCase {
17
18   /**
19    * @covers ::equals
20    *
21    * @dataProvider providerTestEquals
22    */
23   public function testEquals($expected, FieldItemInterface $first_field_item = NULL, FieldItemInterface $second_field_item = NULL) {
24
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);
30
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);
39
40     $field_list_a = new FieldItemList($field_definition);
41     $field_list_b = new FieldItemList($field_definition);
42
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);
47
48     // Set the field item values.
49     if ($first_field_item instanceof FieldItemInterface) {
50       $field_list_a->setValue($first_field_item);
51     }
52     if ($second_field_item instanceof FieldItemInterface) {
53       $field_list_b->setValue($second_field_item);
54     }
55
56     $this->assertEquals($expected, $field_list_a->equals($field_list_b));
57   }
58
59   /**
60    * Data provider for testEquals.
61    */
62   public function providerTestEquals() {
63     // Tests field item lists with no values.
64     $datasets[] = [TRUE];
65
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];
71
72     // Tests field item lists where both have the same value.
73     $datasets[] = [TRUE, $field_item_a, $field_item_a];
74
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];
80
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]);
86
87     // Tests field item lists where both have the differently ordered values.
88     $datasets[] = [TRUE, $field_item_c, $field_item_d];
89
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']);
93
94     // Tests field item lists where both have same values but different data
95     // types.
96     $datasets[] = [TRUE, $field_item_b, $field_item_e];
97
98     return $datasets;
99   }
100
101   /**
102    * @covers ::equals
103    */
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);
116
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);
125
126     $field_list_a = new FieldItemList($field_definition);
127     $field_list_b = new FieldItemList($field_definition);
128
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);
133
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);
138
139     // Field list A has an empty item.
140     $this->assertEquals(FALSE, $field_list_a->equals($field_list_b));
141
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));
145
146     // Field list B has an empty item.
147     $field_list_a->filterEmptyItems();
148     $this->assertEquals(FALSE, $field_list_a->equals($field_list_b));
149
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));
153   }
154
155   /**
156    * @covers ::defaultValuesForm
157    */
158   public function testDefaultValuesForm() {
159     $field_definition = $this->getMock(FieldDefinitionInterface::class);
160     $field_definition->expects($this->any())
161       ->method('getType')
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')
167       ->willReturn(NULL);
168     $form = [];
169     $form_state = new FormState();
170     $string_translation = $this->getStringTranslationStub();
171     $field_list->setStringTranslation($string_translation);
172
173     $this->assertEquals('No widget available for: <em class="placeholder">field_type</em>.', $field_list->defaultValuesForm($form, $form_state)['#markup']);
174   }
175
176   /**
177    * @covers ::defaultValuesFormValidate
178    */
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')
185       ->willReturn(NULL);
186     $field_list->expects($this->never())
187       ->method('validate');
188     $form = [];
189     $form_state = new FormState();
190
191     $field_list->defaultValuesFormValidate([], $form, $form_state);
192   }
193
194   /**
195    * @covers ::defaultValuesFormSubmit
196    */
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')
203       ->willReturn(NULL);
204     $form = [];
205     $form_state = new FormState();
206     $field_list->expects($this->never())
207       ->method('getValue');
208
209     $this->assertNull($field_list->defaultValuesFormSubmit([], $form, $form_state));
210   }
211
212 }