import pytest
from hypothesis import given
from rithm.integer import Int
from tests.utils import (
IntOrBuiltin,
IntWithBuiltin,
is_equivalent_to_builtin_int,
)
from . import strategies
@given(strategies.ints, strategies.non_zero_ints_or_builtins)
def test_basic(dividend: Int, divisor: IntOrBuiltin) -> None:
result = divmod(dividend, divisor)
assert isinstance(result, tuple)
assert len(result) == 2
assert isinstance(result[0], Int)
assert isinstance(result[1], Int)
@given(strategies.ints, strategies.non_zero_ints_or_builtins)
def test_alternatives(dividend: Int, divisor: IntOrBuiltin) -> None:
result = divmod(dividend, divisor)
assert result == (dividend // divisor, dividend % divisor)
@given(strategies.ints, strategies.ints_with_builtins)
def test_polymorphism(
dividend: Int, divisor_with_builtin: IntWithBuiltin
) -> None:
divisor, divisor_builtin = divisor_with_builtin
try:
result = divmod(dividend, divisor)
except ZeroDivisionError as exception:
with pytest.raises(type(exception)):
divmod(dividend, divisor_builtin)
else:
assert result == divmod(dividend, divisor_builtin)
@given(strategies.ints_with_builtins, strategies.ints_with_builtins)
def test_connection_with_builtin(
dividend_with_builtin: IntWithBuiltin, divisor_with_builtin: IntWithBuiltin
) -> None:
dividend, dividend_builtin = dividend_with_builtin
divisor, divisor_builtin = divisor_with_builtin
try:
quotient, remainder = divmod(dividend, divisor)
except ZeroDivisionError as exception:
with pytest.raises(type(exception)):
divmod(dividend_builtin, divisor_builtin)
else:
builtin_quotient, builtin_remainder = divmod(
dividend_builtin, divisor_builtin
)
assert is_equivalent_to_builtin_int(quotient, builtin_quotient)
assert is_equivalent_to_builtin_int(remainder, builtin_remainder)
@given(strategies.ints, strategies.zero_ints_or_builtins)
def test_zero_divisor(dividend: Int, divisor: IntOrBuiltin) -> None:
with pytest.raises(ZeroDivisionError):
divmod(dividend, divisor)