def test_integer_is_finite():

    assert Integer(0).is_finite() is True
    assert Integer(1).is_finite() is True
    assert Integer(-1).is_finite() is True
    assert Integer(2300000).is_finite() is True
    assert Integer(-2300000).is_finite() is True
def test_integer_is_defined():

    a = Integer(10)
    b = Integer(-1346)
    c = Integer(0)
    u = Integer.undefined()

    assert a.is_defined() is True
    assert b.is_defined() is True
    assert c.is_defined() is True
    assert u.is_defined() is False
def test_integer_casting():

    a = Integer(0)
    b = Integer(5)
    c = Integer(-7)

    assert a == 0
    assert b == 5
    assert c == -7
    assert int(b) == 5
    assert int(a) == 0
    assert int(c) == -7
    assert isinstance(a, Integer)
    assert isinstance(b, Integer)
    assert isinstance(c, Integer)
    assert isinstance(int(a), int)
    assert isinstance(int(b), int)
    assert isinstance(int(c), int)
def test_integer_zero():

    a = Integer(4)
    b = Integer(0)
    c = Integer.zero()

    assert a.is_zero() is False
    assert b.is_zero() is True
    assert c.is_zero() is True
def test_integer_comparators():

    a = Integer(5)

    assert a == a
    assert a == 5
    assert a != (a + 1)
    assert (a - 1) < a
    assert (a - 1) <= a
    assert a <= a
    assert (a + 1) > a
    assert (a + 1) >= a
    assert a >= a
def test_integer_get_sign():

    assert isinstance(Integer(4).get_sign(), Sign)
    assert Integer(2).get_sign() == Sign.Positive
    assert Integer(-1).get_sign() == Sign.Negative
    assert Integer(232567).get_sign() == Sign.Positive
    assert Integer(0).get_sign() == Sign.NoSign
    assert Integer.undefined().get_sign() == Sign.Undefined
def test_integer_is_infinity():

    assert Integer(10).is_infinity() is False
    assert Integer(0).is_infinity() is False
    assert Integer(2000000).is_infinity() is False
    assert Integer(-2400000).is_infinity() is False

    with pytest.raises(TypeError):
        assert Integer(200000000000000000000)
        assert Integer(-200000000000000000000)
def test_integer_constructors():

    a = Integer(0)
    b = Integer(1)
    c = Integer(123456789)
    d = Integer(-1)
    u = Integer.undefined()

    assert isinstance(a, Integer)
    assert isinstance(b, Integer)
    assert isinstance(c, Integer)
    assert isinstance(d, Integer)
    assert isinstance(u, Integer)

    with pytest.raises(TypeError):

        e = Integer(1.2)
def test_integer_operators():

    a = Integer(15)
    b = Integer(30)
    c = Integer(-45)

    # Addition
    assert a + b == Integer(45)
    a += b
    assert a == Integer(45)

    # Substraction
    assert a - b == Integer(15)
    a -= b
    assert a == Integer(15)

    # Multiplication
    assert a * Integer(2) == Integer(30)
    a *= Integer(1)
    assert a == Integer(15)

    # Division
    assert a / Integer(3) == Integer(5)
    a /= Integer(3)
    assert a == Integer(5)

    # Addition with python native type
    assert a + 2 == Integer(7)
    a += 2
    assert a == Integer(7)

    # Substraction with python native python
    assert a - 10 == Integer(-3)
    a -= 10
    assert a == Integer(-3)

    # Multiplication with python native python
    assert a * 2 == Integer(-6)
    a *= 2
    assert a == Integer(-6)

    # Division with python native python
    assert a / (-3) == Integer(2)
    a /= -3
    assert a == Integer(2)
def test_integer_static_methods():

    a = Integer(34)

    assert Integer.undefined()
    assert Integer.zero() == Integer(0)
    # assert Integer.positive_infinity()
    # assert Integer.negative_infinity()
    assert Integer.int8(a) == a
    assert Integer.int16(a) == a
    assert Integer.int32(a) == a
    assert Integer.uint8(a) == a
    assert Integer.uint16(a) == a
    assert Integer.uint32(a) == a
    assert Integer.uint64(a) == a
def test_integer_is_odd():

    assert Integer(2).is_odd() is False
    assert Integer(4).is_odd() is False
    assert Integer(6).is_odd() is False
    assert Integer(10).is_odd() is False
    assert Integer(-4).is_odd() is False
    assert Integer(-2).is_odd() is False
    assert Integer(-23257).is_odd() is True
    assert Integer(23257).is_odd() is True
    assert Integer(-2453856).is_odd() is False
    assert Integer(2453856).is_odd() is False
    assert Integer(1).is_odd() is True
    assert Integer(3).is_odd() is True
    assert Integer(0).is_odd() is False
def test_integer_is_strictly_negative():

    assert Integer(-1).is_strictly_negative() is True
    assert Integer(-18).is_strictly_negative() is True
    assert Integer(0).is_strictly_negative() is False
    assert Integer(2).is_strictly_negative() is False
def test_integer_is_strictly_positive():

    assert Integer(-15).is_strictly_positive() is False
    assert Integer(0).is_strictly_positive() is False
    assert Integer(1).is_strictly_positive() is True
    assert Integer(40).is_strictly_positive() is True
def test_integer_is_negative():

    assert Integer(-5).is_negative() is True
    assert Integer(0).is_negative() is True
    assert Integer(7).is_negative() is False
def test_integer_is_positive():

    assert Integer(-3).is_positive() is False
    assert Integer(0).is_positive() is True
    assert Integer(4).is_positive() is True