Author: Carl Friedrich Bolz-Tereick <cfb...@gmx.de> Branch: math-improvements Changeset: r95473:6b10ba9fde9c Date: 2018-12-13 13:13 +0100 http://bitbucket.org/pypy/pypy/changeset/6b10ba9fde9c/
Log: improve random testing of divmod, this finds a bug! bad Stian, no cookie diff --git a/rpython/rlib/test/test_rbigint.py b/rpython/rlib/test/test_rbigint.py --- a/rpython/rlib/test/test_rbigint.py +++ b/rpython/rlib/test/test_rbigint.py @@ -16,12 +16,22 @@ from rpython.rtyper.test.test_llinterp import interpret from rpython.translator.c.test.test_standalone import StandaloneTests -from hypothesis import given, strategies +from hypothesis import given, strategies, example longs = strategies.builds( long, strategies.integers()) ints = strategies.integers(-sys.maxint-1, sys.maxint) +def makelong(data): + numbits = data.draw(strategies.integers(1, 2000)) + r = data.draw(strategies.integers(0, 1 << numbits)) + if data.draw(strategies.booleans()): + return -r + return r + +biglongs = strategies.builds(makelong, strategies.data()) + + def gen_signs(l): for s in l: if s == 0: @@ -1125,7 +1135,6 @@ data = cbuilder.cmdexec('hi there') assert data == '[%d]\n[0, 1]\n' % sys.maxint - class TestHypothesis(object): @given(longs, longs, longs) def test_pow(self, x, y, z): @@ -1140,23 +1149,35 @@ v = f1.pow(f2, f3) assert v.tolong() == res - @given(longs, longs, longs) - def test_divmod(self, x, y, z): + @given(biglongs, biglongs) + @example(510439143470502793407446782273075179618477362188870662225920, + 108089693021945158982483698831267549521) + def test_divmod(self, x, y): + if x < y: + x, y = y, x + f1 = rbigint.fromlong(x) f2 = rbigint.fromlong(y) - f3 = rbigint.fromlong(z) try: - res = divmod(x, y, z) + res = divmod(x, y) except Exception as e: - pytest.raises(type(e), f1.divmod, f2, f3) - if isinstance(int(y), int): - pytest.raises(type(e), f1.int_divmod, f2, f3) + pytest.raises(type(e), f1.divmod, f2) else: - a, b = f1.divmod(f2, f3) - assert a.tolong(), b.tolong() == res - if isinstance(int(y), int): - a, b = f1.int_divmod(f2, f3) - assert a.tolong(), b.tolong() == res + print x, y + a, b = f1.divmod(f2) + assert (a.tolong(), b.tolong()) == res + + @given(biglongs, ints) + def test_int_divmod(self, x, iy): + f1 = rbigint.fromlong(x) + try: + res = divmod(x, iy) + except Exception as e: + pytest.raises(type(e), f1.int_divmod, iy) + else: + print x, iy + a, b = f1.int_divmod(iy) + assert (a.tolong(), b.tolong()) == res @given(longs) def test_hash(self, x): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit