You are here

public function ElementsTest::testProcessSelectOrOther in Select (or other) 8.3

Same name and namespace in other branches
  1. 8 tests/src/Unit/ElementsTest.php \Drupal\Tests\select_or_other\Unit\ElementsTest::testProcessSelectOrOther()
  2. 4.x tests/src/Unit/ElementsTest.php \Drupal\Tests\select_or_other\Unit\ElementsTest::testProcessSelectOrOther()

Tests the processing of a select or other element.

File

Tests/src/Unit/ElementsTest.php, line 99

Class

ElementsTest
Tests the form element implementation.

Namespace

Drupal\Tests\select_or_other\Unit

Code

public function testProcessSelectOrOther() {

  // Test ElementBase.
  // Make the protected method accessible and invoke it.
  $method = new ReflectionMethod('Drupal\\select_or_other\\Element\\ElementBase', 'addOtherOption');
  $method
    ->setAccessible(TRUE);
  $form_state = new FormState();
  $form = [];
  $original_element = $element = [
    '#name' => 'select_or_other',
    '#default_value' => 'default',
    '#required' => TRUE,
    '#multiple' => FALSE,
    '#options' => [
      'first_option' => 'First option',
      'second_option' => "Second option",
    ],
  ];
  $base_expected_element = $expected_element = $element + [
    'select' => [
      '#default_value' => $element['#default_value'],
      '#required' => $element['#required'],
      '#multiple' => $element['#multiple'],
      '#options' => $method
        ->invoke(NULL, $element['#options']),
      '#weight' => 10,
    ],
    'other' => [
      '#type' => 'textfield',
      '#weight' => 20,
    ],
  ];
  $resulting_element = ElementBase::processSelectOrOther($element, $form_state, $form);
  $this
    ->assertArrayEquals($expected_element, $resulting_element);
  $this
    ->assertArrayEquals($resulting_element, $element);

  // Test single cardinality Buttons.
  $element = $original_element;
  $expected_element = array_merge_recursive($base_expected_element, [
    'select' => [
      '#type' => 'checkboxes',
    ],
    'other' => [
      '#states' => [
        'visible' => [
          ':input[name="' . $element['#name'] . '[select][select_or_other]"]' => [
            'checked' => TRUE,
          ],
        ],
      ],
    ],
  ]);
  $element['#multiple'] = $expected_element['#multiple'] = $expected_element['select']['#multiple'] = TRUE;
  $resulting_element = Buttons::processSelectOrOther($element, $form_state, $form);
  $this
    ->assertArrayEquals($expected_element, $resulting_element);
  $this
    ->assertArrayEquals($resulting_element, $element);

  // Test multiple cardinality Buttons.
  $element = $original_element;
  $expected_element = array_merge_recursive($base_expected_element, [
    'select' => [
      '#type' => 'radios',
    ],
    'other' => [
      '#states' => [
        'visible' => [
          ':input[name="' . $element['#name'] . '[select]"]' => [
            'value' => 'select_or_other',
          ],
        ],
      ],
    ],
  ]);
  $resulting_element = Buttons::processSelectOrOther($element, $form_state, $form);
  $this
    ->assertArrayEquals($expected_element, $resulting_element);
  $this
    ->assertArrayEquals($resulting_element, $element);

  // Test single cardinality Select
  $element = $original_element;
  $expected_element = array_merge_recursive($base_expected_element, [
    'select' => [
      '#type' => 'select',
    ],
    'other' => [
      '#states' => [
        'visible' => [
          ':input[name="' . $element['#name'] . '[select]"]' => [
            'value' => 'select_or_other',
          ],
        ],
      ],
    ],
  ]);
  $resulting_element = Select::processSelectOrOther($element, $form_state, $form);
  $this
    ->assertArrayEquals($expected_element, $resulting_element);
  $this
    ->assertArrayEquals($resulting_element, $element);

  // Test single cardinality Select
  $element = $original_element;
  $expected_element = array_merge_recursive($base_expected_element, [
    'select' => [
      '#type' => 'select',
      '#multiple' => TRUE,
      '#attached' => [
        'library' => [
          'select_or_other/multiple_select_states_hack',
        ],
      ],
    ],
  ]);
  $element['#multiple'] = $expected_element['#multiple'] = $expected_element['select']['#multiple'] = TRUE;
  $resulting_element = Select::processSelectOrOther($element, $form_state, $form);
  $this
    ->assertArrayEquals($expected_element, $resulting_element);
  $this
    ->assertArrayEquals($resulting_element, $element);
}