-
Notifications
You must be signed in to change notification settings - Fork 261
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
PHPLIB-1148: Add comparator for Int64 objects
- Loading branch information
Showing
7 changed files
with
219 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
<?php | ||
|
||
namespace MongoDB\Tests\Comparator; | ||
|
||
use MongoDB\BSON\Int64; | ||
use SebastianBergmann\Comparator\Comparator; | ||
use SebastianBergmann\Comparator\ComparisonFailure; | ||
|
||
use function is_int; | ||
use function is_numeric; | ||
use function is_string; | ||
use function sprintf; | ||
|
||
use const PHP_INT_SIZE; | ||
|
||
class Int64Comparator extends Comparator | ||
{ | ||
public function accepts($expected, $actual) | ||
{ | ||
// Only compare if either value is an Int64 | ||
return ($expected instanceof Int64 && $this->isComparable($actual)) | ||
|| ($actual instanceof Int64 && $this->isComparable($expected)); | ||
} | ||
|
||
public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false): void | ||
{ | ||
if (PHP_INT_SIZE == 8) { | ||
// On 64-bit systems, compare integers directly | ||
$expectedValue = (int) $expected; | ||
$actualValue = (int) $actual; | ||
} else { | ||
// On 32-bit systems, compare integers as strings | ||
$expectedValue = (string) $expected; | ||
$actualValue = (string) $actual; | ||
} | ||
|
||
if ($expectedValue === $actualValue) { | ||
return; | ||
} | ||
|
||
throw new ComparisonFailure( | ||
$expected, | ||
$actual, | ||
'', | ||
'', | ||
false, | ||
sprintf( | ||
'Failed asserting that %s matches expected %s.', | ||
$this->exporter->export($actual), | ||
$this->exporter->export($expected) | ||
) | ||
); | ||
} | ||
|
||
private function isComparable($value): bool | ||
{ | ||
return $value instanceof Int64 // Int64 instances | ||
|| is_int($value) // Integer values | ||
|| (is_string($value) && is_numeric($value)); // Numeric strings (is_numeric accepts floats) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
<?php | ||
|
||
namespace MongoDB\Tests\Comparator; | ||
|
||
use Generator; | ||
use MongoDB\BSON\Int64; | ||
use PHPUnit\Framework\TestCase; | ||
use SebastianBergmann\Comparator\ComparisonFailure; | ||
|
||
class Int64ComparatorTest extends TestCase | ||
{ | ||
/** @dataProvider provideAcceptsValues */ | ||
public function testAccepts(bool $expectedResult, $expectedValue, $actualValue): void | ||
{ | ||
$this->assertSame($expectedResult, (new Int64Comparator())->accepts($expectedValue, $actualValue)); | ||
} | ||
|
||
public static function provideAcceptsValues(): Generator | ||
{ | ||
yield 'Expects Int64, Actual Int64' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => new Int64(123), | ||
'actualValue' => new Int64(123), | ||
]; | ||
|
||
yield 'Expects Int64, Actual int' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => new Int64(123), | ||
'actualValue' => 123, | ||
]; | ||
|
||
yield 'Expects Int64, Actual string' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => new Int64(123), | ||
'actualValue' => '123', | ||
]; | ||
|
||
yield 'Expects Int64, Actual float' => [ | ||
'expectedResult' => false, | ||
'expectedValue' => new Int64(123), | ||
'actualValue' => 123.0, | ||
]; | ||
|
||
yield 'Expects int, Actual Int64' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => 123, | ||
'actualValue' => new Int64(123), | ||
]; | ||
|
||
yield 'Expects string, Actual Int64' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => '123', | ||
'actualValue' => new Int64(123), | ||
]; | ||
|
||
yield 'Expects float, Actual Int64' => [ | ||
'expectedResult' => false, | ||
'expectedValue' => 123.0, | ||
'actualValue' => new Int64(123), | ||
]; | ||
|
||
yield 'Expects float, Actual Float' => [ | ||
'expectedResult' => false, | ||
'expectedValue' => 123.0, | ||
'actualValue' => 123.0, | ||
]; | ||
|
||
yield 'Expects string, Actual string' => [ | ||
'expectedResult' => false, | ||
'expectedValue' => '123', | ||
'actualValue' => '123', | ||
]; | ||
} | ||
|
||
/** | ||
* @dataProvider provideMatchingAssertions | ||
* @doesNotPerformAssertions | ||
*/ | ||
public function testMatchingAssertions($expected, $actual): void | ||
{ | ||
(new Int64Comparator())->assertEquals($expected, $actual); | ||
} | ||
|
||
public static function provideMatchingAssertions(): Generator | ||
{ | ||
yield 'Expected Int64, Actual Int64' => [ | ||
'expected' => new Int64(123), | ||
'actual' => new Int64(123), | ||
]; | ||
|
||
yield 'Expected Int64, Actual int' => [ | ||
'expected' => new Int64(123), | ||
'actual' => 123, | ||
]; | ||
|
||
yield 'Expected Int64, Actual string' => [ | ||
'expected' => new Int64(123), | ||
'actual' => '123', | ||
]; | ||
|
||
yield 'Expected int, Actual Int64' => [ | ||
'expected' => 123, | ||
'actual' => new Int64(123), | ||
]; | ||
|
||
yield 'Expected string, Actual Int64' => [ | ||
'expected' => '123', | ||
'actual' => new Int64(123), | ||
]; | ||
} | ||
|
||
/** @dataProvider provideFailingValues */ | ||
public function testFailingAssertions($expected, $actual): void | ||
{ | ||
$this->expectException(ComparisonFailure::class); | ||
|
||
(new Int64Comparator())->assertEquals($expected, $actual); | ||
} | ||
|
||
public static function provideFailingValues(): Generator | ||
{ | ||
yield 'Expected Int64, Actual Int64' => [ | ||
'expected' => new Int64(123), | ||
'actual' => new Int64(456), | ||
]; | ||
|
||
yield 'Expected Int64, Actual int' => [ | ||
'expected' => new Int64(123), | ||
'actual' => 456, | ||
]; | ||
|
||
yield 'Expected Int64, Actual string' => [ | ||
'expected' => new Int64(123), | ||
'actual' => '456', | ||
]; | ||
|
||
yield 'Expected int, Actual Int64' => [ | ||
'expected' => 123, | ||
'actual' => new Int64(456), | ||
]; | ||
|
||
yield 'Expected string, Actual Int64' => [ | ||
'expected' => '123', | ||
'actual' => new Int64(456), | ||
]; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
<?php | ||
|
||
use MongoDB\Tests\Comparator\Int64Comparator; | ||
use SebastianBergmann\Comparator\Factory as ComparatorFactory; | ||
|
||
require __DIR__ . '/../vendor/autoload.php'; | ||
|
||
// Register custom comparators | ||
ComparatorFactory::getInstance()->register(new Int64Comparator()); |