test_mathml.py 94 KB

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