WeightTest.php

Same filename in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Render/Element/WeightTest.php
  2. 8.9.x core/tests/Drupal/KernelTests/Core/Render/Element/WeightTest.php
  3. 11.x core/tests/Drupal/KernelTests/Core/Render/Element/WeightTest.php

Namespace

Drupal\KernelTests\Core\Render\Element

File

core/tests/Drupal/KernelTests/Core/Render/Element/WeightTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\KernelTests\Core\Render\Element;

use Drupal\Core\Form\FormState;
use Drupal\Core\Render\Element\Number;
use Drupal\Core\Render\Element\Select;
use Drupal\Core\Render\Element\Weight;
use Drupal\element_info_test\ElementInfoTestNumberBuilder;
use Drupal\KernelTests\KernelTestBase;

/**
 * @coversDefaultClass \Drupal\Core\Render\Element\Weight
 * @group Render
 */
class WeightTest extends KernelTestBase {
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'system',
        'element_info_test',
    ];
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        $this->installConfig([
            'system',
        ]);
    }
    
    /**
     * Tests existing #default_value value in #options list.
     *
     * @covers ::processWeight
     */
    public function testProcessWeight() : void {
        $element = [];
        $form_state = new FormState();
        $complete_form = [];
        $element_object = new Weight([], 'weight', []);
        $info = $element_object->getInfo();
        $element += $info;
        $element['#default_value'] = $element['#delta'] + 5;
        Weight::processWeight($element, $form_state, $complete_form);
        $this->assertTrue(isset($element['#options'][$element['#default_value']]), 'Default value exists in the #options list');
    }
    
    /**
     * Tests transformation from "select" to "number" for MAX_DELTA + 1.
     *
     * @throws \Exception
     *
     * @covers ::processWeight
     */
    public function testProcessWeightSelectMax() : void {
        $form_state = new FormState();
        $definition = [
            '#type' => 'weight',
            '#delta' => $this->container
                ->get('config.factory')
                ->get('system.site')
                ->get('weight_select_max'),
            // Expected by the "doBuildForm()" method of "form_builder" service.
'#parents' => [],
        ];
        $assert = function ($type, array $element, array $expected) use ($form_state) {
            // Pretend we have a form to trigger the "#process" callbacks.
            $element = $this->container
                ->get('form_builder')
                ->doBuildForm(__FUNCTION__, $element, $form_state);
            $expected['#type'] = $type;
            foreach ($expected as $property => $value) {
                static::assertSame($value, $element[$property]);
            }
            return $element;
        };
        // When the "#delta" is less or equal to maximum the "weight" must be
        // rendered as a "select".
        $select = $definition;
        $assert('select', $select, [
            '#process' => [
                [
                    Select::class,
                    'processSelect',
                ],
                [
                    Select::class,
                    'processAjaxForm',
                ],
            ],
            '#pre_render' => [
                [
                    Select::class,
                    'preRenderSelect',
                ],
            ],
        ]);
        $number = $definition;
        // Increase "#delta" in order to start rendering "number" elements
        // instead of "select".
        $number['#delta']++;
        // The "number" element definition has the "#pre_render" declaration by
        // default. The "hook_element_info_alter()" allows to modify the definition
        // of an element. We must be sure the standard "#pre_render" callbacks
        // are presented (unless explicitly removed) even in a case when the array
        // is modified by the alter hook.
        $assert('number', $number, [
            '#process' => [
                [
                    Number::class,
                    'processAjaxForm',
                ],
            ],
            '#element_validate' => [
                [
                    Number::class,
                    'validateNumber',
                ],
            ],
            '#pre_render' => [
                [
                    Number::class,
                    'preRenderNumber',
                ],
                // The custom callback is appended.
                
                /* @see \Drupal\element_info_test\ElementInfoTestNumberBuilder::preRender */
[
                    ElementInfoTestNumberBuilder::class,
                    'preRender',
                ],
            ],
        ]);
    }

}

Classes

Title Deprecated Summary
WeightTest @coversDefaultClass \Drupal\Core\Render\Element\Weight @group Render

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.