1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Include test fixture.
6 GEN_INCLUDE(['../testing/chromevox_unittest_base.js']);
11 * @extends {ChromeVoxUnitTestBase}
13 function CvoxSemanticTreeUnitTest() {}
15 CvoxSemanticTreeUnitTest.prototype = {
16 __proto__: ChromeVoxUnitTestBase.prototype,
29 this.xpathBlacklist = [];
31 this.setupAttributes();
35 * Adds some unicode characters via hex code to the right category.
37 * This method is necessary as the test framework can not handle code
38 * containing utf-8 encoded characters.
40 setupAttributes: function() {
41 var attr = cvox.SemanticAttr.getInstance();
42 attr.neutralFences.unshift(cvox.SemanticUtil.numberToUnicode(0x00A6));
43 attr.dashes.unshift(cvox.SemanticUtil.numberToUnicode(0x2015));
44 attr.neutralFences.unshift(cvox.SemanticUtil.numberToUnicode(0x2016));
45 attr.arrows.unshift(cvox.SemanticUtil.numberToUnicode(0x2192));
46 attr.sumOps.unshift(cvox.SemanticUtil.numberToUnicode(0x2211));
47 attr.additions.unshift(cvox.SemanticUtil.numberToUnicode(0x2213));
48 attr.multiplications.unshift(cvox.SemanticUtil.numberToUnicode(0x2218));
49 attr.intOps.unshift(cvox.SemanticUtil.numberToUnicode(0x222B));
50 attr.inequalities.unshift(cvox.SemanticUtil.numberToUnicode(0x2264));
51 attr.additions.unshift(cvox.SemanticUtil.numberToUnicode(0x2295));
52 var open = cvox.SemanticUtil.numberToUnicode(0x3008);
53 var close = cvox.SemanticUtil.numberToUnicode(0x3009);
54 attr.openClosePairs[open] = close;
55 attr.leftFences.unshift(open);
56 attr.rightFences.unshift(close);
60 * Removes XML nodes according to the XPath elements in the blacklist.
61 * @param {Node} xml Xml representation of the semantic node.
63 customizeXml: function(xml) {
64 this.xpathBlacklist.forEach(
66 var removes = cvox.XpathUtil.evalXPath(xpath, xml);
69 node.parentNode.removeChild(node);
75 * Tests if for a given mathml snippet results in a particular semantic tree.
76 * @param {string} mml MathML expression.
77 * @param {string} sml XML snippet for the semantic tree.
79 executeTreeTest: function(mml, sml) {
80 var mathMl = '<math id=' + this.nodeCounter + '>' + mml + '';
81 this.loadHtml(mathMl);
82 var node = document.getElementById((this.nodeCounter++).toString());
83 var stree = new cvox.SemanticTree(/** @type {!Element} */(node));
84 var sxml = stree.xml(this.brief);
85 this.customizeXml(sxml);
86 var dp = new DOMParser();
87 var xml = dp.parseFromString('<stree>' + sml + '</stree>', 'text/xml');
88 var xmls = new XMLSerializer();
89 assertEquals(xmls.serializeToString(xml),
90 xmls.serializeToString(sxml));
94 TEST_F('CvoxSemanticTreeUnitTest', 'StreeRelations', function() {
98 '<relation>=</relation>');
100 '<mi>a</mi><mo>=</mo><mi>b</mi>',
102 '<content><relation>=</relation></content>' +
104 '<identifier>a</identifier>' +
105 '<identifier>b</identifier>' +
108 this.executeTreeTest(
109 '<mi>a</mi><mo>=</mo><mi>b</mi><mo>=</mo><mi>c</mi>',
111 '<content><relation>=</relation><relation>=</relation></content>' +
113 '<identifier>a</identifier>' +
114 '<identifier>b</identifier>' +
115 '<identifier>c</identifier>' +
118 this.executeTreeTest(
119 '<mi>a</mi><mo>=</mo><mi>b</mi><mo>=</mo><mi>c</mi>' +
120 '<mo>\u2264</mo><mi>d</mi>',
122 '<content><relation>=</relation><relation>=</relation>' +
123 '<relation>\u2264</relation></content>' +
125 '<identifier>a</identifier>' +
126 '<identifier>b</identifier>' +
127 '<identifier>c</identifier>' +
128 '<identifier>d</identifier>' +
136 * Test operator trees with pre- and postfixes.
138 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrePostfixOperators', function() {
140 // Pathological operator only case.
141 this.executeTreeTest(
142 '<mo>+</mo><mo>-</mo><mo>+</mo>',
144 '<content><operator>+</operator></content>' +
147 '<content><operator>-</operator></content>' +
149 '<operator>+</operator>' +
154 // Single identifier with prefixes.
155 this.executeTreeTest(
156 '<mo>+</mo><mo>+</mo><mi>a</mi>',
158 '<content><operator>+</operator><operator>+</operator></content>' +
160 '<identifier>a</identifier>' +
163 // Single identifier with prefix and negative.
164 this.executeTreeTest(
165 '<mo>+</mo><mo>-</mo><mi>a</mi>',
167 '<content><operator>+</operator></content>' +
170 '<content><operator>-</operator></content>' +
172 '<identifier>a</identifier>' +
177 // Single identifier with postfixes.
178 this.executeTreeTest(
179 '<mi>a</mi><mo>+</mo><mo>-</mo>',
181 '<content><operator>+</operator><operator>-</operator></content>' +
183 '<identifier>a</identifier>' +
186 // Single identifier with pre- and postfixes.
187 this.executeTreeTest(
188 '<mo>+</mo><mo>+</mo><mi>a</mi><mo>+</mo><mo>+</mo>',
190 '<content><operator>+</operator><operator>+</operator></content>' +
193 '<content><operator>+</operator><operator>+</operator></content>' +
195 '<identifier>a</identifier>' +
200 // Single identifier with mixed pre- and postfixes.
201 this.executeTreeTest(
202 '<mo>\u2213</mo><mo>+</mo><mi>a</mi><mo>\u2213</mo><mo>+</mo>',
203 '<postfixop>\u2213 +' +
205 '<operator>\u2213</operator><operator>+</operator>' +
208 '<prefixop>\u2213 +' +
210 '<operator>\u2213</operator><operator>+</operator>' +
213 '<identifier>a</identifier>' +
218 // Two identifiers with pre- and postfixes.
219 this.executeTreeTest(
220 '<mo>+</mo><mo>+</mo><mi>a</mi><mo>\u2213</mo><mo>+</mo>' +
221 '<mi>b</mi><mo>+</mo>',
223 '<content><operator>\u2213</operator></content>' +
226 '<content><operator>+</operator><operator>+</operator></content>' +
228 '<identifier>a</identifier>' +
232 '<content><operator>+</operator></content>' +
235 '<content><operator>+</operator></content>' +
237 '<identifier>b</identifier>' +
244 // Three identifiers with pre- and postfixes.
245 this.executeTreeTest(
246 '<mo>+</mo><mo>+</mo><mi>a</mi><mo>\u2213</mo><mo>+</mo>' +
247 '<mi>b</mi><mo>+</mo><mo>\u2213</mo><mi>c</mi><mo>+</mo>',
249 '<content><operator>+</operator></content>' +
252 '<content><operator>\u2213</operator></content>' +
255 '<content><operator>+</operator><operator>+</operator></content>' +
257 '<identifier>a</identifier>' +
261 '<content><operator>+</operator></content>' +
263 '<identifier>b</identifier>' +
269 '<content><operator>+</operator></content>' +
272 '<content><operator>\u2213</operator></content>' +
274 '<identifier>c</identifier>' +
285 * Test operator trees with single operator.
287 TEST_F('CvoxSemanticTreeUnitTest', 'StreeSingleOperators', function() {
289 // Single identifier.
290 this.executeTreeTest(
292 '<identifier>a</identifier>');
293 // Single implicit node.
294 this.executeTreeTest(
295 '<mi>a</mi><mi>b</mi>',
297 '<content><operator>\u2062</operator></content>' +
299 '<identifier>a</identifier>' +
300 '<identifier>b</identifier>' +
303 // Implicit multi node.
304 this.executeTreeTest(
305 '<mi>a</mi><mi>b</mi><mi>c</mi>',
307 '<content><operator>\u2062</operator></content>' +
309 '<identifier>a</identifier>' +
310 '<identifier>b</identifier>' +
311 '<identifier>c</identifier>' +
315 this.executeTreeTest(
316 '<mi>a</mi><mo>+</mo><mi>b</mi>',
318 '<content><operator>+</operator></content>' +
320 '<identifier>a</identifier>' +
321 '<identifier>b</identifier>' +
325 this.executeTreeTest(
326 '<mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>c</mi>',
328 '<content><operator>+</operator><operator>+</operator></content>' +
330 '<identifier>a</identifier>' +
331 '<identifier>b</identifier>' +
332 '<identifier>c</identifier>' +
335 // Multi addition with implicit node.
336 this.executeTreeTest(
337 '<mi>a</mi><mo>+</mo><mi>b</mi><mi>c</mi><mo>+</mo><mi>d</mi>',
339 '<content><operator>+</operator><operator>+</operator></content>' +
341 '<identifier>a</identifier>' +
343 '<content><operator>\u2062</operator></content>' +
345 '<identifier>b</identifier>' +
346 '<identifier>c</identifier>' +
349 '<identifier>d</identifier>' +
356 * Test operator trees with multiple operators.
358 TEST_F('CvoxSemanticTreeUnitTest', 'StreeMultipleOperators', function() {
360 // Addition and subtraction.
361 this.executeTreeTest(
362 '<mi>a</mi><mo>+</mo><mi>b</mi><mo>-</mo><mi>c</mi><mo>+</mo><mi>d</mi>',
364 '<content><operator>+</operator></content>' +
367 '<content><operator>-</operator></content>' +
370 '<content><operator>+</operator></content>' +
372 '<identifier>a</identifier>' +
373 '<identifier>b</identifier>' +
376 '<identifier>c</identifier>' +
379 '<identifier>d</identifier>' +
382 // Addition and subtraction.
383 this.executeTreeTest(
384 '<mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>c</mi><mo>-</mo>' +
385 '<mi>d</mi><mo>-</mo><mi>e</mi>',
387 '<content><operator>-</operator><operator>-</operator></content>' +
390 '<content><operator>+</operator><operator>+</operator></content>' +
392 '<identifier>a</identifier>' +
393 '<identifier>b</identifier>' +
394 '<identifier>c</identifier>' +
397 '<identifier>d</identifier>' +
398 '<identifier>e</identifier>' +
401 // Addition and explicit multiplication.
402 this.executeTreeTest(
403 '<mi>a</mi><mo>+</mo><mi>b</mi><mo>\u2218</mo><mi>c</mi><mo>+</mo>' +
406 '<content><operator>+</operator><operator>+</operator></content>' +
408 '<identifier>a</identifier>' +
410 '<content><operator>\u2218</operator></content>' +
412 '<identifier>b</identifier>' +
413 '<identifier>c</identifier>' +
416 '<identifier>d</identifier>' +
419 // Addition with explicit and implicit multiplication.
420 this.executeTreeTest(
421 '<mi>a</mi><mo>+</mo><mi>b</mi><mo>\u2218</mo><mi>c</mi><mi>d</mi>' +
422 '<mo>+</mo><mi>e</mi><mo>\u2218</mo><mi>f</mi>',
424 '<content><operator>+</operator><operator>+</operator></content>' +
426 '<identifier>a</identifier>' +
428 '<content><operator>\u2218</operator></content>' +
430 '<identifier>b</identifier>' +
432 '<content><operator>\u2062</operator></content>' +
434 '<identifier>c</identifier>' +
435 '<identifier>d</identifier>' +
441 '<content><operator>\u2218</operator></content>' +
443 '<identifier>e</identifier>' +
444 '<identifier>f</identifier>' +
449 // Two Additions, subtraction plus explicit and implicit multiplication,
450 // one prefix and one postfix.
451 this.executeTreeTest(
452 '<mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>c</mi><mi>d</mi>' +
453 '<mo>+</mo><mi>e</mi><mo>\u2218</mo><mi>f</mi><mo>-</mo><mi>g</mi>' +
454 '<mo>+</mo><mo>+</mo><mi>h</mi><mo>\u2295</mo><mi>i</mi>' +
455 '<mo>\u2295</mo><mi>j</mi><mo>+</mo><mo>+</mo>',
457 '<content><operator>\u2295</operator>' +
458 '<operator>\u2295</operator></content>' +
461 '<content><operator>+</operator></content>' +
464 '<content><operator>-</operator></content>' +
467 '<content><operator>+</operator>' +
468 '<operator>+</operator><operator>+</operator></content>' +
470 '<identifier>a</identifier>' +
471 '<identifier>b</identifier>' +
473 '<content><operator>\u2062</operator></content>' +
475 '<identifier>c</identifier>' +
476 '<identifier>d</identifier>' +
480 '<content><operator>\u2218</operator></content>' +
482 '<identifier>e</identifier>' +
483 '<identifier>f</identifier>' +
488 '<identifier>g</identifier>' +
492 '<content><operator>+</operator></content>' +
494 '<identifier>h</identifier>' +
499 '<identifier>i</identifier>' +
501 '<content><operator>+</operator><operator>+</operator></content>' +
503 '<identifier>j</identifier>' +
513 * Test regular directed fences.
515 TEST_F('CvoxSemanticTreeUnitTest', 'StreeRegularFences', function() {
518 this.executeTreeTest(
519 '<mrow><mi>a</mi><mo>+</mo><mi>b</mi></mrow>',
522 '<operator>+</operator>' +
525 '<identifier>a</identifier>' +
526 '<identifier>b</identifier>' +
529 // Empty parentheses.
530 this.executeTreeTest(
531 '<mrow><mo>(</mo><mo>)</mo></mrow>',
541 // Single Fenced Expression.
542 this.executeTreeTest(
543 '<mrow><mo>(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo>)</mo></mrow>',
552 '<operator>+</operator>' +
555 '<identifier>a</identifier>' +
556 '<identifier>b</identifier>' +
561 // Single Fenced Expression and operators.
562 this.executeTreeTest(
563 '<mrow><mi>a</mi><mo>+</mo><mo>(</mo><mi>b</mi><mo>+</mo><mi>c</mi>' +
564 '<mo>)</mo><mo>+</mo><mi>d</mi></mrow>',
567 '<operator>+</operator>' +
568 '<operator>+</operator>' +
571 '<identifier>a</identifier>' +
580 '<operator>+</operator>' +
583 '<identifier>b</identifier>' +
584 '<identifier>c</identifier>' +
589 '<identifier>d</identifier>' +
592 // Parallel Parenthesis.
593 this.executeTreeTest(
594 '<mrow><mo>(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo>)</mo><mo>(</mo>' +
595 '<mi>c</mi><mo>+</mo><mi>d</mi><mo>)</mo></mrow>',
598 '<operator>\u2062</operator>' +
609 '<operator>+</operator>' +
612 '<identifier>a</identifier>' +
613 '<identifier>b</identifier>' +
626 '<operator>+</operator>' +
629 '<identifier>c</identifier>' +
630 '<identifier>d</identifier>' +
637 // Nested Parenthesis.
638 this.executeTreeTest(
639 '<mrow><mo>(</mo><mo>(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo>)</mo>' +
640 '<mo>(</mo><mi>c</mi><mo>+</mo><mi>d</mi><mo>)</mo><mo>)</mo></mrow>',
649 '<operator>\u2062</operator>' +
660 '<operator>+</operator>' +
663 '<identifier>a</identifier>' +
664 '<identifier>b</identifier>' +
677 '<operator>+</operator>' +
680 '<identifier>c</identifier>' +
681 '<identifier>d</identifier>' +
690 // Nested parenthesis and brackets.
691 this.executeTreeTest(
692 '<mrow><mo>(</mo><mo>[</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo>' +
693 '<mi>c</mi><mo>]</mo><mo>+</mo><mi>d</mi><mo>)</mo></mrow>',
702 '<operator>+</operator>' +
713 '<operator>+</operator>' +
714 '<operator>+</operator>' +
717 '<identifier>a</identifier>' +
718 '<identifier>b</identifier>' +
719 '<identifier>c</identifier>' +
724 '<identifier>d</identifier>' +
729 // Nested parenthesis, brackets, braces and superscript operator.
730 this.executeTreeTest(
731 '<mrow><mo>(</mo><msup><mi>a</mi><mrow><mn>2</mn><mo>[</mo><mi>i</mi>' +
732 '<mo>+</mo><mi>n</mi><mo>]</mo></mrow></msup><mo>+</mo><mi>b</mi>' +
733 '<mo>)</mo><mo>+</mo><mo>{</mo><mi>c</mi><mi>d</mi><mo>-</mo><mo>[</mo>' +
734 '<mi>e</mi><mo>+</mo><mi>f</mi><mo>]</mo><mo>}</mo></mrow>',
737 '<operator>+</operator>' +
748 '<operator>+</operator>' +
753 '<identifier>a</identifier>' +
756 '<operator>\u2062</operator>' +
759 '<number>2</number>' +
768 '<operator>+</operator>' +
771 '<identifier>i</identifier>' +
772 '<identifier>n</identifier>' +
781 '<identifier>b</identifier>' +
794 '<operator>-</operator>' +
799 '<operator>\u2062</operator>' +
802 '<identifier>c</identifier>' +
803 '<identifier>d</identifier>' +
814 '<operator>+</operator>' +
817 '<identifier>e</identifier>' +
818 '<identifier>f</identifier>' +
833 * Test neutral fences.
835 TEST_F('CvoxSemanticTreeUnitTest', 'StreeNeutralFences', function() {
838 this.executeTreeTest(
839 '<mrow><mo>|</mo><mo>|</mo></mrow>',
850 this.executeTreeTest(
851 '<mrow><mo>|</mo><mi>a</mi><mo>|</mo></mrow>',
858 '<identifier>a</identifier>' +
861 // Parallel bar fences.
862 this.executeTreeTest(
863 '<mrow><mo>|</mo><mi>a</mi><mo>|</mo><mi>b</mi><mo>+</mo>' +
864 '<mo>\u00A6</mo><mi>c</mi><mo>\u00A6</mo></mrow>',
867 '<operator>+</operator>' +
872 '<operator>\u2062</operator>' +
881 '<identifier>a</identifier>' +
884 '<identifier>b</identifier>' +
889 '<fence>\u00A6</fence>' +
890 '<fence>\u00A6</fence>' +
893 '<identifier>c</identifier>' +
898 // Nested bar fences.
899 this.executeTreeTest(
900 '<mrow><mo>\u00A6</mo><mo>|</mo><mi>a</mi><mo>|</mo><mi>b</mi>' +
901 '<mo>+</mo><mi>c</mi><mo>\u00A6</mo></mrow>',
904 '<fence>\u00A6</fence>' +
905 '<fence>\u00A6</fence>' +
910 '<operator>+</operator>' +
915 '<operator>\u2062</operator>' +
924 '<identifier>a</identifier>' +
927 '<identifier>b</identifier>' +
930 '<identifier>c</identifier>' +
939 * Mixed neutral and regular fences.
941 TEST_F('CvoxSemanticTreeUnitTest', 'StreeMixedFences', function() {
943 // Empty parenthsis inside bars.
944 this.executeTreeTest(
945 '<mrow><mo>|</mo><mo>(</mo><mo>)</mo><mo>|</mo></mrow>',
963 // Bars inside parentheses.
964 this.executeTreeTest(
965 '<mrow><mo>(</mo><mo>|</mo><mi>a</mi><mo>|</mo><mi>b</mi>' +
966 '<mo>¦</mo><mi>c</mi><mo>¦</mo><mi>d</mi>' +
976 '<operator>\u2062</operator>' +
985 '<identifier>a</identifier>' +
988 '<identifier>b</identifier>' +
991 '<fence>\u00A6</fence>' +
992 '<fence>\u00A6</fence>' +
995 '<identifier>c</identifier>' +
998 '<identifier>d</identifier>' +
1003 // Parentheses inside bards.
1004 this.executeTreeTest(
1005 '<mrow><mo>|</mo><mo>(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo>)</mo>' +
1006 '<mo>¦</mo><mi>c</mi><mo>¦</mo><mi>d</mi><mo>|</mo></mrow>',
1009 '<fence>|</fence>' +
1010 '<fence>|</fence>' +
1015 '<operator>\u2062</operator>' +
1020 '<fence>(</fence>' +
1021 '<fence>)</fence>' +
1026 '<operator>+</operator>' +
1029 '<identifier>a</identifier>' +
1030 '<identifier>b</identifier>' +
1037 '<fence>\u00A6</fence>' +
1038 '<fence>\u00A6</fence>' +
1041 '<identifier>c</identifier>' +
1044 '<identifier>d</identifier>' +
1049 // Parentheses inside bards.
1050 this.executeTreeTest(
1051 '<mrow><mo>[</mo><mo>|</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo>|</mo>' +
1052 '<mo>+</mo><mi>c</mi><mo>]</mo><mo>+</mo><mo>\u00A6</mo><mi>d</mi>' +
1053 '<mo>+</mo><mo>(</mo><mi>e</mi><mo>+</mo><mi>f</mi><mo>)</mo>' +
1054 '<mo>\u00A6</mo></mrow>',
1057 '<operator>+</operator>' +
1062 '<fence>[</fence>' +
1063 '<fence>]</fence>' +
1068 '<operator>+</operator>' +
1073 '<fence>|</fence>' +
1074 '<fence>|</fence>' +
1079 '<operator>+</operator>' +
1082 '<identifier>a</identifier>' +
1083 '<identifier>b</identifier>' +
1088 '<identifier>c</identifier>' +
1095 '<fence>\u00A6</fence>' +
1096 '<fence>\u00A6</fence>' +
1101 '<operator>+</operator>' +
1104 '<identifier>d</identifier>' +
1107 '<fence>(</fence>' +
1108 '<fence>)</fence>' +
1113 '<operator>+</operator>' +
1116 '<identifier>e</identifier>' +
1117 '<identifier>f</identifier>' +
1132 * Mixed with isolated bars.
1134 TEST_F('CvoxSemanticTreeUnitTest', 'StreeMixedFencesWithBars', function() {
1136 this.xpathBlacklist = ['descendant::punctuated/content'];
1138 this.executeTreeTest(
1139 '<mrow><mo>{</mo><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi><mo>,</mo>' +
1140 '<mi>z</mi><mo>)</mo><mo>|</mo><mi>x</mi><mi>y</mi><mo>=</mo>' +
1141 '<mo>z</mo><mo>}</mo></mrow>',
1144 '<fence>{</fence>' +
1145 '<fence>}</fence>' +
1152 '<fence>(</fence>' +
1153 '<fence>)</fence>' +
1158 '<identifier>x</identifier>' +
1159 '<punctuation>,</punctuation>' +
1160 '<identifier>y</identifier>' +
1161 '<punctuation>,</punctuation>' +
1162 '<identifier>z</identifier>' +
1167 '<punctuation>|</punctuation>' +
1170 '<relation>=</relation>' +
1175 '<operator>\u2062</operator>' +
1178 '<identifier>x</identifier>' +
1179 '<identifier>y</identifier>' +
1182 '<identifier>z</identifier>' +
1189 // Disjunction of bracketed parallel statements.
1190 this.executeTreeTest(
1191 '<mrow><mo>[</mo><mi>a</mi><mo>‖</mo><mi>b</mi><mo>]</mo>' +
1192 '<mo>|</mo><mo>[</mo><mi>x</mi><mo>‖</mo><mi>y</mi><mo>]</mo>' +
1198 '<fence>[</fence>' +
1199 '<fence>]</fence>' +
1204 '<identifier>a</identifier>' +
1205 '<punctuation>\u2016</punctuation>' +
1206 '<identifier>b</identifier>' +
1211 '<punctuation>|</punctuation>' +
1214 '<fence>[</fence>' +
1215 '<fence>]</fence>' +
1220 '<identifier>x</identifier>' +
1221 '<punctuation>\u2016</punctuation>' +
1222 '<identifier>y</identifier>' +
1230 // Metric over the above.
1231 this.executeTreeTest(
1232 '<mrow><mo>‖</mo><mo>[</mo><mi>a</mi><mo>‖</mo>' +
1233 '<mi>b</mi><mo>]</mo><mo>|</mo><mo>[</mo><mi>x</mi><mo>‖</mo>' +
1234 '<mi>y</mi><mo>]</mo><mo>‖</mo></mrow>',
1237 '<fence>\u2016</fence>' +
1238 '<fence>\u2016</fence>' +
1245 '<fence>[</fence>' +
1246 '<fence>]</fence>' +
1251 '<identifier>a</identifier>' +
1252 '<punctuation>\u2016</punctuation>' +
1253 '<identifier>b</identifier>' +
1258 '<punctuation>|</punctuation>' +
1261 '<fence>[</fence>' +
1262 '<fence>]</fence>' +
1267 '<identifier>x</identifier>' +
1268 '<punctuation>\u2016</punctuation>' +
1269 '<identifier>y</identifier>' +
1278 // Mix of metrics and bracketed expression and single bars.
1279 this.executeTreeTest(
1280 '<mrow><mo>‖</mo><mo>[</mo><mi>a</mi><mo>‖</mo><mi>b</mi>' +
1281 '<mo>]</mo><mo>|</mo><mo>[</mo><mi>c</mi><mo>‖</mo>' +
1282 '<mo>¦</mo><mi>d</mi><mo>]</mo><mo>‖</mo><mo>[</mo>' +
1283 '<mi>u</mi><mo>‖</mo><mi>v</mi><mo>]</mo><mo>|</mo><mi>x</mi>' +
1284 '<mo>‖</mo><mi>y</mi><mo>¦</mo><mi>z</mi></mrow>',
1289 '<operator>\u2062</operator>' +
1294 '<fence>\u2016</fence>' +
1295 '<fence>\u2016</fence>' +
1302 '<fence>[</fence>' +
1303 '<fence>]</fence>' +
1308 '<identifier>a</identifier>' +
1309 '<punctuation>\u2016</punctuation>' +
1310 '<identifier>b</identifier>' +
1315 '<punctuation>|</punctuation>' +
1318 '<fence>[</fence>' +
1319 '<fence>]</fence>' +
1324 '<identifier>c</identifier>' +
1325 '<punctuation>\u2016</punctuation>' +
1326 '<punctuation>\u00A6</punctuation>' +
1327 '<identifier>d</identifier>' +
1338 '<fence>[</fence>' +
1339 '<fence>]</fence>' +
1344 '<identifier>u</identifier>' +
1345 '<punctuation>\u2016</punctuation>' +
1346 '<identifier>v</identifier>' +
1353 '<punctuation>|</punctuation>' +
1354 '<identifier>x</identifier>' +
1355 '<punctuation>\u2016</punctuation>' +
1356 '<identifier>y</identifier>' +
1357 '<punctuation>\u00A6</punctuation>' +
1358 '<identifier>z</identifier>' +
1361 this.xpathBlacklist = [];
1366 * Pathological cases with only opening fences.
1368 TEST_F('CvoxSemanticTreeUnitTest', 'StreeOpeningFencesOnly', function() {
1370 this.xpathBlacklist = ['descendant::punctuated/content'];
1372 this.executeTreeTest(
1373 '<mrow><mo>[</mo></mrow>',
1374 '<fence>[</fence>');
1376 this.executeTreeTest(
1377 '<mrow><mi>a</mi><mo>[</mo></mrow>',
1380 '<identifier>a</identifier>' +
1381 '<punctuation>[</punctuation>' +
1385 this.executeTreeTest(
1386 '<mrow><mi>a</mi><mo>[</mo><mi>b</mi></mrow>',
1389 '<identifier>a</identifier>' +
1390 '<punctuation>[</punctuation>' +
1391 '<identifier>b</identifier>' +
1395 this.executeTreeTest(
1396 '<mrow><mo>[</mo><mi>b</mi></mrow>',
1399 '<punctuation>[</punctuation>' +
1400 '<identifier>b</identifier>' +
1404 this.executeTreeTest(
1405 '<mrow><mi>a</mi><mo>[</mo><mi>b</mi><mi>c</mi><mo>(</mo><mi>d</mi>' +
1406 '<mo>{</mo><mi>e</mi><mo>〈</mo><mi>f</mi></mrow>',
1409 '<identifier>a</identifier>' +
1410 '<punctuation>[</punctuation>' +
1413 '<operator>\u2062</operator>' +
1416 '<identifier>b</identifier>' +
1417 '<identifier>c</identifier>' +
1420 '<punctuation>(</punctuation>' +
1421 '<identifier>d</identifier>' +
1422 '<punctuation>{</punctuation>' +
1423 '<identifier>e</identifier>' +
1424 '<punctuation>\u3008</punctuation>' +
1425 '<identifier>f</identifier>' +
1428 // Multiple plus inner fenced.
1429 this.executeTreeTest(
1430 '<mrow><mi>a</mi><mo>[</mo><mi>b</mi><mo>[</mo><mo>(</mo><mo>(</mo>' +
1431 '<mi>c</mi><mo>)</mo><mi>d</mi><mo>{</mo><mi>e</mi><mo>〈</mo>' +
1432 '<mi>f</mi></mrow>',
1435 '<identifier>a</identifier>' +
1436 '<punctuation>[</punctuation>' +
1437 '<identifier>b</identifier>' +
1438 '<punctuation>[</punctuation>' +
1439 '<punctuation>(</punctuation>' +
1442 '<operator>\u2062</operator>' +
1447 '<fence>(</fence>' +
1448 '<fence>)</fence>' +
1451 '<identifier>c</identifier>' +
1454 '<identifier>d</identifier>' +
1457 '<punctuation>{</punctuation>' +
1458 '<identifier>e</identifier>' +
1459 '<punctuation>\u3008</punctuation>' +
1460 '<identifier>f</identifier>' +
1463 this.xpathBlacklist = [];
1468 * Pathological cases with only closing fences.
1470 TEST_F('CvoxSemanticTreeUnitTest', 'StreeClosingFencesOnly', function() {
1472 this.xpathBlacklist = ['descendant::punctuated/content'];
1474 this.executeTreeTest(
1475 '<mrow><mo>]</mo></mrow>',
1476 '<fence>]</fence>');
1478 this.executeTreeTest(
1479 '<mrow><mi>a</mi><mo>]</mo></mrow>',
1482 '<identifier>a</identifier>' +
1483 '<punctuation>]</punctuation>' +
1487 this.executeTreeTest(
1488 '<mrow><mi>a</mi><mo>]</mo><mi>b</mi></mrow>',
1491 '<identifier>a</identifier>' +
1492 '<punctuation>]</punctuation>' +
1493 '<identifier>b</identifier>' +
1497 this.executeTreeTest(
1498 '<mrow><mo>]</mo><mi>b</mi></mrow>',
1501 '<punctuation>]</punctuation>' +
1502 '<identifier>b</identifier>' +
1506 this.executeTreeTest(
1507 '<mrow><mi>a</mi><mo>]</mo><mi>b</mi><mi>c</mi><mo>)</mo><mi>d</mi>' +
1508 '<mo>}</mo><mi>e</mi><mo>〉</mo><mi>f</mi></mrow>',
1511 '<identifier>a</identifier>' +
1512 '<punctuation>]</punctuation>' +
1515 '<operator>\u2062</operator>' +
1518 '<identifier>b</identifier>' +
1519 '<identifier>c</identifier>' +
1522 '<punctuation>)</punctuation>' +
1523 '<identifier>d</identifier>' +
1524 '<punctuation>}</punctuation>' +
1525 '<identifier>e</identifier>' +
1526 '<punctuation>\u3009</punctuation>' +
1527 '<identifier>f</identifier>' +
1530 // Multiple plus inner fenced.
1531 this.executeTreeTest(
1532 '<mrow><mi>a</mi><mo>]</mo><mi>b</mi><mo>]</mo><mo>(</mo><mi>c</mi>' +
1533 '<mo>)</mo><mo>)</mo><mi>d</mi><mo>}</mo><mi>e</mi><mo>〉</mo>' +
1534 '<mi>f</mi></mrow>',
1537 '<identifier>a</identifier>' +
1538 '<punctuation>]</punctuation>' +
1539 '<identifier>b</identifier>' +
1540 '<punctuation>]</punctuation>' +
1543 '<fence>(</fence>' +
1544 '<fence>)</fence>' +
1547 '<identifier>c</identifier>' +
1550 '<punctuation>)</punctuation>' +
1551 '<identifier>d</identifier>' +
1552 '<punctuation>}</punctuation>' +
1553 '<identifier>e</identifier>' +
1554 '<punctuation>\u3009</punctuation>' +
1555 '<identifier>f</identifier>' +
1558 this.xpathBlacklist = [];
1563 * Pathological cases with only neutral fences.
1565 TEST_F('CvoxSemanticTreeUnitTest', 'StreeNeutralFencesOnly', function() {
1567 this.xpathBlacklist = ['descendant::punctuated/content'];
1569 this.executeTreeTest(
1570 '<mrow><mo>|</mo></mrow>',
1571 '<fence>|</fence>');
1573 this.executeTreeTest(
1574 '<mrow><mi>a</mi><mo>|</mo></mrow>',
1577 '<identifier>a</identifier>' +
1578 '<punctuation>|</punctuation>' +
1582 this.executeTreeTest(
1583 '<mrow><mi>a</mi><mo>|</mo><mi>b</mi></mrow>',
1586 '<identifier>a</identifier>' +
1587 '<punctuation>|</punctuation>' +
1588 '<identifier>b</identifier>' +
1592 this.executeTreeTest(
1593 '<mrow><mo>|</mo><mi>b</mi></mrow>',
1596 '<punctuation>|</punctuation>' +
1597 '<identifier>b</identifier>' +
1600 // Two different bars.
1601 this.executeTreeTest(
1602 '<mrow><mi>a</mi><mo>|</mo><mi>b</mi><mo>¦</mo><mi>c</mi></mrow>',
1605 '<identifier>a</identifier>' +
1606 '<punctuation>|</punctuation>' +
1607 '<identifier>b</identifier>' +
1608 '<punctuation>\u00A6</punctuation>' +
1609 '<identifier>c</identifier>' +
1612 // Three different bars.
1613 this.executeTreeTest(
1614 '<mrow><mi>a</mi><mo>‖</mo><mi>b</mi><mo>|</mo><mi>c</mi>' +
1615 '<mo>¦</mo><mi>d</mi></mrow>',
1618 '<identifier>a</identifier>' +
1619 '<punctuation>\u2016</punctuation>' +
1620 '<identifier>b</identifier>' +
1621 '<punctuation>|</punctuation>' +
1622 '<identifier>c</identifier>' +
1623 '<punctuation>\u00A6</punctuation>' +
1624 '<identifier>d</identifier>' +
1627 // Multiple plus inner fenced.
1628 this.executeTreeTest(
1629 '<mrow><mo>‖</mo><mo>[</mo><mi>a</mi><mo>‖</mo><mi>b</mi>' +
1630 '<mo>]</mo><mo>‖</mo><mo>|</mo><mi>x</mi><mo>‖</mo>' +
1631 '<mi>y</mi><mo>¦</mo><mi>z</mi></mrow>',
1636 '<fence>\u2016</fence>' +
1637 '<fence>\u2016</fence>' +
1642 '<fence>[</fence>' +
1643 '<fence>]</fence>' +
1648 '<identifier>a</identifier>' +
1649 '<punctuation>\u2016</punctuation>' +
1650 '<identifier>b</identifier>' +
1657 '<punctuation>|</punctuation>' +
1658 '<identifier>x</identifier>' +
1659 '<punctuation>\u2016</punctuation>' +
1660 '<identifier>y</identifier>' +
1661 '<punctuation>\u00A6</punctuation>' +
1662 '<identifier>z</identifier>' +
1665 this.xpathBlacklist = [];
1670 * Pathological cases with mixed fences.
1672 TEST_F('CvoxSemanticTreeUnitTest', 'StreeMixedUnmatchedFences', function() {
1674 this.xpathBlacklist = ['descendant::punctuated/content'];
1675 // Close, neutral, open.
1676 this.executeTreeTest(
1677 '<mrow><mo>]</mo><mo>‖</mo><mi>b</mi><mo>|</mo><mi>c</mi>' +
1678 '<mo>(</mo></mrow>',
1681 '<punctuation>]</punctuation>' +
1682 '<punctuation>\u2016</punctuation>' +
1683 '<identifier>b</identifier>' +
1684 '<punctuation>|</punctuation>' +
1685 '<identifier>c</identifier>' +
1686 '<punctuation>(</punctuation>' +
1689 // Neutrals and close.
1690 this.executeTreeTest(
1691 '<mrow><mi>a</mi><mo>‖</mo><mi>b</mi><mo>|</mo><mi>c</mi>' +
1692 '<mo>¦</mo><mi>d</mi><mo>]</mo><mi>e</mi></mrow>',
1695 '<identifier>a</identifier>' +
1696 '<punctuation>\u2016</punctuation>' +
1697 '<identifier>b</identifier>' +
1698 '<punctuation>|</punctuation>' +
1699 '<identifier>c</identifier>' +
1700 '<punctuation>\u00A6</punctuation>' +
1701 '<identifier>d</identifier>' +
1702 '<punctuation>]</punctuation>' +
1703 '<identifier>e</identifier>' +
1706 // Neutrals and open.
1707 this.executeTreeTest(
1708 '<mrow><mo>[</mo><mi>a</mi><mo>‖</mo><mi>b</mi><mo>|</mo>' +
1709 '<mi>c</mi><mo>¦</mo><mi>d</mi></mrow>',
1712 '<punctuation>[</punctuation>' +
1713 '<identifier>a</identifier>' +
1714 '<punctuation>\u2016</punctuation>' +
1715 '<identifier>b</identifier>' +
1716 '<punctuation>|</punctuation>' +
1717 '<identifier>c</identifier>' +
1718 '<punctuation>\u00A6</punctuation>' +
1719 '<identifier>d</identifier>' +
1722 // Multiple fences, fenced and operations
1723 this.executeTreeTest(
1724 '<mrow><mo>‖</mo><mo>[</mo><mi>a</mi><mo>‖</mo><mi>b</mi>' +
1725 '<mo>]</mo><mo>|</mo><mo>[</mo><mi>c</mi><mo>‖</mo>' +
1726 '<mo>¦</mo><mi>d</mi><mo>]</mo><mo>‖</mo><mo>|</mo>' +
1727 '<mi>x</mi><mo>‖</mo><mi>y</mi><mo>¦</mo><mi>z</mi>' +
1728 '<mo>]</mo></mrow>',
1733 '<fence>\u2016</fence>' +
1734 '<fence>\u2016</fence>' +
1741 '<fence>[</fence>' +
1742 '<fence>]</fence>' +
1747 '<identifier>a</identifier>' +
1748 '<punctuation>\u2016</punctuation>' +
1749 '<identifier>b</identifier>' +
1754 '<punctuation>|</punctuation>' +
1757 '<fence>[</fence>' +
1758 '<fence>]</fence>' +
1763 '<identifier>c</identifier>' +
1764 '<punctuation>\u2016</punctuation>' +
1765 '<punctuation>\u00A6</punctuation>' +
1766 '<identifier>d</identifier>' +
1775 '<punctuation>|</punctuation>' +
1776 '<identifier>x</identifier>' +
1777 '<punctuation>\u2016</punctuation>' +
1778 '<identifier>y</identifier>' +
1779 '<punctuation>\u00A6</punctuation>' +
1780 '<identifier>z</identifier>' +
1781 '<punctuation>]</punctuation>' +
1784 // Multiple fences, fenced and operations
1785 this.executeTreeTest(
1786 '<mrow><mo>‖</mo><mo>]</mo><mo>¦</mo><mo>‖</mo>' +
1787 '<mo>[</mo><mo>|</mo><mo>[</mo><mi>a</mi><mo>‖</mo><mi>b</mi>' +
1788 '<mo>]</mo><mo>‖</mo><mo>|</mo><mi>[</mi><mo>‖</mo>' +
1789 '<mi>y</mi><mo>¦</mo><mi>z</mi></mrow>',
1794 '<fence>\u2016</fence>' +
1795 '<fence>\u2016</fence>' +
1800 '<punctuation>]</punctuation>' +
1801 '<punctuation>\u00A6</punctuation>' +
1806 '<punctuation>[</punctuation>' +
1809 '<fence>|</fence>' +
1810 '<fence>|</fence>' +
1817 '<fence>[</fence>' +
1818 '<fence>]</fence>' +
1823 '<identifier>a</identifier>' +
1824 '<punctuation>\u2016</punctuation>' +
1825 '<identifier>b</identifier>' +
1830 '<punctuation>\u2016</punctuation>' +
1835 '<punctuation>[</punctuation>' +
1836 '<punctuation>\u2016</punctuation>' +
1837 '<identifier>y</identifier>' +
1838 '<punctuation>\u00A6</punctuation>' +
1839 '<identifier>z</identifier>' +
1842 // Multiple fences, fenced and operations
1843 this.executeTreeTest(
1844 '<mrow><mo>‖</mo><mo>[</mo><mi>a</mi><mo>¦</mo>' +
1845 '<mo>‖</mo><mo>[</mo><mo>+</mo><mo>[</mo><mi>b</mi>' +
1846 '<mo>‖</mo><mi>c</mi><mo>]</mo><mo>+</mo><mo>‖</mo>' +
1847 '<mo>|</mo><mi>d</mi><mo>+</mo><mi>e</mi><mi>[</mi><mo>‖</mo>' +
1848 '<mi>y</mi><mo>¦</mo><mo>+</mo><mi>z</mi></mrow>',
1851 '<punctuation>\u2016</punctuation>' +
1852 '<punctuation>[</punctuation>' +
1853 '<identifier>a</identifier>' +
1854 '<punctuation>\u00A6</punctuation>' +
1855 '<punctuation>\u2016</punctuation>' +
1856 '<punctuation>[</punctuation>' +
1859 '<operator>+</operator>' +
1864 '<operator>+</operator>' +
1869 '<fence>[</fence>' +
1870 '<fence>]</fence>' +
1875 '<identifier>b</identifier>' +
1876 '<punctuation>\u2016</punctuation>' +
1877 '<identifier>c</identifier>' +
1886 '<punctuation>\u2016</punctuation>' +
1887 '<punctuation>|</punctuation>' +
1890 '<operator>+</operator>' +
1893 '<identifier>d</identifier>' +
1894 '<identifier>e</identifier>' +
1897 '<punctuation>[</punctuation>' +
1898 '<punctuation>\u2016</punctuation>' +
1899 '<identifier>y</identifier>' +
1900 '<punctuation>\u00A6</punctuation>' +
1903 '<operator>+</operator>' +
1906 '<identifier>z</identifier>' +
1911 this.xpathBlacklist = [];
1916 * Simple function applications
1918 TEST_F('CvoxSemanticTreeUnitTest', 'StreeSimpleFuncsSingle', function() {
1920 this.executeTreeTest(
1921 '<mrow><mi>f</mi></mrow>',
1922 '<identifier>f</identifier>');
1924 this.executeTreeTest(
1925 '<mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow>',
1928 '<punctuation>\u2061</punctuation>' +
1931 '<identifier>f</identifier>' +
1934 '<fence>(</fence>' +
1935 '<fence>)</fence>' +
1938 '<identifier>x</identifier>' +
1944 this.executeTreeTest(
1945 '<mrow><mi>f</mi><mo>(</mo><mi>x</mi><mi>y</mi><mo>)</mo></mrow>',
1948 '<punctuation>\u2061</punctuation>' +
1951 '<identifier>f</identifier>' +
1954 '<fence>(</fence>' +
1955 '<fence>)</fence>' +
1960 '<operator>\u2062</operator>' +
1963 '<identifier>x</identifier>' +
1964 '<identifier>y</identifier>' +
1972 this.executeTreeTest(
1973 '<mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>,</mo><mi>y</mi>' +
1974 '<mo>,</mo><mi>z</mi><mo>)</mo></mrow>',
1977 '<punctuation>\u2061</punctuation>' +
1980 '<identifier>f</identifier>' +
1983 '<fence>(</fence>' +
1984 '<fence>)</fence>' +
1989 '<punctuation>,</punctuation>' +
1990 '<punctuation>,</punctuation>' +
1993 '<identifier>x</identifier>' +
1994 '<punctuation>,</punctuation>' +
1995 '<identifier>y</identifier>' +
1996 '<punctuation>,</punctuation>' +
1997 '<identifier>z</identifier>' +
2005 this.executeTreeTest(
2006 '<mrow><mi>f</mi><mo>(</mo><msup><mi>x</mi><mn>2</mn></msup>' +
2007 '<mo>)</mo></mrow>',
2010 '<punctuation>\u2061</punctuation>' +
2013 '<identifier>f</identifier>' +
2016 '<fence>(</fence>' +
2017 '<fence>)</fence>' +
2022 '<identifier>x</identifier>' +
2023 '<number>2</number>' +
2031 this.executeTreeTest(
2032 '<mrow><mi>f</mi><mo>(</mo><msub><mi>x</mi><mn>2</mn></msub>' +
2033 '<mo>)</mo></mrow>',
2036 '<punctuation>\u2061</punctuation>' +
2039 '<identifier>f</identifier>' +
2042 '<fence>(</fence>' +
2043 '<fence>)</fence>' +
2048 '<identifier>x</identifier>' +
2049 '<number>2</number>' +
2057 this.executeTreeTest(
2058 '<mrow><mi>f</mi><mo>(</mo><msubsup><mi>x</mi><mn>2</mn>' +
2059 '<mn>1</mn></msubsup><mo>)</mo></mrow>',
2062 '<punctuation>\u2061</punctuation>' +
2065 '<identifier>f</identifier>' +
2068 '<fence>(</fence>' +
2069 '<fence>)</fence>' +
2076 '<identifier>x</identifier>' +
2077 '<number>2</number>' +
2080 '<number>1</number>' +
2088 this.executeTreeTest(
2089 '<mrow><mi>f</mi><mo>(</mo><mover><mi>x</mi><mn>2</mn></mover>' +
2090 '<mo>)</mo></mrow>',
2093 '<punctuation>\u2061</punctuation>' +
2096 '<identifier>f</identifier>' +
2099 '<fence>(</fence>' +
2100 '<fence>)</fence>' +
2105 '<identifier>x</identifier>' +
2106 '<number>2</number>' +
2114 this.executeTreeTest(
2115 '<mrow><mi>f</mi><mo>(</mo><munder><mi>x</mi><mn>2</mn></munder>' +
2116 '<mo>)</mo></mrow>',
2119 '<punctuation>\u2061</punctuation>' +
2122 '<identifier>f</identifier>' +
2125 '<fence>(</fence>' +
2126 '<fence>)</fence>' +
2131 '<identifier>x</identifier>' +
2132 '<number>2</number>' +
2140 this.executeTreeTest(
2141 '<mrow><mi>f</mi><mo>(</mo><munderover><mi>x</mi><mn>2</mn>' +
2142 '<mn>1</mn></munderover><mo>)</mo></mrow>',
2145 '<punctuation>\u2061</punctuation>' +
2148 '<identifier>f</identifier>' +
2151 '<fence>(</fence>' +
2152 '<fence>)</fence>' +
2159 '<identifier>x</identifier>' +
2160 '<number>2</number>' +
2163 '<number>1</number>' +
2171 this.executeTreeTest(
2172 '<mrow><mi>f</mi><mo>(</mo><mfrac><mn>1</mn><mn>2</mn></mfrac>' +
2173 '<mo>)</mo></mrow>',
2176 '<punctuation>\u2061</punctuation>' +
2179 '<identifier>f</identifier>' +
2182 '<fence>(</fence>' +
2183 '<fence>)</fence>' +
2188 '<number>1</number>' +
2189 '<number>2</number>' +
2197 this.executeTreeTest(
2198 '<mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>+</mo><mi>y</mi>' +
2199 '<mo>)</mo></mrow>',
2202 '<operator>\u2062</operator>' +
2205 '<identifier>f</identifier>' +
2208 '<fence>(</fence>' +
2209 '<fence>)</fence>' +
2214 '<operator>+</operator>' +
2217 '<identifier>x</identifier>' +
2218 '<identifier>y</identifier>' +
2229 * Simple functions with surrounding operators.
2231 TEST_F('CvoxSemanticTreeUnitTest', 'StreeSimpleFuncsWithOps', function() {
2233 this.executeTreeTest(
2234 '<mrow><mn>1</mn><mo>+</mo><mi>f</mi><mo>(</mo><mi>x</mi>' +
2235 '<mo>)</mo></mrow>',
2238 '<operator>+</operator>' +
2241 '<number>1</number>' +
2244 '<punctuation>\u2061</punctuation>' +
2247 '<identifier>f</identifier>' +
2250 '<fence>(</fence>' +
2251 '<fence>)</fence>' +
2254 '<identifier>x</identifier>' +
2262 this.executeTreeTest(
2263 '<mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo>' +
2264 '<mn>2</mn></mrow>',
2267 '<operator>+</operator>' +
2272 '<punctuation>\u2061</punctuation>' +
2275 '<identifier>f</identifier>' +
2278 '<fence>(</fence>' +
2279 '<fence>)</fence>' +
2282 '<identifier>x</identifier>' +
2287 '<number>2</number>' +
2291 this.executeTreeTest(
2292 '<mrow><mn>1</mn><mo>+</mo><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo>' +
2293 '<mo>+</mo><mn>2</mn></mrow>',
2296 '<operator>+</operator>' +
2297 '<operator>+</operator>' +
2300 '<number>1</number>' +
2303 '<punctuation>\u2061</punctuation>' +
2306 '<identifier>f</identifier>' +
2309 '<fence>(</fence>' +
2310 '<fence>)</fence>' +
2313 '<identifier>x</identifier>' +
2318 '<number>2</number>' +
2322 this.executeTreeTest(
2323 '<mrow><mo>a</mo><mo>+</mo><mi>f</mi><mo>(</mo><mi>x</mi>' +
2324 '<mo>)</mo></mrow>',
2327 '<operator>+</operator>' +
2330 '<identifier>a</identifier>' +
2333 '<punctuation>\u2061</punctuation>' +
2336 '<identifier>f</identifier>' +
2339 '<fence>(</fence>' +
2340 '<fence>)</fence>' +
2343 '<identifier>x</identifier>' +
2351 this.executeTreeTest(
2352 '<mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo>' +
2353 '<mo>b</mo></mrow>',
2356 '<operator>+</operator>' +
2361 '<punctuation>\u2061</punctuation>' +
2364 '<identifier>f</identifier>' +
2367 '<fence>(</fence>' +
2368 '<fence>)</fence>' +
2371 '<identifier>x</identifier>' +
2376 '<identifier>b</identifier>' +
2380 this.executeTreeTest(
2381 '<mrow><mo>a</mo><mo>+</mo><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo>' +
2382 '<mo>+</mo><mo>b</mo></mrow>',
2385 '<operator>+</operator>' +
2386 '<operator>+</operator>' +
2389 '<identifier>a</identifier>' +
2392 '<punctuation>\u2061</punctuation>' +
2395 '<identifier>f</identifier>' +
2398 '<fence>(</fence>' +
2399 '<fence>)</fence>' +
2402 '<identifier>x</identifier>' +
2407 '<identifier>b</identifier>' +
2411 this.executeTreeTest(
2412 '<mrow><mo>a</mo><mo>=</mo><mi>f</mi><mo>(</mo><mi>x</mi>' +
2413 '<mo>)</mo></mrow>',
2416 '<relation>=</relation>' +
2419 '<identifier>a</identifier>' +
2422 '<punctuation>\u2061</punctuation>' +
2425 '<identifier>f</identifier>' +
2428 '<fence>(</fence>' +
2429 '<fence>)</fence>' +
2432 '<identifier>x</identifier>' +
2440 this.executeTreeTest(
2441 '<mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>=</mo>' +
2442 '<mo>b</mo></mrow>',
2445 '<relation>=</relation>' +
2450 '<punctuation>\u2061</punctuation>' +
2453 '<identifier>f</identifier>' +
2456 '<fence>(</fence>' +
2457 '<fence>)</fence>' +
2460 '<identifier>x</identifier>' +
2465 '<identifier>b</identifier>' +
2469 this.executeTreeTest(
2470 '<mrow><mo>a</mo><mo>=</mo><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo>' +
2471 '<mo>=</mo><mo>b</mo></mrow>',
2474 '<relation>=</relation>' +
2475 '<relation>=</relation>' +
2478 '<identifier>a</identifier>' +
2481 '<punctuation>\u2061</punctuation>' +
2484 '<identifier>f</identifier>' +
2487 '<fence>(</fence>' +
2488 '<fence>)</fence>' +
2491 '<identifier>x</identifier>' +
2496 '<identifier>b</identifier>' +
2503 * Multiple simple functions.
2505 TEST_F('CvoxSemanticTreeUnitTest', 'StreeSimpleFuncsMulti', function() {
2507 this.executeTreeTest(
2508 '<mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo><mi>g</mi>' +
2509 '<mo>(</mo><mi>x</mi><mo>)</mo></mrow>',
2512 '<operator>+</operator>' +
2517 '<punctuation>\u2061</punctuation>' +
2520 '<identifier>f</identifier>' +
2523 '<fence>(</fence>' +
2524 '<fence>)</fence>' +
2527 '<identifier>x</identifier>' +
2534 '<punctuation>\u2061</punctuation>' +
2537 '<identifier>g</identifier>' +
2540 '<fence>(</fence>' +
2541 '<fence>)</fence>' +
2544 '<identifier>x</identifier>' +
2552 this.executeTreeTest(
2553 '<mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo><mi>g</mi>' +
2554 '<mo>(</mo><mi>x</mi><mo>)</mo><mo>=</mo><mi>h</mi><mo>(</mo>' +
2555 '<mi>x</mi><mo>)</mo></mrow>',
2558 '<relation>=</relation>' +
2563 '<operator>+</operator>' +
2568 '<punctuation>\u2061</punctuation>' +
2571 '<identifier>f</identifier>' +
2574 '<fence>(</fence>' +
2575 '<fence>)</fence>' +
2578 '<identifier>x</identifier>' +
2585 '<punctuation>\u2061</punctuation>' +
2588 '<identifier>g</identifier>' +
2591 '<fence>(</fence>' +
2592 '<fence>)</fence>' +
2595 '<identifier>x</identifier>' +
2604 '<punctuation>\u2061</punctuation>' +
2607 '<identifier>h</identifier>' +
2610 '<fence>(</fence>' +
2611 '<fence>)</fence>' +
2614 '<identifier>x</identifier>' +
2622 this.executeTreeTest(
2623 '<mrow><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo><mi>g</mi>' +
2624 '<mo>(</mo><mi>y</mi><mo>)</mo><mo>=</mo><mi>h</mi><mo>(</mo>' +
2625 '<mi>x</mi><mi>y</mi><mo>)</mo></mrow>',
2628 '<relation>=</relation>' +
2633 '<operator>+</operator>' +
2638 '<punctuation>\u2061</punctuation>' +
2641 '<identifier>f</identifier>' +
2644 '<fence>(</fence>' +
2645 '<fence>)</fence>' +
2648 '<identifier>x</identifier>' +
2655 '<punctuation>\u2061</punctuation>' +
2658 '<identifier>g</identifier>' +
2661 '<fence>(</fence>' +
2662 '<fence>)</fence>' +
2665 '<identifier>y</identifier>' +
2674 '<punctuation>\u2061</punctuation>' +
2677 '<identifier>h</identifier>' +
2680 '<fence>(</fence>' +
2681 '<fence>)</fence>' +
2686 '<operator>\u2062</operator>' +
2689 '<identifier>x</identifier>' +
2690 '<identifier>y</identifier>' +
2703 * Nested simple functions.
2705 TEST_F('CvoxSemanticTreeUnitTest', 'StreeSimpleFuncsNested', function() {
2707 this.executeTreeTest(
2708 '<mrow><mi>g</mi><mo>(</mo><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo>' +
2709 '<mo>)</mo></mrow>',
2712 '<punctuation>\u2061</punctuation>' +
2715 '<identifier>g</identifier>' +
2718 '<fence>(</fence>' +
2719 '<fence>)</fence>' +
2724 '<punctuation>\u2061</punctuation>' +
2727 '<identifier>f</identifier>' +
2730 '<fence>(</fence>' +
2731 '<fence>)</fence>' +
2734 '<identifier>x</identifier>' +
2744 this.executeTreeTest(
2745 '<mrow><mi>h</mi><mo>(</mo><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo>' +
2746 '<mi>g</mi><mo>(</mo><mi>y</mi><mo>)</mo><mo>)</mo></mrow>',
2749 '<punctuation>\u2061</punctuation>' +
2752 '<identifier>h</identifier>' +
2755 '<fence>(</fence>' +
2756 '<fence>)</fence>' +
2761 '<operator>\u2062</operator>' +
2766 '<punctuation>\u2061</punctuation>' +
2769 '<identifier>f</identifier>' +
2772 '<fence>(</fence>' +
2773 '<fence>)</fence>' +
2776 '<identifier>x</identifier>' +
2783 '<punctuation>\u2061</punctuation>' +
2786 '<identifier>g</identifier>' +
2789 '<fence>(</fence>' +
2790 '<fence>)</fence>' +
2793 '<identifier>y</identifier>' +
2805 this.executeTreeTest(
2806 '<mrow><mi>h</mi><mo>(</mo><mi>f</mi><mo>(</mo><mi>x</mi><mo>)</mo>' +
2807 '<mo>+</mo><mi>g</mi><mo>(</mo><mi>y</mi><mo>)</mo><mo>)</mo></mrow>',
2810 '<operator>\u2062</operator>' +
2813 '<identifier>h</identifier>' +
2816 '<fence>(</fence>' +
2817 '<fence>)</fence>' +
2822 '<operator>+</operator>' +
2827 '<punctuation>\u2061</punctuation>' +
2830 '<identifier>f</identifier>' +
2833 '<fence>(</fence>' +
2834 '<fence>)</fence>' +
2837 '<identifier>x</identifier>' +
2844 '<punctuation>\u2061</punctuation>' +
2847 '<identifier>g</identifier>' +
2850 '<fence>(</fence>' +
2851 '<fence>)</fence>' +
2854 '<identifier>y</identifier>' +
2866 this.executeTreeTest(
2867 '<mi>P</mi><mo>[</mo><mi>x</mi><mo>=</mo><mn>2</mn><mo>]</mo>',
2870 '<punctuation>\u2061</punctuation>' +
2873 '<identifier>P</identifier>' +
2876 '<fence>[</fence>' +
2877 '<fence>]</fence>' +
2882 '<relation>=</relation>' +
2885 '<identifier>x</identifier>' +
2886 '<number>2</number>' +
2897 * Simple functions with explicit function application.
2899 TEST_F('CvoxSemanticTreeUnitTest', 'StreeSimpleFuncsExplicitApp', function() {
2901 this.executeTreeTest(
2902 '<mi>f</mi><mo>\u2061</mo><mo>(</mo><mi>x</mi><mo>+</mo><mi>y</mi>' +
2906 '<punctuation>\u2061</punctuation>' +
2909 '<identifier>f</identifier>' +
2912 '<fence>(</fence>' +
2913 '<fence>)</fence>' +
2918 '<operator>+</operator>' +
2921 '<identifier>x</identifier>' +
2922 '<identifier>y</identifier>' +
2930 this.executeTreeTest(
2931 '<mi>f</mi><mo>\u2061</mo><mo>(</mo><mi>x</mi><mo>+</mo><mi>y</mi>' +
2932 '<mo>)</mo><mo>+</mo><mi>f</mi><mo>(</mo><mi>x</mi><mo>+</mo>' +
2933 '<mi>y</mi><mo>)</mo>',
2936 '<operator>+</operator>' +
2941 '<punctuation>\u2061</punctuation>' +
2944 '<identifier>f</identifier>' +
2947 '<fence>(</fence>' +
2948 '<fence>)</fence>' +
2953 '<operator>+</operator>' +
2956 '<identifier>x</identifier>' +
2957 '<identifier>y</identifier>' +
2966 '<operator>\u2062</operator>' +
2969 '<identifier>f</identifier>' +
2972 '<fence>(</fence>' +
2973 '<fence>)</fence>' +
2978 '<operator>+</operator>' +
2981 '<identifier>x</identifier>' +
2982 '<identifier>y</identifier>' +
2992 this.executeTreeTest(
2993 '<msub><mi>f</mi><mn>1</mn></msub><mo>\u2061</mo><mo>(</mo><mi>x</mi>' +
2994 '<mo>+</mo><mi>y</mi><mo>)</mo>',
2997 '<punctuation>\u2061</punctuation>' +
3002 '<identifier>f</identifier>' +
3003 '<number>1</number>' +
3008 '<fence>(</fence>' +
3009 '<fence>)</fence>' +
3014 '<operator>+</operator>' +
3017 '<identifier>x</identifier>' +
3018 '<identifier>y</identifier>' +
3026 this.executeTreeTest(
3027 '<msup><msub><mi>f</mi><mn>n</mn></msub><mn>2</mn></msup>' +
3028 '<mo>\u2061</mo><mo>(</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo>)</mo>' +
3029 '<mo>+</mo><msup><msub><mi>f</mi><mn>m</mn></msub><mn>2</mn></msup>' +
3030 '<mo>(</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo>)</mo>',
3033 '<operator>+</operator>' +
3038 '<punctuation>\u2061</punctuation>' +
3045 '<identifier>f</identifier>' +
3046 '<identifier>n</identifier>' +
3049 '<number>2</number>' +
3054 '<fence>(</fence>' +
3055 '<fence>)</fence>' +
3060 '<operator>+</operator>' +
3063 '<identifier>x</identifier>' +
3064 '<identifier>y</identifier>' +
3073 '<operator>\u2062</operator>' +
3080 '<identifier>f</identifier>' +
3081 '<identifier>m</identifier>' +
3084 '<number>2</number>' +
3089 '<fence>(</fence>' +
3090 '<fence>)</fence>' +
3095 '<operator>+</operator>' +
3098 '<identifier>x</identifier>' +
3099 '<identifier>y</identifier>' +
3112 * Prefix function applications
3114 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrefixFuncsSingle', function() {
3116 this.executeTreeTest(
3117 '<mrow><mi>sin</mi><mo>(</mo><mi>x</mi><mo>)</mo></mrow>',
3120 '<punctuation>\u2061</punctuation>' +
3123 '<function>sin</function>' +
3126 '<fence>(</fence>' +
3127 '<fence>)</fence>' +
3130 '<identifier>x</identifier>' +
3136 this.executeTreeTest(
3137 '<mrow><mi>sin</mi><mo>(</mo><mi>x</mi><mi>y</mi><mo>)</mo></mrow>',
3140 '<punctuation>\u2061</punctuation>' +
3143 '<function>sin</function>' +
3146 '<fence>(</fence>' +
3147 '<fence>)</fence>' +
3152 '<operator>\u2062</operator>' +
3155 '<identifier>x</identifier>' +
3156 '<identifier>y</identifier>' +
3164 this.executeTreeTest(
3165 '<mrow><mi>sin</mi><mo>(</mo><msup><mi>x</mi><mn>2</mn></msup>' +
3166 '<mo>)</mo></mrow>',
3169 '<punctuation>\u2061</punctuation>' +
3172 '<function>sin</function>' +
3175 '<fence>(</fence>' +
3176 '<fence>)</fence>' +
3181 '<identifier>x</identifier>' +
3182 '<number>2</number>' +
3190 this.executeTreeTest(
3191 '<mrow><mi>sin</mi><mo>(</mo><msub><mi>x</mi><mn>2</mn></msub>' +
3192 '<mo>)</mo></mrow>',
3195 '<punctuation>\u2061</punctuation>' +
3198 '<function>sin</function>' +
3201 '<fence>(</fence>' +
3202 '<fence>)</fence>' +
3207 '<identifier>x</identifier>' +
3208 '<number>2</number>' +
3216 this.executeTreeTest(
3217 '<mrow><mi>sin</mi><mo>(</mo><msubsup><mi>x</mi><mn>2</mn>' +
3218 '<mn>1</mn></msubsup><mo>)</mo></mrow>',
3221 '<punctuation>\u2061</punctuation>' +
3224 '<function>sin</function>' +
3227 '<fence>(</fence>' +
3228 '<fence>)</fence>' +
3235 '<identifier>x</identifier>' +
3236 '<number>2</number>' +
3239 '<number>1</number>' +
3247 this.executeTreeTest(
3248 '<mrow><mi>sin</mi><mo>(</mo><mover><mi>x</mi><mn>2</mn></mover>' +
3249 '<mo>)</mo></mrow>',
3252 '<punctuation>\u2061</punctuation>' +
3255 '<function>sin</function>' +
3258 '<fence>(</fence>' +
3259 '<fence>)</fence>' +
3264 '<identifier>x</identifier>' +
3265 '<number>2</number>' +
3273 this.executeTreeTest(
3274 '<mrow><mi>sin</mi><mo>(</mo><munder><mi>x</mi><mn>2</mn></munder>' +
3275 '<mo>)</mo></mrow>',
3278 '<punctuation>\u2061</punctuation>' +
3281 '<function>sin</function>' +
3284 '<fence>(</fence>' +
3285 '<fence>)</fence>' +
3290 '<identifier>x</identifier>' +
3291 '<number>2</number>' +
3299 this.executeTreeTest(
3300 '<mrow><mi>sin</mi><mo>(</mo><munderover><mi>x</mi><mn>2</mn>' +
3301 '<mn>1</mn></munderover><mo>)</mo></mrow>',
3304 '<punctuation>\u2061</punctuation>' +
3307 '<function>sin</function>' +
3310 '<fence>(</fence>' +
3311 '<fence>)</fence>' +
3318 '<identifier>x</identifier>' +
3319 '<number>2</number>' +
3322 '<number>1</number>' +
3330 this.executeTreeTest(
3331 '<mrow><mi>sin</mi><mo>(</mo><mfrac><mn>1</mn><mn>2</mn></mfrac>' +
3332 '<mo>)</mo></mrow>',
3335 '<punctuation>\u2061</punctuation>' +
3338 '<function>sin</function>' +
3341 '<fence>(</fence>' +
3342 '<fence>)</fence>' +
3347 '<number>1</number>' +
3348 '<number>2</number>' +
3356 this.executeTreeTest(
3357 '<mrow><mi>sin</mi><mo>(</mo><mi>x</mi><mo>+</mo><mi>y</mi>' +
3358 '<mo>)</mo></mrow>',
3361 '<punctuation>\u2061</punctuation>' +
3364 '<function>sin</function>' +
3367 '<fence>(</fence>' +
3368 '<fence>)</fence>' +
3373 '<operator>+</operator>' +
3376 '<identifier>x</identifier>' +
3377 '<identifier>y</identifier>' +
3388 * Prefix functions applications with surrounding operators.
3390 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrefixFuncsWithOps', function() {
3392 this.executeTreeTest(
3393 '<mrow><mn>1</mn><mo>+</mo><mi>sin</mi><mo>(</mo><mi>x</mi>' +
3394 '<mo>)</mo></mrow>',
3397 '<operator>+</operator>' +
3400 '<number>1</number>' +
3403 '<punctuation>\u2061</punctuation>' +
3406 '<function>sin</function>' +
3409 '<fence>(</fence>' +
3410 '<fence>)</fence>' +
3413 '<identifier>x</identifier>' +
3421 this.executeTreeTest(
3422 '<mrow><mi>sin</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo>' +
3423 '<mn>2</mn></mrow>',
3426 '<operator>+</operator>' +
3431 '<punctuation>\u2061</punctuation>' +
3434 '<function>sin</function>' +
3437 '<fence>(</fence>' +
3438 '<fence>)</fence>' +
3441 '<identifier>x</identifier>' +
3446 '<number>2</number>' +
3450 this.executeTreeTest(
3451 '<mrow><mn>1</mn><mo>+</mo><mi>sin</mi><mo>(</mo><mi>x</mi><mo>)</mo>' +
3452 '<mo>+</mo><mn>2</mn></mrow>',
3455 '<operator>+</operator>' +
3456 '<operator>+</operator>' +
3459 '<number>1</number>' +
3462 '<punctuation>\u2061</punctuation>' +
3465 '<function>sin</function>' +
3468 '<fence>(</fence>' +
3469 '<fence>)</fence>' +
3472 '<identifier>x</identifier>' +
3477 '<number>2</number>' +
3481 this.executeTreeTest(
3482 '<mrow><mo>a</mo><mo>+</mo><mi>sin</mi><mo>(</mo><mi>x</mi>' +
3483 '<mo>)</mo></mrow>',
3486 '<operator>+</operator>' +
3489 '<identifier>a</identifier>' +
3492 '<punctuation>\u2061</punctuation>' +
3495 '<function>sin</function>' +
3498 '<fence>(</fence>' +
3499 '<fence>)</fence>' +
3502 '<identifier>x</identifier>' +
3510 this.executeTreeTest(
3511 '<mrow><mi>sin</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo>' +
3512 '<mo>b</mo></mrow>',
3515 '<operator>+</operator>' +
3520 '<punctuation>\u2061</punctuation>' +
3523 '<function>sin</function>' +
3526 '<fence>(</fence>' +
3527 '<fence>)</fence>' +
3530 '<identifier>x</identifier>' +
3535 '<identifier>b</identifier>' +
3539 this.executeTreeTest(
3540 '<mrow><mo>a</mo><mo>+</mo><mi>sin</mi><mo>(</mo><mi>x</mi>' +
3541 '<mo>)</mo><mo>+</mo><mo>b</mo></mrow>',
3544 '<operator>+</operator>' +
3545 '<operator>+</operator>' +
3548 '<identifier>a</identifier>' +
3551 '<punctuation>\u2061</punctuation>' +
3554 '<function>sin</function>' +
3557 '<fence>(</fence>' +
3558 '<fence>)</fence>' +
3561 '<identifier>x</identifier>' +
3566 '<identifier>b</identifier>' +
3570 this.executeTreeTest(
3571 '<mrow><mo>a</mo><mo>=</mo><mi>sin</mi><mo>(</mo><mi>x</mi>' +
3572 '<mo>)</mo></mrow>',
3575 '<relation>=</relation>' +
3578 '<identifier>a</identifier>' +
3581 '<punctuation>\u2061</punctuation>' +
3584 '<function>sin</function>' +
3587 '<fence>(</fence>' +
3588 '<fence>)</fence>' +
3591 '<identifier>x</identifier>' +
3599 this.executeTreeTest(
3600 '<mrow><mi>sin</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>=</mo>' +
3601 '<mo>b</mo></mrow>',
3604 '<relation>=</relation>' +
3609 '<punctuation>\u2061</punctuation>' +
3612 '<function>sin</function>' +
3615 '<fence>(</fence>' +
3616 '<fence>)</fence>' +
3619 '<identifier>x</identifier>' +
3624 '<identifier>b</identifier>' +
3628 this.executeTreeTest(
3629 '<mrow><mo>a</mo><mo>=</mo><mi>sin</mi><mo>(</mo><mi>x</mi><mo>)</mo>' +
3630 '<mo>=</mo><mo>b</mo></mrow>',
3633 '<relation>=</relation>' +
3634 '<relation>=</relation>' +
3637 '<identifier>a</identifier>' +
3640 '<punctuation>\u2061</punctuation>' +
3643 '<function>sin</function>' +
3646 '<fence>(</fence>' +
3647 '<fence>)</fence>' +
3650 '<identifier>x</identifier>' +
3655 '<identifier>b</identifier>' +
3662 * Multiple prefix function applications.
3664 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrefixFuncsMulti', function() {
3666 this.executeTreeTest(
3667 '<mrow><mi>sin</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo><mi>cos</mi>' +
3668 '<mo>(</mo><mi>x</mi><mo>)</mo></mrow>',
3671 '<operator>+</operator>' +
3676 '<punctuation>\u2061</punctuation>' +
3679 '<function>sin</function>' +
3682 '<fence>(</fence>' +
3683 '<fence>)</fence>' +
3686 '<identifier>x</identifier>' +
3693 '<punctuation>\u2061</punctuation>' +
3696 '<function>cos</function>' +
3699 '<fence>(</fence>' +
3700 '<fence>)</fence>' +
3703 '<identifier>x</identifier>' +
3711 this.executeTreeTest(
3712 '<mrow><mi>sin</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo><mi>cos</mi>' +
3713 '<mo>(</mo><mi>x</mi><mo>)</mo><mo>=</mo><mi>tan</mi><mo>(</mo>' +
3714 '<mi>x</mi><mo>)</mo></mrow>',
3717 '<relation>=</relation>' +
3722 '<operator>+</operator>' +
3727 '<punctuation>\u2061</punctuation>' +
3730 '<function>sin</function>' +
3733 '<fence>(</fence>' +
3734 '<fence>)</fence>' +
3737 '<identifier>x</identifier>' +
3744 '<punctuation>\u2061</punctuation>' +
3747 '<function>cos</function>' +
3750 '<fence>(</fence>' +
3751 '<fence>)</fence>' +
3754 '<identifier>x</identifier>' +
3763 '<punctuation>\u2061</punctuation>' +
3766 '<function>tan</function>' +
3769 '<fence>(</fence>' +
3770 '<fence>)</fence>' +
3773 '<identifier>x</identifier>' +
3781 this.executeTreeTest(
3782 '<mrow><mi>sin</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>+</mo><mi>cos</mi>' +
3783 '<mo>(</mo><mi>y</mi><mo>)</mo><mo>=</mo><mi>tan</mi><mo>(</mo>' +
3784 '<mi>x</mi><mi>y</mi><mo>)</mo></mrow>',
3787 '<relation>=</relation>' +
3792 '<operator>+</operator>' +
3797 '<punctuation>\u2061</punctuation>' +
3800 '<function>sin</function>' +
3803 '<fence>(</fence>' +
3804 '<fence>)</fence>' +
3807 '<identifier>x</identifier>' +
3814 '<punctuation>\u2061</punctuation>' +
3817 '<function>cos</function>' +
3820 '<fence>(</fence>' +
3821 '<fence>)</fence>' +
3824 '<identifier>y</identifier>' +
3833 '<punctuation>\u2061</punctuation>' +
3836 '<function>tan</function>' +
3839 '<fence>(</fence>' +
3840 '<fence>)</fence>' +
3845 '<operator>\u2062</operator>' +
3848 '<identifier>x</identifier>' +
3849 '<identifier>y</identifier>' +
3862 * Prefix function applications with sub- and superscripts.
3864 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrefixFuncsScripts', function() {
3866 this.executeTreeTest(
3867 '<mrow><msup><mi>sin</mi><mn>2</mn></msup><mo>(</mo><mi>x</mi>' +
3868 '<mo>)</mo></mrow>',
3871 '<punctuation>\u2061</punctuation>' +
3876 '<function>sin</function>' +
3877 '<number>2</number>' +
3882 '<fence>(</fence>' +
3883 '<fence>)</fence>' +
3886 '<identifier>x</identifier>' +
3892 this.executeTreeTest(
3893 '<mrow><msub><mi>sin</mi><mn>1</mn></msub><mo>(</mo><mi>x</mi>' +
3894 '<mo>)</mo></mrow>',
3897 '<punctuation>\u2061</punctuation>' +
3902 '<function>sin</function>' +
3903 '<number>1</number>' +
3908 '<fence>(</fence>' +
3909 '<fence>)</fence>' +
3912 '<identifier>x</identifier>' +
3918 this.executeTreeTest(
3919 '<mrow><msubsup><mi>sin</mi><mn>2</mn><mn>1</mn></msubsup><mo>(</mo>' +
3920 '<mi>x</mi><mo>)</mo></mrow>',
3923 '<punctuation>\u2061</punctuation>' +
3930 '<function>sin</function>' +
3931 '<number>2</number>' +
3934 '<number>1</number>' +
3939 '<fence>(</fence>' +
3940 '<fence>)</fence>' +
3943 '<identifier>x</identifier>' +
3949 this.executeTreeTest(
3950 '<mrow><msup><mi>sin</mi><mn>2</mn></msup><mo>(</mo><mi>x</mi>' +
3951 '<mo>)</mo><mo>+</mo><msup><mi>cos</mi><mn>2</mn></msup><mo>(</mo>' +
3952 '<mi>y</mi><mo>)</mo><mo>=</mo><mn>1</mn></mrow>',
3955 '<relation>=</relation>' +
3960 '<operator>+</operator>' +
3965 '<punctuation>\u2061</punctuation>' +
3970 '<function>sin</function>' +
3971 '<number>2</number>' +
3976 '<fence>(</fence>' +
3977 '<fence>)</fence>' +
3980 '<identifier>x</identifier>' +
3987 '<punctuation>\u2061</punctuation>' +
3992 '<function>cos</function>' +
3993 '<number>2</number>' +
3998 '<fence>(</fence>' +
3999 '<fence>)</fence>' +
4002 '<identifier>y</identifier>' +
4009 '<number>1</number>' +
4016 * Prefix function applications with unfenced arguments.
4018 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrefixFuncsUnfenced', function() {
4020 this.executeTreeTest(
4021 '<mrow><mi>sin</mi><mi>x</mi></mrow>',
4024 '<punctuation>\u2061</punctuation>' +
4027 '<function>sin</function>' +
4028 '<identifier>x</identifier>' +
4032 this.executeTreeTest(
4033 '<mrow><mi>sin</mi><mi>x</mi><mi>y</mi></mrow>',
4036 '<punctuation>\u2061</punctuation>' +
4039 '<function>sin</function>' +
4042 '<operator>\u2062</operator>' +
4045 '<identifier>x</identifier>' +
4046 '<identifier>y</identifier>' +
4052 this.executeTreeTest(
4053 '<mrow><mi>sin</mi><msup><mi>x</mi><mn>2</mn></msup></mrow>',
4056 '<punctuation>\u2061</punctuation>' +
4059 '<function>sin</function>' +
4062 '<identifier>x</identifier>' +
4063 '<number>2</number>' +
4069 this.executeTreeTest(
4070 '<mrow><mi>sin</mi><msub><mi>x</mi><mn>2</mn></msub></mrow>',
4073 '<punctuation>\u2061</punctuation>' +
4076 '<function>sin</function>' +
4079 '<identifier>x</identifier>' +
4080 '<number>2</number>' +
4086 this.executeTreeTest(
4087 '<mrow><mi>sin</mi><msubsup><mi>x</mi><mn>2</mn><mn>1</mn>' +
4088 '</msubsup></mrow>',
4091 '<punctuation>\u2061</punctuation>' +
4094 '<function>sin</function>' +
4099 '<identifier>x</identifier>' +
4100 '<number>2</number>' +
4103 '<number>1</number>' +
4109 this.executeTreeTest(
4110 '<mrow><mi>sin</mi><mover><mi>x</mi><mn>2</mn></mover></mrow>',
4113 '<punctuation>\u2061</punctuation>' +
4116 '<function>sin</function>' +
4119 '<identifier>x</identifier>' +
4120 '<number>2</number>' +
4126 this.executeTreeTest(
4127 '<mrow><mi>sin</mi><munder><mi>x</mi><mn>2</mn></munder></mrow>',
4130 '<punctuation>\u2061</punctuation>' +
4133 '<function>sin</function>' +
4136 '<identifier>x</identifier>' +
4137 '<number>2</number>' +
4143 this.executeTreeTest(
4144 '<mrow><mi>sin</mi><munderover><mi>x</mi><mn>2</mn><mn>1</mn>' +
4145 '</munderover></mrow>',
4148 '<punctuation>\u2061</punctuation>' +
4151 '<function>sin</function>' +
4156 '<identifier>x</identifier>' +
4157 '<number>2</number>' +
4160 '<number>1</number>' +
4166 this.executeTreeTest(
4167 '<mrow><mi>sin</mi><mfrac><mn>1</mn><mn>2</mn></mfrac></mrow>',
4170 '<punctuation>\u2061</punctuation>' +
4173 '<function>sin</function>' +
4176 '<number>1</number>' +
4177 '<number>2</number>' +
4186 * Prefix function applications with unfenced arguments in an operator
4189 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrefixFuncsUnfencedOps', function() {
4191 this.executeTreeTest(
4192 '<mrow><mn>1</mn><mo>+</mo><mi>sin</mi><mi>x</mi></mrow>',
4195 '<operator>+</operator>' +
4198 '<number>1</number>' +
4201 '<punctuation>\u2061</punctuation>' +
4204 '<function>sin</function>' +
4205 '<identifier>x</identifier>' +
4211 this.executeTreeTest(
4212 '<mrow><mi>sin</mi><mi>x</mi><mo>+</mo><mn>2</mn></mrow>',
4215 '<operator>+</operator>' +
4220 '<punctuation>\u2061</punctuation>' +
4223 '<function>sin</function>' +
4224 '<identifier>x</identifier>' +
4227 '<number>2</number>' +
4231 this.executeTreeTest(
4232 '<mrow><mn>1</mn><mo>+</mo><mi>sin</mi><mi>x</mi><mo>+</mo>' +
4233 '<mn>2</mn></mrow>',
4236 '<operator>+</operator>' +
4237 '<operator>+</operator>' +
4240 '<number>1</number>' +
4243 '<punctuation>\u2061</punctuation>' +
4246 '<function>sin</function>' +
4247 '<identifier>x</identifier>' +
4250 '<number>2</number>' +
4254 this.executeTreeTest(
4255 '<mrow><mo>a</mo><mo>+</mo><mi>sin</mi><mi>x</mi></mrow>',
4258 '<operator>+</operator>' +
4261 '<identifier>a</identifier>' +
4264 '<punctuation>\u2061</punctuation>' +
4267 '<function>sin</function>' +
4268 '<identifier>x</identifier>' +
4274 this.executeTreeTest(
4275 '<mrow><mi>sin</mi><mi>x</mi><mo>+</mo><mo>b</mo></mrow>',
4278 '<operator>+</operator>' +
4283 '<punctuation>\u2061</punctuation>' +
4286 '<function>sin</function>' +
4287 '<identifier>x</identifier>' +
4290 '<identifier>b</identifier>' +
4294 this.executeTreeTest(
4295 '<mrow><mo>a</mo><mo>+</mo><mi>sin</mi><mi>x</mi><mo>+</mo>' +
4296 '<mo>b</mo></mrow>',
4299 '<operator>+</operator>' +
4300 '<operator>+</operator>' +
4303 '<identifier>a</identifier>' +
4306 '<punctuation>\u2061</punctuation>' +
4309 '<function>sin</function>' +
4310 '<identifier>x</identifier>' +
4313 '<identifier>b</identifier>' +
4317 this.executeTreeTest(
4318 '<mrow><mo>a</mo><mo>=</mo><mi>sin</mi><mi>x</mi></mrow>',
4321 '<relation>=</relation>' +
4324 '<identifier>a</identifier>' +
4327 '<punctuation>\u2061</punctuation>' +
4330 '<function>sin</function>' +
4331 '<identifier>x</identifier>' +
4337 this.executeTreeTest(
4338 '<mrow><mi>sin</mi><mi>x</mi><mo>=</mo><mo>b</mo></mrow>',
4341 '<relation>=</relation>' +
4346 '<punctuation>\u2061</punctuation>' +
4349 '<function>sin</function>' +
4350 '<identifier>x</identifier>' +
4353 '<identifier>b</identifier>' +
4357 this.executeTreeTest(
4358 '<mrow><mo>a</mo><mo>=</mo><mi>sin</mi><mi>x</mi><mo>=</mo>' +
4359 '<mo>b</mo></mrow>',
4362 '<relation>=</relation>' +
4363 '<relation>=</relation>' +
4366 '<identifier>a</identifier>' +
4369 '<punctuation>\u2061</punctuation>' +
4372 '<function>sin</function>' +
4373 '<identifier>x</identifier>' +
4376 '<identifier>b</identifier>' +
4383 * Multiple prefix function applications with unfenced arguments.
4385 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrefixFuncsMultiUnfenced', function() {
4387 this.executeTreeTest(
4388 '<mrow><mi>sin</mi><mi>x</mi><mo>+</mo><mi>cos</mi><mi>x</mi></mrow>',
4391 '<operator>+</operator>' +
4396 '<punctuation>\u2061</punctuation>' +
4399 '<function>sin</function>' +
4400 '<identifier>x</identifier>' +
4405 '<punctuation>\u2061</punctuation>' +
4408 '<function>cos</function>' +
4409 '<identifier>x</identifier>' +
4415 this.executeTreeTest(
4416 '<mrow><mi>sin</mi><mi>x</mi><mo>+</mo><mi>cos</mi><mi>x</mi><mo>=</mo>' +
4417 '<mi>tan</mi><mi>x</mi></mrow>',
4420 '<relation>=</relation>' +
4425 '<operator>+</operator>' +
4430 '<punctuation>\u2061</punctuation>' +
4433 '<function>sin</function>' +
4434 '<identifier>x</identifier>' +
4439 '<punctuation>\u2061</punctuation>' +
4442 '<function>cos</function>' +
4443 '<identifier>x</identifier>' +
4450 '<punctuation>\u2061</punctuation>' +
4453 '<function>tan</function>' +
4454 '<identifier>x</identifier>' +
4460 this.executeTreeTest(
4461 '<mrow><mi>sin</mi><mi>x</mi><mo>+</mo><mi>cos</mi><mi>y</mi><mo>=</mo>' +
4462 '<mi>tan</mi><mi>x</mi><mi>y</mi></mrow>',
4465 '<relation>=</relation>' +
4470 '<operator>+</operator>' +
4475 '<punctuation>\u2061</punctuation>' +
4478 '<function>sin</function>' +
4479 '<identifier>x</identifier>' +
4484 '<punctuation>\u2061</punctuation>' +
4487 '<function>cos</function>' +
4488 '<identifier>y</identifier>' +
4495 '<punctuation>\u2061</punctuation>' +
4498 '<function>tan</function>' +
4501 '<operator>\u2062</operator>' +
4504 '<identifier>x</identifier>' +
4505 '<identifier>y</identifier>' +
4516 * Prefix function applications with sub- and superscripts and unfenced
4519 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrefixFuncsScriptUnfenced',
4522 this.executeTreeTest(
4523 '<mrow><msup><mi>sin</mi><mn>2</mn></msup><mi>x</mi></mrow>',
4526 '<punctuation>\u2061</punctuation>' +
4531 '<function>sin</function>' +
4532 '<number>2</number>' +
4535 '<identifier>x</identifier>' +
4539 this.executeTreeTest(
4540 '<mrow><msub><mi>sin</mi><mn>1</mn></msub><mi>x</mi></mrow>',
4543 '<punctuation>\u2061</punctuation>' +
4548 '<function>sin</function>' +
4549 '<number>1</number>' +
4552 '<identifier>x</identifier>' +
4556 this.executeTreeTest(
4557 '<mrow><msubsup><mi>sin</mi><mn>2</mn><mn>1</mn></msubsup>' +
4558 '<mi>x</mi></mrow>',
4561 '<punctuation>\u2061</punctuation>' +
4568 '<function>sin</function>' +
4569 '<number>2</number>' +
4572 '<number>1</number>' +
4575 '<identifier>x</identifier>' +
4579 this.executeTreeTest(
4580 '<mrow><msup><mi>sin</mi><mn>2</mn></msup><mi>x</mi><mo>+</mo><msup>' +
4581 '<mi>cos</mi><mn>2</mn></msup><mi>y</mi><mo>=</mo><mn>1</mn></mrow>',
4584 '<relation>=</relation>' +
4589 '<operator>+</operator>' +
4594 '<punctuation>\u2061</punctuation>' +
4599 '<function>sin</function>' +
4600 '<number>2</number>' +
4603 '<identifier>x</identifier>' +
4608 '<punctuation>\u2061</punctuation>' +
4613 '<function>cos</function>' +
4614 '<number>2</number>' +
4617 '<identifier>y</identifier>' +
4622 '<number>1</number>' +
4625 this.executeTreeTest(
4626 '<mrow><msubsup><msubsup><mi>sin</mi><mn>2</mn><mn>1</mn>' +
4627 '</msubsup><mi>n</mi><mi>m</mi></msubsup><mi>x</mi></mrow>',
4630 '<punctuation>\u2061</punctuation>' +
4641 '<function>sin</function>' +
4642 '<number>2</number>' +
4645 '<number>1</number>' +
4648 '<identifier>n</identifier>' +
4651 '<identifier>m</identifier>' +
4654 '<identifier>x</identifier>' +
4661 * Prefix functions without arguments.
4663 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrefixFuncsNoArgs', function() {
4665 this.executeTreeTest(
4667 '<function>sin</function>');
4669 this.executeTreeTest(
4670 '<msup><mi>sin</mi><mn>2</mn></msup>',
4673 '<function>sin</function>' +
4674 '<number>2</number>' +
4678 this.executeTreeTest(
4679 '<msup><mi>sin</mi><mn>2</mn></msup><mo>+</mo><msup><mi>cos</mi>' +
4680 '<mn>2</mn></msup>',
4683 '<operator>+</operator>' +
4688 '<punctuation>\u2061</punctuation>' +
4693 '<function>sin</function>' +
4694 '<number>2</number>' +
4702 '<punctuation>\u2061</punctuation>' +
4707 '<function>cos</function>' +
4708 '<number>2</number>' +
4717 this.executeTreeTest(
4718 '<mrow><msup><mi>sin</mi><mn>2</mn></msup><mo>+</mo>' +
4719 '<msup><mi>cos</mi><mn>2</mn></msup><mo>=</mo><mn>1</mn></mrow>',
4722 '<relation>=</relation>' +
4727 '<operator>+</operator>' +
4732 '<punctuation>\u2061</punctuation>' +
4737 '<function>sin</function>' +
4738 '<number>2</number>' +
4746 '<punctuation>\u2061</punctuation>' +
4751 '<function>cos</function>' +
4752 '<number>2</number>' +
4760 '<number>1</number>' +
4764 this.executeTreeTest(
4765 '<mrow><mi>sin</mi><mo>=</mo><mfrac><mn>1</mn>' +
4766 '<mi>csc</mi></mfrac></mrow>',
4769 '<relation>=</relation>' +
4774 '<punctuation>\u2061</punctuation>' +
4777 '<function>sin</function>' +
4783 '<number>1</number>' +
4784 '<function>csc</function>' +
4793 * Nested prefix function applications, both with and without fenced arguments.
4795 TEST_F('CvoxSemanticTreeUnitTest', 'StreePrefixFuncsNested', function() {
4797 this.executeTreeTest(
4798 '<mrow><mi>log</mi><mi>cos</mi><mi>x</mi></mrow>',
4801 '<punctuation>\u2061</punctuation>' +
4804 '<function>log</function>' +
4807 '<punctuation>\u2061</punctuation>' +
4810 '<function>cos</function>' +
4811 '<identifier>x</identifier>' +
4817 this.executeTreeTest(
4818 '<mrow><mi>ln</mi><mo>' +
4819 '(</mo><mi>sin</mi><mo>(</mo><mi>x</mi><mo>)</mo><mo>)</mo></mrow>',
4822 '<punctuation>\u2061</punctuation>' +
4825 '<function>ln</function>' +
4828 '<fence>(</fence>' +
4829 '<fence>)</fence>' +
4834 '<punctuation>\u2061</punctuation>' +
4837 '<function>sin</function>' +
4840 '<fence>(</fence>' +
4841 '<fence>)</fence>' +
4844 '<identifier>x</identifier>' +
4854 this.executeTreeTest(
4855 '<mrow><mi>log</mi><mi>cos</mi><mi>x</mi><mo>=' +
4856 '</mo><mi>ln</mi><mo>(</mo><mi>sin</mi><mo>' +
4857 '(</mo><mi>x</mi><mo>)</mo><mo>)</mo></mrow>',
4860 '<relation>=</relation>' +
4865 '<punctuation>\u2061</punctuation>' +
4868 '<function>log</function>' +
4871 '<punctuation>\u2061</punctuation>' +
4874 '<function>cos</function>' +
4875 '<identifier>x</identifier>' +
4882 '<punctuation>\u2061</punctuation>' +
4885 '<function>ln</function>' +
4888 '<fence>(</fence>' +
4889 '<fence>)</fence>' +
4894 '<punctuation>\u2061</punctuation>' +
4897 '<function>sin</function>' +
4900 '<fence>(</fence>' +
4901 '<fence>)</fence>' +
4904 '<identifier>x</identifier>' +
4919 * Variations of tables representing matrices, vectors, case statements,
4920 * multiline equations and regular tables.
4922 TEST_F('CvoxSemanticTreeUnitTest', 'StreeTables', function() {
4924 this.executeTreeTest(
4925 '<mrow class="MJX-TeXAtom-ORD"><mi mathvariant="bold">A</mi>' +
4926 '<mo>=</mo><mo>[</mo><mtable rowspacing="4pt" columnspacing="1em">' +
4927 '<mtr><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd></mtr><mtr><mtd>' +
4928 '<mn>2</mn></mtd><mtd><mn>3</mn></mtd></mtr></mtable><mo>]</mo>' +
4930 '<relseq role="equality" id="16">=' +
4932 '<relation role="equality" id="1">=</relation>' +
4935 '<identifier role="latinletter" font="bold" id="0">A</identifier>' +
4936 '<matrix role="unknown" id="13">' +
4938 '<fence role="open" id="2">[</fence>' +
4939 '<fence role="close" id="14">]</fence>' +
4942 '<row role="matrix" id="7">' +
4944 '<cell role="matrix" id="4">' +
4946 '<number role="integer" font="normal" id="3">0</number>' +
4949 '<cell role="matrix" id="6">' +
4951 '<number role="integer" font="normal" id="5">1</number>' +
4956 '<row role="matrix" id="12">' +
4958 '<cell role="matrix" id="9">' +
4960 '<number role="integer" font="normal" id="8">2</number>' +
4963 '<cell role="matrix" id="11">' +
4965 '<number role="integer" font="normal" id="10">3</number>' +
4975 this.executeTreeTest(
4976 '<mo>[</mo><mtable rowspacing="4pt" columnspacing="1em"><mtr>' +
4977 '<mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd></mtr><mtr><mtd>' +
4978 '<mn>2</mn></mtd><mtd><mn>3</mn></mtd></mtr></mtable>' +
4980 '<matrix role="unknown" id="11">' +
4982 '<fence role="open" id="0">[</fence>' +
4983 '<fence role="close" id="12">]</fence>' +
4986 '<row role="matrix" id="5">' +
4988 '<cell role="matrix" id="2">' +
4990 '<number role="integer" font="normal" id="1">0</number>' +
4993 '<cell role="matrix" id="4">' +
4995 '<number role="integer" font="normal" id="3">1</number>' +
5000 '<row role="matrix" id="10">' +
5002 '<cell role="matrix" id="7">' +
5004 '<number role="integer" font="normal" id="6">2</number>' +
5007 '<cell role="matrix" id="9">' +
5009 '<number role="integer" font="normal" id="8">3</number>' +
5017 this.executeTreeTest(
5018 '<mrow class="MJX-TeXAtom-ORD"><mi mathvariant="bold">V</mi>' +
5019 '<mo>=</mo><mo>[</mo><mtable rowspacing="4pt" columnspacing="1em">' +
5020 '<mtr><mtd><mn>1</mn></mtd></mtr><mtr><mtd><mn>2</mn></mtd></mtr>' +
5021 '<mtr><mtd><mn>3</mn></mtd></mtr></mtable><mo>]</mo></mrow>',
5022 '<relseq role="equality" id="15">=' +
5024 '<relation role="equality" id="1">=</relation>' +
5027 '<identifier role="latinletter" font="bold" id="0">V</identifier>' +
5028 '<vector role="unknown" id="12">' +
5030 '<fence role="open" id="2">[</fence>' +
5031 '<fence role="close" id="13">]</fence>' +
5034 '<line role="vector" id="5">' +
5036 '<number role="integer" font="normal" id="3">1</number>' +
5039 '<line role="vector" id="8">' +
5041 '<number role="integer" font="normal" id="6">2</number>' +
5044 '<line role="vector" id="11">' +
5046 '<number role="integer" font="normal" id="9">3</number>' +
5054 this.executeTreeTest(
5055 '<mo>[</mo><mtable rowspacing="4pt" columnspacing="1em">' +
5056 '<mtr><mtd><mn>1</mn></mtd></mtr><mtr><mtd><mn>2</mn></mtd></mtr>' +
5057 '<mtr><mtd><mn>3</mn></mtd></mtr></mtable><mo>]</mo>',
5058 '<vector role="unknown" id="10">' +
5060 '<fence role="open" id="0">[</fence>' +
5061 '<fence role="close" id="11">]</fence>' +
5064 '<line role="vector" id="3">' +
5066 '<number role="integer" font="normal" id="1">1</number>' +
5069 '<line role="vector" id="6">' +
5071 '<number role="integer" font="normal" id="4">2</number>' +
5074 '<line role="vector" id="9">' +
5076 '<number role="integer" font="normal" id="7">3</number>' +
5083 this.executeTreeTest(
5084 '<mrow><mo>{</mo><mtable><mtr><mtd><mi>a</mi></mtd><mtd>' +
5085 '<mtext>often</mtext></mtd></mtr><mtr><mtd><mi>b</mi></mtd>' +
5086 '<mtd><mtext>sometimes</mtext></mtd></mtr></mtable></mrow>',
5087 '<cases role="unknown" id="11">' +
5089 '<punctuation role="openfence" id="0">{</punctuation>' +
5092 '<row role="cases" id="5">' +
5094 '<cell role="cases" id="2">' +
5096 '<identifier role="latinletter" font="normal" id="1">a</identifier>' +
5099 '<cell role="cases" id="4">' +
5101 '<text role="unknown" id="3">often</text>' +
5106 '<row role="cases" id="10">' +
5108 '<cell role="cases" id="7">' +
5110 '<identifier role="latinletter" font="normal" id="6">b</identifier>' +
5113 '<cell role="cases" id="9">' +
5115 '<text role="unknown" id="8">sometimes</text>' +
5123 this.executeTreeTest(
5124 '<mrow><mi mathvariant="bold">A</mi><mo>=</mo><mo>{</mo><mtable>' +
5125 '<mtr><mtd><mi>a</mi></mtd><mtd><mtext>often</mtext></mtd></mtr>' +
5126 '<mtr><mtd><mi>b</mi></mtd><mtd><mtext>sometimes</mtext></mtd></mtr>' +
5128 '<relseq role="equality" id="14">=' +
5130 '<relation role="equality" id="1">=</relation>' +
5133 '<identifier role="latinletter" font="bold" id="0">A</identifier>' +
5134 '<cases role="unknown" id="13">' +
5136 '<punctuation role="openfence" id="2">{</punctuation>' +
5139 '<row role="cases" id="7">' +
5141 '<cell role="cases" id="4">' +
5143 '<identifier role="latinletter" font="normal" id="3">a</identifier>' +
5146 '<cell role="cases" id="6">' +
5148 '<text role="unknown" id="5">often</text>' +
5153 '<row role="cases" id="12">' +
5155 '<cell role="cases" id="9">' +
5157 '<identifier role="latinletter" font="normal" id="8">b</identifier>' +
5160 '<cell role="cases" id="11">' +
5162 '<text role="unknown" id="10">sometimes</text>' +
5172 this.executeTreeTest(
5173 '<mrow><mo>{</mo><mtable><mtr><mtd><mi>a</mi></mtd><mtd>' +
5174 '<mtext>often</mtext></mtd></mtr><mtr><mtd><mi>b</mi></mtd><mtd>' +
5175 '<mtext>sometimes</mtext></mtd></mtr></mtable><mo>.</mo></mrow>',
5176 '<punctuated role="endpunct" id="13">' +
5178 '<punctuation role="fullstop" id="12">.</punctuation>' +
5181 '<cases role="unknown" id="11">' +
5183 '<punctuation role="openfence" id="0">{</punctuation>' +
5186 '<row role="cases" id="5">' +
5188 '<cell role="cases" id="2">' +
5190 '<identifier role="latinletter" font="normal" id="1">a</identifier>' +
5193 '<cell role="cases" id="4">' +
5195 '<text role="unknown" id="3">often</text>' +
5200 '<row role="cases" id="10">' +
5202 '<cell role="cases" id="7">' +
5204 '<identifier role="latinletter" font="normal" id="6">b</identifier>' +
5207 '<cell role="cases" id="9">' +
5209 '<text role="unknown" id="8">sometimes</text>' +
5216 '<punctuation role="fullstop" id="12">.</punctuation>' +
5220 this.executeTreeTest(
5221 '<mrow><mo>{</mo><mtable><mtr><mtd><mi>a</mi></mtd>' +
5222 '<mtd><mtext>often</mtext></mtd></mtr><mtr><mtd><mi>b</mi></mtd>' +
5223 '<mtd><mtext>sometimes</mtext></mtd></mtr></mtable>' +
5224 '<mo>,</mo><mi>b</mi><mo>,</mo><mi>c</mi><mo>.</mo></mrow>',
5225 '<punctuated role="sequence" id="17">' +
5227 '<punctuation role="unknown" id="12">,</punctuation>' +
5228 '<punctuation role="unknown" id="14">,</punctuation>' +
5229 '<punctuation role="fullstop" id="16">.</punctuation>' +
5232 '<cases role="unknown" id="11">' +
5234 '<punctuation role="openfence" id="0">{</punctuation>' +
5237 '<row role="cases" id="5">' +
5239 '<cell role="cases" id="2">' +
5241 '<identifier role="latinletter" font="normal" id="1">a</identifier>' +
5244 '<cell role="cases" id="4">' +
5246 '<text role="unknown" id="3">often</text>' +
5251 '<row role="cases" id="10">' +
5253 '<cell role="cases" id="7">' +
5255 '<identifier role="latinletter" font="normal" id="6">b</identifier>' +
5258 '<cell role="cases" id="9">' +
5260 '<text role="unknown" id="8">sometimes</text>' +
5267 '<punctuation role="unknown" id="12">,</punctuation>' +
5268 '<identifier role="latinletter" font="normal" id="13">b</identifier>' +
5269 '<punctuation role="unknown" id="14">,</punctuation>' +
5270 '<identifier role="latinletter" font="normal" id="15">c</identifier>' +
5271 '<punctuation role="fullstop" id="16">.</punctuation>' +
5275 this.executeTreeTest(
5276 '<mrow><mo>{</mo><mtable><mtr><mtd><mi>a</mi><mo>,</mo>' +
5277 '<mtext>often</mtext></mtd></mtr><mtr><mtd><mi>b</mi><mo>,</mo>' +
5278 '<mtext>sometimes</mtext></mtd></mtr></mtable><mo>,</mo><mi>b</mi>' +
5279 '<mo>,</mo><mi>c</mi><mo>.</mo></mrow>',
5280 '<punctuated role="sequence" id="19">' +
5282 '<punctuation role="unknown" id="14">,</punctuation>' +
5283 '<punctuation role="unknown" id="16">,</punctuation>' +
5284 '<punctuation role="fullstop" id="18">.</punctuation>' +
5287 '<cases role="unknown" id="13">' +
5289 '<punctuation role="openfence" id="0">{</punctuation>' +
5292 '<line role="cases" id="6">' +
5294 '<punctuated role="sequence" id="4">' +
5296 '<punctuation role="unknown" id="2">,</punctuation>' +
5299 '<identifier role="latinletter" font="normal" id="1">a</identifier>' +
5300 '<punctuation role="unknown" id="2">,</punctuation>' +
5301 '<text role="unknown" id="3">often</text>' +
5306 '<line role="cases" id="12">' +
5308 '<punctuated role="sequence" id="10">' +
5310 '<punctuation role="unknown" id="8">,</punctuation>' +
5313 '<identifier role="latinletter" font="normal" id="7">b</identifier>' +
5314 '<punctuation role="unknown" id="8">,</punctuation>' +
5315 '<text role="unknown" id="9">sometimes</text>' +
5322 '<punctuation role="unknown" id="14">,</punctuation>' +
5323 '<identifier role="latinletter" font="normal" id="15">b</identifier>' +
5324 '<punctuation role="unknown" id="16">,</punctuation>' +
5325 '<identifier role="latinletter" font="normal" id="17">c</identifier>' +
5326 '<punctuation role="fullstop" id="18">.</punctuation>' +
5330 this.executeTreeTest(
5331 '<mtable><mtr><mtd><mi>x</mi><maligngroup/><mo>=</mo><mn>4</mn>' +
5332 '</mtd></mtr><mtr><mtd><mi>y</mi><maligngroup/><mo>=</mo><mn>2</mn>' +
5333 '</mtd></mtr><mtr><mtd><mi>x</mi><mi>y</mi><maligngroup/><mo>=</mo>' +
5334 '<mn>6</mn></mtd></mtr></mtable>',
5335 '<multiline role="unknown" id="21">' +
5337 '<line role="multiline" id="5">' +
5339 '<relseq role="equality" id="3">=' +
5341 '<relation role="equality" id="1">=</relation>' +
5344 '<identifier role="latinletter" font="normal" id="0">x</identifier>' +
5345 '<number role="integer" font="normal" id="2">4</number>' +
5350 '<line role="multiline" id="11">' +
5352 '<relseq role="equality" id="9">=' +
5354 '<relation role="equality" id="7">=</relation>' +
5357 '<identifier role="latinletter" font="normal" id="6">y</identifier>' +
5358 '<number role="integer" font="normal" id="8">2</number>' +
5363 '<line role="multiline" id="20">' +
5365 '<relseq role="equality" id="18">=' +
5367 '<relation role="equality" id="14">=</relation>' +
5370 '<infixop role="implicit" id="17">\u2062' +
5372 '<operator role="multiplication" id="16">\u2062</operator>' +
5375 '<identifier role="latinletter" font="normal" id="12">x</identifier>' +
5376 '<identifier role="latinletter" font="normal" id="13">y</identifier>' +
5379 '<number role="integer" font="normal" id="15">6</number>' +
5387 this.executeTreeTest(
5388 '<mtable><mtr><mtd><mi>x</mi></mtd><mtd><mo>=</mo></mtd><mtd><mn>4</mn>' +
5389 '</mtd></mtr><mtr><mtd><mi>y</mi></mtd><mtd><mo>=</mo></mtd><mtd>' +
5390 '<mn>2</mn></mtd></mtr><mtr><mtd><mi>x</mi><mi>y</mi></mtd><mtd>' +
5391 '<mo>=</mo></mtd><mtd><mn>6</mn></mtd></mtr></mtable>',
5392 '<table role="unknown" id="24">' +
5394 '<row role="table" id="6">' +
5396 '<cell role="table" id="1">' +
5398 '<identifier role="latinletter" font="normal" id="0">x</identifier>' +
5401 '<cell role="table" id="3">' +
5403 '<relation role="equality" id="2">=</relation>' +
5406 '<cell role="table" id="5">' +
5408 '<number role="integer" font="normal" id="4">4</number>' +
5413 '<row role="table" id="13">' +
5415 '<cell role="table" id="8">' +
5417 '<identifier role="latinletter" font="normal" id="7">y</identifier>' +
5420 '<cell role="table" id="10">' +
5422 '<relation role="equality" id="9">=</relation>' +
5425 '<cell role="table" id="12">' +
5427 '<number role="integer" font="normal" id="11">2</number>' +
5432 '<row role="table" id="23">' +
5434 '<cell role="table" id="18">' +
5436 '<infixop role="implicit" id="17">\u2062' +
5438 '<operator role="multiplication" id="16">\u2062</operator>' +
5441 '<identifier role="latinletter" font="normal" id="14">x</identifier>' +
5442 '<identifier role="latinletter" font="normal" id="15">y</identifier>' +
5447 '<cell role="table" id="20">' +
5449 '<relation role="equality" id="19">=</relation>' +
5452 '<cell role="table" id="22">' +
5454 '<number role="integer" font="normal" id="21">6</number>' +
5464 TEST_F('CvoxSemanticTreeUnitTest', 'StreeLimitFunctions', function() {
5466 this.executeTreeTest(
5467 '<mrow><munder><mi>lim</mi><mrow><mi>x</mi><mo>\u2192</mo>' +
5468 '<mi>\u221E</mi></mrow></munder><mo>(</mo><mi>x</mi><mo>)</mo></mrow>',
5471 '<punctuation>\u2061</punctuation>' +
5476 '<function>lim</function>' +
5479 '<relation>\u2192</relation>' +
5482 '<identifier>x</identifier>' +
5483 '<identifier>\u221E</identifier>' +
5490 '<fence>(</fence>' +
5491 '<fence>)</fence>' +
5494 '<identifier>x</identifier>' +
5500 this.executeTreeTest(
5501 '<mrow><mi>a</mi><mo>+</mo><munder><mi>lim</mi><mrow><mi>x</mi>' +
5502 '<mo>\u2192</mo><mi>\u221E</mi></mrow></munder><mo>(</mo><mi>x</mi>' +
5503 '<mo>)</mo><mo>+</mo><mi>b</mi></mrow>',
5506 '<operator>+</operator>' +
5507 '<operator>+</operator>' +
5510 '<identifier>a</identifier>' +
5513 '<punctuation>\u2061</punctuation>' +
5518 '<function>lim</function>' +
5521 '<relation>\u2192</relation>' +
5524 '<identifier>x</identifier>' +
5525 '<identifier>\u221E</identifier>' +
5532 '<fence>(</fence>' +
5533 '<fence>)</fence>' +
5536 '<identifier>x</identifier>' +
5541 '<identifier>b</identifier>' +
5545 this.executeTreeTest(
5546 '<mrow><msup><munder><mi>lim</mi><mrow><mi>x</mi><mo>\u2192</mo>' +
5547 '<mi>\u221E</mi></mrow></munder><mo>+</mo></msup><mo>(</mo><mi>x</mi>' +
5548 '<mo>)</mo></mrow>',
5551 '<punctuation>\u2061</punctuation>' +
5558 '<function>lim</function>' +
5561 '<relation>\u2192</relation>' +
5564 '<identifier>x</identifier>' +
5565 '<identifier>\u221E</identifier>' +
5570 '<operator>+</operator>' +
5575 '<fence>(</fence>' +
5576 '<fence>)</fence>' +
5579 '<identifier>x</identifier>' +
5585 this.executeTreeTest(
5586 '<mrow><munderover><mi>lim</mi><mo>\u2015</mo><mrow><mi>x</mi>' +
5587 '<mo>\u2192</mo><mi>\u221E</mi></mrow></munderover><mo>(</mo>' +
5588 '<mi>x</mi><mo>)</mo></mrow>',
5591 '<punctuation>\u2061</punctuation>' +
5596 '<function>lim</function>' +
5597 '<punctuation>\u2015</punctuation>' +
5600 '<relation>\u2192</relation>' +
5603 '<identifier>x</identifier>' +
5604 '<identifier>\u221E</identifier>' +
5611 '<fence>(</fence>' +
5612 '<fence>)</fence>' +
5615 '<identifier>x</identifier>' +
5621 this.executeTreeTest(
5622 '<mrow><munder><mi>liminf</mi><mrow><mi>x</mi><mo>\u2192</mo>' +
5623 '<mi>\u221E</mi></mrow></munder><mo>(</mo><mi>x</mi><mo>)</mo>' +
5624 '<mo>+</mo><munder><mi>limsup</mi><mrow><mi>y</mi><mo>\u2192</mo>' +
5625 '<mi>\u221E</mi></mrow></munder><mo>(</mo><mi>y</mi><mo>)</mo></mrow>',
5628 '<operator>+</operator>' +
5633 '<punctuation>\u2061</punctuation>' +
5638 '<function>liminf</function>' +
5641 '<relation>\u2192</relation>' +
5644 '<identifier>x</identifier>' +
5645 '<identifier>\u221E</identifier>' +
5652 '<fence>(</fence>' +
5653 '<fence>)</fence>' +
5656 '<identifier>x</identifier>' +
5663 '<punctuation>\u2061</punctuation>' +
5668 '<function>limsup</function>' +
5671 '<relation>\u2192</relation>' +
5674 '<identifier>y</identifier>' +
5675 '<identifier>\u221E</identifier>' +
5682 '<fence>(</fence>' +
5683 '<fence>)</fence>' +
5686 '<identifier>y</identifier>' +
5694 this.executeTreeTest(
5695 '<mrow><mi>a</mi><mo>+</mo><munder><mi>lim</mi><mrow><mi>x</mi>' +
5696 '<mo>\u2192</mo><mi>\u221E</mi></mrow></munder><mi>x</mi><mo>+</mo>' +
5697 '<mi>b</mi></mrow>',
5700 '<operator>+</operator>' +
5701 '<operator>+</operator>' +
5704 '<identifier>a</identifier>' +
5707 '<punctuation>\u2061</punctuation>' +
5712 '<function>lim</function>' +
5715 '<relation>\u2192</relation>' +
5718 '<identifier>x</identifier>' +
5719 '<identifier>\u221E</identifier>' +
5724 '<identifier>x</identifier>' +
5727 '<identifier>b</identifier>' +
5731 this.executeTreeTest(
5732 '<mrow><munder><mi>lim</mi><mrow><mi>x</mi><mo>\u2192</mo><mi>\u221E</mi>' +
5733 '</mrow></munder><mi>lim</mi><munder><mrow><mi>y</mi><mo>\u2192</mo>' +
5734 '<mi>\u221E</mi></mrow></munder><mi>x</mi><mi>y</mi></mrow>',
5737 '<punctuation>\u2061</punctuation>' +
5742 '<function>lim</function>' +
5745 '<relation>\u2192</relation>' +
5748 '<identifier>x</identifier>' +
5749 '<identifier>\u221E</identifier>' +
5756 '<punctuation>\u2061</punctuation>' +
5759 '<function>lim</function>' +
5762 '<operator>\u2062</operator>' +
5769 '<relation>\u2192</relation>' +
5772 '<identifier>y</identifier>' +
5773 '<identifier>\u221E</identifier>' +
5778 '<identifier>x</identifier>' +
5779 '<identifier>y</identifier>' +
5787 this.executeTreeTest(
5789 '<function>liminf</function>');
5791 this.executeTreeTest(
5792 '<munder><mi>lim</mi><mrow><mi>x</mi><mo>\u2192</mo><mi>\u221E</mi>' +
5796 '<function>lim</function>' +
5799 '<relation>\u2192</relation>' +
5802 '<identifier>x</identifier>' +
5803 '<identifier>\u221E</identifier>' +
5809 this.executeTreeTest(
5810 '<mi>liminf</mi><mo>+</mo><mi>limsup</mi><mo>=</mo><mi>lim</mi>',
5813 '<relation>=</relation>' +
5818 '<operator>+</operator>' +
5823 '<punctuation>\u2061</punctuation>' +
5826 '<function>liminf</function>' +
5832 '<punctuation>\u2061</punctuation>' +
5835 '<function>limsup</function>' +
5843 '<punctuation>\u2061</punctuation>' +
5846 '<function>lim</function>' +
5856 * Variations of big operators.
5858 TEST_F('CvoxSemanticTreeUnitTest', 'StreeBigOps', function() {
5860 this.executeTreeTest(
5861 '<mrow><munderover><mi>\u2211</mi><mrow><mi>n</mi><mo>=</mo><mn>0</mn>' +
5862 '</mrow><mi>\u221E</mi></munderover><msup><mi>n</mi><mn>2</mn>' +
5868 '<largeop>\u2211</largeop>' +
5871 '<relation>=</relation>' +
5874 '<identifier>n</identifier>' +
5875 '<number>0</number>' +
5878 '<identifier>\u221E</identifier>' +
5883 '<identifier>n</identifier>' +
5884 '<number>2</number>' +
5890 this.executeTreeTest(
5891 '<mrow><munderover><mi>\u2211</mi><mrow><mi>n</mi><mo>=</mo><mn>0</mn>' +
5892 '</mrow><mi>\u221E</mi></munderover><munderover><mi>\u2211</mi><mrow>' +
5893 '<mi>m</mi><mo>=</mo><mn>0</mn></mrow><mi>\u221E</mi></munderover><msup>' +
5894 '<mi>n</mi><mn>m</mn></msup></mrow>',
5899 '<largeop>\u2211</largeop>' +
5902 '<relation>=</relation>' +
5905 '<identifier>n</identifier>' +
5906 '<number>0</number>' +
5909 '<identifier>\u221E</identifier>' +
5916 '<largeop>\u2211</largeop>' +
5919 '<relation>=</relation>' +
5922 '<identifier>m</identifier>' +
5923 '<number>0</number>' +
5926 '<identifier>\u221E</identifier>' +
5931 '<identifier>n</identifier>' +
5932 '<identifier>m</identifier>' +
5940 this.executeTreeTest(
5941 '<mrow><munder><mi>\u2211</mi><mrow><mi>n</mi><mo>=</mo><mn>0</mn></mrow>' +
5942 '</munder><msup><mi>n</mi><mn>2</mn></msup></mrow>',
5947 '<largeop>\u2211</largeop>' +
5950 '<relation>=</relation>' +
5953 '<identifier>n</identifier>' +
5954 '<number>0</number>' +
5961 '<identifier>n</identifier>' +
5962 '<number>2</number>' +
5972 * Variations of integrals.
5974 TEST_F('CvoxSemanticTreeUnitTest', 'StreeIntegrals', function() {
5976 this.executeTreeTest(
5978 '<largeop>\u222B</largeop>');
5980 this.executeTreeTest(
5981 '<mi>\u222B</mi><mi>dx</mi>',
5984 '<largeop>\u222B</largeop>' +
5986 '<identifier>dx</identifier>' +
5990 this.executeTreeTest(
5991 '<mrow><mi>\u222B</mi><mi>x</mi><mi>dx</mi></mrow>',
5994 '<largeop>\u222B</largeop>' +
5995 '<identifier>x</identifier>' +
5996 '<identifier>dx</identifier>' +
6000 this.executeTreeTest(
6001 '<mrow><mi>\u222B</mi><mi>x</mi><mi>d</mi><mi>x</mi></mrow>',
6004 '<largeop>\u222B</largeop>' +
6005 '<identifier>x</identifier>' +
6008 '<punctuation>\u2063</punctuation>' +
6011 '<identifier>d</identifier>' +
6012 '<punctuation>\u2063</punctuation>' +
6013 '<identifier>x</identifier>' +
6019 this.executeTreeTest(
6020 '<mrow><mi>\u222B</mi><mi>x</mi><mo>+' +
6021 '</mo><mi>y</mi><mi>d</mi><mi>x</mi></mrow>',
6024 '<largeop>\u222B</largeop>' +
6027 '<operator>+</operator>' +
6030 '<identifier>x</identifier>' +
6031 '<identifier>y</identifier>' +
6036 '<punctuation>\u2063</punctuation>' +
6039 '<identifier>d</identifier>' +
6040 '<punctuation>\u2063</punctuation>' +
6041 '<identifier>x</identifier>' +
6047 this.executeTreeTest(
6048 '<munderover><mi>\u222B</mi><mn>0</mn><mn>10</mn></munderover>',
6051 '<largeop>\u222B</largeop>' +
6052 '<number>0</number>' +
6053 '<number>10</number>' +
6057 this.executeTreeTest(
6058 '<munder><mi>\u222B</mi><mn>X</mn></munder>',
6061 '<largeop>\u222B</largeop>' +
6062 '<identifier>X</identifier>' +
6066 this.executeTreeTest(
6067 '<munderover><mi>\u222B</mi><mn>0</mn><mn>10</mn></munderover><mi>x</mi>' +
6068 '<mi>d</mi><mi>x</mi>',
6073 '<largeop>\u222B</largeop>' +
6074 '<number>0</number>' +
6075 '<number>10</number>' +
6078 '<identifier>x</identifier>' +
6081 '<punctuation>\u2063</punctuation>' +
6084 '<identifier>d</identifier>' +
6085 '<punctuation>\u2063</punctuation>' +
6086 '<identifier>x</identifier>' +
6092 this.executeTreeTest(
6093 '<munder><mi>\u222B</mi><mn>X</mn></munder><mi>x</mi><mi>dx</mi>',
6098 '<largeop>\u222B</largeop>' +
6099 '<identifier>X</identifier>' +
6102 '<identifier>x</identifier>' +
6103 '<identifier>dx</identifier>' +
6107 this.executeTreeTest(
6108 '<munderover><mi>\u222B</mi><mn>0</mn><mn>10</mn></munderover><mi>x</mi>' +
6109 '<mi>dx</mi><mo>+</mo><munderover><mi>\u222B</mi><mn>10</mn><mn>20</mn>' +
6110 '</munderover><mi>x</mi><mi>dx</mi><mo>=</mo><munderover><mi>\u222B</mi>' +
6111 '<mn>0</mn><mn>20</mn></munderover><mi>x</mi><mi>dx</mi>',
6114 '<relation>=</relation>' +
6119 '<operator>+</operator>' +
6126 '<largeop>\u222B</largeop>' +
6127 '<number>0</number>' +
6128 '<number>10</number>' +
6131 '<identifier>x</identifier>' +
6132 '<identifier>dx</identifier>' +
6139 '<largeop>\u222B</largeop>' +
6140 '<number>10</number>' +
6141 '<number>20</number>' +
6144 '<identifier>x</identifier>' +
6145 '<identifier>dx</identifier>' +
6154 '<largeop>\u222B</largeop>' +
6155 '<number>0</number>' +
6156 '<number>20</number>' +
6159 '<identifier>x</identifier>' +
6160 '<identifier>dx</identifier>' +
6166 this.executeTreeTest(
6167 '<mi>\u222B</mi><mi>\u222B</mi><mi>\u222B</mi>' +
6168 '<mi>dx</mi><mi>dy</mi><mi>dz</mi>',
6171 '<largeop>\u222B</largeop>' +
6174 '<largeop>\u222B</largeop>' +
6177 '<largeop>\u222B</largeop>' +
6179 '<identifier>dx</identifier>' +
6182 '<identifier>dy</identifier>' +
6185 '<identifier>dz</identifier>' +