/test2/gmpy_test_mpq.py

http://gmpy.googlecode.com/ · Python · 305 lines · 114 code · 16 blank · 175 comment · 6 complexity · b50d52b5a51d92dc0b10a592d4ec5d6c MD5 · raw file

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