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);
}
}
}