-
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-1147: Create Int64 instances directly * PHPLIB-1148: Add comparator for Int64 objects * Simplify comparison of Int64
- Loading branch information
Showing
12 changed files
with
279 additions
and
55 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,45 @@ | ||
<?php | ||
|
||
namespace MongoDB\Tests\Comparator; | ||
|
||
use MongoDB\BSON\Int64; | ||
use SebastianBergmann\Comparator\Comparator; | ||
use SebastianBergmann\Comparator\ComparisonFailure; | ||
|
||
use function is_numeric; | ||
use function sprintf; | ||
|
||
class Int64Comparator extends Comparator | ||
{ | ||
public function accepts($expected, $actual) | ||
{ | ||
// Only compare if either value is an Int64 and the other value is numeric | ||
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 ($expected == $actual) { | ||
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 || is_numeric($value); | ||
} | ||
} |
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,211 @@ | ||
<?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 int string' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => new Int64(123), | ||
'actualValue' => '123', | ||
]; | ||
|
||
yield 'Expects Int64, Actual float' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => new Int64(123), | ||
'actualValue' => 123.0, | ||
]; | ||
|
||
yield 'Expects Int64, Actual float string' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => new Int64(123), | ||
'actualValue' => '123.0', | ||
]; | ||
|
||
yield 'Expects Int64, Actual non-numeric string' => [ | ||
'expectedResult' => false, | ||
'expectedValue' => new Int64(123), | ||
'actualValue' => 'foo', | ||
]; | ||
|
||
yield 'Expects int, Actual Int64' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => 123, | ||
'actualValue' => new Int64(123), | ||
]; | ||
|
||
yield 'Expects int string, Actual Int64' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => '123', | ||
'actualValue' => new Int64(123), | ||
]; | ||
|
||
yield 'Expects float, Actual Int64' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => 123.0, | ||
'actualValue' => new Int64(123), | ||
]; | ||
|
||
yield 'Expects float string, Actual Int64' => [ | ||
'expectedResult' => true, | ||
'expectedValue' => '123.0', | ||
'actualValue' => new Int64(123), | ||
]; | ||
|
||
yield 'Expects non-numeric string, Actual Int64' => [ | ||
'expectedResult' => false, | ||
'expectedValue' => 'foo', | ||
'actualValue' => new Int64(123), | ||
]; | ||
|
||
yield 'Expects float, Actual float' => [ | ||
'expectedResult' => false, | ||
'expectedValue' => 123.0, | ||
'actualValue' => 123.0, | ||
]; | ||
|
||
yield 'Expects numeric string, Actual numeric 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(8589934592), | ||
'actual' => new Int64(8589934592), | ||
]; | ||
|
||
yield 'Expected Int64, Actual int' => [ | ||
'expected' => new Int64(8589934592), | ||
'actual' => 8589934592, | ||
]; | ||
|
||
yield 'Expected Int64, Actual int string' => [ | ||
'expected' => new Int64(8589934592), | ||
'actual' => '8589934592', | ||
]; | ||
|
||
yield 'Expected Int64, Actual float' => [ | ||
'expected' => new Int64(8589934592), | ||
'actual' => 8589934592.0, | ||
]; | ||
|
||
yield 'Expected Int64, Actual float string' => [ | ||
'expected' => new Int64(8589934592), | ||
'actual' => '8589934592.0', | ||
]; | ||
|
||
yield 'Expected int, Actual Int64' => [ | ||
'expected' => 8589934592, | ||
'actual' => new Int64(8589934592), | ||
]; | ||
|
||
yield 'Expected int string, Actual Int64' => [ | ||
'expected' => '8589934592', | ||
'actual' => new Int64(8589934592), | ||
]; | ||
|
||
yield 'Expected float, Actual Int64' => [ | ||
'expected' => 8589934592.0, | ||
'actual' => new Int64(8589934592), | ||
]; | ||
|
||
yield 'Expected float string, Actual Int64' => [ | ||
'expected' => '8589934592.0', | ||
'actual' => new Int64(8589934592), | ||
]; | ||
} | ||
|
||
/** @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(8589934592), | ||
'actual' => new Int64(456), | ||
]; | ||
|
||
yield 'Expected Int64, Actual int' => [ | ||
'expected' => new Int64(8589934592), | ||
'actual' => 456, | ||
]; | ||
|
||
yield 'Expected Int64, Actual int string' => [ | ||
'expected' => new Int64(8589934592), | ||
'actual' => '456', | ||
]; | ||
|
||
yield 'Expected Int64, Actual float' => [ | ||
'expected' => new Int64(8589934592), | ||
'actual' => 8589934592.1, | ||
]; | ||
|
||
yield 'Expected Int64, Actual float string' => [ | ||
'expected' => new Int64(8589934592), | ||
'actual' => '8589934592.1', | ||
]; | ||
|
||
yield 'Expected int, Actual Int64' => [ | ||
'expected' => 8589934592, | ||
'actual' => new Int64(456), | ||
]; | ||
|
||
yield 'Expected int string, Actual Int64' => [ | ||
'expected' => '8589934592', | ||
'actual' => new Int64(456), | ||
]; | ||
|
||
yield 'Expected float, Actual Int64' => [ | ||
'expected' => 8589934592.1, | ||
'actual' => new Int64(456), | ||
]; | ||
|
||
yield 'Expected float string, Actual Int64' => [ | ||
'expected' => '8589934592.1', | ||
'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
Oops, something went wrong.