diff --git a/core/modules/system/tests/modules/form_test/src/Form/FormTestSelectForm.php b/core/modules/system/tests/modules/form_test/src/Form/FormTestSelectForm.php index 5c1f1d64f5..e4ab781468 100644 --- a/core/modules/system/tests/modules/form_test/src/Form/FormTestSelectForm.php +++ b/core/modules/system/tests/modules/form_test/src/Form/FormTestSelectForm.php @@ -136,14 +136,17 @@ public function buildForm(array $form, FormStateInterface $form_state) { // option groups sorted and some left alone. $sortable_options = $this->makeSortableOptions('sso'); $sortable_options['sso_zzgroup']['#sort_options'] = TRUE; + $sortable_options['sso_xxgroup']['#sort_options'] = TRUE; + $sortable_options['sso_xxgroup']['#sort_start'] = 1; + // Do not use a sort start on this one. $form['sorted'] = [ '#type' => 'select', '#options' => $sortable_options, '#sort_options' => TRUE, - '#sort_start' => 3, ]; - // Add a select to test sorting with a -NONE- option included. + // Add a select to test sorting with a -NONE- option included, + // and a sort start set. $sortable_none_options = $this->makeSortableOptions('sno'); $sortable_none_options['sno_zzgroup']['#sort_options'] = TRUE; $form['sorted_none'] = [ @@ -184,6 +187,11 @@ protected function makeSortableOptions($prefix) { $prefix . '_gd' => new TranslatableMarkup('group d'), $prefix . '_gf' => new TranslatableMarkup('group f'), ], + $prefix . '_xxgroup' => [ + $prefix . '_gz' => new TranslatableMarkup('group z'), + $prefix . '_gi' => new TranslatableMarkup('group i'), + $prefix . '_gh' => new TranslatableMarkup('group h'), + ], $prefix . '_d' => 'd', $prefix . '_c' => new TranslatableMarkup('main c'), $prefix . '_b' => new TranslatableMarkup('main b'), diff --git a/core/modules/system/tests/src/Functional/Form/FormTest.php b/core/modules/system/tests/src/Functional/Form/FormTest.php index 43b9bf3d9c..3731f06d0a 100644 --- a/core/modules/system/tests/src/Functional/Form/FormTest.php +++ b/core/modules/system/tests/src/Functional/Form/FormTest.php @@ -12,6 +12,7 @@ use Drupal\Tests\BrowserTestBase; use Drupal\user\RoleInterface; use Drupal\filter\Entity\FilterFormat; +use Behat\Mink\Element\NodeElement; /** * Tests various form element validation mechanisms. @@ -470,10 +471,9 @@ public function testSelectSorting() { $this->drupalGet('form-test/select'); $content = $this->getSession()->getPage()->getContent(); - // Verify the expected order of the options in the unsorted and - // sorted elements. - $expected_order = [ - 'uso_first', + // Verify the order of the select options. + $this->validateSelectSorting('unsorted', [ + 'uso_first_element', 'uso_second', 'uso_zzgroup', 'uso_gc', @@ -483,26 +483,40 @@ public function testSelectSorting() { 'uso_ge', 'uso_gd', 'uso_gf', + 'uso_xxgroup', + 'uso_gz', + 'uso_gi', + 'uso_gh', 'uso_d', 'uso_c', 'uso_b', 'uso_a', - 'sso_first', - 'sso_second', - 'sso_zzgroup', - 'sso_ga', - 'sso_gb', - 'sso_gc', + ]); + + $this->validateSelectSorting('sorted', [ 'sso_a', 'sso_d', + 'sso_first_element', 'sso_b', 'sso_c', + 'sso_second', + 'sso_xxgroup', + 'sso_gz', + 'sso_gh', + 'sso_gi', 'sso_yygroup', 'sso_ge', 'sso_gd', 'sso_gf', + 'sso_zzgroup', + 'sso_ga', + 'sso_gb', + 'sso_gc', + ]); + + $this->validateSelectSorting('sorted_none', [ 'sno_empty', - 'sno_first', + 'sno_first_element', 'sno_second', 'sno_zzgroup', 'sno_ga', @@ -512,22 +526,41 @@ public function testSelectSorting() { 'sno_d', 'sno_b', 'sno_c', + 'sno_xxgroup', + 'sno_gz', + 'sno_gi', + 'sno_gh', 'sno_yygroup', 'sno_ge', 'sno_gd', 'sno_gf', - ]; - - $prev_position = 0; - foreach ($expected_order as $string) { - $position = strpos($content, $string); - $this->assertTrue($position > $prev_position, 'Item ' . $string . ' is in correct order'); - $prev_position = $position; - } + ]); // Verify that #sort_order and #sort_start are not in the page. - $this->assertFalse(strpos($content, '#sort_order'), 'Sort order property has been removed'); - $this->assertFalse(strpos($content, '#sort_start'), 'Sort start property has been removed'); + $this->assertSession()->responseNotContains('#sort_order'); + $this->assertSession()->responseNotContains('#sort_start'); + } + + /** + * Validates that the options are in the right order in a select. + * + * @param string $select + * Name of the select to verify. + * @param string[] $order + * Expected order of its options. + */ + protected function validateSelectSorting($select, $order) { + $option_map_function = function (NodeElement $option) { + if ($option->getTagName() === 'optgroup') { + return $option->getAttribute('label'); + } + return $option->getValue(); + }; + + $field = $this->getSession()->getPage()->findField($select); + $options = array_map($option_map_function, + $field->findAll('css', 'option, optgroup')); + $this->assertIdentical($order, $options); } /**