function NumberFieldTest::testNumberDecimalField

Same name in other branches
  1. 9 core/modules/field/tests/src/Functional/Number/NumberFieldTest.php \Drupal\Tests\field\Functional\Number\NumberFieldTest::testNumberDecimalField()
  2. 10 core/modules/field/tests/src/Functional/Number/NumberFieldTest.php \Drupal\Tests\field\Functional\Number\NumberFieldTest::testNumberDecimalField()
  3. 11.x core/modules/field/tests/src/Functional/Number/NumberFieldTest.php \Drupal\Tests\field\Functional\Number\NumberFieldTest::testNumberDecimalField()

Test decimal field.

File

core/modules/field/tests/src/Functional/Number/NumberFieldTest.php, line 44

Class

NumberFieldTest
Tests the creation of numeric fields.

Namespace

Drupal\Tests\field\Functional\Number

Code

public function testNumberDecimalField() {
    // Create a field with settings to validate.
    $field_name = mb_strtolower($this->randomMachineName());
    FieldStorageConfig::create([
        'field_name' => $field_name,
        'entity_type' => 'entity_test',
        'type' => 'decimal',
        'settings' => [
            'precision' => 8,
            'scale' => 4,
        ],
    ])->save();
    FieldConfig::create([
        'field_name' => $field_name,
        'entity_type' => 'entity_test',
        'bundle' => 'entity_test',
    ])->save();
    
    /** @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface $display_repository */
    $display_repository = \Drupal::service('entity_display.repository');
    $display_repository->getFormDisplay('entity_test', 'entity_test')
        ->setComponent($field_name, [
        'type' => 'number',
        'settings' => [
            'placeholder' => '0.00',
        ],
    ])
        ->save();
    $display_repository->getViewDisplay('entity_test', 'entity_test')
        ->setComponent($field_name, [
        'type' => 'number_decimal',
    ])
        ->save();
    // Display creation form.
    $this->drupalGet('entity_test/add');
    $this->assertFieldByName("{$field_name}[0][value]", '', 'Widget is displayed');
    $this->assertRaw('placeholder="0.00"');
    // Submit a signed decimal value within the allowed precision and scale.
    $value = '-1234.5678';
    $edit = [
        "{$field_name}[0][value]" => $value,
    ];
    $this->drupalPostForm(NULL, $edit, t('Save'));
    preg_match('|entity_test/manage/(\\d+)|', $this->getUrl(), $match);
    $id = $match[1];
    $this->assertText(t('entity_test @id has been created.', [
        '@id' => $id,
    ]), 'Entity was created');
    $this->assertRaw($value, 'Value is displayed.');
    // Try to create entries with more than one decimal separator; assert fail.
    $wrong_entries = [
        '3.14.159',
        '0..45469',
        '..4589',
        '6.459.52',
        '6.3..25',
    ];
    foreach ($wrong_entries as $wrong_entry) {
        $this->drupalGet('entity_test/add');
        $edit = [
            "{$field_name}[0][value]" => $wrong_entry,
        ];
        $this->drupalPostForm(NULL, $edit, t('Save'));
        $this->assertRaw(t('%name must be a number.', [
            '%name' => $field_name,
        ]), 'Correctly failed to save decimal value with more than one decimal point.');
    }
    // Try to create entries with minus sign not in the first position.
    $wrong_entries = [
        '3-3',
        '4-',
        '1.3-',
        '1.2-4',
        '-10-10',
    ];
    foreach ($wrong_entries as $wrong_entry) {
        $this->drupalGet('entity_test/add');
        $edit = [
            "{$field_name}[0][value]" => $wrong_entry,
        ];
        $this->drupalPostForm(NULL, $edit, t('Save'));
        $this->assertRaw(t('%name must be a number.', [
            '%name' => $field_name,
        ]), 'Correctly failed to save decimal value with minus sign in the wrong position.');
    }
}

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