Files
2025-08-14 22:41:49 +02:00

100 lines
4.1 KiB
PHP

<?php
namespace Yuloh\BcCompPolyfill;
class BcCompTest extends \PHPUnit_Framework_TestCase
{
public function bcCompData()
{
return [
['1', '2', 0, -1, 'lt'],
['2', '1', 0, 1, 'gt'],
['2', '2', 0, 0, 'eq'],
['123', '1', 0, 1, 'gt when left operand is longer'],
['1', '123', 0, -1, 'lt when left operand is shorter'],
['100.12', '100.13', 0, 0, 'eq when scale is 0 but mantissa is less than'],
['100.12', '100.13', 1, 0, 'eq when eq up to last decimal place checked'],
['100.12', '100.13', 2, -1, 'lt with two decimal places checked and last place is lt'],
['100.12', '100.13', 5, -1, 'lt when scale is larger than both operands'],
['1', '-1', 0, 1, 'gt when right operand is negative'],
['-1', '1', 0, -1, 'lt when left operand is negative'],
['-1', '-1', 0, 0, 'eq when both operands are negative'],
['-1', '-2', 0, 1, 'gt when both operands are negative'],
['-2', '-1', 0, -1, 'lt when both operands are negative'],
['-20', '-1', 0, -1, 'lt when both operands are negative and left operand is longer'],
['-2', '-10', 0, 1, 'gt when both operands are negative and left operand is shorter'],
['-200.12', '-200.13', 2, 1, 'gt when both operands are negative with mantissa'],
['-' . PHP_INT_MAX . '99', '-' . PHP_INT_MAX . '99', 0, 0, 'eq when negative and larger than PHP_INT_MAX'],
['-' . PHP_INT_MAX . '99', '-' . PHP_INT_MAX . '98', 0, -1, 'lt when negative and larger than PHP_INT_MAX'],
[PHP_INT_MAX . '99', PHP_INT_MAX . '99', 0, 0, 'eq when larger than PHP_INT_MAX'],
[PHP_INT_MAX . '99', PHP_INT_MAX . '97', 0, 1, 'gt when larger than PHP_INT_MAX'],
[PHP_INT_MAX . '99.999', PHP_INT_MAX . '99.997', 5, 1, 'lt when larger than PHP_INT_MAX with mantissa'],
['riffraff', '1', 0, -1, 'comparison when left operand is nonsense'],
['1', 'kodos', 0, 1, 'comparison when right operand is nonsense'],
['riffraff', 'kodos', 0, 0, 'comparison when both operands are nonsense'],
['1.2.3', '1', 5, -1, 'comparison when left operand has too many decimal separators'],
['1', '1.2.3', 5, 1, 'comparison when right operand has too many decimal separators'],
['1.12', '1.15', 1.6, 0, 'float scale should be cast to int, not rounded'],
['1a', '1b', 0, 0, 'comparison when both operands have a letter in a number'],
['0', '-0', 0, 0, 'comparison of 0 and -0'],
];
}
/**
* @dataProvider bcCompData
*/
public function testBcComp($leftOperand, $rightOperand, $scale, $result, $msg)
{
$realLibraryResult = \bccomp($leftOperand, $rightOperand, $scale);
$this->assertSame($result, $realLibraryResult, 'The actual function result should match the expected result');
$actual = \Yuloh\BcCompPolyfill\bccomp($leftOperand, $rightOperand, $scale);
$this->assertSame($result, $actual, $msg);
}
/**
* @expectedException PHPUnit_Framework_Error_Warning
*/
public function testInvalidScale()
{
\Yuloh\BcCompPolyfill\bccomp(1, 1, []);
}
public function fuzzTestData()
{
$data = [];
for ($i = 0; $i < 1000; $i++) {
$leftOperand = $this->randOperand();
$rightOperand = $this->randOperand();
$scale = rand(0, 200);
$result = \bccomp($leftOperand, $rightOperand, $scale);
$data[] = [$leftOperand, $rightOperand, $scale, $result];
}
return $data;
}
/**
* @dataProvider fuzzTestData
*/
public function testWithRandomData($leftOperand, $rightOperand, $scale, $result)
{
$actual = \Yuloh\BcCompPolyfill\bccomp($leftOperand, $rightOperand, $scale);
$this->assertSame($result, $actual);
}
public function randOperand()
{
$negative = rand() % 2 === 0 ? '-' : '';
$characteristic = rand();
$mantissa = rand() % 2 === 0 ? '.' . rand() : '';
return $negative . $characteristic . $mantissa;
}
}