Skip to content

Commit e676e43

Browse files
committed
Add tests for fmpq
1 parent e6becb9 commit e676e43

2 files changed

Lines changed: 110 additions & 5 deletions

File tree

bin/coverage.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ export PYTHON_FLINT_COVERAGE=true
3333

3434
python setup.py build_ext --inplace
3535

36-
coverage run test/test.py
36+
pytest --cov flint test/test.py
3737
#coverage run --append test/dtest.py
3838

39-
coverage report -m
39+
#coverage report -m
4040
coverage html

test/test.py

Lines changed: 108 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,8 @@ def test_fmpz():
8888
assert big.str() == bigstr
8989
assert big.str(condense=10) == '1111111111{...80 digits...}1111111111'
9090
raises(lambda: pow(flint.fmpz(2), 2, 3), NotImplementedError)
91+
92+
def test_fmpz_factor():
9193
assert flint.fmpz(6).gcd(flint.fmpz(9)) == 3
9294
assert flint.fmpz(6).gcd(9) == 3
9395
raises(lambda: flint.fmpz(2).gcd('asd'), TypeError)
@@ -99,13 +101,14 @@ def test_fmpz():
99101
assert n.factor() == [
100102
(73, 1), (137, 1), (401, 1), (1201, 1), (1601, 1), (1676321, 1), (5964848081, 1),
101103
(129694419029057750551385771184564274499075700947656757821537291527196801, 1)]
102-
103104
assert n.factor(trial_limit=100) == [
104105
(73, 1), (137, 1), (401, 1),
105106
(2493516234411471571047384039650897753117456334167082044912715710972543643391271845384040149601, 1)]
106107
assert n.factor_smooth() == [
107108
(73, 1), (137, 1), (401, 1), (1201, 1), (1601, 1),
108109
(1296814508839693536173209832765271992846610925502473758289451540212712414540699659186801, 1)]
110+
111+
def test_fmpz_functions():
109112
T, F, VE, OE = True, False, ValueError, OverflowError
110113
cases = [
111114
# (f, [f(-1), f(0), f(1), f(2), ... f(10)]),
@@ -174,7 +177,6 @@ def test_fmpz():
174177
raises(lambda: flint.fmpz(1).root(-1), ValueError)
175178
raises(lambda: flint.fmpz(1).jacobi('bad'), TypeError)
176179

177-
178180
def test_fmpz_poly():
179181
Z = flint.fmpz_poly
180182
assert Z() == Z([])
@@ -304,6 +306,14 @@ def test_fmpq():
304306
assert Q(1,2) != 1
305307
assert Q(2,3) == Q(flint.fmpz(2),long(3))
306308
assert Q(-2,-4) == Q(1,2)
309+
assert Q("1") == Q(1)
310+
assert Q("1/2") == Q(1,2)
311+
raises(lambda: Q("1.0"), ValueError)
312+
raises(lambda: Q("1.5"), ValueError)
313+
raises(lambda: Q("1/2/3"), ValueError)
314+
raises(lambda: Q([]), ValueError)
315+
raises(lambda: Q(1, []), ValueError)
316+
raises(lambda: Q([], 1), ValueError)
307317
assert bool(Q(0)) == False
308318
assert bool(Q(1)) == True
309319
assert Q(1,3) + Q(2,3) == 1
@@ -320,11 +330,50 @@ def test_fmpq():
320330
assert Q(2,3) / flint.fmpz(5) == Q(2,15)
321331
assert 5 / Q(2,3) == Q(15,2)
322332
assert flint.fmpz(5) / Q(2,3) == Q(15,2)
323-
assert operator.truediv(Q(2,3), 5) == Q(2,15)
333+
assert Q(2,3)/5 == Q(2,15)
334+
assert Q(1,2) ** 2 == Q(1,4)
335+
assert Q(1,2) ** -2 == Q(4)
336+
raises(lambda: Q(0) ** -1, ZeroDivisionError)
337+
raises(lambda: Q(1,2) ** Q(1,2), TypeError)
338+
raises(lambda: Q(1,2) ** [], TypeError)
339+
raises(lambda: [] ** Q(1,2), TypeError)
340+
# XXX: This should NotImplementedError or something.
341+
raises(lambda: pow(Q(1,2),2,3), AssertionError)
342+
343+
raises(lambda: Q(1,2) + [], TypeError)
344+
raises(lambda: Q(1,2) - [], TypeError)
345+
raises(lambda: Q(1,2) * [], TypeError)
346+
raises(lambda: Q(1,2) / [], TypeError)
347+
raises(lambda: [] + Q(1,2), TypeError)
348+
raises(lambda: [] - Q(1,2), TypeError)
349+
raises(lambda: [] * Q(1,2), TypeError)
350+
raises(lambda: [] / Q(1,2), TypeError)
351+
assert (Q(1,2) == 1) is False
352+
assert (Q(1,2) != 1) is True
353+
assert (Q(1,2) < 1) is True
354+
assert (Q(1,2) <= 1) is True
355+
assert (Q(1,2) > 1) is False
356+
assert (Q(1,2) >= 1) is False
357+
assert (Q(1,2) == Q(3,4)) is False
358+
assert (Q(1,2) != Q(3,4)) is True
359+
assert (Q(1,2) < Q(3,4)) is True
360+
assert (Q(1,2) <= Q(3,4)) is True
361+
assert (Q(1,2) > Q(3,4)) is False
362+
assert (Q(1,2) >= Q(3,4)) is False
363+
assert (Q(1,2) == Q(1,2)) is True
364+
assert (Q(1,2) != Q(1,2)) is False
365+
assert (Q(1,2) < Q(1,2)) is False
366+
assert (Q(1,2) <= Q(1,2)) is True
367+
assert (Q(1,2) > Q(1,2)) is False
368+
assert (Q(1,2) >= Q(1,2)) is True
369+
raises(lambda: Q(1,2) > [], TypeError)
370+
raises(lambda: [] < Q(1,2), TypeError)
324371
ctx.pretty = False
325372
assert repr(Q(-2,3)) == "fmpq(-2,3)"
373+
assert repr(Q(3)) == "fmpq(3)"
326374
ctx.pretty = True
327375
assert str(Q(-2,3)) == "-2/3"
376+
assert str(Q(3)) == "3"
328377
assert Q(2,3).p == Q(2,3).numer() == 2
329378
assert Q(2,3).q == Q(2,3).denom() == 3
330379
assert +Q(5,7) == Q(5,7)
@@ -336,6 +385,62 @@ def test_fmpq():
336385
assert raises(lambda: Q(1,2) / Q(0), ZeroDivisionError)
337386
assert raises(lambda: Q(1,2) / 0, ZeroDivisionError)
338387

388+
assert Q(5,3).floor() == flint.fmpz(1)
389+
assert Q(-5,3).floor() == flint.fmpz(-2)
390+
assert Q(5,3).ceil() == flint.fmpz(2)
391+
assert Q(-5,3).ceil() == flint.fmpz(-1)
392+
# XXX: Need __floor__ etc.
393+
#
394+
# assert math.floor(Q(5,3)) == flint.fmpz(1)
395+
# assert math.ceil(Q(5,3)) == flint.fmpz(2)
396+
# assert math.trunc(Q(5,3)) == flint.fmpz(2)
397+
# assert round(Q(5,3)) == 2
398+
399+
d = {}
400+
d[Q(1,2)] = 3
401+
d[Q(1,2)] = 4
402+
assert d == {Q(1,2):4}
403+
404+
assert Q(-5,3).height_bits() == 3
405+
assert Q(-5,3).height_bits(signed=True) == -3
406+
407+
cases = [
408+
(lambda q: q.next(),
409+
[Q(0), Q(1), Q(-1), Q(1,2), Q(-1,2), Q(2), Q(-2), Q(1,3), Q(-1,3), Q(3)]),
410+
(lambda q: q.next(signed=False),
411+
[Q(0), Q(1), Q(1,2), Q(2), Q(1,3), Q(3), Q(2,3), Q(3,2), Q(1,4), Q(4)]),
412+
(lambda q: q.next(minimal=False),
413+
[Q(0), Q(1), Q(-1), Q(1,2), Q(-1,2), Q(2), Q(-2), Q(1,3), Q(-1,3), Q(3,2)]),
414+
(lambda q: q.next(signed=False, minimal=False),
415+
[Q(0), Q(1), Q(1,2), Q(2), Q(1,3), Q(3,2), Q(2,3), Q(3), Q(1,4), Q(4,3)]),
416+
]
417+
for func, values in cases:
418+
for val1, val2 in zip(values[:-1], values[1:]):
419+
assert func(val1) == val2
420+
raises(lambda: Q(-1).next(signed=False), ValueError)
421+
422+
OE = OverflowError
423+
cases = [
424+
(flint.fmpq.bernoulli,
425+
[OE, Q(1), Q(-1,2), Q(1,6), Q(0), Q(-1,30)]),
426+
(lambda n: flint.fmpq.bernoulli(n, cache=True),
427+
[OE, Q(1), Q(-1,2), Q(1,6), Q(0), Q(-1,30)]),
428+
(flint.fmpq.harmonic,
429+
[OE, Q(0), Q(1), Q(3,2), Q(11, 6), Q(25, 12)]),
430+
(lambda n: flint.fmpq.dedekind_sum(n, 3),
431+
[-Q(1,18), 0, Q(1,18), -Q(1,18), 0, Q(1,18), -Q(1,18)]),
432+
]
433+
is_exception = lambda v: isinstance(v, type) and issubclass(v, Exception)
434+
435+
for func, values in cases:
436+
for n, val in enumerate(values, -1):
437+
if is_exception(val):
438+
raises(lambda: func(n), val)
439+
else:
440+
assert func(n) == val
441+
442+
443+
339444
def test_fmpq_poly():
340445
Q = flint.fmpq_poly
341446
Z = flint.fmpz_poly

0 commit comments

Comments
 (0)