New utility Number::constrainInteger() (#15663)

* New utility Number::constrainInteger()
Fixes a bug with Number::unsignedAsSigned() and implements signed support as well.

* cleanup

* Apply fixes from StyleCI

* Remove default cases

---------

Co-authored-by: StyleCI Bot <bot@styleci.io>
This commit is contained in:
Tony Murray
2023-12-20 09:21:40 -06:00
committed by GitHub
parent b4a61636c1
commit 6bea8cffa6
4 changed files with 105 additions and 18 deletions

View File

@@ -26,6 +26,7 @@
namespace LibreNMS\Tests;
use LibreNMS\Device\YamlDiscovery;
use LibreNMS\Enum\IntegerType;
use LibreNMS\Util\Number;
use LibreNMS\Util\Time;
@@ -129,18 +130,26 @@ class FunctionsTest extends TestCase
public function testNumberAsUnsigned()
{
$this->assertSame(42, Number::unsignedAsSigned('42')); /** @phpstan-ignore-line */
$this->assertSame(2147483647, Number::unsignedAsSigned(2147483647));
$this->assertSame(-2147483648, Number::unsignedAsSigned(2147483648));
$this->assertSame(-2147483647, Number::unsignedAsSigned(2147483649));
$this->assertSame(-1, Number::unsignedAsSigned(4294967295));
$this->assertSame(42, Number::constrainInteger('42', IntegerType::int32)); /** @phpstan-ignore-line */
$this->assertSame(2147483647, Number::constrainInteger(2147483647, IntegerType::int32));
$this->assertSame(-2147483648, Number::constrainInteger(2147483648, IntegerType::int32));
$this->assertSame(-2147483647, Number::constrainInteger(2147483649, IntegerType::int32));
$this->assertSame(-1, Number::constrainInteger(4294967295, IntegerType::int32));
$this->assertSame(-3757, Number::constrainInteger(61779, IntegerType::int16));
$this->assertSame(0, Number::constrainInteger(0, IntegerType::uint32));
$this->assertSame(42, Number::constrainInteger(42, IntegerType::uint32));
$this->assertSame(4294967252, Number::constrainInteger(-42, IntegerType::uint32));
$this->assertSame(2147483648, Number::constrainInteger(-2147483646, IntegerType::uint32));
$this->assertSame(2147483647, Number::constrainInteger(-2147483647, IntegerType::uint32));
$this->assertSame(2147483646, Number::constrainInteger(-2147483648, IntegerType::uint32));
$this->assertSame(2147483645, Number::constrainInteger(-2147483649, IntegerType::uint32));
}
public function testNumberAsUnsignedValueExceedsMaxUnsignedValue()
{
$this->expectException(\InvalidArgumentException::class);
// Exceeds the maximum representable value for a 32-bit unsigned integer
Number::unsignedAsSigned(4294967296, 32);
// Exceeds the maximum representable value for a 16-bit unsigned integer
Number::constrainInteger(4294967296, IntegerType::int16);
}
}