class NumberTest

Same name in other branches
  1. 9 core/tests/Drupal/Tests/Component/Utility/NumberTest.php \Drupal\Tests\Component\Utility\NumberTest
  2. 8.9.x core/tests/Drupal/Tests/Component/Utility/NumberTest.php \Drupal\Tests\Component\Utility\NumberTest
  3. 10 core/tests/Drupal/Tests/Component/Utility/NumberTest.php \Drupal\Tests\Component\Utility\NumberTest

Tests number manipulation utilities.

@group Utility

@coversDefaultClass \Drupal\Component\Utility\Number

Hierarchy

Expanded class hierarchy of NumberTest

See also

\Drupal\Component\Utility\Number

File

core/tests/Drupal/Tests/Component/Utility/NumberTest.php, line 20

Namespace

Drupal\Tests\Component\Utility
View source
class NumberTest extends TestCase {
    use ExpectDeprecationTrait;
    
    /**
     * Tests Number::validStep() without offset.
     *
     * @param numeric $value
     *   The value argument for Number::validStep().
     * @param numeric $step
     *   The step argument for Number::validStep().
     * @param bool $expected
     *   Expected return value from Number::validStep().
     *
     * @dataProvider providerTestValidStep
     * @covers ::validStep
     */
    public function testValidStep($value, $step, $expected) : void {
        $return = Number::validStep($value, $step);
        $this->assertEquals($expected, $return);
    }
    
    /**
     * Tests Number::validStep() with offset.
     *
     * @param numeric $value
     *   The value argument for Number::validStep().
     * @param numeric $step
     *   The step argument for Number::validStep().
     * @param numeric $offset
     *   The offset argument for Number::validStep().
     * @param bool $expected
     *   Expected return value from Number::validStep().
     *
     * @dataProvider providerTestValidStepOffset
     * @covers ::validStep
     */
    public function testValidStepOffset($value, $step, $offset, $expected) : void {
        $return = Number::validStep($value, $step, $offset);
        $this->assertEquals($expected, $return);
    }
    
    /**
     * Provides data for self::testNumberStep().
     *
     * @see \Drupal\Tests\Component\Utility\Number::testValidStep
     */
    public static function providerTestValidStep() {
        return [
            // Value and step equal.
[
                10.3,
                10.3,
                TRUE,
            ],
            // Valid integer steps.
[
                42,
                21,
                TRUE,
            ],
            [
                42,
                3,
                TRUE,
            ],
            // Valid float steps.
[
                42,
                10.5,
                TRUE,
            ],
            [
                1,
                1 / 3,
                TRUE,
            ],
            [
                -100,
                100 / 7,
                TRUE,
            ],
            [
                1000,
                -10,
                TRUE,
            ],
            // Valid and very small float steps.
[
                1000.12345,
                1.0E-10,
                TRUE,
            ],
            [
                3.9999999999999,
                1.0E-13,
                TRUE,
            ],
            // Invalid integer steps.
[
                100,
                30,
                FALSE,
            ],
            [
                -10,
                4,
                FALSE,
            ],
            // Invalid float steps.
[
                6,
                5 / 7,
                FALSE,
            ],
            [
                10.3,
                10.25,
                FALSE,
            ],
            // Step mismatches very close to being valid.
[
                70 + 9.0E-7,
                10 + 9.0E-7,
                FALSE,
            ],
            [
                1936.5,
                3.0E-8,
                FALSE,
            ],
        ];
    }
    
    /**
     * Data provider for testValidStepOffset().
     *
     * @see \Drupal\Tests\Component\Utility\NumberTest::testValidStepOffset()
     */
    public static function providerTestValidStepOffset() {
        return [
            // Try obvious fits.
[
                11.3,
                10.3,
                1,
                TRUE,
            ],
            [
                100,
                10,
                50,
                TRUE,
            ],
            [
                -100,
                90 / 7,
                -10,
                TRUE,
            ],
            [
                2 / 7 + 5 / 9,
                1 / 7,
                5 / 9,
                TRUE,
            ],
            // Ensure a small offset is still invalid.
[
                10.3,
                10.3,
                0.0001,
                FALSE,
            ],
            [
                1 / 5,
                1 / 7,
                1 / 11,
                FALSE,
            ],
            // Try negative values and offsets.
[
                1000,
                10,
                -5,
                FALSE,
            ],
            [
                -10,
                4,
                0,
                FALSE,
            ],
            [
                -10,
                4,
                -4,
                FALSE,
            ],
        ];
    }
    
    /**
     * Tests the alphadecimal conversion functions.
     *
     * @param int $value
     *   The integer value.
     * @param string $expected
     *   The expected alphadecimal value.
     *
     * @dataProvider providerTestConversions
     * @covers ::intToAlphadecimal
     * @covers ::alphadecimalToInt
     */
    public function testConversions($value, $expected) : void {
        $this->assertSame(Number::intToAlphadecimal($value), $expected);
        $this->assertSame($value, Number::alphadecimalToInt($expected));
    }
    
    /**
     * Data provider for testConversions().
     *
     * @return array
     *   An array containing:
     *     - The integer value.
     *     - The alphadecimal value.
     *
     * @see testConversions()
     */
    public static function providerTestConversions() {
        return [
            [
                0,
                '00',
            ],
            [
                1,
                '01',
            ],
            [
                10,
                '0a',
            ],
            [
                20,
                '0k',
            ],
            [
                35,
                '0z',
            ],
            [
                36,
                '110',
            ],
            [
                100,
                '12s',
            ],
        ];
    }
    
    /**
     * Tests the alphadecimal conversion function input parameter checking.
     *
     * Number::alphadecimalToInt() must throw an exception
     * when non-alphanumeric characters are passed as input.
     *
     * @covers ::alphadecimalToInt
     */
    public function testAlphadecimalToIntThrowsExceptionWithMalformedStrings() : void {
        $this->expectException(\InvalidArgumentException::class);
        $nonAlphanumericChar = '#';
        Number::alphadecimalToInt($nonAlphanumericChar);
    }
    
    /**
     * Tests the alphadecimal conversion function keeps backward compatibility.
     *
     * Many tests and code rely on Number::alphadecimalToInt() returning 0
     * for degenerate values '' and NULL. We must ensure they are accepted.
     *
     * @group legacy
     * @covers ::alphadecimalToInt
     */
    public function testAlphadecimalToIntReturnsZeroWithNullAndEmptyString() : void {
        $deprecationMessage = 'Passing NULL or an empty string to Drupal\\Component\\Utility\\Number::alphadecimalToInt() is deprecated in drupal:11.2.0 and will be removed in drupal:12.0.0. See https://www.drupal.org/node/3494472';
        $this->expectDeprecation($deprecationMessage);
        $this->assertSame(0, Number::alphadecimalToInt(NULL));
        $this->expectDeprecation($deprecationMessage);
        $this->assertSame(0, Number::alphadecimalToInt(''));
    }

}

Members

Title Sort descending Modifiers Object type Summary
ExpectDeprecationTrait::expectDeprecation public function Adds an expected deprecation.
ExpectDeprecationTrait::getCallableName private static function Returns a callable as a string suitable for inclusion in a message.
ExpectDeprecationTrait::setUpErrorHandler public function Sets up the test error handler.
ExpectDeprecationTrait::tearDownErrorHandler public function Tears down the test error handler.
NumberTest::providerTestConversions public static function Data provider for testConversions().
NumberTest::providerTestValidStep public static function Provides data for self::testNumberStep().
NumberTest::providerTestValidStepOffset public static function Data provider for testValidStepOffset().
NumberTest::testAlphadecimalToIntReturnsZeroWithNullAndEmptyString public function Tests the alphadecimal conversion function keeps backward compatibility.
NumberTest::testAlphadecimalToIntThrowsExceptionWithMalformedStrings public function Tests the alphadecimal conversion function input parameter checking.
NumberTest::testConversions public function Tests the alphadecimal conversion functions.
NumberTest::testValidStep public function Tests Number::validStep() without offset.
NumberTest::testValidStepOffset public function Tests Number::validStep() with offset.

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