from __future__ import division
# When true division is the default, get rid of this and add it to
# test_long.py instead.  In the meantime, it's too obscure to try to
# trick just part of test_long into using future division.

from test.test_support import TestFailed, verify, verbose

def test_true_division():
    if verbose:
        print "long true division"
    huge = 1L << 40000
    mhuge = -huge
    verify(huge / huge == 1.0)
    verify(mhuge / mhuge == 1.0)
    verify(huge / mhuge == -1.0)
    verify(mhuge / huge == -1.0)
    verify(1 / huge == 0.0)
    verify(1L / huge == 0.0)
    verify(1 / mhuge == 0.0)
    verify(1L / mhuge == 0.0)
    verify((666 * huge + (huge >> 1)) / huge == 666.5)
    verify((666 * mhuge + (mhuge >> 1)) / mhuge == 666.5)
    verify((666 * huge + (huge >> 1)) / mhuge == -666.5)
    verify((666 * mhuge + (mhuge >> 1)) / huge == -666.5)
    verify(huge / (huge << 1) == 0.5)
    verify((1000000 * huge) / huge == 1000000)

    namespace = {'huge': huge, 'mhuge': mhuge}

    for overflow in ["float(huge)", "float(mhuge)",
                     "huge / 1", "huge / 2L", "huge / -1", "huge / -2L",
                     "mhuge / 100", "mhuge / 100L"]:
        try:
            eval(overflow, namespace)
        except OverflowError:
            pass
        else:
            raise TestFailed("expected OverflowError from %r" % overflow)

    for underflow in ["1 / huge", "2L / huge", "-1 / huge", "-2L / huge",
                     "100 / mhuge", "100L / mhuge"]:
        result = eval(underflow, namespace)
        if result != 0.0:
            raise TestFailed("expected underflow to 0 from %r" % underflow)

    for zero in ["huge / 0", "huge / 0L",
                 "mhuge / 0", "mhuge / 0L"]:
        try:
            eval(zero, namespace)
        except ZeroDivisionError:
            pass
        else:
            raise TestFailed("expected ZeroDivisionError from %r" % zero)

test_true_division()
