Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
201 changes: 201 additions & 0 deletions math/tests/data/BigNumberThrowTypes.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
use Brick\Math\BigInteger;
use Brick\Math\BigNumber;
use Brick\Math\BigRational;
use Brick\Math\Exception\DivisionByZeroException;
use Brick\Math\Exception\IntegerOverflowException;
use Brick\Math\Exception\InvalidArgumentException;
use Brick\Math\Exception\MathException;
use Brick\Math\Exception\NegativeNumberException;
use Brick\Math\Exception\RoundingNecessaryException;
use Brick\Math\RoundingMode;
use PHPStan\TrinaryLogic;

Expand Down Expand Up @@ -44,6 +50,57 @@ public function ofWithString(string $s): void
}
}

public function ofWithStringCatchingDivisionByZero(string $s): void
{
try {
$result = BigInteger::of($s);
} catch (DivisionByZeroException) {
$result = BigInteger::zero();
} finally {
assertVariableCertainty(TrinaryLogic::createMaybe(), $result);
}
}

public function ofFractionWithNonZeroDenominator(): void
{
try {
$result = BigRational::ofFraction(1, 2);
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

public function ofFractionWithNonZeroDenominatorCatchingDivisionByZero(): void
{
try {
$result = BigRational::ofFraction(1, 2);
} catch (DivisionByZeroException) {
$result = BigRational::zero();
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

public function ofFractionWithMaybeZeroDenominator(int $denominator): void
{
try {
$result = BigRational::ofFraction(1, $denominator);
} finally {
assertVariableCertainty(TrinaryLogic::createMaybe(), $result);
}
}

public function ofFractionWithMaybeZeroDenominatorCatchingDivisionByZero(int $denominator): void
{
try {
$result = BigRational::ofFraction(1, $denominator);
} catch (DivisionByZeroException) {
$result = BigRational::zero();
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

// --- Conversion methods ---

public function toBigIntegerOnBigInteger(BigInteger $a): void
Expand All @@ -64,6 +121,39 @@ public function toBigDecimalOnBigRational(BigRational $a): void
}
}

public function toBigDecimalOnBigRationalCatchingRounding(BigRational $a): void
{
try {
$result = $a->toBigDecimal();
} catch (RoundingNecessaryException) {
$result = BigDecimal::zero();
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

public function toIntOnBigIntegerCatchingOverflow(BigInteger $a): void
{
try {
$result = $a->toInt();
} catch (IntegerOverflowException) {
$result = 0;
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

public function toIntOnBigDecimalCatchingOverflow(BigDecimal $a): void
{
try {
$result = $a->toInt();
} catch (IntegerOverflowException) {
$result = 0;
} finally {
assertVariableCertainty(TrinaryLogic::createMaybe(), $result);
}
}

// --- Operation methods ---

public function plusWithSameType(BigInteger $a, BigInteger $b): void
Expand Down Expand Up @@ -93,6 +183,17 @@ public function plusWithString(BigInteger $a, string $s): void
}
}

public function plusWithStringCatchingParsingException(BigInteger $a, string $s): void
{
try {
$result = $a->plus($s);
} catch (MathException) {
$result = $a;
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

public function quotientMayThrowDivisionByZero(BigInteger $a, BigInteger $b): void
{
try {
Expand All @@ -102,6 +203,17 @@ public function quotientMayThrowDivisionByZero(BigInteger $a, BigInteger $b): vo
}
}

public function quotientMayThrowDivisionByZeroCatchingDivisionByZero(BigInteger $a, BigInteger $b): void
{
try {
$result = $a->quotient($b);
} catch (DivisionByZeroException) {
$result = BigInteger::zero();
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

/** @param int<1, max> $divisor */
public function quotientWithNonZeroDivisor(BigInteger $a, int $divisor): void
{
Expand All @@ -112,6 +224,17 @@ public function quotientWithNonZeroDivisor(BigInteger $a, int $divisor): void
}
}

public function quotientWithStringCatchingDivisionByZero(BigInteger $a, string $divisor): void
{
try {
$result = $a->quotient($divisor);
} catch (DivisionByZeroException) {
$result = BigInteger::zero();
} finally {
assertVariableCertainty(TrinaryLogic::createMaybe(), $result);
}
}

public function compareToWithBigNumber(BigInteger $a, BigDecimal $b): void
{
try {
Expand Down Expand Up @@ -189,6 +312,51 @@ public function toScaleWithUnnecessary(BigDecimal $a): void
}
}

/** @param int<0, max> $scale */
public function toScaleWithNonNegativeScaleCatchingRounding(BigDecimal $a, int $scale): void
{
try {
$result = $a->toScale($scale, RoundingMode::Unnecessary);
} catch (RoundingNecessaryException) {
$result = $a;
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

public function toScaleWithMaybeNegativeScaleCatchingRounding(BigDecimal $a, int $scale): void
{
try {
$result = $a->toScale($scale, RoundingMode::Unnecessary);
} catch (RoundingNecessaryException) {
$result = $a;
} finally {
assertVariableCertainty(TrinaryLogic::createMaybe(), $result);
}
}

public function toScaleWithSafeRoundingCatchingInvalidScale(BigDecimal $a, int $scale): void
{
try {
$result = $a->toScale($scale, RoundingMode::Down);
} catch (InvalidArgumentException) {
$result = $a;
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

public function toScaleWithMaybeNegativeScaleCatchingInvalidScale(BigDecimal $a, int $scale): void
{
try {
$result = $a->toScale($scale, RoundingMode::Down);
} catch (InvalidArgumentException) {
$result = $a;
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

public function dividedByWithSafeRounding(BigInteger $a, BigInteger $b): void
{
try {
Expand All @@ -198,6 +366,17 @@ public function dividedByWithSafeRounding(BigInteger $a, BigInteger $b): void
}
}

public function dividedByWithSafeRoundingCatchingNonRoundingExceptions(BigInteger $a, BigInteger $b): void
{
try {
$result = $a->dividedBy($b, RoundingMode::Down);
} catch (MathException | DivisionByZeroException) {
$result = $a;
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

/** @param int<1, max> $divisor */
public function dividedByWithSafeRoundingAndNonZero(BigInteger $a, int $divisor): void
{
Expand All @@ -208,6 +387,28 @@ public function dividedByWithSafeRoundingAndNonZero(BigInteger $a, int $divisor)
}
}

public function dividedByWithMaybeZeroIntCatchingDivisionByZero(BigInteger $a, int $divisor): void
{
try {
$result = $a->dividedBy($divisor, RoundingMode::Down);
} catch (DivisionByZeroException) {
$result = $a;
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

public function sqrtWithSafeRoundingCatchingNegativeNumber(BigDecimal $a): void
{
try {
$result = $a->sqrt(2, RoundingMode::Down);
} catch (NegativeNumberException) {
$result = BigDecimal::zero();
} finally {
assertVariableCertainty(TrinaryLogic::createYes(), $result);
}
}

/** Static variadic methods (min, max, sum, gcdAll, lcmAll) */

public function minWithSameType(BigInteger $a, BigInteger $b): void
Expand Down
Loading