test_mathml.py 97 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048
  1. from sympy.calculus.accumulationbounds import AccumBounds
  2. from sympy.concrete.summations import Sum
  3. from sympy.core.basic import Basic
  4. from sympy.core.containers import Tuple
  5. from sympy.core.function import Derivative, Lambda, diff, Function
  6. from sympy.core.numbers import (zoo, Float, Integer, I, oo, pi, E,
  7. Rational)
  8. from sympy.core.relational import Lt, Ge, Ne, Eq
  9. from sympy.core.singleton import S
  10. from sympy.core.symbol import symbols, Symbol
  11. from sympy.core.sympify import sympify
  12. from sympy.functions.combinatorial.factorials import (factorial2,
  13. binomial, factorial)
  14. from sympy.functions.combinatorial.numbers import (lucas, bell,
  15. catalan, euler, tribonacci, fibonacci, bernoulli, primenu, primeomega,
  16. totient, reduced_totient)
  17. from sympy.functions.elementary.complexes import re, im, conjugate, Abs
  18. from sympy.functions.elementary.exponential import exp, LambertW, log
  19. from sympy.functions.elementary.hyperbolic import (tanh, acoth, atanh,
  20. coth, asinh, acsch, asech, acosh, csch, sinh, cosh, sech)
  21. from sympy.functions.elementary.integers import ceiling, floor
  22. from sympy.functions.elementary.miscellaneous import Max, Min
  23. from sympy.functions.elementary.trigonometric import (csc, sec, tan,
  24. atan, sin, asec, cot, cos, acot, acsc, asin, acos)
  25. from sympy.functions.special.delta_functions import Heaviside
  26. from sympy.functions.special.elliptic_integrals import (elliptic_pi,
  27. elliptic_f, elliptic_k, elliptic_e)
  28. from sympy.functions.special.error_functions import (fresnelc,
  29. fresnels, Ei, expint)
  30. from sympy.functions.special.gamma_functions import (gamma, uppergamma,
  31. lowergamma)
  32. from sympy.functions.special.mathieu_functions import (mathieusprime,
  33. mathieus, mathieucprime, mathieuc)
  34. from sympy.functions.special.polynomials import (jacobi, chebyshevu,
  35. chebyshevt, hermite, assoc_legendre, gegenbauer, assoc_laguerre,
  36. legendre, laguerre)
  37. from sympy.functions.special.singularity_functions import SingularityFunction
  38. from sympy.functions.special.zeta_functions import (polylog, stieltjes,
  39. lerchphi, dirichlet_eta, zeta)
  40. from sympy.integrals.integrals import Integral
  41. from sympy.logic.boolalg import (Xor, Or, false, true, And, Equivalent,
  42. Implies, Not)
  43. from sympy.matrices.dense import Matrix
  44. from sympy.matrices.expressions.determinant import Determinant
  45. from sympy.matrices.expressions.matexpr import MatrixSymbol
  46. from sympy.physics.quantum import (ComplexSpace, FockSpace, hbar,
  47. HilbertSpace, Dagger)
  48. from sympy.printing.mathml import (MathMLPresentationPrinter,
  49. MathMLPrinter, MathMLContentPrinter, mathml)
  50. from sympy.series.limits import Limit
  51. from sympy.sets.contains import Contains
  52. from sympy.sets.fancysets import Range
  53. from sympy.sets.sets import (Interval, Union, SymmetricDifference,
  54. Complement, FiniteSet, Intersection, ProductSet)
  55. from sympy.stats.rv import RandomSymbol
  56. from sympy.tensor.indexed import IndexedBase
  57. from sympy.vector import (Divergence, CoordSys3D, Cross, Curl, Dot,
  58. Laplacian, Gradient)
  59. from sympy.testing.pytest import raises, XFAIL
  60. x, y, z, a, b, c, d, e, n = symbols('x:z a:e n')
  61. mp = MathMLContentPrinter()
  62. mpp = MathMLPresentationPrinter()
  63. def test_mathml_printer():
  64. m = MathMLPrinter()
  65. assert m.doprint(1+x) == mp.doprint(1+x)
  66. def test_content_printmethod():
  67. assert mp.doprint(1 + x) == '<apply><plus/><ci>x</ci><cn>1</cn></apply>'
  68. def test_content_mathml_core():
  69. mml_1 = mp._print(1 + x)
  70. assert mml_1.nodeName == 'apply'
  71. nodes = mml_1.childNodes
  72. assert len(nodes) == 3
  73. assert nodes[0].nodeName == 'plus'
  74. assert nodes[0].hasChildNodes() is False
  75. assert nodes[0].nodeValue is None
  76. assert nodes[1].nodeName in ['cn', 'ci']
  77. if nodes[1].nodeName == 'cn':
  78. assert nodes[1].childNodes[0].nodeValue == '1'
  79. assert nodes[2].childNodes[0].nodeValue == 'x'
  80. else:
  81. assert nodes[1].childNodes[0].nodeValue == 'x'
  82. assert nodes[2].childNodes[0].nodeValue == '1'
  83. mml_2 = mp._print(x**2)
  84. assert mml_2.nodeName == 'apply'
  85. nodes = mml_2.childNodes
  86. assert nodes[1].childNodes[0].nodeValue == 'x'
  87. assert nodes[2].childNodes[0].nodeValue == '2'
  88. mml_3 = mp._print(2*x)
  89. assert mml_3.nodeName == 'apply'
  90. nodes = mml_3.childNodes
  91. assert nodes[0].nodeName == 'times'
  92. assert nodes[1].childNodes[0].nodeValue == '2'
  93. assert nodes[2].childNodes[0].nodeValue == 'x'
  94. mml = mp._print(Float(1.0, 2)*x)
  95. assert mml.nodeName == 'apply'
  96. nodes = mml.childNodes
  97. assert nodes[0].nodeName == 'times'
  98. assert nodes[1].childNodes[0].nodeValue == '1.0'
  99. assert nodes[2].childNodes[0].nodeValue == 'x'
  100. def test_content_mathml_functions():
  101. mml_1 = mp._print(sin(x))
  102. assert mml_1.nodeName == 'apply'
  103. assert mml_1.childNodes[0].nodeName == 'sin'
  104. assert mml_1.childNodes[1].nodeName == 'ci'
  105. mml_2 = mp._print(diff(sin(x), x, evaluate=False))
  106. assert mml_2.nodeName == 'apply'
  107. assert mml_2.childNodes[0].nodeName == 'diff'
  108. assert mml_2.childNodes[1].nodeName == 'bvar'
  109. assert mml_2.childNodes[1].childNodes[
  110. 0].nodeName == 'ci' # below bvar there's <ci>x/ci>
  111. mml_3 = mp._print(diff(cos(x*y), x, evaluate=False))
  112. assert mml_3.nodeName == 'apply'
  113. assert mml_3.childNodes[0].nodeName == 'partialdiff'
  114. assert mml_3.childNodes[1].nodeName == 'bvar'
  115. assert mml_3.childNodes[1].childNodes[
  116. 0].nodeName == 'ci' # below bvar there's <ci>x/ci>
  117. mml_4 = mp._print(Lambda((x, y), x * y))
  118. assert mml_4.nodeName == 'lambda'
  119. assert mml_4.childNodes[0].nodeName == 'bvar'
  120. assert mml_4.childNodes[0].childNodes[
  121. 0].nodeName == 'ci' # below bvar there's <ci>x/ci>
  122. assert mml_4.childNodes[1].nodeName == 'bvar'
  123. assert mml_4.childNodes[1].childNodes[
  124. 0].nodeName == 'ci' # below bvar there's <ci>y/ci>
  125. assert mml_4.childNodes[2].nodeName == 'apply'
  126. def test_content_mathml_limits():
  127. # XXX No unevaluated limits
  128. lim_fun = sin(x)/x
  129. mml_1 = mp._print(Limit(lim_fun, x, 0))
  130. assert mml_1.childNodes[0].nodeName == 'limit'
  131. assert mml_1.childNodes[1].nodeName == 'bvar'
  132. assert mml_1.childNodes[2].nodeName == 'lowlimit'
  133. assert mml_1.childNodes[3].toxml() == mp._print(lim_fun).toxml()
  134. def test_content_mathml_integrals():
  135. integrand = x
  136. mml_1 = mp._print(Integral(integrand, (x, 0, 1)))
  137. assert mml_1.childNodes[0].nodeName == 'int'
  138. assert mml_1.childNodes[1].nodeName == 'bvar'
  139. assert mml_1.childNodes[2].nodeName == 'lowlimit'
  140. assert mml_1.childNodes[3].nodeName == 'uplimit'
  141. assert mml_1.childNodes[4].toxml() == mp._print(integrand).toxml()
  142. def test_content_mathml_matrices():
  143. A = Matrix([1, 2, 3])
  144. B = Matrix([[0, 5, 4], [2, 3, 1], [9, 7, 9]])
  145. mll_1 = mp._print(A)
  146. assert mll_1.childNodes[0].nodeName == 'matrixrow'
  147. assert mll_1.childNodes[0].childNodes[0].nodeName == 'cn'
  148. assert mll_1.childNodes[0].childNodes[0].childNodes[0].nodeValue == '1'
  149. assert mll_1.childNodes[1].nodeName == 'matrixrow'
  150. assert mll_1.childNodes[1].childNodes[0].nodeName == 'cn'
  151. assert mll_1.childNodes[1].childNodes[0].childNodes[0].nodeValue == '2'
  152. assert mll_1.childNodes[2].nodeName == 'matrixrow'
  153. assert mll_1.childNodes[2].childNodes[0].nodeName == 'cn'
  154. assert mll_1.childNodes[2].childNodes[0].childNodes[0].nodeValue == '3'
  155. mll_2 = mp._print(B)
  156. assert mll_2.childNodes[0].nodeName == 'matrixrow'
  157. assert mll_2.childNodes[0].childNodes[0].nodeName == 'cn'
  158. assert mll_2.childNodes[0].childNodes[0].childNodes[0].nodeValue == '0'
  159. assert mll_2.childNodes[0].childNodes[1].nodeName == 'cn'
  160. assert mll_2.childNodes[0].childNodes[1].childNodes[0].nodeValue == '5'
  161. assert mll_2.childNodes[0].childNodes[2].nodeName == 'cn'
  162. assert mll_2.childNodes[0].childNodes[2].childNodes[0].nodeValue == '4'
  163. assert mll_2.childNodes[1].nodeName == 'matrixrow'
  164. assert mll_2.childNodes[1].childNodes[0].nodeName == 'cn'
  165. assert mll_2.childNodes[1].childNodes[0].childNodes[0].nodeValue == '2'
  166. assert mll_2.childNodes[1].childNodes[1].nodeName == 'cn'
  167. assert mll_2.childNodes[1].childNodes[1].childNodes[0].nodeValue == '3'
  168. assert mll_2.childNodes[1].childNodes[2].nodeName == 'cn'
  169. assert mll_2.childNodes[1].childNodes[2].childNodes[0].nodeValue == '1'
  170. assert mll_2.childNodes[2].nodeName == 'matrixrow'
  171. assert mll_2.childNodes[2].childNodes[0].nodeName == 'cn'
  172. assert mll_2.childNodes[2].childNodes[0].childNodes[0].nodeValue == '9'
  173. assert mll_2.childNodes[2].childNodes[1].nodeName == 'cn'
  174. assert mll_2.childNodes[2].childNodes[1].childNodes[0].nodeValue == '7'
  175. assert mll_2.childNodes[2].childNodes[2].nodeName == 'cn'
  176. assert mll_2.childNodes[2].childNodes[2].childNodes[0].nodeValue == '9'
  177. def test_content_mathml_sums():
  178. summand = x
  179. mml_1 = mp._print(Sum(summand, (x, 1, 10)))
  180. assert mml_1.childNodes[0].nodeName == 'sum'
  181. assert mml_1.childNodes[1].nodeName == 'bvar'
  182. assert mml_1.childNodes[2].nodeName == 'lowlimit'
  183. assert mml_1.childNodes[3].nodeName == 'uplimit'
  184. assert mml_1.childNodes[4].toxml() == mp._print(summand).toxml()
  185. def test_content_mathml_tuples():
  186. mml_1 = mp._print([2])
  187. assert mml_1.nodeName == 'list'
  188. assert mml_1.childNodes[0].nodeName == 'cn'
  189. assert len(mml_1.childNodes) == 1
  190. mml_2 = mp._print([2, Integer(1)])
  191. assert mml_2.nodeName == 'list'
  192. assert mml_2.childNodes[0].nodeName == 'cn'
  193. assert mml_2.childNodes[1].nodeName == 'cn'
  194. assert len(mml_2.childNodes) == 2
  195. def test_content_mathml_add():
  196. mml = mp._print(x**5 - x**4 + x)
  197. assert mml.childNodes[0].nodeName == 'plus'
  198. assert mml.childNodes[1].childNodes[0].nodeName == 'minus'
  199. assert mml.childNodes[1].childNodes[1].nodeName == 'apply'
  200. def test_content_mathml_Rational():
  201. mml_1 = mp._print(Rational(1, 1))
  202. """should just return a number"""
  203. assert mml_1.nodeName == 'cn'
  204. mml_2 = mp._print(Rational(2, 5))
  205. assert mml_2.childNodes[0].nodeName == 'divide'
  206. def test_content_mathml_constants():
  207. mml = mp._print(I)
  208. assert mml.nodeName == 'imaginaryi'
  209. mml = mp._print(E)
  210. assert mml.nodeName == 'exponentiale'
  211. mml = mp._print(oo)
  212. assert mml.nodeName == 'infinity'
  213. mml = mp._print(pi)
  214. assert mml.nodeName == 'pi'
  215. assert mathml(hbar) == '<hbar/>'
  216. assert mathml(S.TribonacciConstant) == '<tribonacciconstant/>'
  217. assert mathml(S.GoldenRatio) == '<cn>&#966;</cn>'
  218. mml = mathml(S.EulerGamma)
  219. assert mml == '<eulergamma/>'
  220. mml = mathml(S.EmptySet)
  221. assert mml == '<emptyset/>'
  222. mml = mathml(S.true)
  223. assert mml == '<true/>'
  224. mml = mathml(S.false)
  225. assert mml == '<false/>'
  226. mml = mathml(S.NaN)
  227. assert mml == '<notanumber/>'
  228. def test_content_mathml_trig():
  229. mml = mp._print(sin(x))
  230. assert mml.childNodes[0].nodeName == 'sin'
  231. mml = mp._print(cos(x))
  232. assert mml.childNodes[0].nodeName == 'cos'
  233. mml = mp._print(tan(x))
  234. assert mml.childNodes[0].nodeName == 'tan'
  235. mml = mp._print(cot(x))
  236. assert mml.childNodes[0].nodeName == 'cot'
  237. mml = mp._print(csc(x))
  238. assert mml.childNodes[0].nodeName == 'csc'
  239. mml = mp._print(sec(x))
  240. assert mml.childNodes[0].nodeName == 'sec'
  241. mml = mp._print(asin(x))
  242. assert mml.childNodes[0].nodeName == 'arcsin'
  243. mml = mp._print(acos(x))
  244. assert mml.childNodes[0].nodeName == 'arccos'
  245. mml = mp._print(atan(x))
  246. assert mml.childNodes[0].nodeName == 'arctan'
  247. mml = mp._print(acot(x))
  248. assert mml.childNodes[0].nodeName == 'arccot'
  249. mml = mp._print(acsc(x))
  250. assert mml.childNodes[0].nodeName == 'arccsc'
  251. mml = mp._print(asec(x))
  252. assert mml.childNodes[0].nodeName == 'arcsec'
  253. mml = mp._print(sinh(x))
  254. assert mml.childNodes[0].nodeName == 'sinh'
  255. mml = mp._print(cosh(x))
  256. assert mml.childNodes[0].nodeName == 'cosh'
  257. mml = mp._print(tanh(x))
  258. assert mml.childNodes[0].nodeName == 'tanh'
  259. mml = mp._print(coth(x))
  260. assert mml.childNodes[0].nodeName == 'coth'
  261. mml = mp._print(csch(x))
  262. assert mml.childNodes[0].nodeName == 'csch'
  263. mml = mp._print(sech(x))
  264. assert mml.childNodes[0].nodeName == 'sech'
  265. mml = mp._print(asinh(x))
  266. assert mml.childNodes[0].nodeName == 'arcsinh'
  267. mml = mp._print(atanh(x))
  268. assert mml.childNodes[0].nodeName == 'arctanh'
  269. mml = mp._print(acosh(x))
  270. assert mml.childNodes[0].nodeName == 'arccosh'
  271. mml = mp._print(acoth(x))
  272. assert mml.childNodes[0].nodeName == 'arccoth'
  273. mml = mp._print(acsch(x))
  274. assert mml.childNodes[0].nodeName == 'arccsch'
  275. mml = mp._print(asech(x))
  276. assert mml.childNodes[0].nodeName == 'arcsech'
  277. def test_content_mathml_relational():
  278. mml_1 = mp._print(Eq(x, 1))
  279. assert mml_1.nodeName == 'apply'
  280. assert mml_1.childNodes[0].nodeName == 'eq'
  281. assert mml_1.childNodes[1].nodeName == 'ci'
  282. assert mml_1.childNodes[1].childNodes[0].nodeValue == 'x'
  283. assert mml_1.childNodes[2].nodeName == 'cn'
  284. assert mml_1.childNodes[2].childNodes[0].nodeValue == '1'
  285. mml_2 = mp._print(Ne(1, x))
  286. assert mml_2.nodeName == 'apply'
  287. assert mml_2.childNodes[0].nodeName == 'neq'
  288. assert mml_2.childNodes[1].nodeName == 'cn'
  289. assert mml_2.childNodes[1].childNodes[0].nodeValue == '1'
  290. assert mml_2.childNodes[2].nodeName == 'ci'
  291. assert mml_2.childNodes[2].childNodes[0].nodeValue == 'x'
  292. mml_3 = mp._print(Ge(1, x))
  293. assert mml_3.nodeName == 'apply'
  294. assert mml_3.childNodes[0].nodeName == 'geq'
  295. assert mml_3.childNodes[1].nodeName == 'cn'
  296. assert mml_3.childNodes[1].childNodes[0].nodeValue == '1'
  297. assert mml_3.childNodes[2].nodeName == 'ci'
  298. assert mml_3.childNodes[2].childNodes[0].nodeValue == 'x'
  299. mml_4 = mp._print(Lt(1, x))
  300. assert mml_4.nodeName == 'apply'
  301. assert mml_4.childNodes[0].nodeName == 'lt'
  302. assert mml_4.childNodes[1].nodeName == 'cn'
  303. assert mml_4.childNodes[1].childNodes[0].nodeValue == '1'
  304. assert mml_4.childNodes[2].nodeName == 'ci'
  305. assert mml_4.childNodes[2].childNodes[0].nodeValue == 'x'
  306. def test_content_symbol():
  307. mml = mp._print(x)
  308. assert mml.nodeName == 'ci'
  309. assert mml.childNodes[0].nodeValue == 'x'
  310. del mml
  311. mml = mp._print(Symbol("x^2"))
  312. assert mml.nodeName == 'ci'
  313. assert mml.childNodes[0].nodeName == 'mml:msup'
  314. assert mml.childNodes[0].childNodes[0].nodeName == 'mml:mi'
  315. assert mml.childNodes[0].childNodes[0].childNodes[0].nodeValue == 'x'
  316. assert mml.childNodes[0].childNodes[1].nodeName == 'mml:mi'
  317. assert mml.childNodes[0].childNodes[1].childNodes[0].nodeValue == '2'
  318. del mml
  319. mml = mp._print(Symbol("x__2"))
  320. assert mml.nodeName == 'ci'
  321. assert mml.childNodes[0].nodeName == 'mml:msup'
  322. assert mml.childNodes[0].childNodes[0].nodeName == 'mml:mi'
  323. assert mml.childNodes[0].childNodes[0].childNodes[0].nodeValue == 'x'
  324. assert mml.childNodes[0].childNodes[1].nodeName == 'mml:mi'
  325. assert mml.childNodes[0].childNodes[1].childNodes[0].nodeValue == '2'
  326. del mml
  327. mml = mp._print(Symbol("x_2"))
  328. assert mml.nodeName == 'ci'
  329. assert mml.childNodes[0].nodeName == 'mml:msub'
  330. assert mml.childNodes[0].childNodes[0].nodeName == 'mml:mi'
  331. assert mml.childNodes[0].childNodes[0].childNodes[0].nodeValue == 'x'
  332. assert mml.childNodes[0].childNodes[1].nodeName == 'mml:mi'
  333. assert mml.childNodes[0].childNodes[1].childNodes[0].nodeValue == '2'
  334. del mml
  335. mml = mp._print(Symbol("x^3_2"))
  336. assert mml.nodeName == 'ci'
  337. assert mml.childNodes[0].nodeName == 'mml:msubsup'
  338. assert mml.childNodes[0].childNodes[0].nodeName == 'mml:mi'
  339. assert mml.childNodes[0].childNodes[0].childNodes[0].nodeValue == 'x'
  340. assert mml.childNodes[0].childNodes[1].nodeName == 'mml:mi'
  341. assert mml.childNodes[0].childNodes[1].childNodes[0].nodeValue == '2'
  342. assert mml.childNodes[0].childNodes[2].nodeName == 'mml:mi'
  343. assert mml.childNodes[0].childNodes[2].childNodes[0].nodeValue == '3'
  344. del mml
  345. mml = mp._print(Symbol("x__3_2"))
  346. assert mml.nodeName == 'ci'
  347. assert mml.childNodes[0].nodeName == 'mml:msubsup'
  348. assert mml.childNodes[0].childNodes[0].nodeName == 'mml:mi'
  349. assert mml.childNodes[0].childNodes[0].childNodes[0].nodeValue == 'x'
  350. assert mml.childNodes[0].childNodes[1].nodeName == 'mml:mi'
  351. assert mml.childNodes[0].childNodes[1].childNodes[0].nodeValue == '2'
  352. assert mml.childNodes[0].childNodes[2].nodeName == 'mml:mi'
  353. assert mml.childNodes[0].childNodes[2].childNodes[0].nodeValue == '3'
  354. del mml
  355. mml = mp._print(Symbol("x_2_a"))
  356. assert mml.nodeName == 'ci'
  357. assert mml.childNodes[0].nodeName == 'mml:msub'
  358. assert mml.childNodes[0].childNodes[0].nodeName == 'mml:mi'
  359. assert mml.childNodes[0].childNodes[0].childNodes[0].nodeValue == 'x'
  360. assert mml.childNodes[0].childNodes[1].nodeName == 'mml:mrow'
  361. assert mml.childNodes[0].childNodes[1].childNodes[0].nodeName == 'mml:mi'
  362. assert mml.childNodes[0].childNodes[1].childNodes[0].childNodes[
  363. 0].nodeValue == '2'
  364. assert mml.childNodes[0].childNodes[1].childNodes[1].nodeName == 'mml:mo'
  365. assert mml.childNodes[0].childNodes[1].childNodes[1].childNodes[
  366. 0].nodeValue == ' '
  367. assert mml.childNodes[0].childNodes[1].childNodes[2].nodeName == 'mml:mi'
  368. assert mml.childNodes[0].childNodes[1].childNodes[2].childNodes[
  369. 0].nodeValue == 'a'
  370. del mml
  371. mml = mp._print(Symbol("x^2^a"))
  372. assert mml.nodeName == 'ci'
  373. assert mml.childNodes[0].nodeName == 'mml:msup'
  374. assert mml.childNodes[0].childNodes[0].nodeName == 'mml:mi'
  375. assert mml.childNodes[0].childNodes[0].childNodes[0].nodeValue == 'x'
  376. assert mml.childNodes[0].childNodes[1].nodeName == 'mml:mrow'
  377. assert mml.childNodes[0].childNodes[1].childNodes[0].nodeName == 'mml:mi'
  378. assert mml.childNodes[0].childNodes[1].childNodes[0].childNodes[
  379. 0].nodeValue == '2'
  380. assert mml.childNodes[0].childNodes[1].childNodes[1].nodeName == 'mml:mo'
  381. assert mml.childNodes[0].childNodes[1].childNodes[1].childNodes[
  382. 0].nodeValue == ' '
  383. assert mml.childNodes[0].childNodes[1].childNodes[2].nodeName == 'mml:mi'
  384. assert mml.childNodes[0].childNodes[1].childNodes[2].childNodes[
  385. 0].nodeValue == 'a'
  386. del mml
  387. mml = mp._print(Symbol("x__2__a"))
  388. assert mml.nodeName == 'ci'
  389. assert mml.childNodes[0].nodeName == 'mml:msup'
  390. assert mml.childNodes[0].childNodes[0].nodeName == 'mml:mi'
  391. assert mml.childNodes[0].childNodes[0].childNodes[0].nodeValue == 'x'
  392. assert mml.childNodes[0].childNodes[1].nodeName == 'mml:mrow'
  393. assert mml.childNodes[0].childNodes[1].childNodes[0].nodeName == 'mml:mi'
  394. assert mml.childNodes[0].childNodes[1].childNodes[0].childNodes[
  395. 0].nodeValue == '2'
  396. assert mml.childNodes[0].childNodes[1].childNodes[1].nodeName == 'mml:mo'
  397. assert mml.childNodes[0].childNodes[1].childNodes[1].childNodes[
  398. 0].nodeValue == ' '
  399. assert mml.childNodes[0].childNodes[1].childNodes[2].nodeName == 'mml:mi'
  400. assert mml.childNodes[0].childNodes[1].childNodes[2].childNodes[
  401. 0].nodeValue == 'a'
  402. del mml
  403. def test_content_mathml_greek():
  404. mml = mp._print(Symbol('alpha'))
  405. assert mml.nodeName == 'ci'
  406. assert mml.childNodes[0].nodeValue == '\N{GREEK SMALL LETTER ALPHA}'
  407. assert mp.doprint(Symbol('alpha')) == '<ci>&#945;</ci>'
  408. assert mp.doprint(Symbol('beta')) == '<ci>&#946;</ci>'
  409. assert mp.doprint(Symbol('gamma')) == '<ci>&#947;</ci>'
  410. assert mp.doprint(Symbol('delta')) == '<ci>&#948;</ci>'
  411. assert mp.doprint(Symbol('epsilon')) == '<ci>&#949;</ci>'
  412. assert mp.doprint(Symbol('zeta')) == '<ci>&#950;</ci>'
  413. assert mp.doprint(Symbol('eta')) == '<ci>&#951;</ci>'
  414. assert mp.doprint(Symbol('theta')) == '<ci>&#952;</ci>'
  415. assert mp.doprint(Symbol('iota')) == '<ci>&#953;</ci>'
  416. assert mp.doprint(Symbol('kappa')) == '<ci>&#954;</ci>'
  417. assert mp.doprint(Symbol('lambda')) == '<ci>&#955;</ci>'
  418. assert mp.doprint(Symbol('mu')) == '<ci>&#956;</ci>'
  419. assert mp.doprint(Symbol('nu')) == '<ci>&#957;</ci>'
  420. assert mp.doprint(Symbol('xi')) == '<ci>&#958;</ci>'
  421. assert mp.doprint(Symbol('omicron')) == '<ci>&#959;</ci>'
  422. assert mp.doprint(Symbol('pi')) == '<ci>&#960;</ci>'
  423. assert mp.doprint(Symbol('rho')) == '<ci>&#961;</ci>'
  424. assert mp.doprint(Symbol('varsigma')) == '<ci>&#962;</ci>'
  425. assert mp.doprint(Symbol('sigma')) == '<ci>&#963;</ci>'
  426. assert mp.doprint(Symbol('tau')) == '<ci>&#964;</ci>'
  427. assert mp.doprint(Symbol('upsilon')) == '<ci>&#965;</ci>'
  428. assert mp.doprint(Symbol('phi')) == '<ci>&#966;</ci>'
  429. assert mp.doprint(Symbol('chi')) == '<ci>&#967;</ci>'
  430. assert mp.doprint(Symbol('psi')) == '<ci>&#968;</ci>'
  431. assert mp.doprint(Symbol('omega')) == '<ci>&#969;</ci>'
  432. assert mp.doprint(Symbol('Alpha')) == '<ci>&#913;</ci>'
  433. assert mp.doprint(Symbol('Beta')) == '<ci>&#914;</ci>'
  434. assert mp.doprint(Symbol('Gamma')) == '<ci>&#915;</ci>'
  435. assert mp.doprint(Symbol('Delta')) == '<ci>&#916;</ci>'
  436. assert mp.doprint(Symbol('Epsilon')) == '<ci>&#917;</ci>'
  437. assert mp.doprint(Symbol('Zeta')) == '<ci>&#918;</ci>'
  438. assert mp.doprint(Symbol('Eta')) == '<ci>&#919;</ci>'
  439. assert mp.doprint(Symbol('Theta')) == '<ci>&#920;</ci>'
  440. assert mp.doprint(Symbol('Iota')) == '<ci>&#921;</ci>'
  441. assert mp.doprint(Symbol('Kappa')) == '<ci>&#922;</ci>'
  442. assert mp.doprint(Symbol('Lambda')) == '<ci>&#923;</ci>'
  443. assert mp.doprint(Symbol('Mu')) == '<ci>&#924;</ci>'
  444. assert mp.doprint(Symbol('Nu')) == '<ci>&#925;</ci>'
  445. assert mp.doprint(Symbol('Xi')) == '<ci>&#926;</ci>'
  446. assert mp.doprint(Symbol('Omicron')) == '<ci>&#927;</ci>'
  447. assert mp.doprint(Symbol('Pi')) == '<ci>&#928;</ci>'
  448. assert mp.doprint(Symbol('Rho')) == '<ci>&#929;</ci>'
  449. assert mp.doprint(Symbol('Sigma')) == '<ci>&#931;</ci>'
  450. assert mp.doprint(Symbol('Tau')) == '<ci>&#932;</ci>'
  451. assert mp.doprint(Symbol('Upsilon')) == '<ci>&#933;</ci>'
  452. assert mp.doprint(Symbol('Phi')) == '<ci>&#934;</ci>'
  453. assert mp.doprint(Symbol('Chi')) == '<ci>&#935;</ci>'
  454. assert mp.doprint(Symbol('Psi')) == '<ci>&#936;</ci>'
  455. assert mp.doprint(Symbol('Omega')) == '<ci>&#937;</ci>'
  456. def test_content_mathml_order():
  457. expr = x**3 + x**2*y + 3*x*y**3 + y**4
  458. mp = MathMLContentPrinter({'order': 'lex'})
  459. mml = mp._print(expr)
  460. assert mml.childNodes[1].childNodes[0].nodeName == 'power'
  461. assert mml.childNodes[1].childNodes[1].childNodes[0].data == 'x'
  462. assert mml.childNodes[1].childNodes[2].childNodes[0].data == '3'
  463. assert mml.childNodes[4].childNodes[0].nodeName == 'power'
  464. assert mml.childNodes[4].childNodes[1].childNodes[0].data == 'y'
  465. assert mml.childNodes[4].childNodes[2].childNodes[0].data == '4'
  466. mp = MathMLContentPrinter({'order': 'rev-lex'})
  467. mml = mp._print(expr)
  468. assert mml.childNodes[1].childNodes[0].nodeName == 'power'
  469. assert mml.childNodes[1].childNodes[1].childNodes[0].data == 'y'
  470. assert mml.childNodes[1].childNodes[2].childNodes[0].data == '4'
  471. assert mml.childNodes[4].childNodes[0].nodeName == 'power'
  472. assert mml.childNodes[4].childNodes[1].childNodes[0].data == 'x'
  473. assert mml.childNodes[4].childNodes[2].childNodes[0].data == '3'
  474. def test_content_settings():
  475. raises(TypeError, lambda: mathml(x, method="garbage"))
  476. def test_content_mathml_logic():
  477. assert mathml(And(x, y)) == '<apply><and/><ci>x</ci><ci>y</ci></apply>'
  478. assert mathml(Or(x, y)) == '<apply><or/><ci>x</ci><ci>y</ci></apply>'
  479. assert mathml(Xor(x, y)) == '<apply><xor/><ci>x</ci><ci>y</ci></apply>'
  480. assert mathml(Implies(x, y)) == '<apply><implies/><ci>x</ci><ci>y</ci></apply>'
  481. assert mathml(Not(x)) == '<apply><not/><ci>x</ci></apply>'
  482. def test_content_finite_sets():
  483. assert mathml(FiniteSet(a)) == '<set><ci>a</ci></set>'
  484. assert mathml(FiniteSet(a, b)) == '<set><ci>a</ci><ci>b</ci></set>'
  485. assert mathml(FiniteSet(FiniteSet(a, b), c)) == \
  486. '<set><ci>c</ci><set><ci>a</ci><ci>b</ci></set></set>'
  487. A = FiniteSet(a)
  488. B = FiniteSet(b)
  489. C = FiniteSet(c)
  490. D = FiniteSet(d)
  491. U1 = Union(A, B, evaluate=False)
  492. U2 = Union(C, D, evaluate=False)
  493. I1 = Intersection(A, B, evaluate=False)
  494. I2 = Intersection(C, D, evaluate=False)
  495. C1 = Complement(A, B, evaluate=False)
  496. C2 = Complement(C, D, evaluate=False)
  497. # XXX ProductSet does not support evaluate keyword
  498. P1 = ProductSet(A, B)
  499. P2 = ProductSet(C, D)
  500. assert mathml(U1) == \
  501. '<apply><union/><set><ci>a</ci></set><set><ci>b</ci></set></apply>'
  502. assert mathml(I1) == \
  503. '<apply><intersect/><set><ci>a</ci></set><set><ci>b</ci></set>' \
  504. '</apply>'
  505. assert mathml(C1) == \
  506. '<apply><setdiff/><set><ci>a</ci></set><set><ci>b</ci></set></apply>'
  507. assert mathml(P1) == \
  508. '<apply><cartesianproduct/><set><ci>a</ci></set><set><ci>b</ci>' \
  509. '</set></apply>'
  510. assert mathml(Intersection(A, U2, evaluate=False)) == \
  511. '<apply><intersect/><set><ci>a</ci></set><apply><union/><set>' \
  512. '<ci>c</ci></set><set><ci>d</ci></set></apply></apply>'
  513. assert mathml(Intersection(U1, U2, evaluate=False)) == \
  514. '<apply><intersect/><apply><union/><set><ci>a</ci></set><set>' \
  515. '<ci>b</ci></set></apply><apply><union/><set><ci>c</ci></set>' \
  516. '<set><ci>d</ci></set></apply></apply>'
  517. # XXX Does the parenthesis appear correctly for these examples in mathjax?
  518. assert mathml(Intersection(C1, C2, evaluate=False)) == \
  519. '<apply><intersect/><apply><setdiff/><set><ci>a</ci></set><set>' \
  520. '<ci>b</ci></set></apply><apply><setdiff/><set><ci>c</ci></set>' \
  521. '<set><ci>d</ci></set></apply></apply>'
  522. assert mathml(Intersection(P1, P2, evaluate=False)) == \
  523. '<apply><intersect/><apply><cartesianproduct/><set><ci>a</ci></set>' \
  524. '<set><ci>b</ci></set></apply><apply><cartesianproduct/><set>' \
  525. '<ci>c</ci></set><set><ci>d</ci></set></apply></apply>'
  526. assert mathml(Union(A, I2, evaluate=False)) == \
  527. '<apply><union/><set><ci>a</ci></set><apply><intersect/><set>' \
  528. '<ci>c</ci></set><set><ci>d</ci></set></apply></apply>'
  529. assert mathml(Union(I1, I2, evaluate=False)) == \
  530. '<apply><union/><apply><intersect/><set><ci>a</ci></set><set>' \
  531. '<ci>b</ci></set></apply><apply><intersect/><set><ci>c</ci></set>' \
  532. '<set><ci>d</ci></set></apply></apply>'
  533. assert mathml(Union(C1, C2, evaluate=False)) == \
  534. '<apply><union/><apply><setdiff/><set><ci>a</ci></set><set>' \
  535. '<ci>b</ci></set></apply><apply><setdiff/><set><ci>c</ci></set>' \
  536. '<set><ci>d</ci></set></apply></apply>'
  537. assert mathml(Union(P1, P2, evaluate=False)) == \
  538. '<apply><union/><apply><cartesianproduct/><set><ci>a</ci></set>' \
  539. '<set><ci>b</ci></set></apply><apply><cartesianproduct/><set>' \
  540. '<ci>c</ci></set><set><ci>d</ci></set></apply></apply>'
  541. assert mathml(Complement(A, C2, evaluate=False)) == \
  542. '<apply><setdiff/><set><ci>a</ci></set><apply><setdiff/><set>' \
  543. '<ci>c</ci></set><set><ci>d</ci></set></apply></apply>'
  544. assert mathml(Complement(U1, U2, evaluate=False)) == \
  545. '<apply><setdiff/><apply><union/><set><ci>a</ci></set><set>' \
  546. '<ci>b</ci></set></apply><apply><union/><set><ci>c</ci></set>' \
  547. '<set><ci>d</ci></set></apply></apply>'
  548. assert mathml(Complement(I1, I2, evaluate=False)) == \
  549. '<apply><setdiff/><apply><intersect/><set><ci>a</ci></set><set>' \
  550. '<ci>b</ci></set></apply><apply><intersect/><set><ci>c</ci></set>' \
  551. '<set><ci>d</ci></set></apply></apply>'
  552. assert mathml(Complement(P1, P2, evaluate=False)) == \
  553. '<apply><setdiff/><apply><cartesianproduct/><set><ci>a</ci></set>' \
  554. '<set><ci>b</ci></set></apply><apply><cartesianproduct/><set>' \
  555. '<ci>c</ci></set><set><ci>d</ci></set></apply></apply>'
  556. assert mathml(ProductSet(A, P2)) == \
  557. '<apply><cartesianproduct/><set><ci>a</ci></set>' \
  558. '<apply><cartesianproduct/><set><ci>c</ci></set>' \
  559. '<set><ci>d</ci></set></apply></apply>'
  560. assert mathml(ProductSet(U1, U2)) == \
  561. '<apply><cartesianproduct/><apply><union/><set><ci>a</ci></set>' \
  562. '<set><ci>b</ci></set></apply><apply><union/><set><ci>c</ci></set>' \
  563. '<set><ci>d</ci></set></apply></apply>'
  564. assert mathml(ProductSet(I1, I2)) == \
  565. '<apply><cartesianproduct/><apply><intersect/><set><ci>a</ci></set>' \
  566. '<set><ci>b</ci></set></apply><apply><intersect/><set>' \
  567. '<ci>c</ci></set><set><ci>d</ci></set></apply></apply>'
  568. assert mathml(ProductSet(C1, C2)) == \
  569. '<apply><cartesianproduct/><apply><setdiff/><set><ci>a</ci></set>' \
  570. '<set><ci>b</ci></set></apply><apply><setdiff/><set>' \
  571. '<ci>c</ci></set><set><ci>d</ci></set></apply></apply>'
  572. def test_presentation_printmethod():
  573. assert mpp.doprint(1 + x) == '<mrow><mi>x</mi><mo>+</mo><mn>1</mn></mrow>'
  574. assert mpp.doprint(x**2) == '<msup><mi>x</mi><mn>2</mn></msup>'
  575. assert mpp.doprint(x**-1) == '<mfrac><mn>1</mn><mi>x</mi></mfrac>'
  576. assert mpp.doprint(x**-2) == \
  577. '<mfrac><mn>1</mn><msup><mi>x</mi><mn>2</mn></msup></mfrac>'
  578. assert mpp.doprint(2*x) == \
  579. '<mrow><mn>2</mn><mo>&InvisibleTimes;</mo><mi>x</mi></mrow>'
  580. def test_presentation_mathml_core():
  581. mml_1 = mpp._print(1 + x)
  582. assert mml_1.nodeName == 'mrow'
  583. nodes = mml_1.childNodes
  584. assert len(nodes) == 3
  585. assert nodes[0].nodeName in ['mi', 'mn']
  586. assert nodes[1].nodeName == 'mo'
  587. if nodes[0].nodeName == 'mn':
  588. assert nodes[0].childNodes[0].nodeValue == '1'
  589. assert nodes[2].childNodes[0].nodeValue == 'x'
  590. else:
  591. assert nodes[0].childNodes[0].nodeValue == 'x'
  592. assert nodes[2].childNodes[0].nodeValue == '1'
  593. mml_2 = mpp._print(x**2)
  594. assert mml_2.nodeName == 'msup'
  595. nodes = mml_2.childNodes
  596. assert nodes[0].childNodes[0].nodeValue == 'x'
  597. assert nodes[1].childNodes[0].nodeValue == '2'
  598. mml_3 = mpp._print(2*x)
  599. assert mml_3.nodeName == 'mrow'
  600. nodes = mml_3.childNodes
  601. assert nodes[0].childNodes[0].nodeValue == '2'
  602. assert nodes[1].childNodes[0].nodeValue == '&InvisibleTimes;'
  603. assert nodes[2].childNodes[0].nodeValue == 'x'
  604. mml = mpp._print(Float(1.0, 2)*x)
  605. assert mml.nodeName == 'mrow'
  606. nodes = mml.childNodes
  607. assert nodes[0].childNodes[0].nodeValue == '1.0'
  608. assert nodes[1].childNodes[0].nodeValue == '&InvisibleTimes;'
  609. assert nodes[2].childNodes[0].nodeValue == 'x'
  610. def test_presentation_mathml_functions():
  611. mml_1 = mpp._print(sin(x))
  612. assert mml_1.childNodes[0].childNodes[0
  613. ].nodeValue == 'sin'
  614. assert mml_1.childNodes[1].childNodes[1
  615. ].childNodes[0].nodeValue == 'x'
  616. mml_2 = mpp._print(diff(sin(x), x, evaluate=False))
  617. assert mml_2.nodeName == 'mrow'
  618. assert mml_2.childNodes[0].childNodes[0
  619. ].childNodes[0].childNodes[0].nodeValue == '&dd;'
  620. assert mml_2.childNodes[1].childNodes[1
  621. ].nodeName == 'mrow'
  622. assert mml_2.childNodes[0].childNodes[1
  623. ].childNodes[0].childNodes[0].nodeValue == '&dd;'
  624. mml_3 = mpp._print(diff(cos(x*y), x, evaluate=False))
  625. assert mml_3.childNodes[0].nodeName == 'mfrac'
  626. assert mml_3.childNodes[0].childNodes[0
  627. ].childNodes[0].childNodes[0].nodeValue == '&#x2202;'
  628. assert mml_3.childNodes[1].childNodes[0
  629. ].childNodes[0].nodeValue == 'cos'
  630. def test_print_derivative():
  631. f = Function('f')
  632. d = Derivative(f(x, y, z), x, z, x, z, z, y)
  633. assert mathml(d) == \
  634. '<apply><partialdiff/><bvar><ci>y</ci><ci>z</ci><degree><cn>2</cn></degree><ci>x</ci><ci>z</ci><ci>x</ci></bvar><apply><f/><ci>x</ci><ci>y</ci><ci>z</ci></apply></apply>'
  635. assert mathml(d, printer='presentation') == \
  636. '<mrow><mfrac><mrow><msup><mo>&#x2202;</mo><mn>6</mn></msup></mrow><mrow><mo>&#x2202;</mo><mi>y</mi><msup><mo>&#x2202;</mo><mn>2</mn></msup><mi>z</mi><mo>&#x2202;</mo><mi>x</mi><mo>&#x2202;</mo><mi>z</mi><mo>&#x2202;</mo><mi>x</mi></mrow></mfrac><mrow><mi>f</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>,</mo><mi>z</mi><mo>)</mo></mrow></mrow></mrow>'
  637. def test_presentation_mathml_limits():
  638. lim_fun = sin(x)/x
  639. mml_1 = mpp._print(Limit(lim_fun, x, 0))
  640. assert mml_1.childNodes[0].nodeName == 'munder'
  641. assert mml_1.childNodes[0].childNodes[0
  642. ].childNodes[0].nodeValue == 'lim'
  643. assert mml_1.childNodes[0].childNodes[1
  644. ].childNodes[0].childNodes[0
  645. ].nodeValue == 'x'
  646. assert mml_1.childNodes[0].childNodes[1
  647. ].childNodes[1].childNodes[0
  648. ].nodeValue == '&#x2192;'
  649. assert mml_1.childNodes[0].childNodes[1
  650. ].childNodes[2].childNodes[0
  651. ].nodeValue == '0'
  652. def test_presentation_mathml_integrals():
  653. assert mpp.doprint(Integral(x, (x, 0, 1))) == \
  654. '<mrow><msubsup><mo>&#x222B;</mo><mn>0</mn><mn>1</mn></msubsup>'\
  655. '<mi>x</mi><mo>&dd;</mo><mi>x</mi></mrow>'
  656. assert mpp.doprint(Integral(log(x), x)) == \
  657. '<mrow><mo>&#x222B;</mo><mrow><mi>log</mi><mrow><mo>(</mo><mi>x</mi>' \
  658. '<mo>)</mo></mrow></mrow><mo>&dd;</mo><mi>x</mi></mrow>'
  659. assert mpp.doprint(Integral(x*y, x, y)) == \
  660. '<mrow><mo>&#x222C;</mo><mrow><mi>x</mi><mo>&InvisibleTimes;</mo>'\
  661. '<mi>y</mi></mrow><mo>&dd;</mo><mi>y</mi><mo>&dd;</mo><mi>x</mi></mrow>'
  662. z, w = symbols('z w')
  663. assert mpp.doprint(Integral(x*y*z, x, y, z)) == \
  664. '<mrow><mo>&#x222D;</mo><mrow><mi>x</mi><mo>&InvisibleTimes;</mo>'\
  665. '<mi>y</mi><mo>&InvisibleTimes;</mo><mi>z</mi></mrow><mo>&dd;</mo>'\
  666. '<mi>z</mi><mo>&dd;</mo><mi>y</mi><mo>&dd;</mo><mi>x</mi></mrow>'
  667. assert mpp.doprint(Integral(x*y*z*w, x, y, z, w)) == \
  668. '<mrow><mo>&#x222B;</mo><mo>&#x222B;</mo><mo>&#x222B;</mo>'\
  669. '<mo>&#x222B;</mo><mrow><mi>w</mi><mo>&InvisibleTimes;</mo>'\
  670. '<mi>x</mi><mo>&InvisibleTimes;</mo><mi>y</mi>'\
  671. '<mo>&InvisibleTimes;</mo><mi>z</mi></mrow><mo>&dd;</mo><mi>w</mi>'\
  672. '<mo>&dd;</mo><mi>z</mi><mo>&dd;</mo><mi>y</mi><mo>&dd;</mo><mi>x</mi></mrow>'
  673. assert mpp.doprint(Integral(x, x, y, (z, 0, 1))) == \
  674. '<mrow><msubsup><mo>&#x222B;</mo><mn>0</mn><mn>1</mn></msubsup>'\
  675. '<mo>&#x222B;</mo><mo>&#x222B;</mo><mi>x</mi><mo>&dd;</mo><mi>z</mi>'\
  676. '<mo>&dd;</mo><mi>y</mi><mo>&dd;</mo><mi>x</mi></mrow>'
  677. assert mpp.doprint(Integral(x, (x, 0))) == \
  678. '<mrow><msup><mo>&#x222B;</mo><mn>0</mn></msup><mi>x</mi><mo>&dd;</mo>'\
  679. '<mi>x</mi></mrow>'
  680. def test_presentation_mathml_matrices():
  681. A = Matrix([1, 2, 3])
  682. B = Matrix([[0, 5, 4], [2, 3, 1], [9, 7, 9]])
  683. mll_1 = mpp._print(A)
  684. assert mll_1.childNodes[1].nodeName == 'mtable'
  685. assert mll_1.childNodes[1].childNodes[0].nodeName == 'mtr'
  686. assert len(mll_1.childNodes[1].childNodes) == 3
  687. assert mll_1.childNodes[1].childNodes[0].childNodes[0].nodeName == 'mtd'
  688. assert len(mll_1.childNodes[1].childNodes[0].childNodes) == 1
  689. assert mll_1.childNodes[1].childNodes[0].childNodes[0
  690. ].childNodes[0].childNodes[0].nodeValue == '1'
  691. assert mll_1.childNodes[1].childNodes[1].childNodes[0
  692. ].childNodes[0].childNodes[0].nodeValue == '2'
  693. assert mll_1.childNodes[1].childNodes[2].childNodes[0
  694. ].childNodes[0].childNodes[0].nodeValue == '3'
  695. mll_2 = mpp._print(B)
  696. assert mll_2.childNodes[1].nodeName == 'mtable'
  697. assert mll_2.childNodes[1].childNodes[0].nodeName == 'mtr'
  698. assert len(mll_2.childNodes[1].childNodes) == 3
  699. assert mll_2.childNodes[1].childNodes[0].childNodes[0].nodeName == 'mtd'
  700. assert len(mll_2.childNodes[1].childNodes[0].childNodes) == 3
  701. assert mll_2.childNodes[1].childNodes[0].childNodes[0
  702. ].childNodes[0].childNodes[0].nodeValue == '0'
  703. assert mll_2.childNodes[1].childNodes[0].childNodes[1
  704. ].childNodes[0].childNodes[0].nodeValue == '5'
  705. assert mll_2.childNodes[1].childNodes[0].childNodes[2
  706. ].childNodes[0].childNodes[0].nodeValue == '4'
  707. assert mll_2.childNodes[1].childNodes[1].childNodes[0
  708. ].childNodes[0].childNodes[0].nodeValue == '2'
  709. assert mll_2.childNodes[1].childNodes[1].childNodes[1
  710. ].childNodes[0].childNodes[0].nodeValue == '3'
  711. assert mll_2.childNodes[1].childNodes[1].childNodes[2
  712. ].childNodes[0].childNodes[0].nodeValue == '1'
  713. assert mll_2.childNodes[1].childNodes[2].childNodes[0
  714. ].childNodes[0].childNodes[0].nodeValue == '9'
  715. assert mll_2.childNodes[1].childNodes[2].childNodes[1
  716. ].childNodes[0].childNodes[0].nodeValue == '7'
  717. assert mll_2.childNodes[1].childNodes[2].childNodes[2
  718. ].childNodes[0].childNodes[0].nodeValue == '9'
  719. def test_presentation_mathml_sums():
  720. mml_1 = mpp._print(Sum(x, (x, 1, 10)))
  721. assert mml_1.childNodes[0].nodeName == 'munderover'
  722. assert len(mml_1.childNodes[0].childNodes) == 3
  723. assert mml_1.childNodes[0].childNodes[0].childNodes[0
  724. ].nodeValue == '&#x2211;'
  725. assert len(mml_1.childNodes[0].childNodes[1].childNodes) == 3
  726. assert mml_1.childNodes[0].childNodes[2].childNodes[0
  727. ].nodeValue == '10'
  728. assert mml_1.childNodes[1].childNodes[0].nodeValue == 'x'
  729. assert mpp.doprint(Sum(x, (x, 1, 10))) == \
  730. '<mrow><munderover><mo>&#x2211;</mo><mrow><mi>x</mi><mo>=</mo><mn>1</mn></mrow><mn>10</mn></munderover><mi>x</mi></mrow>'
  731. assert mpp.doprint(Sum(x + y, (x, 1, 10))) == \
  732. '<mrow><munderover><mo>&#x2211;</mo><mrow><mi>x</mi><mo>=</mo><mn>1</mn></mrow><mn>10</mn></munderover><mrow><mo>(</mo><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow><mo>)</mo></mrow></mrow>'
  733. def test_presentation_mathml_add():
  734. mml = mpp._print(x**5 - x**4 + x)
  735. assert len(mml.childNodes) == 5
  736. assert mml.childNodes[0].childNodes[0].childNodes[0
  737. ].nodeValue == 'x'
  738. assert mml.childNodes[0].childNodes[1].childNodes[0
  739. ].nodeValue == '5'
  740. assert mml.childNodes[1].childNodes[0].nodeValue == '-'
  741. assert mml.childNodes[2].childNodes[0].childNodes[0
  742. ].nodeValue == 'x'
  743. assert mml.childNodes[2].childNodes[1].childNodes[0
  744. ].nodeValue == '4'
  745. assert mml.childNodes[3].childNodes[0].nodeValue == '+'
  746. assert mml.childNodes[4].childNodes[0].nodeValue == 'x'
  747. def test_presentation_mathml_Rational():
  748. mml_1 = mpp._print(Rational(1, 1))
  749. assert mml_1.nodeName == 'mn'
  750. mml_2 = mpp._print(Rational(2, 5))
  751. assert mml_2.nodeName == 'mfrac'
  752. assert mml_2.childNodes[0].childNodes[0].nodeValue == '2'
  753. assert mml_2.childNodes[1].childNodes[0].nodeValue == '5'
  754. def test_presentation_mathml_constants():
  755. mml = mpp._print(I)
  756. assert mml.childNodes[0].nodeValue == '&ImaginaryI;'
  757. mml = mpp._print(E)
  758. assert mml.childNodes[0].nodeValue == '&ExponentialE;'
  759. mml = mpp._print(oo)
  760. assert mml.childNodes[0].nodeValue == '&#x221E;'
  761. mml = mpp._print(pi)
  762. assert mml.childNodes[0].nodeValue == '&pi;'
  763. assert mathml(hbar, printer='presentation') == '<mi>&#x210F;</mi>'
  764. assert mathml(S.TribonacciConstant, printer='presentation'
  765. ) == '<mi>TribonacciConstant</mi>'
  766. assert mathml(S.EulerGamma, printer='presentation'
  767. ) == '<mi>&#x3B3;</mi>'
  768. assert mathml(S.GoldenRatio, printer='presentation'
  769. ) == '<mi>&#x3A6;</mi>'
  770. assert mathml(zoo, printer='presentation') == \
  771. '<mover><mo>&#x221E;</mo><mo>~</mo></mover>'
  772. assert mathml(S.NaN, printer='presentation') == '<mi>NaN</mi>'
  773. def test_presentation_mathml_trig():
  774. mml = mpp._print(sin(x))
  775. assert mml.childNodes[0].childNodes[0].nodeValue == 'sin'
  776. mml = mpp._print(cos(x))
  777. assert mml.childNodes[0].childNodes[0].nodeValue == 'cos'
  778. mml = mpp._print(tan(x))
  779. assert mml.childNodes[0].childNodes[0].nodeValue == 'tan'
  780. mml = mpp._print(asin(x))
  781. assert mml.childNodes[0].childNodes[0].nodeValue == 'arcsin'
  782. mml = mpp._print(acos(x))
  783. assert mml.childNodes[0].childNodes[0].nodeValue == 'arccos'
  784. mml = mpp._print(atan(x))
  785. assert mml.childNodes[0].childNodes[0].nodeValue == 'arctan'
  786. mml = mpp._print(sinh(x))
  787. assert mml.childNodes[0].childNodes[0].nodeValue == 'sinh'
  788. mml = mpp._print(cosh(x))
  789. assert mml.childNodes[0].childNodes[0].nodeValue == 'cosh'
  790. mml = mpp._print(tanh(x))
  791. assert mml.childNodes[0].childNodes[0].nodeValue == 'tanh'
  792. mml = mpp._print(asinh(x))
  793. assert mml.childNodes[0].childNodes[0].nodeValue == 'arcsinh'
  794. mml = mpp._print(atanh(x))
  795. assert mml.childNodes[0].childNodes[0].nodeValue == 'arctanh'
  796. mml = mpp._print(acosh(x))
  797. assert mml.childNodes[0].childNodes[0].nodeValue == 'arccosh'
  798. def test_presentation_mathml_relational():
  799. mml_1 = mpp._print(Eq(x, 1))
  800. assert len(mml_1.childNodes) == 3
  801. assert mml_1.childNodes[0].nodeName == 'mi'
  802. assert mml_1.childNodes[0].childNodes[0].nodeValue == 'x'
  803. assert mml_1.childNodes[1].nodeName == 'mo'
  804. assert mml_1.childNodes[1].childNodes[0].nodeValue == '='
  805. assert mml_1.childNodes[2].nodeName == 'mn'
  806. assert mml_1.childNodes[2].childNodes[0].nodeValue == '1'
  807. mml_2 = mpp._print(Ne(1, x))
  808. assert len(mml_2.childNodes) == 3
  809. assert mml_2.childNodes[0].nodeName == 'mn'
  810. assert mml_2.childNodes[0].childNodes[0].nodeValue == '1'
  811. assert mml_2.childNodes[1].nodeName == 'mo'
  812. assert mml_2.childNodes[1].childNodes[0].nodeValue == '&#x2260;'
  813. assert mml_2.childNodes[2].nodeName == 'mi'
  814. assert mml_2.childNodes[2].childNodes[0].nodeValue == 'x'
  815. mml_3 = mpp._print(Ge(1, x))
  816. assert len(mml_3.childNodes) == 3
  817. assert mml_3.childNodes[0].nodeName == 'mn'
  818. assert mml_3.childNodes[0].childNodes[0].nodeValue == '1'
  819. assert mml_3.childNodes[1].nodeName == 'mo'
  820. assert mml_3.childNodes[1].childNodes[0].nodeValue == '&#x2265;'
  821. assert mml_3.childNodes[2].nodeName == 'mi'
  822. assert mml_3.childNodes[2].childNodes[0].nodeValue == 'x'
  823. mml_4 = mpp._print(Lt(1, x))
  824. assert len(mml_4.childNodes) == 3
  825. assert mml_4.childNodes[0].nodeName == 'mn'
  826. assert mml_4.childNodes[0].childNodes[0].nodeValue == '1'
  827. assert mml_4.childNodes[1].nodeName == 'mo'
  828. assert mml_4.childNodes[1].childNodes[0].nodeValue == '<'
  829. assert mml_4.childNodes[2].nodeName == 'mi'
  830. assert mml_4.childNodes[2].childNodes[0].nodeValue == 'x'
  831. def test_presentation_symbol():
  832. mml = mpp._print(x)
  833. assert mml.nodeName == 'mi'
  834. assert mml.childNodes[0].nodeValue == 'x'
  835. del mml
  836. mml = mpp._print(Symbol("x^2"))
  837. assert mml.nodeName == 'msup'
  838. assert mml.childNodes[0].nodeName == 'mi'
  839. assert mml.childNodes[0].childNodes[0].nodeValue == 'x'
  840. assert mml.childNodes[1].nodeName == 'mi'
  841. assert mml.childNodes[1].childNodes[0].nodeValue == '2'
  842. del mml
  843. mml = mpp._print(Symbol("x__2"))
  844. assert mml.nodeName == 'msup'
  845. assert mml.childNodes[0].nodeName == 'mi'
  846. assert mml.childNodes[0].childNodes[0].nodeValue == 'x'
  847. assert mml.childNodes[1].nodeName == 'mi'
  848. assert mml.childNodes[1].childNodes[0].nodeValue == '2'
  849. del mml
  850. mml = mpp._print(Symbol("x_2"))
  851. assert mml.nodeName == 'msub'
  852. assert mml.childNodes[0].nodeName == 'mi'
  853. assert mml.childNodes[0].childNodes[0].nodeValue == 'x'
  854. assert mml.childNodes[1].nodeName == 'mi'
  855. assert mml.childNodes[1].childNodes[0].nodeValue == '2'
  856. del mml
  857. mml = mpp._print(Symbol("x^3_2"))
  858. assert mml.nodeName == 'msubsup'
  859. assert mml.childNodes[0].nodeName == 'mi'
  860. assert mml.childNodes[0].childNodes[0].nodeValue == 'x'
  861. assert mml.childNodes[1].nodeName == 'mi'
  862. assert mml.childNodes[1].childNodes[0].nodeValue == '2'
  863. assert mml.childNodes[2].nodeName == 'mi'
  864. assert mml.childNodes[2].childNodes[0].nodeValue == '3'
  865. del mml
  866. mml = mpp._print(Symbol("x__3_2"))
  867. assert mml.nodeName == 'msubsup'
  868. assert mml.childNodes[0].nodeName == 'mi'
  869. assert mml.childNodes[0].childNodes[0].nodeValue == 'x'
  870. assert mml.childNodes[1].nodeName == 'mi'
  871. assert mml.childNodes[1].childNodes[0].nodeValue == '2'
  872. assert mml.childNodes[2].nodeName == 'mi'
  873. assert mml.childNodes[2].childNodes[0].nodeValue == '3'
  874. del mml
  875. mml = mpp._print(Symbol("x_2_a"))
  876. assert mml.nodeName == 'msub'
  877. assert mml.childNodes[0].nodeName == 'mi'
  878. assert mml.childNodes[0].childNodes[0].nodeValue == 'x'
  879. assert mml.childNodes[1].nodeName == 'mrow'
  880. assert mml.childNodes[1].childNodes[0].nodeName == 'mi'
  881. assert mml.childNodes[1].childNodes[0].childNodes[0].nodeValue == '2'
  882. assert mml.childNodes[1].childNodes[1].nodeName == 'mo'
  883. assert mml.childNodes[1].childNodes[1].childNodes[0].nodeValue == ' '
  884. assert mml.childNodes[1].childNodes[2].nodeName == 'mi'
  885. assert mml.childNodes[1].childNodes[2].childNodes[0].nodeValue == 'a'
  886. del mml
  887. mml = mpp._print(Symbol("x^2^a"))
  888. assert mml.nodeName == 'msup'
  889. assert mml.childNodes[0].nodeName == 'mi'
  890. assert mml.childNodes[0].childNodes[0].nodeValue == 'x'
  891. assert mml.childNodes[1].nodeName == 'mrow'
  892. assert mml.childNodes[1].childNodes[0].nodeName == 'mi'
  893. assert mml.childNodes[1].childNodes[0].childNodes[0].nodeValue == '2'
  894. assert mml.childNodes[1].childNodes[1].nodeName == 'mo'
  895. assert mml.childNodes[1].childNodes[1].childNodes[0].nodeValue == ' '
  896. assert mml.childNodes[1].childNodes[2].nodeName == 'mi'
  897. assert mml.childNodes[1].childNodes[2].childNodes[0].nodeValue == 'a'
  898. del mml
  899. mml = mpp._print(Symbol("x__2__a"))
  900. assert mml.nodeName == 'msup'
  901. assert mml.childNodes[0].nodeName == 'mi'
  902. assert mml.childNodes[0].childNodes[0].nodeValue == 'x'
  903. assert mml.childNodes[1].nodeName == 'mrow'
  904. assert mml.childNodes[1].childNodes[0].nodeName == 'mi'
  905. assert mml.childNodes[1].childNodes[0].childNodes[0].nodeValue == '2'
  906. assert mml.childNodes[1].childNodes[1].nodeName == 'mo'
  907. assert mml.childNodes[1].childNodes[1].childNodes[0].nodeValue == ' '
  908. assert mml.childNodes[1].childNodes[2].nodeName == 'mi'
  909. assert mml.childNodes[1].childNodes[2].childNodes[0].nodeValue == 'a'
  910. del mml
  911. def test_presentation_mathml_greek():
  912. mml = mpp._print(Symbol('alpha'))
  913. assert mml.nodeName == 'mi'
  914. assert mml.childNodes[0].nodeValue == '\N{GREEK SMALL LETTER ALPHA}'
  915. assert mpp.doprint(Symbol('alpha')) == '<mi>&#945;</mi>'
  916. assert mpp.doprint(Symbol('beta')) == '<mi>&#946;</mi>'
  917. assert mpp.doprint(Symbol('gamma')) == '<mi>&#947;</mi>'
  918. assert mpp.doprint(Symbol('delta')) == '<mi>&#948;</mi>'
  919. assert mpp.doprint(Symbol('epsilon')) == '<mi>&#949;</mi>'
  920. assert mpp.doprint(Symbol('zeta')) == '<mi>&#950;</mi>'
  921. assert mpp.doprint(Symbol('eta')) == '<mi>&#951;</mi>'
  922. assert mpp.doprint(Symbol('theta')) == '<mi>&#952;</mi>'
  923. assert mpp.doprint(Symbol('iota')) == '<mi>&#953;</mi>'
  924. assert mpp.doprint(Symbol('kappa')) == '<mi>&#954;</mi>'
  925. assert mpp.doprint(Symbol('lambda')) == '<mi>&#955;</mi>'
  926. assert mpp.doprint(Symbol('mu')) == '<mi>&#956;</mi>'
  927. assert mpp.doprint(Symbol('nu')) == '<mi>&#957;</mi>'
  928. assert mpp.doprint(Symbol('xi')) == '<mi>&#958;</mi>'
  929. assert mpp.doprint(Symbol('omicron')) == '<mi>&#959;</mi>'
  930. assert mpp.doprint(Symbol('pi')) == '<mi>&#960;</mi>'
  931. assert mpp.doprint(Symbol('rho')) == '<mi>&#961;</mi>'
  932. assert mpp.doprint(Symbol('varsigma')) == '<mi>&#962;</mi>'
  933. assert mpp.doprint(Symbol('sigma')) == '<mi>&#963;</mi>'
  934. assert mpp.doprint(Symbol('tau')) == '<mi>&#964;</mi>'
  935. assert mpp.doprint(Symbol('upsilon')) == '<mi>&#965;</mi>'
  936. assert mpp.doprint(Symbol('phi')) == '<mi>&#966;</mi>'
  937. assert mpp.doprint(Symbol('chi')) == '<mi>&#967;</mi>'
  938. assert mpp.doprint(Symbol('psi')) == '<mi>&#968;</mi>'
  939. assert mpp.doprint(Symbol('omega')) == '<mi>&#969;</mi>'
  940. assert mpp.doprint(Symbol('Alpha')) == '<mi>&#913;</mi>'
  941. assert mpp.doprint(Symbol('Beta')) == '<mi>&#914;</mi>'
  942. assert mpp.doprint(Symbol('Gamma')) == '<mi>&#915;</mi>'
  943. assert mpp.doprint(Symbol('Delta')) == '<mi>&#916;</mi>'
  944. assert mpp.doprint(Symbol('Epsilon')) == '<mi>&#917;</mi>'
  945. assert mpp.doprint(Symbol('Zeta')) == '<mi>&#918;</mi>'
  946. assert mpp.doprint(Symbol('Eta')) == '<mi>&#919;</mi>'
  947. assert mpp.doprint(Symbol('Theta')) == '<mi>&#920;</mi>'
  948. assert mpp.doprint(Symbol('Iota')) == '<mi>&#921;</mi>'
  949. assert mpp.doprint(Symbol('Kappa')) == '<mi>&#922;</mi>'
  950. assert mpp.doprint(Symbol('Lambda')) == '<mi>&#923;</mi>'
  951. assert mpp.doprint(Symbol('Mu')) == '<mi>&#924;</mi>'
  952. assert mpp.doprint(Symbol('Nu')) == '<mi>&#925;</mi>'
  953. assert mpp.doprint(Symbol('Xi')) == '<mi>&#926;</mi>'
  954. assert mpp.doprint(Symbol('Omicron')) == '<mi>&#927;</mi>'
  955. assert mpp.doprint(Symbol('Pi')) == '<mi>&#928;</mi>'
  956. assert mpp.doprint(Symbol('Rho')) == '<mi>&#929;</mi>'
  957. assert mpp.doprint(Symbol('Sigma')) == '<mi>&#931;</mi>'
  958. assert mpp.doprint(Symbol('Tau')) == '<mi>&#932;</mi>'
  959. assert mpp.doprint(Symbol('Upsilon')) == '<mi>&#933;</mi>'
  960. assert mpp.doprint(Symbol('Phi')) == '<mi>&#934;</mi>'
  961. assert mpp.doprint(Symbol('Chi')) == '<mi>&#935;</mi>'
  962. assert mpp.doprint(Symbol('Psi')) == '<mi>&#936;</mi>'
  963. assert mpp.doprint(Symbol('Omega')) == '<mi>&#937;</mi>'
  964. def test_presentation_mathml_order():
  965. expr = x**3 + x**2*y + 3*x*y**3 + y**4
  966. mp = MathMLPresentationPrinter({'order': 'lex'})
  967. mml = mp._print(expr)
  968. assert mml.childNodes[0].nodeName == 'msup'
  969. assert mml.childNodes[0].childNodes[0].childNodes[0].nodeValue == 'x'
  970. assert mml.childNodes[0].childNodes[1].childNodes[0].nodeValue == '3'
  971. assert mml.childNodes[6].nodeName == 'msup'
  972. assert mml.childNodes[6].childNodes[0].childNodes[0].nodeValue == 'y'
  973. assert mml.childNodes[6].childNodes[1].childNodes[0].nodeValue == '4'
  974. mp = MathMLPresentationPrinter({'order': 'rev-lex'})
  975. mml = mp._print(expr)
  976. assert mml.childNodes[0].nodeName == 'msup'
  977. assert mml.childNodes[0].childNodes[0].childNodes[0].nodeValue == 'y'
  978. assert mml.childNodes[0].childNodes[1].childNodes[0].nodeValue == '4'
  979. assert mml.childNodes[6].nodeName == 'msup'
  980. assert mml.childNodes[6].childNodes[0].childNodes[0].nodeValue == 'x'
  981. assert mml.childNodes[6].childNodes[1].childNodes[0].nodeValue == '3'
  982. def test_print_intervals():
  983. a = Symbol('a', real=True)
  984. assert mpp.doprint(Interval(0, a)) == \
  985. '<mrow><mo>[</mo><mn>0</mn><mo>,</mo><mi>a</mi><mo>]</mo></mrow>'
  986. assert mpp.doprint(Interval(0, a, False, False)) == \
  987. '<mrow><mo>[</mo><mn>0</mn><mo>,</mo><mi>a</mi><mo>]</mo></mrow>'
  988. assert mpp.doprint(Interval(0, a, True, False)) == \
  989. '<mrow><mo>(</mo><mn>0</mn><mo>,</mo><mi>a</mi><mo>]</mo></mrow>'
  990. assert mpp.doprint(Interval(0, a, False, True)) == \
  991. '<mrow><mo>[</mo><mn>0</mn><mo>,</mo><mi>a</mi><mo>)</mo></mrow>'
  992. assert mpp.doprint(Interval(0, a, True, True)) == \
  993. '<mrow><mo>(</mo><mn>0</mn><mo>,</mo><mi>a</mi><mo>)</mo></mrow>'
  994. def test_print_tuples():
  995. assert mpp.doprint(Tuple(0,)) == \
  996. '<mrow><mo>(</mo><mn>0</mn><mo>)</mo></mrow>'
  997. assert mpp.doprint(Tuple(0, a)) == \
  998. '<mrow><mo>(</mo><mn>0</mn><mo>,</mo><mi>a</mi><mo>)</mo></mrow>'
  999. assert mpp.doprint(Tuple(0, a, a)) == \
  1000. '<mrow><mo>(</mo><mn>0</mn><mo>,</mo><mi>a</mi><mo>,</mo><mi>a</mi><mo>)</mo></mrow>'
  1001. assert mpp.doprint(Tuple(0, 1, 2, 3, 4)) == \
  1002. '<mrow><mo>(</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>2</mn><mo>,</mo><mn>3</mn><mo>,</mo><mn>4</mn><mo>)</mo></mrow>'
  1003. assert mpp.doprint(Tuple(0, 1, Tuple(2, 3, 4))) == \
  1004. '<mrow><mo>(</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo>,</mo><mrow><mo>(</mo><mn>2</mn><mo>,</mo><mn>3'\
  1005. '</mn><mo>,</mo><mn>4</mn><mo>)</mo></mrow><mo>)</mo></mrow>'
  1006. def test_print_re_im():
  1007. assert mpp.doprint(re(x)) == \
  1008. '<mrow><mi>&#8476;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1009. assert mpp.doprint(im(x)) == \
  1010. '<mrow><mi>&#8465;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1011. assert mpp.doprint(re(x + 1, evaluate=False)) == \
  1012. '<mrow><mi>&#8476;</mi><mrow><mo>(</mo><mrow><mi>x</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow>'
  1013. assert mpp.doprint(im(x + 1, evaluate=False)) == \
  1014. '<mrow><mi>&#8465;</mi><mrow><mo>(</mo><mrow><mi>x</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow></mrow>'
  1015. def test_print_Abs():
  1016. assert mpp.doprint(Abs(x)) == \
  1017. '<mrow><mo>|</mo><mi>x</mi><mo>|</mo></mrow>'
  1018. assert mpp.doprint(Abs(x + 1)) == \
  1019. '<mrow><mo>|</mo><mrow><mi>x</mi><mo>+</mo><mn>1</mn></mrow><mo>|</mo></mrow>'
  1020. def test_print_Determinant():
  1021. assert mpp.doprint(Determinant(Matrix([[1, 2], [3, 4]]))) == \
  1022. '<mrow><mo>|</mo><mrow><mo>[</mo><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mn>2</mn></mtd></mtr><mtr><mtd><mn>3</mn></mtd><mtd><mn>4</mn></mtd></mtr></mtable><mo>]</mo></mrow><mo>|</mo></mrow>'
  1023. def test_presentation_settings():
  1024. raises(TypeError, lambda: mathml(x, printer='presentation',
  1025. method="garbage"))
  1026. def test_print_domains():
  1027. from sympy.sets import Integers, Naturals, Naturals0, Reals, Complexes
  1028. assert mpp.doprint(Complexes) == '<mi mathvariant="normal">&#x2102;</mi>'
  1029. assert mpp.doprint(Integers) == '<mi mathvariant="normal">&#x2124;</mi>'
  1030. assert mpp.doprint(Naturals) == '<mi mathvariant="normal">&#x2115;</mi>'
  1031. assert mpp.doprint(Naturals0) == \
  1032. '<msub><mi mathvariant="normal">&#x2115;</mi><mn>0</mn></msub>'
  1033. assert mpp.doprint(Reals) == '<mi mathvariant="normal">&#x211D;</mi>'
  1034. def test_print_expression_with_minus():
  1035. assert mpp.doprint(-x) == '<mrow><mo>-</mo><mi>x</mi></mrow>'
  1036. assert mpp.doprint(-x/y) == \
  1037. '<mrow><mo>-</mo><mfrac><mi>x</mi><mi>y</mi></mfrac></mrow>'
  1038. assert mpp.doprint(-Rational(1, 2)) == \
  1039. '<mrow><mo>-</mo><mfrac><mn>1</mn><mn>2</mn></mfrac></mrow>'
  1040. def test_print_AssocOp():
  1041. from sympy.core.operations import AssocOp
  1042. class TestAssocOp(AssocOp):
  1043. identity = 0
  1044. expr = TestAssocOp(1, 2)
  1045. assert mpp.doprint(expr) == \
  1046. '<mrow><mi>testassocop</mi><mn>1</mn><mn>2</mn></mrow>'
  1047. def test_print_basic():
  1048. expr = Basic(S(1), S(2))
  1049. assert mpp.doprint(expr) == \
  1050. '<mrow><mi>basic</mi><mrow><mo>(</mo><mn>1</mn><mo>,</mo><mn>2</mn><mo>)</mo></mrow></mrow>'
  1051. assert mp.doprint(expr) == '<basic><cn>1</cn><cn>2</cn></basic>'
  1052. def test_mat_delim_print():
  1053. expr = Matrix([[1, 2], [3, 4]])
  1054. assert mathml(expr, printer='presentation', mat_delim='[') == \
  1055. '<mrow><mo>[</mo><mtable><mtr><mtd><mn>1</mn></mtd><mtd>'\
  1056. '<mn>2</mn></mtd></mtr><mtr><mtd><mn>3</mn></mtd><mtd><mn>4</mn>'\
  1057. '</mtd></mtr></mtable><mo>]</mo></mrow>'
  1058. assert mathml(expr, printer='presentation', mat_delim='(') == \
  1059. '<mrow><mo>(</mo><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mn>2</mn></mtd>'\
  1060. '</mtr><mtr><mtd><mn>3</mn></mtd><mtd><mn>4</mn></mtd></mtr></mtable><mo>)</mo></mrow>'
  1061. assert mathml(expr, printer='presentation', mat_delim='') == \
  1062. '<mtable><mtr><mtd><mn>1</mn></mtd><mtd><mn>2</mn></mtd></mtr><mtr>'\
  1063. '<mtd><mn>3</mn></mtd><mtd><mn>4</mn></mtd></mtr></mtable>'
  1064. def test_ln_notation_print():
  1065. expr = log(x)
  1066. assert mathml(expr, printer='presentation') == \
  1067. '<mrow><mi>log</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1068. assert mathml(expr, printer='presentation', ln_notation=False) == \
  1069. '<mrow><mi>log</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1070. assert mathml(expr, printer='presentation', ln_notation=True) == \
  1071. '<mrow><mi>ln</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1072. def test_mul_symbol_print():
  1073. expr = x * y
  1074. assert mathml(expr, printer='presentation') == \
  1075. '<mrow><mi>x</mi><mo>&InvisibleTimes;</mo><mi>y</mi></mrow>'
  1076. assert mathml(expr, printer='presentation', mul_symbol=None) == \
  1077. '<mrow><mi>x</mi><mo>&InvisibleTimes;</mo><mi>y</mi></mrow>'
  1078. assert mathml(expr, printer='presentation', mul_symbol='dot') == \
  1079. '<mrow><mi>x</mi><mo>&#xB7;</mo><mi>y</mi></mrow>'
  1080. assert mathml(expr, printer='presentation', mul_symbol='ldot') == \
  1081. '<mrow><mi>x</mi><mo>&#x2024;</mo><mi>y</mi></mrow>'
  1082. assert mathml(expr, printer='presentation', mul_symbol='times') == \
  1083. '<mrow><mi>x</mi><mo>&#xD7;</mo><mi>y</mi></mrow>'
  1084. def test_print_lerchphi():
  1085. assert mpp.doprint(lerchphi(1, 2, 3)) == \
  1086. '<mrow><mi>&#x3A6;</mi><mrow><mo>(</mo><mn>1</mn><mo>,</mo><mn>2</mn><mo>,</mo><mn>3</mn><mo>)</mo></mrow></mrow>'
  1087. def test_print_polylog():
  1088. assert mp.doprint(polylog(x, y)) == \
  1089. '<apply><polylog/><ci>x</ci><ci>y</ci></apply>'
  1090. assert mpp.doprint(polylog(x, y)) == \
  1091. '<mrow><msub><mi>Li</mi><mi>x</mi></msub><mrow><mo>(</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1092. def test_print_set_frozenset():
  1093. f = frozenset({1, 5, 3})
  1094. assert mpp.doprint(f) == \
  1095. '<mrow><mo>{</mo><mn>1</mn><mo>,</mo><mn>3</mn><mo>,</mo><mn>5</mn><mo>}</mo></mrow>'
  1096. s = set({1, 2, 3})
  1097. assert mpp.doprint(s) == \
  1098. '<mrow><mo>{</mo><mn>1</mn><mo>,</mo><mn>2</mn><mo>,</mo><mn>3</mn><mo>}</mo></mrow>'
  1099. def test_print_FiniteSet():
  1100. f1 = FiniteSet(x, 1, 3)
  1101. assert mpp.doprint(f1) == \
  1102. '<mrow><mo>{</mo><mn>1</mn><mo>,</mo><mn>3</mn><mo>,</mo><mi>x</mi><mo>}</mo></mrow>'
  1103. def test_print_LambertW():
  1104. assert mpp.doprint(LambertW(x)) == '<mrow><mi>W</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1105. assert mpp.doprint(LambertW(x, y)) == '<mrow><mi>W</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1106. def test_print_EmptySet():
  1107. assert mpp.doprint(S.EmptySet) == '<mo>&#x2205;</mo>'
  1108. def test_print_UniversalSet():
  1109. assert mpp.doprint(S.UniversalSet) == '<mo>&#x1D54C;</mo>'
  1110. def test_print_spaces():
  1111. assert mpp.doprint(HilbertSpace()) == '<mi>&#x210B;</mi>'
  1112. assert mpp.doprint(ComplexSpace(2)) == '<msup>&#x1D49E;<mn>2</mn></msup>'
  1113. assert mpp.doprint(FockSpace()) == '<mi>&#x2131;</mi>'
  1114. def test_print_constants():
  1115. assert mpp.doprint(hbar) == '<mi>&#x210F;</mi>'
  1116. assert mpp.doprint(S.TribonacciConstant) == '<mi>TribonacciConstant</mi>'
  1117. assert mpp.doprint(S.GoldenRatio) == '<mi>&#x3A6;</mi>'
  1118. assert mpp.doprint(S.EulerGamma) == '<mi>&#x3B3;</mi>'
  1119. def test_print_Contains():
  1120. assert mpp.doprint(Contains(x, S.Naturals)) == \
  1121. '<mrow><mi>x</mi><mo>&#x2208;</mo><mi mathvariant="normal">&#x2115;</mi></mrow>'
  1122. def test_print_Dagger():
  1123. x = symbols('x', commutative=False)
  1124. assert mpp.doprint(Dagger(x)) == '<msup><mi>x</mi>&#x2020;</msup>'
  1125. def test_print_SetOp():
  1126. f1 = FiniteSet(x, 1, 3)
  1127. f2 = FiniteSet(y, 2, 4)
  1128. prntr = lambda x: mathml(x, printer='presentation')
  1129. assert prntr(Union(f1, f2, evaluate=False)) == \
  1130. '<mrow><mrow><mo>{</mo><mn>1</mn><mo>,</mo><mn>3</mn><mo>,</mo><mi>x</mi>'\
  1131. '<mo>}</mo></mrow><mo>&#x222A;</mo><mrow><mo>{</mo><mn>2</mn><mo>,</mo>'\
  1132. '<mn>4</mn><mo>,</mo><mi>y</mi><mo>}</mo></mrow></mrow>'
  1133. assert prntr(Intersection(f1, f2, evaluate=False)) == \
  1134. '<mrow><mrow><mo>{</mo><mn>1</mn><mo>,</mo><mn>3</mn><mo>,</mo><mi>x</mi>'\
  1135. '<mo>}</mo></mrow><mo>&#x2229;</mo><mrow><mo>{</mo><mn>2</mn>'\
  1136. '<mo>,</mo><mn>4</mn><mo>,</mo><mi>y</mi><mo>}</mo></mrow></mrow>'
  1137. assert prntr(Complement(f1, f2, evaluate=False)) == \
  1138. '<mrow><mrow><mo>{</mo><mn>1</mn><mo>,</mo><mn>3</mn><mo>,</mo><mi>x</mi>'\
  1139. '<mo>}</mo></mrow><mo>&#x2216;</mo><mrow><mo>{</mo><mn>2</mn>'\
  1140. '<mo>,</mo><mn>4</mn><mo>,</mo><mi>y</mi><mo>}</mo></mrow></mrow>'
  1141. assert prntr(SymmetricDifference(f1, f2, evaluate=False)) == \
  1142. '<mrow><mrow><mo>{</mo><mn>1</mn><mo>,</mo><mn>3</mn><mo>,</mo><mi>x</mi>'\
  1143. '<mo>}</mo></mrow><mo>&#x2206;</mo><mrow><mo>{</mo><mn>2</mn>'\
  1144. '<mo>,</mo><mn>4</mn><mo>,</mo><mi>y</mi><mo>}</mo></mrow></mrow>'
  1145. A = FiniteSet(a)
  1146. C = FiniteSet(c)
  1147. D = FiniteSet(d)
  1148. U1 = Union(C, D, evaluate=False)
  1149. I1 = Intersection(C, D, evaluate=False)
  1150. C1 = Complement(C, D, evaluate=False)
  1151. D1 = SymmetricDifference(C, D, evaluate=False)
  1152. # XXX ProductSet does not support evaluate keyword
  1153. P1 = ProductSet(C, D)
  1154. assert prntr(Union(A, I1, evaluate=False)) == \
  1155. '<mrow><mrow><mo>{</mo><mi>a</mi><mo>}</mo></mrow>' \
  1156. '<mo>&#x222A;</mo><mrow><mo>(</mo><mrow><mrow><mo>{</mo>' \
  1157. '<mi>c</mi><mo>}</mo></mrow><mo>&#x2229;</mo><mrow><mo>{</mo>' \
  1158. '<mi>d</mi><mo>}</mo></mrow></mrow><mo>)</mo></mrow></mrow>'
  1159. assert prntr(Intersection(A, C1, evaluate=False)) == \
  1160. '<mrow><mrow><mo>{</mo><mi>a</mi><mo>}</mo></mrow>' \
  1161. '<mo>&#x2229;</mo><mrow><mo>(</mo><mrow><mrow><mo>{</mo>' \
  1162. '<mi>c</mi><mo>}</mo></mrow><mo>&#x2216;</mo><mrow><mo>{</mo>' \
  1163. '<mi>d</mi><mo>}</mo></mrow></mrow><mo>)</mo></mrow></mrow>'
  1164. assert prntr(Complement(A, D1, evaluate=False)) == \
  1165. '<mrow><mrow><mo>{</mo><mi>a</mi><mo>}</mo></mrow>' \
  1166. '<mo>&#x2216;</mo><mrow><mo>(</mo><mrow><mrow><mo>{</mo>' \
  1167. '<mi>c</mi><mo>}</mo></mrow><mo>&#x2206;</mo><mrow><mo>{</mo>' \
  1168. '<mi>d</mi><mo>}</mo></mrow></mrow><mo>)</mo></mrow></mrow>'
  1169. assert prntr(SymmetricDifference(A, P1, evaluate=False)) == \
  1170. '<mrow><mrow><mo>{</mo><mi>a</mi><mo>}</mo></mrow>' \
  1171. '<mo>&#x2206;</mo><mrow><mo>(</mo><mrow><mrow><mo>{</mo>' \
  1172. '<mi>c</mi><mo>}</mo></mrow><mo>&#x00d7;</mo><mrow><mo>{</mo>' \
  1173. '<mi>d</mi><mo>}</mo></mrow></mrow><mo>)</mo></mrow></mrow>'
  1174. assert prntr(ProductSet(A, U1)) == \
  1175. '<mrow><mrow><mo>{</mo><mi>a</mi><mo>}</mo></mrow>' \
  1176. '<mo>&#x00d7;</mo><mrow><mo>(</mo><mrow><mrow><mo>{</mo>' \
  1177. '<mi>c</mi><mo>}</mo></mrow><mo>&#x222A;</mo><mrow><mo>{</mo>' \
  1178. '<mi>d</mi><mo>}</mo></mrow></mrow><mo>)</mo></mrow></mrow>'
  1179. def test_print_logic():
  1180. assert mpp.doprint(And(x, y)) == \
  1181. '<mrow><mi>x</mi><mo>&#x2227;</mo><mi>y</mi></mrow>'
  1182. assert mpp.doprint(Or(x, y)) == \
  1183. '<mrow><mi>x</mi><mo>&#x2228;</mo><mi>y</mi></mrow>'
  1184. assert mpp.doprint(Xor(x, y)) == \
  1185. '<mrow><mi>x</mi><mo>&#x22BB;</mo><mi>y</mi></mrow>'
  1186. assert mpp.doprint(Implies(x, y)) == \
  1187. '<mrow><mi>x</mi><mo>&#x21D2;</mo><mi>y</mi></mrow>'
  1188. assert mpp.doprint(Equivalent(x, y)) == \
  1189. '<mrow><mi>x</mi><mo>&#x21D4;</mo><mi>y</mi></mrow>'
  1190. assert mpp.doprint(And(Eq(x, y), x > 4)) == \
  1191. '<mrow><mrow><mi>x</mi><mo>=</mo><mi>y</mi></mrow><mo>&#x2227;</mo>'\
  1192. '<mrow><mi>x</mi><mo>></mo><mn>4</mn></mrow></mrow>'
  1193. assert mpp.doprint(And(Eq(x, 3), y < 3, x > y + 1)) == \
  1194. '<mrow><mrow><mi>x</mi><mo>=</mo><mn>3</mn></mrow><mo>&#x2227;</mo>'\
  1195. '<mrow><mi>x</mi><mo>></mo><mrow><mi>y</mi><mo>+</mo><mn>1</mn></mrow>'\
  1196. '</mrow><mo>&#x2227;</mo><mrow><mi>y</mi><mo><</mo><mn>3</mn></mrow></mrow>'
  1197. assert mpp.doprint(Or(Eq(x, y), x > 4)) == \
  1198. '<mrow><mrow><mi>x</mi><mo>=</mo><mi>y</mi></mrow><mo>&#x2228;</mo>'\
  1199. '<mrow><mi>x</mi><mo>></mo><mn>4</mn></mrow></mrow>'
  1200. assert mpp.doprint(And(Eq(x, 3), Or(y < 3, x > y + 1))) == \
  1201. '<mrow><mrow><mi>x</mi><mo>=</mo><mn>3</mn></mrow>'\
  1202. '<mo>&#x2227;</mo><mrow><mo>(</mo><mrow><mrow><mi>x</mi><mo>></mo><mrow>'\
  1203. '<mi>y</mi><mo>+</mo><mn>1</mn></mrow></mrow><mo>&#x2228;</mo><mrow>'\
  1204. '<mi>y</mi><mo><</mo><mn>3</mn></mrow></mrow><mo>)</mo></mrow></mrow>'
  1205. assert mpp.doprint(Not(x)) == '<mrow><mo>&#xAC;</mo><mi>x</mi></mrow>'
  1206. assert mpp.doprint(Not(And(x, y))) == \
  1207. '<mrow><mo>&#xAC;</mo><mrow><mo>(</mo><mrow><mi>x</mi><mo>&#x2227;</mo><mi>y</mi></mrow><mo>)</mo></mrow></mrow>'
  1208. def test_root_notation_print():
  1209. assert mathml(x**(S.One/3), printer='presentation') == \
  1210. '<mroot><mi>x</mi><mn>3</mn></mroot>'
  1211. assert mathml(x**(S.One/3), printer='presentation', root_notation=False) ==\
  1212. '<msup><mi>x</mi><mfrac><mn>1</mn><mn>3</mn></mfrac></msup>'
  1213. assert mathml(x**(S.One/3), printer='content') == \
  1214. '<apply><root/><degree><cn>3</cn></degree><ci>x</ci></apply>'
  1215. assert mathml(x**(S.One/3), printer='content', root_notation=False) == \
  1216. '<apply><power/><ci>x</ci><apply><divide/><cn>1</cn><cn>3</cn></apply></apply>'
  1217. assert mathml(x**(Rational(-1, 3)), printer='presentation') == \
  1218. '<mfrac><mn>1</mn><mroot><mi>x</mi><mn>3</mn></mroot></mfrac>'
  1219. assert mathml(x**(Rational(-1, 3)), printer='presentation', root_notation=False) \
  1220. == '<mfrac><mn>1</mn><msup><mi>x</mi><mfrac><mn>1</mn><mn>3</mn></mfrac></msup></mfrac>'
  1221. def test_fold_frac_powers_print():
  1222. expr = x ** Rational(5, 2)
  1223. assert mathml(expr, printer='presentation') == \
  1224. '<msup><mi>x</mi><mfrac><mn>5</mn><mn>2</mn></mfrac></msup>'
  1225. assert mathml(expr, printer='presentation', fold_frac_powers=True) == \
  1226. '<msup><mi>x</mi><mfrac bevelled="true"><mn>5</mn><mn>2</mn></mfrac></msup>'
  1227. assert mathml(expr, printer='presentation', fold_frac_powers=False) == \
  1228. '<msup><mi>x</mi><mfrac><mn>5</mn><mn>2</mn></mfrac></msup>'
  1229. def test_fold_short_frac_print():
  1230. expr = Rational(2, 5)
  1231. assert mathml(expr, printer='presentation') == \
  1232. '<mfrac><mn>2</mn><mn>5</mn></mfrac>'
  1233. assert mathml(expr, printer='presentation', fold_short_frac=True) == \
  1234. '<mfrac bevelled="true"><mn>2</mn><mn>5</mn></mfrac>'
  1235. assert mathml(expr, printer='presentation', fold_short_frac=False) == \
  1236. '<mfrac><mn>2</mn><mn>5</mn></mfrac>'
  1237. def test_print_factorials():
  1238. assert mpp.doprint(factorial(x)) == '<mrow><mi>x</mi><mo>!</mo></mrow>'
  1239. assert mpp.doprint(factorial(x + 1)) == \
  1240. '<mrow><mrow><mo>(</mo><mrow><mi>x</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo>!</mo></mrow>'
  1241. assert mpp.doprint(factorial2(x)) == '<mrow><mi>x</mi><mo>!!</mo></mrow>'
  1242. assert mpp.doprint(factorial2(x + 1)) == \
  1243. '<mrow><mrow><mo>(</mo><mrow><mi>x</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow><mo>!!</mo></mrow>'
  1244. assert mpp.doprint(binomial(x, y)) == \
  1245. '<mrow><mo>(</mo><mfrac linethickness="0"><mi>x</mi><mi>y</mi></mfrac><mo>)</mo></mrow>'
  1246. assert mpp.doprint(binomial(4, x + y)) == \
  1247. '<mrow><mo>(</mo><mfrac linethickness="0"><mn>4</mn><mrow><mi>x</mi>'\
  1248. '<mo>+</mo><mi>y</mi></mrow></mfrac><mo>)</mo></mrow>'
  1249. def test_print_floor():
  1250. expr = floor(x)
  1251. assert mathml(expr, printer='presentation') == \
  1252. '<mrow><mo>&#8970;</mo><mi>x</mi><mo>&#8971;</mo></mrow>'
  1253. def test_print_ceiling():
  1254. expr = ceiling(x)
  1255. assert mathml(expr, printer='presentation') == \
  1256. '<mrow><mo>&#8968;</mo><mi>x</mi><mo>&#8969;</mo></mrow>'
  1257. def test_print_Lambda():
  1258. expr = Lambda(x, x+1)
  1259. assert mathml(expr, printer='presentation') == \
  1260. '<mrow><mo>(</mo><mi>x</mi><mo>&#x21A6;</mo><mrow><mi>x</mi><mo>+</mo><mn>1</mn></mrow><mo>)</mo></mrow>'
  1261. expr = Lambda((x, y), x + y)
  1262. assert mathml(expr, printer='presentation') == \
  1263. '<mrow><mo>(</mo><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow><mo>&#x21A6;</mo><mrow><mi>x</mi><mo>+</mo><mi>y</mi></mrow><mo>)</mo></mrow>'
  1264. def test_print_conjugate():
  1265. assert mpp.doprint(conjugate(x)) == \
  1266. '<menclose notation="top"><mi>x</mi></menclose>'
  1267. assert mpp.doprint(conjugate(x + 1)) == \
  1268. '<mrow><menclose notation="top"><mi>x</mi></menclose><mo>+</mo><mn>1</mn></mrow>'
  1269. def test_print_AccumBounds():
  1270. a = Symbol('a', real=True)
  1271. assert mpp.doprint(AccumBounds(0, 1)) == '<mrow><mo>&#10216;</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo>&#10217;</mo></mrow>'
  1272. assert mpp.doprint(AccumBounds(0, a)) == '<mrow><mo>&#10216;</mo><mn>0</mn><mo>,</mo><mi>a</mi><mo>&#10217;</mo></mrow>'
  1273. assert mpp.doprint(AccumBounds(a + 1, a + 2)) == '<mrow><mo>&#10216;</mo><mrow><mi>a</mi><mo>+</mo><mn>1</mn></mrow><mo>,</mo><mrow><mi>a</mi><mo>+</mo><mn>2</mn></mrow><mo>&#10217;</mo></mrow>'
  1274. def test_print_Float():
  1275. assert mpp.doprint(Float(1e100)) == '<mrow><mn>1.0</mn><mo>&#xB7;</mo><msup><mn>10</mn><mn>100</mn></msup></mrow>'
  1276. assert mpp.doprint(Float(1e-100)) == '<mrow><mn>1.0</mn><mo>&#xB7;</mo><msup><mn>10</mn><mn>-100</mn></msup></mrow>'
  1277. assert mpp.doprint(Float(-1e100)) == '<mrow><mn>-1.0</mn><mo>&#xB7;</mo><msup><mn>10</mn><mn>100</mn></msup></mrow>'
  1278. assert mpp.doprint(Float(1.0*oo)) == '<mi>&#x221E;</mi>'
  1279. assert mpp.doprint(Float(-1.0*oo)) == '<mrow><mo>-</mo><mi>&#x221E;</mi></mrow>'
  1280. def test_print_different_functions():
  1281. assert mpp.doprint(gamma(x)) == '<mrow><mi>&#x393;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1282. assert mpp.doprint(lowergamma(x, y)) == '<mrow><mi>&#x3B3;</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1283. assert mpp.doprint(uppergamma(x, y)) == '<mrow><mi>&#x393;</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1284. assert mpp.doprint(zeta(x)) == '<mrow><mi>&#x3B6;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1285. assert mpp.doprint(zeta(x, y)) == '<mrow><mi>&#x3B6;</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1286. assert mpp.doprint(dirichlet_eta(x)) == '<mrow><mi>&#x3B7;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1287. assert mpp.doprint(elliptic_k(x)) == '<mrow><mi>&#x39A;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1288. assert mpp.doprint(totient(x)) == '<mrow><mi>&#x3D5;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1289. assert mpp.doprint(reduced_totient(x)) == '<mrow><mi>&#x3BB;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1290. assert mpp.doprint(primenu(x)) == '<mrow><mi>&#x3BD;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1291. assert mpp.doprint(primeomega(x)) == '<mrow><mi>&#x3A9;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1292. assert mpp.doprint(fresnels(x)) == '<mrow><mi>S</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1293. assert mpp.doprint(fresnelc(x)) == '<mrow><mi>C</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1294. assert mpp.doprint(Heaviside(x)) == '<mrow><mi>&#x398;</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mfrac><mn>1</mn><mn>2</mn></mfrac><mo>)</mo></mrow></mrow>'
  1295. def test_mathml_builtins():
  1296. assert mpp.doprint(None) == '<mi>None</mi>'
  1297. assert mpp.doprint(true) == '<mi>True</mi>'
  1298. assert mpp.doprint(false) == '<mi>False</mi>'
  1299. def test_mathml_Range():
  1300. assert mpp.doprint(Range(1, 51)) == \
  1301. '<mrow><mo>{</mo><mn>1</mn><mo>,</mo><mn>2</mn><mo>,</mo><mi>&#8230;</mi><mo>,</mo><mn>50</mn><mo>}</mo></mrow>'
  1302. assert mpp.doprint(Range(1, 4)) == \
  1303. '<mrow><mo>{</mo><mn>1</mn><mo>,</mo><mn>2</mn><mo>,</mo><mn>3</mn><mo>}</mo></mrow>'
  1304. assert mpp.doprint(Range(0, 3, 1)) == \
  1305. '<mrow><mo>{</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo>,</mo><mn>2</mn><mo>}</mo></mrow>'
  1306. assert mpp.doprint(Range(0, 30, 1)) == \
  1307. '<mrow><mo>{</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo>,</mo><mi>&#8230;</mi><mo>,</mo><mn>29</mn><mo>}</mo></mrow>'
  1308. assert mpp.doprint(Range(30, 1, -1)) == \
  1309. '<mrow><mo>{</mo><mn>30</mn><mo>,</mo><mn>29</mn><mo>,</mo><mi>&#8230;</mi><mo>,</mo><mn>2</mn><mo>}</mo></mrow>'
  1310. assert mpp.doprint(Range(0, oo, 2)) == \
  1311. '<mrow><mo>{</mo><mn>0</mn><mo>,</mo><mn>2</mn><mo>,</mo><mi>&#8230;</mi><mo>}</mo></mrow>'
  1312. assert mpp.doprint(Range(oo, -2, -2)) == \
  1313. '<mrow><mo>{</mo><mi>&#8230;</mi><mo>,</mo><mn>2</mn><mo>,</mo><mn>0</mn><mo>}</mo></mrow>'
  1314. assert mpp.doprint(Range(-2, -oo, -1)) == \
  1315. '<mrow><mo>{</mo><mn>-2</mn><mo>,</mo><mn>-3</mn><mo>,</mo><mi>&#8230;</mi><mo>}</mo></mrow>'
  1316. def test_print_exp():
  1317. assert mpp.doprint(exp(x)) == \
  1318. '<msup><mi>&ExponentialE;</mi><mi>x</mi></msup>'
  1319. assert mpp.doprint(exp(1) + exp(2)) == \
  1320. '<mrow><mi>&ExponentialE;</mi><mo>+</mo><msup><mi>&ExponentialE;</mi><mn>2</mn></msup></mrow>'
  1321. def test_print_MinMax():
  1322. assert mpp.doprint(Min(x, y)) == \
  1323. '<mrow><mo>min</mo><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1324. assert mpp.doprint(Min(x, 2, x**3)) == \
  1325. '<mrow><mo>min</mo><mrow><mo>(</mo><mn>2</mn><mo>,</mo><mi>x</mi><mo>,</mo><msup><mi>x</mi><mn>3</mn></msup><mo>)</mo></mrow></mrow>'
  1326. assert mpp.doprint(Max(x, y)) == \
  1327. '<mrow><mo>max</mo><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1328. assert mpp.doprint(Max(x, 2, x**3)) == \
  1329. '<mrow><mo>max</mo><mrow><mo>(</mo><mn>2</mn><mo>,</mo><mi>x</mi><mo>,</mo><msup><mi>x</mi><mn>3</mn></msup><mo>)</mo></mrow></mrow>'
  1330. def test_mathml_presentation_numbers():
  1331. n = Symbol('n')
  1332. assert mathml(catalan(n), printer='presentation') == \
  1333. '<msub><mi>C</mi><mi>n</mi></msub>'
  1334. assert mathml(bernoulli(n), printer='presentation') == \
  1335. '<msub><mi>B</mi><mi>n</mi></msub>'
  1336. assert mathml(bell(n), printer='presentation') == \
  1337. '<msub><mi>B</mi><mi>n</mi></msub>'
  1338. assert mathml(euler(n), printer='presentation') == \
  1339. '<msub><mi>E</mi><mi>n</mi></msub>'
  1340. assert mathml(fibonacci(n), printer='presentation') == \
  1341. '<msub><mi>F</mi><mi>n</mi></msub>'
  1342. assert mathml(lucas(n), printer='presentation') == \
  1343. '<msub><mi>L</mi><mi>n</mi></msub>'
  1344. assert mathml(tribonacci(n), printer='presentation') == \
  1345. '<msub><mi>T</mi><mi>n</mi></msub>'
  1346. assert mathml(bernoulli(n, x), printer='presentation') == \
  1347. mathml(bell(n, x), printer='presentation') == \
  1348. '<mrow><msub><mi>B</mi><mi>n</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1349. assert mathml(euler(n, x), printer='presentation') == \
  1350. '<mrow><msub><mi>E</mi><mi>n</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1351. assert mathml(fibonacci(n, x), printer='presentation') == \
  1352. '<mrow><msub><mi>F</mi><mi>n</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1353. assert mathml(tribonacci(n, x), printer='presentation') == \
  1354. '<mrow><msub><mi>T</mi><mi>n</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1355. def test_mathml_presentation_mathieu():
  1356. assert mathml(mathieuc(x, y, z), printer='presentation') == \
  1357. '<mrow><mi>C</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>,</mo><mi>z</mi><mo>)</mo></mrow></mrow>'
  1358. assert mathml(mathieus(x, y, z), printer='presentation') == \
  1359. '<mrow><mi>S</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>,</mo><mi>z</mi><mo>)</mo></mrow></mrow>'
  1360. assert mathml(mathieucprime(x, y, z), printer='presentation') == \
  1361. '<mrow><mi>C&#x2032;</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>,</mo><mi>z</mi><mo>)</mo></mrow></mrow>'
  1362. assert mathml(mathieusprime(x, y, z), printer='presentation') == \
  1363. '<mrow><mi>S&#x2032;</mi><mrow><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>,</mo><mi>z</mi><mo>)</mo></mrow></mrow>'
  1364. def test_mathml_presentation_stieltjes():
  1365. assert mathml(stieltjes(n), printer='presentation') == \
  1366. '<msub><mi>&#x03B3;</mi><mi>n</mi></msub>'
  1367. assert mathml(stieltjes(n, x), printer='presentation') == \
  1368. '<mrow><msub><mi>&#x03B3;</mi><mi>n</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1369. def test_print_matrix_symbol():
  1370. A = MatrixSymbol('A', 1, 2)
  1371. assert mpp.doprint(A) == '<mi>A</mi>'
  1372. assert mp.doprint(A) == '<ci>A</ci>'
  1373. assert mathml(A, printer='presentation', mat_symbol_style="bold") == \
  1374. '<mi mathvariant="bold">A</mi>'
  1375. # No effect in content printer
  1376. assert mathml(A, mat_symbol_style="bold") == '<ci>A</ci>'
  1377. def test_print_hadamard():
  1378. from sympy.matrices.expressions import HadamardProduct
  1379. from sympy.matrices.expressions import Transpose
  1380. X = MatrixSymbol('X', 2, 2)
  1381. Y = MatrixSymbol('Y', 2, 2)
  1382. assert mathml(HadamardProduct(X, Y*Y), printer="presentation") == \
  1383. '<mrow>' \
  1384. '<mi>X</mi>' \
  1385. '<mo>&#x2218;</mo>' \
  1386. '<msup><mi>Y</mi><mn>2</mn></msup>' \
  1387. '</mrow>'
  1388. assert mathml(HadamardProduct(X, Y)*Y, printer="presentation") == \
  1389. '<mrow>' \
  1390. '<mrow><mo>(</mo>' \
  1391. '<mrow><mi>X</mi><mo>&#x2218;</mo><mi>Y</mi></mrow>' \
  1392. '<mo>)</mo></mrow>' \
  1393. '<mo>&InvisibleTimes;</mo><mi>Y</mi>' \
  1394. '</mrow>'
  1395. assert mathml(HadamardProduct(X, Y, Y), printer="presentation") == \
  1396. '<mrow>' \
  1397. '<mi>X</mi><mo>&#x2218;</mo>' \
  1398. '<mi>Y</mi><mo>&#x2218;</mo>' \
  1399. '<mi>Y</mi>' \
  1400. '</mrow>'
  1401. assert mathml(
  1402. Transpose(HadamardProduct(X, Y)), printer="presentation") == \
  1403. '<msup>' \
  1404. '<mrow><mo>(</mo>' \
  1405. '<mrow><mi>X</mi><mo>&#x2218;</mo><mi>Y</mi></mrow>' \
  1406. '<mo>)</mo></mrow>' \
  1407. '<mo>T</mo>' \
  1408. '</msup>'
  1409. def test_print_random_symbol():
  1410. R = RandomSymbol(Symbol('R'))
  1411. assert mpp.doprint(R) == '<mi>R</mi>'
  1412. assert mp.doprint(R) == '<ci>R</ci>'
  1413. def test_print_IndexedBase():
  1414. assert mathml(IndexedBase(a)[b], printer='presentation') == \
  1415. '<msub><mi>a</mi><mi>b</mi></msub>'
  1416. assert mathml(IndexedBase(a)[b, c, d], printer='presentation') == \
  1417. '<msub><mi>a</mi><mrow><mo>(</mo><mi>b</mi><mo>,</mo><mi>c</mi><mo>,</mo><mi>d</mi><mo>)</mo></mrow></msub>'
  1418. assert mathml(IndexedBase(a)[b]*IndexedBase(c)[d]*IndexedBase(e),
  1419. printer='presentation') == \
  1420. '<mrow><msub><mi>a</mi><mi>b</mi></msub><mo>&InvisibleTimes;'\
  1421. '</mo><msub><mi>c</mi><mi>d</mi></msub><mo>&InvisibleTimes;</mo><mi>e</mi></mrow>'
  1422. def test_print_Indexed():
  1423. assert mathml(IndexedBase(a), printer='presentation') == '<mi>a</mi>'
  1424. assert mathml(IndexedBase(a/b), printer='presentation') == \
  1425. '<mrow><mfrac><mi>a</mi><mi>b</mi></mfrac></mrow>'
  1426. assert mathml(IndexedBase((a, b)), printer='presentation') == \
  1427. '<mrow><mo>(</mo><mi>a</mi><mo>,</mo><mi>b</mi><mo>)</mo></mrow>'
  1428. def test_print_MatrixElement():
  1429. i, j = symbols('i j')
  1430. A = MatrixSymbol('A', i, j)
  1431. assert mathml(A[0,0],printer = 'presentation') == \
  1432. '<msub><mi>A</mi><mrow><mn>0</mn><mo>,</mo><mn>0</mn></mrow></msub>'
  1433. assert mathml(A[i,j], printer = 'presentation') == \
  1434. '<msub><mi>A</mi><mrow><mi>i</mi><mo>,</mo><mi>j</mi></mrow></msub>'
  1435. assert mathml(A[i*j,0], printer = 'presentation') == \
  1436. '<msub><mi>A</mi><mrow><mrow><mi>i</mi><mo>&InvisibleTimes;</mo><mi>j</mi></mrow><mo>,</mo><mn>0</mn></mrow></msub>'
  1437. def test_print_Vector():
  1438. ACS = CoordSys3D('A')
  1439. assert mathml(Cross(ACS.i, ACS.j*ACS.x*3 + ACS.k), printer='presentation') == \
  1440. '<mrow><msub><mover><mi mathvariant="bold">i</mi><mo>^</mo></mover>'\
  1441. '<mi mathvariant="bold">A</mi></msub><mo>&#xD7;</mo><mrow><mo>(</mo><mrow>'\
  1442. '<mrow><mo>(</mo><mrow><mn>3</mn><mo>&InvisibleTimes;</mo><msub>'\
  1443. '<mi mathvariant="bold">x</mi><mi mathvariant="bold">A</mi></msub>'\
  1444. '</mrow><mo>)</mo></mrow><mo>&InvisibleTimes;</mo><msub><mover>'\
  1445. '<mi mathvariant="bold">j</mi><mo>^</mo></mover>'\
  1446. '<mi mathvariant="bold">A</mi></msub><mo>+</mo><msub><mover>'\
  1447. '<mi mathvariant="bold">k</mi><mo>^</mo></mover><mi mathvariant="bold">'\
  1448. 'A</mi></msub></mrow><mo>)</mo></mrow></mrow>'
  1449. assert mathml(Cross(ACS.i, ACS.j), printer='presentation') == \
  1450. '<mrow><msub><mover><mi mathvariant="bold">i</mi><mo>^</mo></mover>'\
  1451. '<mi mathvariant="bold">A</mi></msub><mo>&#xD7;</mo><msub><mover>'\
  1452. '<mi mathvariant="bold">j</mi><mo>^</mo></mover>'\
  1453. '<mi mathvariant="bold">A</mi></msub></mrow>'
  1454. assert mathml(x*Cross(ACS.i, ACS.j), printer='presentation') == \
  1455. '<mrow><mi>x</mi><mo>&InvisibleTimes;</mo><mrow><mo>(</mo><mrow><msub><mover>'\
  1456. '<mi mathvariant="bold">i</mi><mo>^</mo></mover>'\
  1457. '<mi mathvariant="bold">A</mi></msub><mo>&#xD7;</mo><msub><mover>'\
  1458. '<mi mathvariant="bold">j</mi><mo>^</mo></mover>'\
  1459. '<mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow></mrow>'
  1460. assert mathml(Cross(x*ACS.i, ACS.j), printer='presentation') == \
  1461. '<mrow><mo>-</mo><mrow><msub><mover><mi mathvariant="bold">j</mi>'\
  1462. '<mo>^</mo></mover><mi mathvariant="bold">A</mi></msub>'\
  1463. '<mo>&#xD7;</mo><mrow><mo>(</mo><mrow><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow>'\
  1464. '<mo>&InvisibleTimes;</mo><msub><mover><mi mathvariant="bold">i</mi>'\
  1465. '<mo>^</mo></mover><mi mathvariant="bold">A</mi></msub></mrow>'\
  1466. '<mo>)</mo></mrow></mrow></mrow>'
  1467. assert mathml(Curl(3*ACS.x*ACS.j), printer='presentation') == \
  1468. '<mrow><mo>&#x2207;</mo><mo>&#xD7;</mo><mrow><mo>(</mo><mrow><mrow><mo>(</mo>'\
  1469. '<mrow><mn>3</mn><mo>&InvisibleTimes;</mo><msub><mi mathvariant="bold">x</mi>'\
  1470. '<mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow><mo>&InvisibleTimes;</mo>'\
  1471. '<msub><mover><mi mathvariant="bold">j</mi><mo>^</mo></mover>'\
  1472. '<mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow></mrow>'
  1473. assert mathml(Curl(3*x*ACS.x*ACS.j), printer='presentation') == \
  1474. '<mrow><mo>&#x2207;</mo><mo>&#xD7;</mo><mrow><mo>(</mo><mrow><mrow><mo>(</mo><mrow>'\
  1475. '<mn>3</mn><mo>&InvisibleTimes;</mo><msub><mi mathvariant="bold">x'\
  1476. '</mi><mi mathvariant="bold">A</mi></msub><mo>&InvisibleTimes;</mo>'\
  1477. '<mi>x</mi></mrow><mo>)</mo></mrow><mo>&InvisibleTimes;</mo><msub><mover>'\
  1478. '<mi mathvariant="bold">j</mi><mo>^</mo></mover>'\
  1479. '<mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow></mrow>'
  1480. assert mathml(x*Curl(3*ACS.x*ACS.j), printer='presentation') == \
  1481. '<mrow><mi>x</mi><mo>&InvisibleTimes;</mo><mrow><mo>(</mo><mrow><mo>&#x2207;</mo>'\
  1482. '<mo>&#xD7;</mo><mrow><mo>(</mo><mrow><mrow><mo>(</mo><mrow><mn>3</mn>'\
  1483. '<mo>&InvisibleTimes;</mo><msub><mi mathvariant="bold">x</mi>'\
  1484. '<mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow>'\
  1485. '<mo>&InvisibleTimes;</mo><msub><mover><mi mathvariant="bold">j</mi>'\
  1486. '<mo>^</mo></mover><mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo>'\
  1487. '</mrow></mrow><mo>)</mo></mrow></mrow>'
  1488. assert mathml(Curl(3*x*ACS.x*ACS.j + ACS.i), printer='presentation') == \
  1489. '<mrow><mo>&#x2207;</mo><mo>&#xD7;</mo><mrow><mo>(</mo><mrow><msub><mover>'\
  1490. '<mi mathvariant="bold">i</mi><mo>^</mo></mover>'\
  1491. '<mi mathvariant="bold">A</mi></msub><mo>+</mo><mrow><mo>(</mo><mrow>'\
  1492. '<mn>3</mn><mo>&InvisibleTimes;</mo><msub><mi mathvariant="bold">x'\
  1493. '</mi><mi mathvariant="bold">A</mi></msub><mo>&InvisibleTimes;</mo>'\
  1494. '<mi>x</mi></mrow><mo>)</mo></mrow><mo>&InvisibleTimes;</mo><msub><mover>'\
  1495. '<mi mathvariant="bold">j</mi><mo>^</mo></mover>'\
  1496. '<mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow></mrow>'
  1497. assert mathml(Divergence(3*ACS.x*ACS.j), printer='presentation') == \
  1498. '<mrow><mo>&#x2207;</mo><mo>&#xB7;</mo><mrow><mo>(</mo><mrow><mrow><mo>(</mo>'\
  1499. '<mrow><mn>3</mn><mo>&InvisibleTimes;</mo><msub><mi mathvariant="bold">x'\
  1500. '</mi><mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow>'\
  1501. '<mo>&InvisibleTimes;</mo><msub><mover><mi mathvariant="bold">j</mi>'\
  1502. '<mo>^</mo></mover><mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow></mrow>'
  1503. assert mathml(x*Divergence(3*ACS.x*ACS.j), printer='presentation') == \
  1504. '<mrow><mi>x</mi><mo>&InvisibleTimes;</mo><mrow><mo>(</mo><mrow><mo>&#x2207;</mo>'\
  1505. '<mo>&#xB7;</mo><mrow><mo>(</mo><mrow><mrow><mo>(</mo><mrow><mn>3</mn>'\
  1506. '<mo>&InvisibleTimes;</mo><msub><mi mathvariant="bold">x</mi>'\
  1507. '<mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow>'\
  1508. '<mo>&InvisibleTimes;</mo><msub><mover><mi mathvariant="bold">j</mi>'\
  1509. '<mo>^</mo></mover><mi mathvariant="bold">A</mi></msub></mrow>'\
  1510. '<mo>)</mo></mrow></mrow><mo>)</mo></mrow></mrow>'
  1511. assert mathml(Divergence(3*x*ACS.x*ACS.j + ACS.i), printer='presentation') == \
  1512. '<mrow><mo>&#x2207;</mo><mo>&#xB7;</mo><mrow><mo>(</mo><mrow><msub><mover>'\
  1513. '<mi mathvariant="bold">i</mi><mo>^</mo></mover>'\
  1514. '<mi mathvariant="bold">A</mi></msub><mo>+</mo><mrow><mo>(</mo><mrow>'\
  1515. '<mn>3</mn><mo>&InvisibleTimes;</mo><msub>'\
  1516. '<mi mathvariant="bold">x</mi><mi mathvariant="bold">A</mi></msub>'\
  1517. '<mo>&InvisibleTimes;</mo><mi>x</mi></mrow><mo>)</mo></mrow>'\
  1518. '<mo>&InvisibleTimes;</mo><msub><mover><mi mathvariant="bold">j</mi>'\
  1519. '<mo>^</mo></mover><mi mathvariant="bold">A</mi></msub></mrow>'\
  1520. '<mo>)</mo></mrow></mrow>'
  1521. assert mathml(Dot(ACS.i, ACS.j*ACS.x*3+ACS.k), printer='presentation') == \
  1522. '<mrow><msub><mover><mi mathvariant="bold">i</mi><mo>^</mo></mover>'\
  1523. '<mi mathvariant="bold">A</mi></msub><mo>&#xB7;</mo><mrow><mo>(</mo><mrow>'\
  1524. '<mrow><mo>(</mo><mrow><mn>3</mn><mo>&InvisibleTimes;</mo><msub>'\
  1525. '<mi mathvariant="bold">x</mi><mi mathvariant="bold">A</mi></msub>'\
  1526. '</mrow><mo>)</mo></mrow><mo>&InvisibleTimes;</mo><msub><mover>'\
  1527. '<mi mathvariant="bold">j</mi><mo>^</mo></mover>'\
  1528. '<mi mathvariant="bold">A</mi></msub><mo>+</mo><msub><mover>'\
  1529. '<mi mathvariant="bold">k</mi><mo>^</mo></mover>'\
  1530. '<mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow></mrow>'
  1531. assert mathml(Dot(ACS.i, ACS.j), printer='presentation') == \
  1532. '<mrow><msub><mover><mi mathvariant="bold">i</mi><mo>^</mo></mover>'\
  1533. '<mi mathvariant="bold">A</mi></msub><mo>&#xB7;</mo><msub><mover>'\
  1534. '<mi mathvariant="bold">j</mi><mo>^</mo></mover>'\
  1535. '<mi mathvariant="bold">A</mi></msub></mrow>'
  1536. assert mathml(Dot(x*ACS.i, ACS.j), printer='presentation') == \
  1537. '<mrow><msub><mover><mi mathvariant="bold">j</mi><mo>^</mo></mover>'\
  1538. '<mi mathvariant="bold">A</mi></msub><mo>&#xB7;</mo><mrow><mo>(</mo><mrow>'\
  1539. '<mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow><mo>&InvisibleTimes;</mo><msub><mover>'\
  1540. '<mi mathvariant="bold">i</mi><mo>^</mo></mover>'\
  1541. '<mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow></mrow>'
  1542. assert mathml(x*Dot(ACS.i, ACS.j), printer='presentation') == \
  1543. '<mrow><mi>x</mi><mo>&InvisibleTimes;</mo><mrow><mo>(</mo><mrow><msub><mover>'\
  1544. '<mi mathvariant="bold">i</mi><mo>^</mo></mover>'\
  1545. '<mi mathvariant="bold">A</mi></msub><mo>&#xB7;</mo><msub><mover>'\
  1546. '<mi mathvariant="bold">j</mi><mo>^</mo></mover>'\
  1547. '<mi mathvariant="bold">A</mi></msub></mrow><mo>)</mo></mrow></mrow>'
  1548. assert mathml(Gradient(ACS.x), printer='presentation') == \
  1549. '<mrow><mo>&#x2207;</mo><msub><mi mathvariant="bold">x</mi>'\
  1550. '<mi mathvariant="bold">A</mi></msub></mrow>'
  1551. assert mathml(Gradient(ACS.x + 3*ACS.y), printer='presentation') == \
  1552. '<mrow><mo>&#x2207;</mo><mrow><mo>(</mo><mrow><msub><mi mathvariant="bold">'\
  1553. 'x</mi><mi mathvariant="bold">A</mi></msub><mo>+</mo><mrow><mn>3</mn>'\
  1554. '<mo>&InvisibleTimes;</mo><msub><mi mathvariant="bold">y</mi>'\
  1555. '<mi mathvariant="bold">A</mi></msub></mrow></mrow><mo>)</mo></mrow></mrow>'
  1556. assert mathml(x*Gradient(ACS.x), printer='presentation') == \
  1557. '<mrow><mi>x</mi><mo>&InvisibleTimes;</mo><mrow><mo>(</mo><mrow><mo>&#x2207;</mo>'\
  1558. '<msub><mi mathvariant="bold">x</mi><mi mathvariant="bold">A</mi>'\
  1559. '</msub></mrow><mo>)</mo></mrow></mrow>'
  1560. assert mathml(Gradient(x*ACS.x), printer='presentation') == \
  1561. '<mrow><mo>&#x2207;</mo><mrow><mo>(</mo><mrow><msub><mi mathvariant="bold">'\
  1562. 'x</mi><mi mathvariant="bold">A</mi></msub><mo>&InvisibleTimes;</mo>'\
  1563. '<mi>x</mi></mrow><mo>)</mo></mrow></mrow>'
  1564. assert mathml(Cross(ACS.z, ACS.x), printer='presentation') == \
  1565. '<mrow><mo>-</mo><mrow><msub><mi mathvariant="bold">x</mi>'\
  1566. '<mi mathvariant="bold">A</mi></msub><mo>&#xD7;</mo><msub>'\
  1567. '<mi mathvariant="bold">z</mi><mi mathvariant="bold">A</mi></msub></mrow></mrow>'
  1568. assert mathml(Laplacian(ACS.x), printer='presentation') == \
  1569. '<mrow><mo>&#x2206;</mo><msub><mi mathvariant="bold">x</mi>'\
  1570. '<mi mathvariant="bold">A</mi></msub></mrow>'
  1571. assert mathml(Laplacian(ACS.x + 3*ACS.y), printer='presentation') == \
  1572. '<mrow><mo>&#x2206;</mo><mrow><mo>(</mo><mrow><msub><mi mathvariant="bold">'\
  1573. 'x</mi><mi mathvariant="bold">A</mi></msub><mo>+</mo><mrow><mn>3</mn>'\
  1574. '<mo>&InvisibleTimes;</mo><msub><mi mathvariant="bold">y</mi>'\
  1575. '<mi mathvariant="bold">A</mi></msub></mrow></mrow><mo>)</mo></mrow></mrow>'
  1576. assert mathml(x*Laplacian(ACS.x), printer='presentation') == \
  1577. '<mrow><mi>x</mi><mo>&InvisibleTimes;</mo><mrow><mo>(</mo><mrow><mo>&#x2206;</mo>'\
  1578. '<msub><mi mathvariant="bold">x</mi><mi mathvariant="bold">A</mi>'\
  1579. '</msub></mrow><mo>)</mo></mrow></mrow>'
  1580. assert mathml(Laplacian(x*ACS.x), printer='presentation') == \
  1581. '<mrow><mo>&#x2206;</mo><mrow><mo>(</mo><mrow><msub><mi mathvariant="bold">'\
  1582. 'x</mi><mi mathvariant="bold">A</mi></msub><mo>&InvisibleTimes;</mo>'\
  1583. '<mi>x</mi></mrow><mo>)</mo></mrow></mrow>'
  1584. @XFAIL
  1585. def test_vector_cross_xfail():
  1586. ACS = CoordSys3D('A')
  1587. assert mathml(Cross(ACS.x, ACS.z) + Cross(ACS.z, ACS.x), printer='presentation') == \
  1588. '<mover><mi mathvariant="bold">0</mi><mo>^</mo></mover>'
  1589. def test_print_elliptic_f():
  1590. assert mathml(elliptic_f(x, y), printer = 'presentation') == \
  1591. '<mrow><mi>&#x1d5a5;</mi><mrow><mo>(</mo><mi>x</mi><mo>|</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1592. assert mathml(elliptic_f(x/y, y), printer = 'presentation') == \
  1593. '<mrow><mi>&#x1d5a5;</mi><mrow><mo>(</mo><mrow><mfrac><mi>x</mi><mi>y</mi></mfrac></mrow><mo>|</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1594. def test_print_elliptic_e():
  1595. assert mathml(elliptic_e(x), printer = 'presentation') == \
  1596. '<mrow><mi>&#x1d5a4;</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1597. assert mathml(elliptic_e(x, y), printer = 'presentation') == \
  1598. '<mrow><mi>&#x1d5a4;</mi><mrow><mo>(</mo><mi>x</mi><mo>|</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1599. def test_print_elliptic_pi():
  1600. assert mathml(elliptic_pi(x, y), printer = 'presentation') == \
  1601. '<mrow><mi>&#x1d6f1;</mi><mrow><mo>(</mo><mi>x</mi><mo>|</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1602. assert mathml(elliptic_pi(x, y, z), printer = 'presentation') == \
  1603. '<mrow><mi>&#x1d6f1;</mi><mrow><mo>(</mo><mi>x</mi><mo>;</mo><mi>y</mi><mo>|</mo><mi>z</mi><mo>)</mo></mrow></mrow>'
  1604. def test_print_Ei():
  1605. assert mathml(Ei(x), printer = 'presentation') == \
  1606. '<mrow><mi>Ei</mi><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1607. assert mathml(Ei(x**y), printer = 'presentation') == \
  1608. '<mrow><mi>Ei</mi><mrow><mo>(</mo><msup><mi>x</mi><mi>y</mi></msup><mo>)</mo></mrow></mrow>'
  1609. def test_print_expint():
  1610. assert mathml(expint(x, y), printer = 'presentation') == \
  1611. '<mrow><msub><mo>E</mo><mi>x</mi></msub><mrow><mo>(</mo><mi>y</mi><mo>)</mo></mrow></mrow>'
  1612. assert mathml(expint(IndexedBase(x)[1], IndexedBase(x)[2]), printer = 'presentation') == \
  1613. '<mrow><msub><mo>E</mo><msub><mi>x</mi><mn>1</mn></msub></msub><mrow><mo>(</mo><msub><mi>x</mi><mn>2</mn></msub><mo>)</mo></mrow></mrow>'
  1614. def test_print_jacobi():
  1615. assert mathml(jacobi(n, a, b, x), printer = 'presentation') == \
  1616. '<mrow><msubsup><mo>P</mo><mi>n</mi><mrow><mo>(</mo><mi>a</mi><mo>,</mo><mi>b</mi><mo>)</mo></mrow></msubsup><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1617. def test_print_gegenbauer():
  1618. assert mathml(gegenbauer(n, a, x), printer = 'presentation') == \
  1619. '<mrow><msubsup><mo>C</mo><mi>n</mi><mrow><mo>(</mo><mi>a</mi><mo>)</mo></mrow></msubsup><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1620. def test_print_chebyshevt():
  1621. assert mathml(chebyshevt(n, x), printer = 'presentation') == \
  1622. '<mrow><msub><mo>T</mo><mi>n</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1623. def test_print_chebyshevu():
  1624. assert mathml(chebyshevu(n, x), printer = 'presentation') == \
  1625. '<mrow><msub><mo>U</mo><mi>n</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1626. def test_print_legendre():
  1627. assert mathml(legendre(n, x), printer = 'presentation') == \
  1628. '<mrow><msub><mo>P</mo><mi>n</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1629. def test_print_assoc_legendre():
  1630. assert mathml(assoc_legendre(n, a, x), printer = 'presentation') == \
  1631. '<mrow><msubsup><mo>P</mo><mi>n</mi><mrow><mo>(</mo><mi>a</mi><mo>)</mo></mrow></msubsup><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1632. def test_print_laguerre():
  1633. assert mathml(laguerre(n, x), printer = 'presentation') == \
  1634. '<mrow><msub><mo>L</mo><mi>n</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1635. def test_print_assoc_laguerre():
  1636. assert mathml(assoc_laguerre(n, a, x), printer = 'presentation') == \
  1637. '<mrow><msubsup><mo>L</mo><mi>n</mi><mrow><mo>(</mo><mi>a</mi><mo>)</mo></mrow></msubsup><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1638. def test_print_hermite():
  1639. assert mathml(hermite(n, x), printer = 'presentation') == \
  1640. '<mrow><msub><mo>H</mo><mi>n</mi></msub><mrow><mo>(</mo><mi>x</mi><mo>)</mo></mrow></mrow>'
  1641. def test_mathml_SingularityFunction():
  1642. assert mathml(SingularityFunction(x, 4, 5), printer='presentation') == \
  1643. '<msup><mrow><mo>&#10216;</mo><mrow><mi>x</mi><mo>-</mo><mn>4</mn></mrow><mo>&#10217;</mo></mrow><mn>5</mn></msup>'
  1644. assert mathml(SingularityFunction(x, -3, 4), printer='presentation') == \
  1645. '<msup><mrow><mo>&#10216;</mo><mrow><mi>x</mi><mo>+</mo><mn>3</mn></mrow><mo>&#10217;</mo></mrow><mn>4</mn></msup>'
  1646. assert mathml(SingularityFunction(x, 0, 4), printer='presentation') == \
  1647. '<msup><mrow><mo>&#10216;</mo><mi>x</mi><mo>&#10217;</mo></mrow><mn>4</mn></msup>'
  1648. assert mathml(SingularityFunction(x, a, n), printer='presentation') == \
  1649. '<msup><mrow><mo>&#10216;</mo><mrow><mrow><mo>-</mo><mi>a</mi></mrow><mo>+</mo><mi>x</mi></mrow><mo>&#10217;</mo></mrow><mi>n</mi></msup>'
  1650. assert mathml(SingularityFunction(x, 4, -2), printer='presentation') == \
  1651. '<msup><mrow><mo>&#10216;</mo><mrow><mi>x</mi><mo>-</mo><mn>4</mn></mrow><mo>&#10217;</mo></mrow><mn>-2</mn></msup>'
  1652. assert mathml(SingularityFunction(x, 4, -1), printer='presentation') == \
  1653. '<msup><mrow><mo>&#10216;</mo><mrow><mi>x</mi><mo>-</mo><mn>4</mn></mrow><mo>&#10217;</mo></mrow><mn>-1</mn></msup>'
  1654. def test_mathml_matrix_functions():
  1655. from sympy.matrices import Adjoint, Inverse, Transpose
  1656. X = MatrixSymbol('X', 2, 2)
  1657. Y = MatrixSymbol('Y', 2, 2)
  1658. assert mathml(Adjoint(X), printer='presentation') == \
  1659. '<msup><mi>X</mi><mo>&#x2020;</mo></msup>'
  1660. assert mathml(Adjoint(X + Y), printer='presentation') == \
  1661. '<msup><mrow><mo>(</mo><mrow><mi>X</mi><mo>+</mo><mi>Y</mi></mrow><mo>)</mo></mrow><mo>&#x2020;</mo></msup>'
  1662. assert mathml(Adjoint(X) + Adjoint(Y), printer='presentation') == \
  1663. '<mrow><msup><mi>X</mi><mo>&#x2020;</mo></msup><mo>+</mo><msup>' \
  1664. '<mi>Y</mi><mo>&#x2020;</mo></msup></mrow>'
  1665. assert mathml(Adjoint(X*Y), printer='presentation') == \
  1666. '<msup><mrow><mo>(</mo><mrow><mi>X</mi><mo>&InvisibleTimes;</mo>' \
  1667. '<mi>Y</mi></mrow><mo>)</mo></mrow><mo>&#x2020;</mo></msup>'
  1668. assert mathml(Adjoint(Y)*Adjoint(X), printer='presentation') == \
  1669. '<mrow><msup><mi>Y</mi><mo>&#x2020;</mo></msup><mo>&InvisibleTimes;' \
  1670. '</mo><msup><mi>X</mi><mo>&#x2020;</mo></msup></mrow>'
  1671. assert mathml(Adjoint(X**2), printer='presentation') == \
  1672. '<msup><mrow><mo>(</mo><msup><mi>X</mi><mn>2</mn></msup><mo>)</mo></mrow><mo>&#x2020;</mo></msup>'
  1673. assert mathml(Adjoint(X)**2, printer='presentation') == \
  1674. '<msup><mrow><mo>(</mo><msup><mi>X</mi><mo>&#x2020;</mo></msup><mo>)</mo></mrow><mn>2</mn></msup>'
  1675. assert mathml(Adjoint(Inverse(X)), printer='presentation') == \
  1676. '<msup><mrow><mo>(</mo><msup><mi>X</mi><mn>-1</mn></msup><mo>)</mo></mrow><mo>&#x2020;</mo></msup>'
  1677. assert mathml(Inverse(Adjoint(X)), printer='presentation') == \
  1678. '<msup><mrow><mo>(</mo><msup><mi>X</mi><mo>&#x2020;</mo></msup><mo>)</mo></mrow><mn>-1</mn></msup>'
  1679. assert mathml(Adjoint(Transpose(X)), printer='presentation') == \
  1680. '<msup><mrow><mo>(</mo><msup><mi>X</mi><mo>T</mo></msup><mo>)</mo></mrow><mo>&#x2020;</mo></msup>'
  1681. assert mathml(Transpose(Adjoint(X)), printer='presentation') == \
  1682. '<msup><mrow><mo>(</mo><msup><mi>X</mi><mo>&#x2020;</mo></msup><mo>)</mo></mrow><mo>T</mo></msup>'
  1683. assert mathml(Transpose(Adjoint(X) + Y), printer='presentation') == \
  1684. '<msup><mrow><mo>(</mo><mrow><msup><mi>X</mi><mo>&#x2020;</mo></msup>' \
  1685. '<mo>+</mo><mi>Y</mi></mrow><mo>)</mo></mrow><mo>T</mo></msup>'
  1686. assert mathml(Transpose(X), printer='presentation') == \
  1687. '<msup><mi>X</mi><mo>T</mo></msup>'
  1688. assert mathml(Transpose(X + Y), printer='presentation') == \
  1689. '<msup><mrow><mo>(</mo><mrow><mi>X</mi><mo>+</mo><mi>Y</mi></mrow><mo>)</mo></mrow><mo>T</mo></msup>'
  1690. def test_mathml_special_matrices():
  1691. from sympy.matrices import Identity, ZeroMatrix, OneMatrix
  1692. assert mathml(Identity(4), printer='presentation') == '<mi>&#x1D540;</mi>'
  1693. assert mathml(ZeroMatrix(2, 2), printer='presentation') == '<mn>&#x1D7D8</mn>'
  1694. assert mathml(OneMatrix(2, 2), printer='presentation') == '<mn>&#x1D7D9</mn>'
  1695. def test_mathml_piecewise():
  1696. from sympy.functions.elementary.piecewise import Piecewise
  1697. # Content MathML
  1698. assert mathml(Piecewise((x, x <= 1), (x**2, True))) == \
  1699. '<piecewise><piece><ci>x</ci><apply><leq/><ci>x</ci><cn>1</cn></apply></piece><otherwise><apply><power/><ci>x</ci><cn>2</cn></apply></otherwise></piecewise>'
  1700. raises(ValueError, lambda: mathml(Piecewise((x, x <= 1))))
  1701. def test_issue_17857():
  1702. assert mathml(Range(-oo, oo), printer='presentation') == \
  1703. '<mrow><mo>{</mo><mi>&#8230;</mi><mo>,</mo><mn>-1</mn><mo>,</mo><mn>0</mn><mo>,</mo><mn>1</mn><mo>,</mo><mi>&#8230;</mi><mo>}</mo></mrow>'
  1704. assert mathml(Range(oo, -oo, -1), printer='presentation') == \
  1705. '<mrow><mo>{</mo><mi>&#8230;</mi><mo>,</mo><mn>1</mn><mo>,</mo><mn>0</mn><mo>,</mo><mn>-1</mn><mo>,</mo><mi>&#8230;</mi><mo>}</mo></mrow>'
  1706. def test_float_roundtrip():
  1707. x = sympify(0.8975979010256552)
  1708. y = float(mp.doprint(x).strip('</cn>'))
  1709. assert x == y
  1710. def test_content_mathml_disable_split_super_sub():
  1711. mp = MathMLContentPrinter()
  1712. assert mp.doprint(Symbol('u_b')) == '<ci><mml:msub><mml:mi>u</mml:mi><mml:mi>b</mml:mi></mml:msub></ci>'
  1713. mp = MathMLContentPrinter({'disable_split_super_sub': False})
  1714. assert mp.doprint(Symbol('u_b')) == '<ci><mml:msub><mml:mi>u</mml:mi><mml:mi>b</mml:mi></mml:msub></ci>'
  1715. mp = MathMLContentPrinter({'disable_split_super_sub': True})
  1716. assert mp.doprint(Symbol('u_b')) == '<ci>u_b</ci>'
  1717. def test_presentation_mathml_disable_split_super_sub():
  1718. mpp = MathMLPresentationPrinter()
  1719. assert mpp.doprint(Symbol('u_b')) == '<msub><mi>u</mi><mi>b</mi></msub>'
  1720. mpp = MathMLPresentationPrinter({'disable_split_super_sub': False})
  1721. assert mpp.doprint(Symbol('u_b')) == '<msub><mi>u</mi><mi>b</mi></msub>'
  1722. mpp = MathMLPresentationPrinter({'disable_split_super_sub': True})
  1723. assert mpp.doprint(Symbol('u_b')) == '<mi>u_b</mi>'