package org.geogebra.io; import org.geogebra.common.io.MathMLParser; import org.geogebra.common.util.lang.Unicode; import org.junit.Test; public class MathMLTest { private static String[] mathmlTest = { // quadratic formula "<math xmlns=\"http://www.w3.org/1998/Math/MathML\"> <mstyle displaystyle=\"true\"> <mfrac> <mrow> <mo> - </mo> <mi> b </mi> <mo> ± </mo> <msqrt> <msup> <mrow> <mi> b </mi> </mrow> <mrow> <mn> 2 </mn> </mrow> </msup> <mo> - </mo> <mn> 4 </mn> <mi> a </mi> <mi> c </mi> </msqrt> </mrow> <mrow> <mn> 2 </mn> <mi> a </mi> </mrow> </mfrac> </mstyle> </math>", // quadratic formula with comment "<math xmlns=\"http://www.w3.org/1998/Math/MathML\"> <mstyle displaystyle=\"true\"> <mfrac> <mrow> <mo> - </mo> <mi> b </mi> <mo> ±<!--plus-minus sign--> </mo> <msqrt> <msup> <mrow> <mi> b </mi> </mrow> <mrow> <mn> 2 </mn> </mrow> </msup> <mo> - </mo> <mn> 4 </mn> <mi> a </mi> <mi> c </mi> </msqrt> </mrow> <mrow> <mn> 2 </mn> <mi> a </mi> </mrow> </mfrac> </mstyle> </math>", // MathJax tests http://www.mathjax.org/demos/mathml-samples/ // quadratic formula "<math display='block'><mrow><mi>x</mi><mo>=</mo><mfrac><mrow><mo>−</mo><mi>b</mi><mo>±</mo><msqrt><mrow><msup><mi>b</mi><mn>2</mn></msup><mo>−</mo><mn>4</mn><mi>a</mi><mi>c</mi></mrow></msqrt></mrow><mrow><mn>2</mn><mi>a</mi></mrow></mfrac></mrow></math>", //Cauchy's Integral Formula "<math display='block'> <mstyle> <mi>f</mi> <mrow> <mo>(</mo> <mi>a</mi> <mo>)</mo> </mrow> <mo>=</mo> <mfrac> <mn>1</mn> <mrow> <mn>2</mn> <mi>" + Unicode.PI_STRING + "<!-- " + Unicode.PI_STRING + " --></mi> <mi>i</mi> </mrow> </mfrac> <msub>" + " <mo>" + Unicode.phi + "</mo> <mrow> <mi>" + Unicode.gamma + "</mi> </mrow> </msub> <mfrac> <mrow> <mi>f</mi> <mo>(</mo> <mi>z</mi> <mo>)</mo>" + " </mrow> <mrow> <mi>z</mi> <mo>" + Unicode.MINUS + "</mo> <mi>a</mi> </mrow> </mfrac> <mi>d</mi> <mi>z</mi> </mstyle></math>", // Double angle formula for Cosines "<math display='block'><mrow><mi>cos</mi><mo>⁡</mo><mrow><mo>(</mo><mi>θ</mi><mo>+</mo><mi>φ</mi><mo>)</mo></mrow><mo>=</mo><mi>cos</mi><mo>⁡</mo><mrow><mo>(</mo><mi>θ</mi><mo>)</mo></mrow><mi>cos</mi><mo>⁡</mo><mrow><mo>(</mo><mi>φ</mi><mo>)</mo></mrow><mo>−</mo><mi>sin</mi><mo>⁡</mo><mrow><mo>(</mo><mi>θ</mi><mo>)</mo></mrow><mi>sin</mi><mo>⁡</mo><mrow><mo>(</mo><mi>φ</mi><mo>)</mo></mrow></mrow></math>", // Gauss' Divergence Theorem "<math display='block'><mrow><mrow><msub><mo>∫</mo><mrow><mi>D</mi></mrow></msub><mrow><mo>(</mo><mo>∇⋅</mo><mi>F</mi><mo>)</mo></mrow><mi>d</mi><mrow><mi>V</mi></mrow></mrow><mo>=</mo><mrow><msub><mo>∫</mo><mrow><mo>∂</mo><mi>D</mi></mrow></msub><mrow><mtext> </mtext><mi>F</mi><mo>⋅</mo><mi>n</mi></mrow><mi>d</mi><mi>S</mi></mrow></mrow></math>", // Curl of a Vector Field "<math display='block'><mrow><mover accent='true'><mrow><mo>∇</mo></mrow><mrow><mo>→</mo></mrow></mover><mo>×</mo><mover accent='true'><mrow><mi>F</mi></mrow><mrow><mo>→</mo></mrow></mover><mo>=</mo><mrow><mo>(</mo><mfrac><mrow><mo>∂</mo><msub><mrow><mi>F</mi></mrow><mrow><mi>z</mi></mrow></msub></mrow><mrow><mo>∂</mo><mi>y</mi></mrow></mfrac><mo>−</mo><mfrac><mrow><mo>∂</mo><msub><mrow><mi>F</mi></mrow><mrow><mi>y</mi></mrow></msub></mrow><mrow><mo>∂</mo><mi>z</mi></mrow></mfrac><mo>)</mo></mrow><mstyle mathvariant='bold' mathsize='normal'><mrow><mi>i</mi></mrow></mstyle><mo>+</mo><mrow><mo>(</mo><mfrac><mrow><mo>∂</mo><msub><mrow><mi>F</mi></mrow><mrow><mi>x</mi></mrow></msub></mrow><mrow><mo>∂</mo><mi>z</mi></mrow></mfrac><mo>−</mo><mfrac><mrow><mo>∂</mo><msub><mrow><mi>F</mi></mrow><mrow><mi>z</mi></mrow></msub></mrow><mrow><mo>∂</mo><mi>x</mi></mrow></mfrac><mo>)</mo></mrow><mstyle mathvariant='bold' mathsize='normal'><mrow><mi>j</mi></mrow></mstyle><mo>+</mo><mrow><mo>(</mo><mfrac><mrow><mo>∂</mo><msub><mrow><mi>F</mi></mrow><mrow><mi>y</mi></mrow></msub></mrow><mrow><mo>∂</mo><mi>x</mi></mrow></mfrac><mo>−</mo><mfrac><mrow><mo>∂</mo><msub><mrow><mi>F</mi></mrow><mrow><mi>x</mi></mrow></msub></mrow><mrow><mo>∂</mo><mi>y</mi></mrow></mfrac><mo>)</mo></mrow><mstyle mathvariant='bold' mathsize='normal'><mrow><mi>k</mi></mrow></mstyle></mrow></math>", // Standard Deviation "<math display='block'><mrow><mi>σ</mi><mo>=</mo><msqrt><mrow><mfrac><mrow><mn>1</mn></mrow><mrow><mi>N</mi></mrow></mfrac><mstyle displaystyle='true'><mrow><munderover><mrow><mo>∑</mo></mrow><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mrow><mi>N</mi></mrow></munderover><mrow><msup><mrow><mo stretchy='false'>(</mo><msub><mrow><mi>x</mi></mrow><mrow><mi>i</mi></mrow></msub><mo>−</mo><mi>μ</mi><mo stretchy='false'>)</mo></mrow><mrow><mn>2</mn></mrow></msup></mrow></mrow></mstyle></mrow></msqrt><mo>.</mo></mrow></math>", // Definition of Christoffel Symbols "<math display='block'><mrow><msup><mrow><mo>(</mo><msub><mrow><mo>∇</mo></mrow><mrow><mi>X</mi></mrow></msub><mi>Y</mi><mo>)</mo></mrow><mrow><mi>k</mi></mrow></msup><mo>=</mo><msup><mrow><mi>X</mi></mrow><mrow><mi>i</mi></mrow></msup><msup><mrow><mo stretchy='false'>(</mo><msub><mrow><mo>∇</mo></mrow><mrow><mi>i</mi></mrow></msub><mi>Y</mi><mo stretchy='false'>)</mo></mrow><mrow><mi>k</mi></mrow></msup><mo>=</mo><msup><mrow><mi>X</mi></mrow><mrow><mi>i</mi></mrow></msup><mrow><mo>(</mo><mfrac><mrow><mo>∂</mo><msup><mrow><mi>Y</mi></mrow><mrow><mi>k</mi></mrow></msup></mrow><mrow><mo>∂</mo><msup><mrow><mi>x</mi></mrow><mrow><mi>i</mi></mrow></msup></mrow></mfrac><mo>+</mo><msubsup><mrow><mi>Γ</mi></mrow><mrow><mi>i</mi><mi>m</mi></mrow><mrow><mi>k</mi></mrow></msubsup><msup><mrow><mi>Y</mi></mrow><mrow><mi>m</mi></mrow></msup><mo>)</mo></mrow></mrow></math>", // a few tests from https://eyeasme.com/Joe/MathML/MathML_browser_test // Axiom of power set "<math display=\"block\"> <mrow> <mo rspace=\"0\">∀</mo> <mi>A</mi> " + "<mo lspace=\"mediummathspace\" rspace=\"0\">∃</mo> <mi>P</mi>" + " <mo lspace=\"mediummathspace\" rspace=\"0\">∀</mo> <mi>B</mi>" + " <mspace width=\"thinmathspace\" /> <mfenced open=\"[\" close=\"]\"> " + "<mrow> <mi>B</mi> <mo>∈</mo> <mi>P</mi> " + "<mo lspace=\"veryverythickmathspace\" rspace=\"veryverythickmathspace\">⟺</mo> " + "<mo rspace=\"0\">∀</mo> <mi>C</mi> <mspace width=\"thinmathspace\" /> <mfenced> <mrow> <mi>C</mi>" + " <mo>∈</mo> <mi>B</mi> <mo>⇒</mo> <mi>C</mi> <mo>∈</mo> <mi>A</mi> </mrow> " + "</mfenced> </mrow> </mfenced> </mrow> </math>", // quadratic formula "<math display=\"block\"> <mrow> <mi>x</mi> <mo>=</mo> <mfrac> <mrow> <mo form=\"prefix\">−</mo> <mi>b</mi> <mo>±</mo> <msqrt> <msup> <mi>b</mi> <mn>2</mn> </msup> <mo>−</mo> <mn>4</mn> <mo>⁢</mo> <mi>a</mi> <mo>⁢</mo> <mi>c</mi> </msqrt> </mrow> <mrow> <mn>2</mn> <mo>⁢</mo> <mi>a</mi> </mrow> </mfrac> </mrow> </math>", // Binomial coefficient "<math display=\"block\"> <mrow> <mi>C</mi> <mfenced> <mi>n</mi> <mi>k</mi> </mfenced> <mo>=</mo> <msubsup> <mi>C</mi> <mi>k</mi> <mi>n</mi> </msubsup> <mo>=</mo> <mmultiscripts> <mi>C</mi> <mi>k</mi> <none /> <mprescripts /> <mi>n</mi> <none /> </mmultiscripts> <mo>=</mo> <mfenced> <mfrac linethickness=\"0\"> <mi>n</mi> <mi>k</mi> </mfrac> </mfenced> <mo>=</mo> <mfrac> <mrow> <mi>n</mi> <mo lspace=\"0\">!</mo> </mrow> <mrow> <mi>k</mi> <mo lspace=\"0\">!</mo> <mo rspace=\"mediummathspace\">⁢</mo> <mfenced> <mrow> <mi>n</mi> <mo>−</mo> <mi>k</mi> </mrow> </mfenced> <mo lspace=\"0\">!</mo> </mrow> </mfrac> </mrow> </math>", // Sophomore's dream "<math display=\"block\"> <mrow> <msubsup> <mo>∫</mo> <mn>0</mn> <mn>1</mn> </msubsup> <msup> <mi>x</mi> <mi>x</mi> </msup> <mo rspace=\"mediummathspace\">⁢</mo> <mo rspace=\"0\">ⅆ</mo> <mi>x</mi> <mo>=</mo> <munderover> <mo>∑</mo> <mrow> <mi>n</mi> <mo>=</mo> <mn>1</mn> </mrow> <mn>∞</mn> </munderover> <msup> <mfenced> <mrow> <mo form=\"prefix\">−</mo> <mn>1</mn> </mrow> </mfenced> <mrow> <mi>n</mi> <mo>+</mo> <mn>1</mn> </mrow> </msup> <mo>⁢</mo> <msup> <mi>n</mi> <mrow> <mo form=\"prefix\">−</mo> <mi>n</mi> </mrow> </msup> </mrow> </math>", // nested roots "<math style=\"font-size: 8pt\" display=\"block\"> <mrow> <mfrac> <msqrt> <mn>1</mn> <mo>+</mo> <mroot> <mrow> <mn>2</mn> <mo>+</mo> <mroot> <mrow> <mn>3</mn> <mo>+</mo> <mroot> <mrow> <mn>4</mn> <mo>+</mo> <mroot> <mrow> <mn>5</mn> <mo>+</mo> <mroot> <mrow> <mn>6</mn> <mo>+</mo> <mroot> <mrow> <mn>7</mn> <mo>+</mo> <mroot> <mi>A</mi> <mn>19</mn> </mroot> </mrow> <mn>17</mn> </mroot> </mrow> <mn>13</mn> </mroot> </mrow> <mn>11</mn> </mroot> </mrow> <mn>7</mn> </mroot> </mrow> <mn>5</mn> </mroot> </mrow> <mn>3</mn> </mroot> </msqrt> <msup> <mi>ⅇ</mi> <mi>π</mi> </msup> </mfrac> <mo>=</mo> <msup> <mi>x</mi> <mo style=\"font-size: larger;\">‴</mo> </msup> </mrow> </math>", // Some other tests - temporarily // factorial "<math style=\"font-size: 8pt\" display=\"block\"> <mrow><mi>n</mi><mo>!</mo></mrow> </math>", // greek letters "<math style=\"font-size: 8pt\" display=\"block\"> <mrow><mi>α</mi><mo>+</mo><mi>β</mi><mo>+</mo><mi>γ</mi></mrow> </math>", "<math xmlns=\"http://www.w3.org/1998/Math/MathML\"><mstyle displaystyle=\"true\"><mi> sin </mi> <mfenced> <mrow> <mi> x </mi> </mrow> </mfenced> </mstyle></math>", "<math xmlns=\"http://www.w3.org/1998/Math/MathML\"> <mstyle displaystyle=\"true\"> <munderover> <mrow> <mo> ∫<!--integral--> </mo> </mrow> <mrow> <mn> 0 </mn> </mrow> <mrow> <mn> 1 </mn> </mrow> </munderover> <msup> <mrow> <mi> x </mi> </mrow> <mrow> <mn> 2 </mn> </mrow> </msup> </mstyle></math>", "<math xmlns=\"http://www.w3.org/1998/Math/MathML\"> <mstyle displaystyle=\"true\"> <munderover> <mrow> <mo> ∑<!--n-ary summation--> </mo> </mrow> <mrow> <mi> k </mi> <mo> = </mo> <mn> 1 </mn> </mrow> <mrow> <mn> 3 </mn> </mrow> </munderover> <mi> k </mi> </mstyle></math>", "<math xmlns=\"http://www.w3.org/1998/Math/MathML\"> <mstyle displaystyle=\"true\"> <msubsup> <mrow> <mi> x </mi> </mrow> <mrow> <mn> 1 </mn> </mrow> <mrow> <mn> 2 </mn> </mrow> </msubsup> </mstyle> </math>", "<math xmlns=\"http://www.w3.org/1998/Math/MathML\"> <mstyle displaystyle=\"true\"> <msqrt> <mfrac> <mrow> <mi> x </mi> </mrow> <mrow> <mi> x </mi> <mo> + </mo> <mn> 2 </mn> </mrow> </mfrac> </msqrt> </mstyle> </math>" }; /** * just for running test-cases * * @param args args */ @Test public void testGeoGebra(){ MathMLParser mathmlParser = new MathMLParser(true); for (int i = 0; i < mathmlTest.length ; i++) { String s = mathmlTest[i]; String latex = mathmlParser.parse(s, false, false); System.out.println(latex); } } @Test public void testLaTeX(){ MathMLParser mathmlParser = new MathMLParser(false); for (int i = 0; i < mathmlTest.length ; i++) { String s = mathmlTest[i]; String latex = mathmlParser.parse(s, false, false); System.out.println(latex); } } }