/test3/gmpy_test_mpq.py

http://gmpy.googlecode.com/ · Python · 327 lines · 114 code · 17 blank · 196 comment · 6 complexity · 998f5884b3f3cc992682f214e091e366 MD5 · raw file

  1. # partial unit test for gmpy2 mpq functionality
  2. # relies on Tim Peters' "doctest.py" test-driver
  3. r'''
  4. >>> list([x for x in dir(a) if x != '__dir__'])
  5. ['__abs__', '__add__', '__bool__', '__ceil__', '__class__', '__delattr__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__int__', '__le__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__pos__', '__pow__', '__radd__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__round__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', 'denominator', 'digits', 'numerator']
  6. >>>
  7. '''
  8. import gmpy2 as _g, doctest,sys
  9. import fractions
  10. F=fractions.Fraction
  11. __test__={}
  12. a=_g.mpq('123/456')
  13. b=_g.mpq('789/123')
  14. af=F(123,456)
  15. bf=F(789,123)
  16. __test__['compat']=\
  17. r'''
  18. >>> a==af
  19. True
  20. >>> af==a
  21. True
  22. >>> a < af
  23. False
  24. >>> a <= af
  25. True
  26. >>> a > af
  27. False
  28. >>> a >= af
  29. True
  30. >>> af < a
  31. False
  32. >>> af <= a
  33. True
  34. >>> af > a
  35. False
  36. >>> af >= a
  37. True
  38. >>> a+bf
  39. mpq(41657,6232)
  40. >>> divmod(123*a, b) == divmod(123*af, bf)
  41. True
  42. >>> divmod(-23*a, b) == divmod(-23*af, bf)
  43. True
  44. >>> divmod(a+17, b-23) == divmod(af+17, bf-23)
  45. True
  46. >>> divmod(-a, -b) == divmod(-af, -bf)
  47. True
  48. '''
  49. __test__['elemop']=\
  50. r'''
  51. >>> a+b
  52. mpq(41657,6232)
  53. >>> a-b
  54. mpq(-38295,6232)
  55. >>> a*b
  56. mpq(263,152)
  57. >>> a/b
  58. mpq(1681,39976)
  59. >>> a//b
  60. mpz(0)
  61. >>> a//-b
  62. mpz(-1)
  63. >>> -a//b
  64. mpz(-1)
  65. >>> -a//-b
  66. mpz(0)
  67. >>> b+a
  68. mpq(41657,6232)
  69. >>> b-a
  70. mpq(38295,6232)
  71. >>> b*a
  72. mpq(263,152)
  73. >>> b/a
  74. mpq(39976,1681)
  75. >>> b//a
  76. mpz(23)
  77. >>> a+1
  78. mpq(193,152)
  79. >>> 1+a
  80. mpq(193,152)
  81. >>> a-1
  82. mpq(-111,152)
  83. >>> 1-a
  84. mpq(111,152)
  85. >>> a*1
  86. mpq(41,152)
  87. >>> 1*a
  88. mpq(41,152)
  89. >>> a/1
  90. mpq(41,152)
  91. >>> 1/a
  92. mpq(152,41)
  93. >>> a % b
  94. mpq(41,152)
  95. >>> a % -b
  96. mpq(-38295,6232)
  97. >>> 2*a % 7*b
  98. mpq(263,76)
  99. >>> -a
  100. mpq(-41,152)
  101. >>> abs(-a)
  102. mpq(41,152)
  103. >>> _g.sign(b-a)
  104. 1
  105. >>> _g.sign(b-b)
  106. 0
  107. >>> _g.sign(a-b)
  108. -1
  109. >>> _g.sign(a)
  110. 1
  111. >>> _g.sign(-a)
  112. -1
  113. >>> z=b-b; _g.sign(z)
  114. 0
  115. >>> _g.numer(a) == a.numerator
  116. True
  117. >>> _g.denom(a) == a.denominator
  118. True
  119. >>> an=_g.numer(a); ad=_g.denom(a);
  120. >>> an==0 or 1==a*_g.mpq(ad,an)
  121. 1
  122. >>> bn=_g.numer(b); bd=_g.denom(b);
  123. >>> bn==0 or 1==b*_g.mpq(bd,bn)
  124. 1
  125. >>> zn=_g.numer(z); zd=_g.denom(z);
  126. >>> zn==0 or 1==z*_g.mpq(zd,zn)
  127. 1
  128. >>> (a+b) == _g.mpq(an*bd+ad*bn,ad*bd)
  129. 1
  130. >>> (a+z) == _g.mpq(an*zd+ad*zn,ad*zd)
  131. 1
  132. >>> (a+a) == _g.mpq(an*ad+ad*an,ad*ad)
  133. 1
  134. >>> import pickle
  135. >>> pickle.loads(pickle.dumps(_g.mpq(1234,6789)))
  136. mpq(1234,6789)
  137. >>>
  138. '''
  139. __test__['cmpr']=\
  140. r'''
  141. >>> c=_g.mpq(a)
  142. >>> c is a
  143. 1
  144. >>> c==a
  145. 1
  146. >>> c>a
  147. 0
  148. >>> c<a
  149. 0
  150. >>> a>b
  151. 0
  152. >>> a<b
  153. 1
  154. >>> not _g.mpq(0)
  155. 1
  156. >>> not a
  157. 0
  158. >>> a>1
  159. 0
  160. >>> a>1.0
  161. 0
  162. >>> a<1
  163. 1
  164. >>> a<1.0
  165. 1
  166. >>> a==1
  167. 0
  168. >>> a==1.0
  169. 0
  170. >>> int(1/a)
  171. 3
  172. >>> int(-1/a)
  173. -3
  174. >>>
  175. '''
  176. __test__['format']=\
  177. r'''
  178. >>> str(a)
  179. '41/152'
  180. >>> repr(a)
  181. 'mpq(41,152)'
  182. >>> a==eval(repr(a),_g.__dict__)
  183. 1
  184. >>> str(-a)
  185. '-41/152'
  186. >>> repr(-a)
  187. 'mpq(-41,152)'
  188. >>> (-a)==eval(repr(-a),_g.__dict__)
  189. 1
  190. >>> for i in range(1,7):
  191. ... for j in range(3,10):
  192. ... if _g.mpq(i,j) != _g.mpq("%d/%d"%(i,j)):
  193. ... print('er1:',i,j); break
  194. ... aa=_g.mpq(i,j); ai=_g.numer(aa); aj=_g.denom(aa)
  195. ... if aj!=1 and str(aa) != ("%d/%d"%(ai,aj)):
  196. ... print('er2:',i,j,str(aa),("%d/%d"%(ai,aj))); break
  197. ... if aj==1 and str(aa) != ("%d"%ai):
  198. ... print('er3:',i,j,str(aa),"%d"%ai); break
  199. ... if aj!=1 and repr(aa) != ("mpq(%d,%d)"%(ai,aj)):
  200. ... print('er4:',i,j,repr(aa),("mpq(%d,%d)"%(ai,aj))); break
  201. ... if aj==1 and repr(aa) != ("mpq(%d,%d)"%(ai,aj)):
  202. ... print('er5:',i,j,repr(aa),"mpq(%d,%d)"%(ai,aj)); break
  203. >>> fmo='_g.mpq('+hex(a.numerator)+','+hex(a.denominator)+')'
  204. >>> fmo
  205. '_g.mpq(0x29,0x98)'
  206. >>> eval(fmo)==a
  207. 1
  208. >>> fmo='_g.mpq("'+_g.numer(a).digits(30)+'/'+_g.denom(a).digits(30)+'",30)'
  209. >>> fmo
  210. '_g.mpq("1b/52",30)'
  211. >>> eval(fmo)==a
  212. 1
  213. >>> _g.digits(a,30)
  214. '1b/52'
  215. >>> a.digits(30)
  216. '1b/52'
  217. >>> _g.mpq(1000*1000*1000*1000*1000*1000*1000,23)
  218. mpq(1000000000000000000000,23)
  219. >>> _g.mpq(23,1000*1000*1000*1000*1000*1000*1000)
  220. mpq(23,1000000000000000000000)
  221. >>> _g.mpq(23**15,1000**7)
  222. mpq(266635235464391245607,1000000000000000000000)
  223. >>> x=_g.mpq('234/567')
  224. >>> del x
  225. >>> _g.mpq('7788')
  226. mpq(7788,1)
  227. >>> _g.mpq('12.34')
  228. mpq(617,50)
  229. '''
  230. __test__['binio']=\
  231. r'''
  232. >>> a == _g.from_binary(_g.to_binary(a))
  233. True
  234. >>> -a == _g.from_binary(_g.to_binary(-a))
  235. True
  236. '''
  237. __test__['power']=\
  238. r'''
  239. >>> _g.mpq(2,3)**3
  240. mpq(8,27)
  241. >>> _g.mpq(8,27)**_g.mpq('2/3')
  242. mpfr('0.44444444444444448')
  243. >>> _g.mpq(2,3)**-3
  244. mpq(27,8)
  245. >>> _g.mpq(8,27)**_g.mpq('-2/3')
  246. mpfr('2.25')
  247. >>> _g.mpq(3)**3 == _g.mpz(3)**3
  248. True
  249. >>> (a**-7) == 1/(a**7)
  250. True
  251. >>> (b**5) == 1/(b**-5)
  252. True
  253. >>>
  254. '''
  255. __test__['qdiv']=\
  256. r'''
  257. >>> _g.qdiv(12,2)
  258. mpz(6)
  259. >>> _g.qdiv(12,5)
  260. mpq(12,5)
  261. >>> a is _g.qdiv(a)
  262. 1
  263. >>> a is _g.qdiv(a,1)
  264. 1
  265. >>> a is _g.qdiv(a,2)
  266. 0
  267. >>> x=_g.numer(a)
  268. >>> x is _g.qdiv(x)
  269. 1
  270. >>> x is _g.qdiv(x,1)
  271. 1
  272. >>> x is _g.qdiv(x,2)
  273. 0
  274. >>> y=_g.mpq(4,1)
  275. >>> y is _g.qdiv(y)
  276. 0
  277. >>> y == _g.qdiv(y)
  278. 1
  279. >>>
  280. '''
  281. def _test(chat=None):
  282. if chat:
  283. print("Unit tests for gmpy2 (mpq functionality)")
  284. print(" on Python %s" % sys.version)
  285. print("Testing gmpy2 {0}".format(_g.version()))
  286. print(" Mutliple-precision library: {0}".format(_g.mp_version()))
  287. print(" Floating-point library: {0}".format(_g.mpfr_version()))
  288. print(" Complex library: {0}".format(_g.mpc_version()))
  289. print(" Caching Values: (Number) {0}".format(_g.get_cache()[0]))
  290. print(" Caching Values: (Size, limbs) {0}".format(_g.get_cache()[1]))
  291. thismod = sys.modules.get(__name__)
  292. doctest.testmod(thismod, report=0)
  293. if chat: print("Repeating tests, with caching disabled")
  294. _g.set_cache(0,128)
  295. sav = sys.stdout
  296. class _Dummy:
  297. encoding = None
  298. def write(self,*whatever):
  299. pass
  300. try:
  301. sys.stdout = _Dummy()
  302. doctest.testmod(thismod, report=0)
  303. finally:
  304. sys.stdout = sav
  305. if chat:
  306. print()
  307. print("Overall results for mpq:")
  308. return doctest.master.summarize(chat)
  309. if __name__=='__main__':
  310. _test(1)