1import pytest
2
3from diofant import (Dummy, E, Float, GoldenRatio, I, Integer, Mod, Mul, Pow,
4                     Rational, Symbol, Wild, asin, cbrt, exp, false, log, nan,
5                     oo, pi, simplify, sin, sqrt, zoo)
6from diofant.core.facts import InconsistentAssumptions
7
8
9__all__ = ()
10
11
12def test_symbol_unset():
13    x = Symbol('x', extended_real=True, integer=True)
14    assert x.is_extended_real is True
15    assert x.is_integer is True
16    assert x.is_imaginary is None
17    assert x.is_noninteger is False
18    assert x.is_number is False
19
20
21def test_zero():
22    z = Integer(0)
23    assert z.is_commutative is True
24    assert z.is_integer is True
25    assert z.is_rational is True
26    assert z.is_algebraic is True
27    assert z.is_transcendental is False
28    assert z.is_extended_real is True
29    assert z.is_complex is True
30    assert z.is_noninteger is False
31    assert z.is_irrational is False
32    assert z.is_imaginary is True
33    assert z.is_positive is False
34    assert z.is_negative is False
35    assert z.is_nonpositive is True
36    assert z.is_nonnegative is True
37    assert z.is_even is True
38    assert z.is_odd is False
39    assert z.is_finite is True
40    assert z.is_infinite is False
41    assert z.is_comparable is True
42    assert z.is_prime is False
43    assert z.is_composite is False
44    assert z.is_number is True
45
46
47def test_one():
48    z = Integer(1)
49    assert z.is_commutative is True
50    assert z.is_integer is True
51    assert z.is_rational is True
52    assert z.is_algebraic is True
53    assert z.is_transcendental is False
54    assert z.is_extended_real is True
55    assert z.is_complex is True
56    assert z.is_noninteger is False
57    assert z.is_irrational is False
58    assert z.is_imaginary is False
59    assert z.is_positive is True
60    assert z.is_negative is False
61    assert z.is_nonpositive is False
62    assert z.is_nonnegative is True
63    assert z.is_even is False
64    assert z.is_odd is True
65    assert z.is_finite is True
66    assert z.is_infinite is False
67    assert z.is_comparable is True
68    assert z.is_prime is False
69    assert z.is_number is True
70    assert z.is_composite is False  # issue sympy/sympy#8807
71
72
73def test_negativeone():
74    z = Integer(-1)
75    assert z.is_commutative is True
76    assert z.is_integer is True
77    assert z.is_rational is True
78    assert z.is_algebraic is True
79    assert z.is_transcendental is False
80    assert z.is_extended_real is True
81    assert z.is_complex is True
82    assert z.is_noninteger is False
83    assert z.is_irrational is False
84    assert z.is_imaginary is False
85    assert z.is_positive is False
86    assert z.is_negative is True
87    assert z.is_nonpositive is True
88    assert z.is_nonnegative is False
89    assert z.is_even is False
90    assert z.is_odd is True
91    assert z.is_finite is True
92    assert z.is_infinite is False
93    assert z.is_comparable is True
94    assert z.is_prime is False
95    assert z.is_composite is False
96    assert z.is_number is True
97
98
99def test_infinity():
100    assert oo.is_commutative is True
101    assert oo.is_integer is False
102    assert oo.is_rational is False
103    assert oo.is_algebraic is False
104    assert oo.is_transcendental is False
105    assert oo.is_extended_real is True
106    assert oo.is_complex is False
107    assert oo.is_noninteger is False
108    assert oo.is_irrational is False
109    assert oo.is_imaginary is False
110    assert oo.is_positive is True
111    assert oo.is_negative is False
112    assert oo.is_nonpositive is False
113    assert oo.is_nonnegative is True
114    assert oo.is_even is False
115    assert oo.is_odd is False
116    assert oo.is_finite is False
117    assert oo.is_infinite is True
118    assert oo.is_comparable is True
119    assert oo.is_prime is False
120    assert oo.is_composite is False
121    assert oo.is_number is True
122    assert oo.is_zero is False
123    assert oo.is_nonzero is True  # issue sympy/sympy#21107
124
125
126def test_neg_infinity():
127    mm = -oo
128
129    assert mm.is_commutative is True
130    assert mm.is_integer is False
131    assert mm.is_rational is False
132    assert mm.is_algebraic is False
133    assert mm.is_transcendental is False
134    assert mm.is_extended_real is True
135    assert mm.is_complex is False
136    assert mm.is_noninteger is False
137    assert mm.is_irrational is False
138    assert mm.is_imaginary is False
139    assert mm.is_positive is False
140    assert mm.is_negative is True
141    assert mm.is_nonpositive is True
142    assert mm.is_nonnegative is False
143    assert mm.is_even is False
144    assert mm.is_odd is False
145    assert mm.is_finite is False
146    assert mm.is_infinite is True
147    assert mm.is_comparable is True
148    assert mm.is_prime is False
149    assert mm.is_composite is False
150    assert mm.is_number is True
151
152
153def test_zoo():
154    assert zoo.is_complex is False
155    assert zoo.is_real is False
156    assert zoo.is_prime is False
157    assert zoo.is_infinite
158
159
160def test_nan():
161    assert nan.is_commutative is True
162    assert nan.is_integer is False
163    assert nan.is_rational is False
164    assert nan.is_algebraic is False
165    assert nan.is_transcendental is False
166    assert nan.is_extended_real is None
167    assert nan.is_complex is False
168    assert nan.is_noninteger is False
169    assert nan.is_irrational is False
170    assert nan.is_imaginary is False
171    assert nan.is_positive is None
172    assert nan.is_negative is None
173    assert nan.is_nonpositive is None
174    assert nan.is_nonnegative is None
175    assert nan.is_even is False
176    assert nan.is_odd is False
177    assert nan.is_finite is False
178    assert nan.is_infinite is None
179    assert nan.is_comparable is False
180    assert nan.is_prime is False
181    assert nan.is_composite is False
182    assert nan.is_number is True
183
184
185def test_pos_rational():
186    r = Rational(3, 4)
187    assert r.is_commutative is True
188    assert r.is_integer is False
189    assert r.is_rational is True
190    assert r.is_algebraic is True
191    assert r.is_transcendental is False
192    assert r.is_extended_real is True
193    assert r.is_complex is True
194    assert r.is_noninteger is True
195    assert r.is_irrational is False
196    assert r.is_imaginary is False
197    assert r.is_positive is True
198    assert r.is_negative is False
199    assert r.is_nonpositive is False
200    assert r.is_nonnegative is True
201    assert r.is_even is False
202    assert r.is_odd is False
203    assert r.is_finite is True
204    assert r.is_infinite is False
205    assert r.is_comparable is True
206    assert r.is_prime is False
207    assert r.is_composite is False
208
209    r = Rational(1, 4)
210    assert r.is_nonpositive is False
211    assert r.is_positive is True
212    assert r.is_negative is False
213    assert r.is_nonnegative is True
214    r = Rational(5, 4)
215    assert r.is_negative is False
216    assert r.is_positive is True
217    assert r.is_nonpositive is False
218    assert r.is_nonnegative is True
219    r = Rational(5, 3)
220    assert r.is_nonnegative is True
221    assert r.is_positive is True
222    assert r.is_negative is False
223    assert r.is_nonpositive is False
224
225
226def test_neg_rational():
227    r = Rational(-3, 4)
228    assert r.is_positive is False
229    assert r.is_nonpositive is True
230    assert r.is_negative is True
231    assert r.is_nonnegative is False
232    r = Rational(-1, 4)
233    assert r.is_nonpositive is True
234    assert r.is_positive is False
235    assert r.is_negative is True
236    assert r.is_nonnegative is False
237    r = Rational(-5, 4)
238    assert r.is_negative is True
239    assert r.is_positive is False
240    assert r.is_nonpositive is True
241    assert r.is_nonnegative is False
242    r = Rational(-5, 3)
243    assert r.is_nonnegative is False
244    assert r.is_positive is False
245    assert r.is_negative is True
246    assert r.is_nonpositive is True
247
248
249def test_pi():
250    z = pi
251    assert z.is_commutative is True
252    assert z.is_integer is False
253    assert z.is_rational is False
254    assert z.is_algebraic is False
255    assert z.is_transcendental is True
256    assert z.is_extended_real is True
257    assert z.is_complex is True
258    assert z.is_noninteger is True
259    assert z.is_irrational is True
260    assert z.is_imaginary is False
261    assert z.is_positive is True
262    assert z.is_negative is False
263    assert z.is_nonpositive is False
264    assert z.is_nonnegative is True
265    assert z.is_even is False
266    assert z.is_odd is False
267    assert z.is_finite is True
268    assert z.is_infinite is False
269    assert z.is_comparable is True
270    assert z.is_prime is False
271    assert z.is_composite is False
272
273
274def test_E():
275    z = E
276    assert z.is_commutative is True
277    assert z.is_integer is False
278    assert z.is_rational is False
279    assert z.is_algebraic is False
280    assert z.is_transcendental is True
281    assert z.is_extended_real is True
282    assert z.is_complex is True
283    assert z.is_noninteger is True
284    assert z.is_irrational is True
285    assert z.is_imaginary is False
286    assert z.is_positive is True
287    assert z.is_negative is False
288    assert z.is_nonpositive is False
289    assert z.is_nonnegative is True
290    assert z.is_even is False
291    assert z.is_odd is False
292    assert z.is_finite is True
293    assert z.is_infinite is False
294    assert z.is_comparable is True
295    assert z.is_prime is False
296    assert z.is_composite is False
297
298
299def test_I():
300    z = I
301    assert z.is_commutative is True
302    assert z.is_integer is False
303    assert z.is_rational is False
304    assert z.is_algebraic is True
305    assert z.is_transcendental is False
306    assert z.is_extended_real is False
307    assert z.is_complex is True
308    assert z.is_noninteger is False
309    assert z.is_irrational is False
310    assert z.is_imaginary is True
311    assert z.is_positive is False
312    assert z.is_negative is False
313    assert z.is_nonpositive is False
314    assert z.is_nonnegative is False
315    assert z.is_even is False
316    assert z.is_odd is False
317    assert z.is_finite is True
318    assert z.is_infinite is False
319    assert z.is_comparable is False
320    assert z.is_prime is False
321    assert z.is_composite is False
322
323
324def test_symbol_real():
325    # issue sympy/sympy#3848
326    a = Symbol('a', extended_real=False)
327
328    assert a.is_extended_real is False
329    assert a.is_integer is False
330    assert a.is_negative is False
331    assert a.is_positive is False
332    assert a.is_nonnegative is False
333    assert a.is_nonpositive is False
334    assert a.is_nonzero is True
335
336
337def test_symbol_zero():
338    x = Symbol('x', zero=True)
339    assert x.is_positive is False
340    assert x.is_nonpositive
341    assert x.is_negative is False
342    assert x.is_nonnegative
343    assert x.is_zero is True
344    assert x.is_nonzero is False
345    assert x.is_finite is True
346
347    # issue sympy/sympy#9165
348    f = Symbol('f', finite=False)
349    assert 0/x == nan
350    assert 0*(1/x) == nan
351    assert 0*f == nan
352
353
354def test_symbol_positive():
355    x = Symbol('x', positive=True)
356    assert x.is_positive is True
357    assert x.is_nonpositive is False
358    assert x.is_negative is False
359    assert x.is_nonnegative is True
360    assert x.is_zero is False
361    assert x.is_nonzero is True
362
363
364def test_neg_symbol_positive():
365    x = -Symbol('x', positive=True)
366    assert x.is_positive is False
367    assert x.is_nonpositive is True
368    assert x.is_negative is True
369    assert x.is_nonnegative is False
370    assert x.is_zero is False
371    assert x.is_nonzero is True
372
373
374def test_symbol_nonpositive():
375    x = Symbol('x', nonpositive=True)
376    assert x.is_positive is False
377    assert x.is_nonpositive is True
378    assert x.is_negative is None
379    assert x.is_nonnegative is None
380    assert x.is_zero is None
381    assert x.is_nonzero is None
382
383
384def test_neg_symbol_nonpositive():
385    x = -Symbol('x', nonpositive=True)
386    assert x.is_positive is None
387    assert x.is_nonpositive is None
388    assert x.is_negative is False
389    assert x.is_nonnegative is True
390    assert x.is_zero is None
391    assert x.is_nonzero is None
392
393
394def test_symbol_falsepositive():
395    x = Symbol('x', positive=False)
396    assert x.is_positive is False
397    assert x.is_nonpositive is None
398    assert x.is_negative is None
399    assert x.is_nonnegative is None
400    assert x.is_zero is None
401    assert x.is_nonzero is None
402
403
404def test_neg_symbol_falsepositive():
405    x = -Symbol('x', positive=False)
406    assert x.is_positive is None
407    assert x.is_nonpositive is None
408    assert x.is_negative is False
409    assert x.is_nonnegative is None
410    assert x.is_zero is None
411    assert x.is_nonzero is None
412
413
414def test_symbol_falsepositive_real():
415    x = Symbol('x', positive=False, extended_real=True)
416    assert x.is_positive is False
417    assert x.is_nonpositive is True
418    assert x.is_negative is None
419    assert x.is_nonnegative is None
420    assert x.is_zero is None
421    assert x.is_nonzero is None
422
423
424def test_neg_symbol_falsepositive_real():
425    x = -Symbol('x', positive=False, extended_real=True)
426    assert x.is_positive is None
427    assert x.is_nonpositive is None
428    assert x.is_negative is False
429    assert x.is_nonnegative is True
430    assert x.is_zero is None
431    assert x.is_nonzero is None
432
433
434def test_symbol_falsenonnegative():
435    x = Symbol('x', nonnegative=False)
436    assert x.is_positive is False
437    assert x.is_nonpositive is None
438    assert x.is_negative is None
439    assert x.is_nonnegative is False
440    assert x.is_zero is False
441    assert x.is_nonzero is True
442
443
444def test_neg_symbol_falsenonnegative():
445    x = -Symbol('x', nonnegative=False)
446    assert x.is_positive is None
447    assert x.is_negative is False
448    assert x.is_nonnegative is None
449    assert x.is_zero is False
450    assert x.is_nonzero is True
451
452
453@pytest.mark.xfail
454def test_neg_symbol_falsenonnegative_xfail():
455    x = -Symbol('x', nonnegative=False)
456    assert x.is_nonpositive is False
457
458
459def test_symbol_falsenonnegative_real():
460    x = Symbol('x', nonnegative=False, extended_real=True)
461    assert x.is_positive is False
462    assert x.is_nonpositive is True
463    assert x.is_negative is True
464    assert x.is_nonnegative is False
465    assert x.is_zero is False
466    assert x.is_nonzero is True
467
468
469def test_neg_symbol_falsenonnegative_real():
470    x = -Symbol('x', nonnegative=False, extended_real=True)
471    assert x.is_positive is True
472    assert x.is_nonpositive is False
473    assert x.is_negative is False
474    assert x.is_nonnegative is True
475    assert x.is_zero is False
476    assert x.is_nonzero is True
477
478
479def test_prime():
480    assert Integer(-1).is_prime is False
481    assert Integer(-2).is_prime is False
482    assert Integer(-4).is_prime is False
483    assert Integer(0).is_prime is False
484    assert Integer(1).is_prime is False
485    assert Integer(2).is_prime is True
486    assert Integer(17).is_prime is True
487    assert Integer(4).is_prime is False
488
489
490def test_composite():
491    assert Integer(-1).is_composite is False
492    assert Integer(-2).is_composite is False
493    assert Integer(-4).is_composite is False
494    assert Integer(0).is_composite is False
495    assert Integer(2).is_composite is False
496    assert Integer(17).is_composite is False
497    assert Integer(4).is_composite is True
498
499
500def test_prime_symbol():
501    x = Symbol('x', prime=True)
502    assert x.is_prime is True
503    assert x.is_integer is True
504    assert x.is_positive is True
505    assert x.is_negative is False
506    assert x.is_nonpositive is False
507    assert x.is_nonnegative is True
508
509    x = Symbol('x', prime=False)
510    assert x.is_prime is False
511    assert x.is_integer is None
512    assert x.is_positive is None
513    assert x.is_negative is None
514    assert x.is_nonpositive is None
515    assert x.is_nonnegative is None
516
517
518def test_symbol_noncommutative():
519    x = Symbol('x', commutative=True)
520    assert x.is_complex is None
521
522    x = Symbol('x', commutative=False)
523    assert x.is_integer is False
524    assert x.is_rational is False
525    assert x.is_algebraic is False
526    assert x.is_irrational is False
527    assert x.is_extended_real is False
528    assert x.is_complex is False
529
530
531def test_other_symbol():
532    x = Symbol('x', integer=True)
533    assert x.is_integer is True
534    assert x.is_extended_real is True
535    assert x.is_finite is True
536
537    x = Symbol('x', integer=True, nonnegative=True)
538    assert x.is_integer is True
539    assert x.is_nonnegative is True
540    assert x.is_negative is False
541    assert x.is_positive is None
542
543    x = Symbol('x', integer=True, nonpositive=True)
544    assert x.is_integer is True
545    assert x.is_nonpositive is True
546    assert x.is_positive is False
547    assert x.is_negative is None
548
549    x = Symbol('x', odd=True)
550    assert x.is_odd is True
551    assert x.is_even is False
552    assert x.is_integer is True
553
554    x = Symbol('x', odd=False)
555    assert x.is_odd is False
556    assert x.is_even is None
557    assert x.is_integer is None
558
559    x = Symbol('x', even=True)
560    assert x.is_even is True
561    assert x.is_odd is False
562    assert x.is_integer is True
563    assert x.is_finite is True
564
565    x = Symbol('x', even=False)
566    assert x.is_even is False
567    assert x.is_odd is None
568    assert x.is_integer is None
569    assert x.is_finite is None  # issue sympy/sympy#16432
570
571    x = Symbol('x', integer=True, nonnegative=True)
572    assert x.is_integer is True
573    assert x.is_nonnegative is True
574
575    x = Symbol('x', integer=True, nonpositive=True)
576    assert x.is_integer is True
577    assert x.is_nonpositive is True
578
579    with pytest.raises(AttributeError):
580        x.is_extended_real = False
581
582    x = Symbol('x', algebraic=True)
583    assert x.is_transcendental is False
584    x = Symbol('x', transcendental=True)
585    assert x.is_algebraic is False
586    assert x.is_rational is False
587    assert x.is_integer is False
588
589    x = Symbol('x', zero=False)
590    assert x.is_nonzero is True  # issue sympy/sympy#16431
591
592
593def test_sympyissue_3825():
594    """catch: hash instability"""
595    x = Symbol('x')
596    y = Symbol('y')
597    a1 = x + y
598    a2 = y + x
599    a2.is_comparable
600
601    h1 = hash(a1)
602    h2 = hash(a2)
603    assert h1 == h2
604
605
606def test_sympyissue_4822():
607    z = cbrt(-1)*(1 - I*sqrt(3))
608    assert z.is_extended_real in [True, None]
609
610
611def test_hash_vs_typeinfo():
612    """Seemingly different typeinfo, but in fact equal."""
613    # the following two are semantically equal
614    x1 = Symbol('x', even=True)
615    x2 = Symbol('x', integer=True, odd=False)
616
617    assert hash(x1) == hash(x2)
618    assert x1 == x2
619
620
621def test_hash_vs_typeinfo_2():
622    """Different typeinfo should mean !eq"""
623    # the following two are semantically different
624    x = Symbol('x')
625    x1 = Symbol('x', even=True)
626
627    assert x != x1
628    assert hash(x) != hash(x1)  # This might fail with very low probability
629
630
631def test_hash_vs_eq():
632    """catch: different hash for equal objects"""
633    a = 1 + pi    # important: do not fold it into a Number instance
634    ha = hash(a)  # it should be Add/Mul/... to trigger the bug
635
636    a.is_positive   # this uses .evalf() and deduces it is positive
637    assert a.is_positive is True
638
639    # be sure that hash stayed the same
640    assert ha == hash(a)
641
642    # now b should be the same expression
643    b = a.expand(trig=True)
644    hb = hash(b)
645
646    assert a == b
647    assert ha == hb
648
649
650def test_Add_is_pos_neg():
651    # these cover lines not covered by the rest of tests in core
652    n = Symbol('n', negative=True, infinite=True)
653    nn = Symbol('n', nonnegative=True, infinite=True)
654    np = Symbol('n', nonpositive=True, infinite=True)
655    p = Symbol('p', positive=True, infinite=True)
656    r = Dummy(extended_real=True, finite=False)
657    x = Symbol('x')
658    xf = Symbol('xb', finite=True, real=True)
659    assert (n + p).is_positive is None
660    assert (n + x).is_positive is None
661    assert (p + x).is_positive is None
662    assert (n + p).is_negative is None
663    assert (n + x).is_negative is None
664    assert (p + x).is_negative is None
665
666    assert (n + xf).is_positive is False
667    assert (p + xf).is_positive is True
668    assert (n + xf).is_negative is True
669    assert (p + xf).is_negative is False
670
671    assert (x - oo).is_negative is None  # issue sympy/sympy#7798
672    # issue sympy/sympy#8046, 16.2
673    assert (p + nn).is_positive
674    assert (n + np).is_negative
675    assert (p + r).is_positive is None
676
677
678def test_Add_is_imaginary():
679    nn = Dummy(nonnegative=True, finite=True)
680    assert (I*nn + I).is_imaginary  # issue sympy/sympy#8046, 17
681
682
683def test_Add_is_algebraic():
684    a = Symbol('a', algebraic=True)
685    b = Symbol('a', algebraic=True)
686    na = Symbol('na', algebraic=False)
687    nb = Symbol('nb', algebraic=False)
688    x = Symbol('x')
689    assert (a + b).is_algebraic
690    assert (na + nb).is_algebraic is None
691    assert (a + na).is_algebraic is False
692    assert (a + x).is_algebraic is None
693    assert (na + x).is_algebraic is None
694
695
696def test_Mul_is_algebraic():
697    a = Symbol('a', algebraic=True)
698    b = Symbol('b', algebraic=True)
699    na = Symbol('na', algebraic=False)
700    an = Symbol('an', algebraic=True, nonzero=True)
701    nb = Symbol('nb', algebraic=False)
702    x = Symbol('x')
703    assert (a*b).is_algebraic
704    assert (na*nb).is_algebraic is None
705    assert (a*na).is_algebraic is None
706    assert (an*na).is_algebraic is False
707    assert (a*x).is_algebraic is None
708    assert (na*x).is_algebraic is None
709
710
711def test_Pow_is_algebraic():
712    e = Symbol('e', algebraic=True)
713
714    assert Pow(1, e, evaluate=False).is_algebraic
715    assert Pow(0, e, evaluate=False).is_algebraic
716
717    a = Symbol('a', algebraic=True)
718    an = Symbol('an', algebraic=True, nonzero=True)
719    na = Symbol('na', algebraic=False)
720    ia = Symbol('ia', algebraic=True, irrational=True)
721    ib = Symbol('ib', algebraic=True, irrational=True)
722    r = Symbol('r', rational=True, nonzero=True)
723    x = Symbol('x')
724    assert (an**r).is_algebraic
725    assert (a**r**2).is_algebraic
726    assert (a**x).is_algebraic is None
727    assert (na**r).is_algebraic is False
728    assert (ia**r).is_algebraic
729    assert (ia**ib).is_algebraic is False
730
731    assert (a**e).is_algebraic is None
732
733    # Gelfond-Schneider constant:
734    assert Pow(2, sqrt(2), evaluate=False).is_algebraic is False
735
736    assert Pow(GoldenRatio, sqrt(3), evaluate=False).is_algebraic is False
737
738    # sympy/sympy#8649
739    t = Symbol('t', real=True, transcendental=True)
740    n = Symbol('n', integer=True)
741    assert (t**n).is_algebraic is None
742    assert (t**n).is_integer is None
743
744    assert exp(t).is_algebraic is None
745    assert exp(n).is_algebraic is None
746
747    i = Symbol('i', integer=True)
748    p = 1/(i - 1)
749    assert p.is_algebraic is None
750    assert p.is_finite is None  # issue sympy/sympy#17453
751
752    # issue sympy/sympy#20617
753    assert exp(I*2*pi/3).is_algebraic is True
754
755
756def test_Mul_is_infinite():
757    x = Symbol('x')
758    f = Symbol('f', finite=True)
759    i = Symbol('i', infinite=True)
760    z = Dummy(zero=True)
761    nzf = Dummy(finite=True, zero=False)
762    assert (x*f).is_finite is None
763    assert (x*i).is_finite is None
764    assert (f*i).is_finite is False
765    assert (x*f*i).is_finite is None
766    assert (z*i).is_finite is False
767    assert (nzf*i).is_finite is False
768    assert (z*f).is_finite is True
769    assert Mul(0, f, evaluate=False).is_finite is True
770    assert Mul(0, i, evaluate=False).is_finite is False
771
772    assert (x*f).is_infinite is None
773    assert (x*i).is_infinite is None
774    assert (f*i).is_infinite is None
775    assert (x*f*i).is_infinite is None
776    assert (z*i).is_infinite is nan.is_infinite
777    assert (nzf*i).is_infinite is True
778    assert (z*f).is_infinite is False
779    assert Mul(0, f, evaluate=False).is_infinite is False
780    assert Mul(0, i, evaluate=False).is_infinite is nan.is_infinite
781
782
783def test_special_is_rational():
784    i = Symbol('i', integer=True)
785    i2 = Symbol('i2', integer=True)
786    ni = Symbol('ni', integer=True, nonzero=True)
787    r = Symbol('r', rational=True)
788    rn = Symbol('r', rational=True, nonzero=True)
789    nr = Symbol('nr', irrational=True)
790    x = Symbol('x')
791    assert sqrt(3).is_rational is False
792    assert (3 + sqrt(3)).is_rational is False
793    assert (3*sqrt(3)).is_rational is False
794    z = Symbol('z', zero=True)
795    assert exp(z).is_rational
796    assert exp(0, evaluate=False).is_rational
797    assert exp(3).is_rational is False
798    assert exp(ni).is_rational is False
799    assert exp(rn).is_rational is False
800    assert exp(x).is_rational is None
801    assert exp(log(3), evaluate=False).is_rational is True
802    assert log(exp(3), evaluate=False).is_rational is True
803    assert log(3).is_rational is False
804    assert log(ni + 1).is_rational is False
805    assert log(rn + 1).is_rational is False
806    assert log(x).is_rational is None
807    assert (sqrt(3) + sqrt(5)).is_rational is None
808    assert (sqrt(3) + pi).is_rational is False
809    assert (x**i).is_rational is None
810    assert (i**i).is_rational is True
811    assert (i**i2).is_rational is None
812    assert (r**i).is_rational is None
813    assert (r**r).is_rational is None
814    assert (r**x).is_rational is None
815    assert (nr**i).is_rational is None  # issue sympy/sympy#8598
816    assert (nr**Symbol('z', zero=True)).is_rational
817    assert sin(1).is_rational is False
818    assert sin(ni).is_rational is False
819    assert sin(rn).is_rational is False
820    assert sin(x).is_rational is None
821    assert asin(rn).is_rational is False
822    assert sin(asin(3), evaluate=False).is_rational is True
823
824
825def test_sanitize_assumptions():
826    # issue sympy/sympy#6666
827    for cls in (Symbol, Dummy, Wild):
828        x = cls('x', extended_real=1, positive=0)
829        assert x.is_extended_real is True
830        assert x.is_positive is False
831        assert cls('', extended_real=True, positive=None).is_positive is None
832        pytest.raises(ValueError, lambda: cls('', commutative=None))
833    pytest.raises(ValueError, lambda: Symbol._sanitize({'commutative': None}))
834
835
836def test_special_assumptions():
837    e = -3 - sqrt(5) + (-sqrt(10)/2 - sqrt(2)/2)**2
838    assert simplify(e < 0) is false
839    assert simplify(e > 0) is false
840    assert (e == 0) is False  # it's not a literal 0
841    assert e.equals(0) is True
842
843
844def test_inconsistent():
845    # cf. issues sympy/sympy#5795 and sympy/sympy#5545
846    pytest.raises(InconsistentAssumptions, lambda: Symbol('x', extended_real=True,
847                                                          commutative=False))
848
849
850def test_sympyissue_2730():
851    assert (1/(1 + I)).is_extended_real is False
852
853
854def test_sympyissue_4149():
855    assert (3 + I).is_complex
856    assert (3 + I).is_imaginary is False
857    assert (3*I + pi*I).is_imaginary
858    y = Symbol('y', real=True)
859    assert (3*I + pi*I + y*I).is_imaginary is True
860    p = Symbol('p', positive=True, finite=True)
861    assert (3*I + pi*I + p*I).is_imaginary
862    n = Symbol('n', negative=True, finite=True)
863    assert (-3*I - pi*I + n*I).is_imaginary
864
865    i = Symbol('i', imaginary=True)
866    assert ([(i**a).is_imaginary for a in range(4)] ==
867            [False, True, False, True])
868
869    # tests from the PR sympy/sympy#7887:
870    e = -sqrt(3)*I/2 + Float(0.866025403784439)*I
871    assert e.is_extended_real is False
872    assert e.is_imaginary
873
874
875def test_sympyissue_2920():
876    n = Symbol('n', real=True, negative=True)
877    assert sqrt(n).is_imaginary
878
879
880def test_sympyissue_7899():
881    x = Symbol('x', extended_real=True)
882    assert (I*x).is_extended_real is None
883    assert ((x - I)*(x - 1)).is_zero is None
884    assert ((x - I)*(x - 1)).is_extended_real is None
885
886
887@pytest.mark.xfail
888def test_sympyissue_7993():
889    x = Symbol('x', integer=True)
890    y = Symbol('y', noninteger=True)
891    assert (x - y).is_nonzero is True
892
893
894def test_sympyissue_8075():
895    pytest.raises(InconsistentAssumptions, lambda: Dummy(zero=True, finite=False))
896    pytest.raises(InconsistentAssumptions, lambda: Dummy(zero=True, infinite=True))
897
898
899def test_sympyissue_8642():
900    x = Symbol('x', extended_real=True, integer=False)
901    assert (x*2).is_integer is None
902
903
904def test_sympyissue_10024():
905    x = Dummy('x')
906    assert Mod(x, 2*pi).is_zero is None
907
908
909def test_sympyissue_16530():
910    x = Symbol('x')
911    e = 1/abs(x)
912    assert e.is_real is None
913    assert e.is_extended_real is None
914
915
916def test_sympyissue_17555():
917    x = Symbol('x', infinite=True, extended_real=True)
918    assert x.is_positive is None
919    assert (-x).is_positive is None
920
921
922def test_sympyissue_17556():
923    z = I*oo
924    assert z.is_imaginary is False
925    assert z.is_finite is False
926