mathml 0.8.1 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,794 +0,0 @@
1
- # Test for math_ml.rb
2
- #
3
- # Copyright (C) 2005, KURODA Hiraku <hiraku@hinet.mydns.jp>
4
- # You can redistribute it and/or modify it under GPL2.
5
-
6
- require "test/unit"
7
- require "math_ml"
8
- require "math_ml_test_util"
9
-
10
- class TC_Mathml_rb < Test::Unit::TestCase
11
- def test_double_require
12
- assert(require("lib/math_ml"))
13
- assert_nothing_raised do
14
- MathML::LaTeX::Parser.new
15
- end
16
- end
17
- end
18
-
19
- class TC_MathML_Element < Test::Unit::TestCase
20
- include Util4TC_MathML
21
- include MathML
22
-
23
- def test_display_style
24
- e = Element.new("test")
25
- assert(!e.display_style)
26
-
27
- e = Element.new("test").as_display_style
28
- assert_equal(MathML::Element, e.class)
29
- assert(e.display_style)
30
- end
31
-
32
- def test_pop
33
- e = Element.new("super")
34
- assert_equal(nil, e.pop)
35
-
36
- s = Element.new("sub")
37
- e << s
38
- assert_equal(s, e.pop)
39
- assert_equal(nil, e.pop)
40
-
41
- e << "text"
42
- assert_equal(MathML.pcstring("text"), e.pop)
43
- assert_equal(nil, e.pop)
44
- end
45
-
46
- def test_pcstring
47
- assert_equal("&lt;&gt;&amp;&quot;&apos;", MathML.pcstring('<>&"\'').to_s)
48
- assert_equal('<tag>&amp;"\'</tag>', MathML.pcstring('<tag>&amp;"\'</tag>', true).to_s)
49
- end
50
- end
51
-
52
- class TC_MathML_LaTeX_Scanner < Test::Unit::TestCase
53
- include MathML::LaTeX
54
-
55
- def test_done
56
- s = Scanner.new("0123")
57
- s.pos = 2
58
- assert_equal("01", s.done)
59
- assert_equal("23", s.rest)
60
- end
61
-
62
- def test__scan
63
- s = Scanner.new(" ")
64
- assert_equal(" ", s._scan(/\s/))
65
- assert_equal(1, s.pos)
66
- end
67
-
68
- def test__check
69
- s = Scanner.new(" ")
70
- assert_equal(" ", s._check(/\s/))
71
- assert_equal(0, s.pos)
72
- end
73
-
74
- def test_scan
75
- s = Scanner.new(" a")
76
- assert_equal("a", s.scan(/a/))
77
- assert_equal(2, s.pos)
78
-
79
- s.reset
80
- assert_equal(nil, s.scan(/b/))
81
- assert_equal(0, s.pos)
82
-
83
- s = Scanner.new(" %comment\na")
84
- assert_equal("a", s.scan(/a/))
85
- assert_equal(11, s.pos)
86
-
87
- s.reset
88
- assert_equal(nil, s.scan(/b/))
89
- assert_equal(0, s.pos)
90
- end
91
-
92
- def test_check
93
- s = Scanner.new(" a")
94
- assert_equal("a", s.check(/a/))
95
- assert_equal(0, s.pos)
96
-
97
- s.reset
98
- assert_equal(nil, s.check(/b/))
99
- assert_equal(0, s.pos)
100
- end
101
-
102
- def test_eos
103
- assert(Scanner.new("").eos?)
104
- assert(Scanner.new(" ").eos?)
105
- assert(Scanner.new(" %test\n%test").eos?)
106
- assert(!Scanner.new(" a").eos?)
107
- assert(!Scanner.new(" \\command").eos?)
108
- end
109
-
110
-
111
- def test_check_command
112
- assert_equal(nil, Scanner.new("test").check_command)
113
- s = Scanner.new(' \test')
114
- assert_equal('\test', s.check_command)
115
- assert_equal("test", s[1])
116
- assert_equal('\test', Scanner.new(' \test next').check_command)
117
- assert_equal('\test', Scanner.new(' \test_a').check_command)
118
- end
119
-
120
- def test_scan_command
121
- assert_equal(nil, Scanner.new("test").scan_command)
122
-
123
- s = Scanner.new(' \test')
124
- assert_equal('\test', s.scan_command)
125
- assert_equal("test", s[1])
126
- assert_equal(6, s.pos)
127
-
128
- s = Scanner.new(' \test rest')
129
- assert_equal('\test', s.scan_command)
130
- assert_equal(6, s.pos)
131
-
132
- s = Scanner.new(' \test_a')
133
- assert_equal('\test', s.scan_command)
134
- assert_equal(6, s.pos)
135
-
136
- s = Scanner.new(' \_test')
137
- assert_equal('\_', s.check_command)
138
- assert_equal('\_', s.scan_command)
139
- assert_equal("test", s.rest)
140
-
141
- end
142
-
143
- def test_scan_block
144
- assert_equal(nil, Scanner.new(" a").scan_block)
145
- assert_equal(nil, Scanner.new(" a").check_block)
146
-
147
- i = " {{}{}{{}{}}} "
148
- e = "{#{i}}"
149
- s = Scanner.new(" #{e} test")
150
- assert_equal(e, s.check_block)
151
- assert_equal(e, s.matched)
152
- assert_equal(i, s[1])
153
- assert_equal(e, s.scan_block)
154
- assert_equal(e, s.matched)
155
- assert_equal(i, s[1])
156
- assert_equal(" test", s.rest)
157
-
158
- assert_equal(nil, Scanner.new(' \command test').scan_block)
159
- assert_equal(nil, Scanner.new(' \command test').check_block)
160
-
161
- assert_equal(nil, Scanner.new("").scan_block)
162
- assert_equal(nil, Scanner.new("").check_block)
163
-
164
- assert_equal(nil, Scanner.new(" ").scan_block)
165
- assert_equal(nil, Scanner.new(" ").check_block)
166
-
167
- s = Scanner.new("{test")
168
- e = assert_raises(BlockNotClosed){s.scan_block}
169
- end
170
-
171
- def test_scan_any
172
- s0 = " %comment\n "
173
- s1 = "{}"
174
- s = Scanner.new(s0+s1)
175
- assert_equal(s1, s.scan_any)
176
- s.reset
177
- assert_equal(s0+s1, s.scan_any(true))
178
- assert_equal(s1, s.matched)
179
-
180
- s1 = '\command'
181
- s = Scanner.new(s0+s1)
182
- assert_equal(s1, s.scan_any)
183
- s.reset
184
- assert_equal(s0+s1, s.scan_any(true))
185
-
186
- s1 = 'a'
187
- s = Scanner.new(s0+s1)
188
- assert_equal(s1, s.scan_any)
189
- s.reset
190
- assert_equal(s0+s1, s.scan_any(true))
191
-
192
- s = Scanner.new(" ")
193
- assert_equal(nil, s.scan_any)
194
- s.reset
195
- assert_equal(" ", s.scan_any(true))
196
-
197
- s = Scanner.new('\begin{env}test\end{env}')
198
- assert_equal('\begin', s.scan_any)
199
- end
200
-
201
- def test_peek_command
202
- assert_equal("test", Scanner.new(' \test').peek_command)
203
- assert_equal(nil, Scanner.new("").peek_command)
204
- assert_equal(nil, Scanner.new(" ").peek_command)
205
- assert_equal(nil, Scanner.new(" a").peek_command)
206
- end
207
-
208
- def test_scan_option
209
- s = Scanner.new(" []")
210
- assert_equal("[]", s.scan_option)
211
- assert_equal("", s[1])
212
- assert_equal(3, s.pos)
213
-
214
- s = Scanner.new(" [ opt ]")
215
- assert_equal("[ opt ]", s.scan_option)
216
- assert_equal(" opt ", s[1])
217
- assert_equal(8, s.pos)
218
-
219
- s = Scanner.new(" [[]]")
220
- assert_equal("[[]", s.scan_option)
221
- assert_equal("[", s[1])
222
-
223
- s = Scanner.new(" [{[]}]")
224
- assert_equal("[{[]}]", s.scan_option)
225
- assert_equal("{[]}", s[1])
226
-
227
- assert_raises(OptionNotClosed){Scanner.new("[").scan_option}
228
- end
229
-
230
- def test_check_option
231
- s = Scanner.new(" []")
232
- assert_equal("[]", s.check_option)
233
- assert_equal("", s[1])
234
- assert_equal(0, s.pos)
235
-
236
- s = Scanner.new(" [ opt ]")
237
- assert_equal("[ opt ]", s.check_option)
238
- assert_equal(" opt ", s[1])
239
- assert_equal(0, s.pos)
240
-
241
- s = Scanner.new(" [[]]")
242
- assert_equal("[[]", s.check_option)
243
- assert_equal("[", s[1])
244
-
245
- s = Scanner.new(" [{[]}]")
246
- assert_equal("[{[]}]", s.check_option)
247
- assert_equal("{[]}", s[1])
248
-
249
- assert_raises(OptionNotClosed){Scanner.new("[").check_option}
250
- end
251
- end
252
-
253
- class TC_MathML_LaTeX_Macro < Test::Unit::TestCase
254
- include Util4TC_MathML
255
- include MathML::LaTeX
256
-
257
- def setup
258
- @src = <<'EOS'
259
- \newcommand{\newcom}{test}
260
- \newcommand{\paramcom}[2]{param2 #2, param1 #1.}
261
- \newcommand\ALPHA\alpha
262
- \newcommand\BETA[1]\beta
263
- \newcommand{\nothing}{}
264
- \newenvironment{newenv}{begin_newenv}{end_newenv}
265
- \newenvironment{paramenv}[2]{begin 1:#1, 2:#2}{end 2:#2 1:#1}
266
- \newenvironment{nothing}{}{}
267
- \newenvironment{separated environment}{sep}{env}
268
- \newenvironment ENV
269
- EOS
270
- super
271
- end
272
-
273
- def test_parse
274
- m = Macro.new
275
- assert_nothing_raised{m.parse(@src)}
276
-
277
- assert_parse_error("Need newcommand.", '\\newcommand{', "notcommand}{}"){m.parse('\newcommand{notcommand}{}')}
278
- assert_parse_error("Syntax error.", '\newcommand{\separated', " command}{}"){m.parse('\newcommand{\separated command}{}')}
279
- assert_parse_error("Need parameter.", '\newcommand{\nobody}', ""){m.parse('\newcommand{\nobody}')}
280
- assert_parse_error("Parameter \# too large.", '\newcommand{\noparam}{#', "1}"){m.parse('\newcommand{\noparam}{#1}')}
281
- assert_parse_error("Parameter \# too large.", '\newcommand{\overopt}[1]{#1#', "2}"){m.parse('\newcommand{\overopt}[1]{#1#2}')}
282
- assert_parse_error("Need positive number.", '\newcommand{\strangeopt}[', "-1]"){m.parse('\newcommand{\strangeopt}[-1]')}
283
- assert_parse_error("Need positive number.", '\newcommand{\strangeopt}[', "a]"){m.parse('\newcommand{\strangeopt}[a]')}
284
-
285
- assert_parse_error("Syntax error.", '\newenvironment{', '\command}{}{}'){m.parse('\newenvironment{\command}{}{}')}
286
- assert_parse_error("Need begin block.", '\newenvironment{nobegin}', ""){m.parse('\newenvironment{nobegin}')}
287
- assert_parse_error("Need end block.", '\newenvironment{noend}{}', ""){m.parse('\newenvironment{noend}{}')}
288
- assert_parse_error("Parameter \# too large.", '\newenvironment{noparam}{#', "1}{}"){m.parse('\newenvironment{noparam}{#1}{}')}
289
- assert_parse_error("Parameter \# too large.", '\newenvironment{overparam}[1]{#1#', "2}{}"){m.parse('\newenvironment{overparam}[1]{#1#2}{}')}
290
- assert_parse_error("Need positive number.", '\newenvironment{strangeparam}[', "-1]{}{}"){m.parse('\newenvironment{strangeparam}[-1]{}{}')}
291
- assert_parse_error("Need positive number.", '\newenvironment{strangeparam}[', "a]{}{}"){m.parse('\newenvironment{strangeparam}[a]{}{}')}
292
-
293
- assert_parse_error("Syntax error.", '\newcommand{\valid}{OK} ', '\invalid{\test}{NG}'){m.parse('\newcommand{\valid}{OK} \invalid{\test}{NG}')}
294
- assert_parse_error("Syntax error.", '\newcommand{\valid}{OK} ', 'invalid{\test}{NG}'){m.parse('\newcommand{\valid}{OK} invalid{\test}{NG}')}
295
-
296
- assert_parse_error("Option not closed.", '\newcommand{\newcom}', '[test'){m.parse('\newcommand{\newcom}[test')}
297
- assert_parse_error("Option not closed.", '\newcommand{\newcom}[1]', '[test'){m.parse('\newcommand{\newcom}[1][test')}
298
- assert_parse_error("Parameter \# too large.", '\newcommand{\newcom}[1][]{#1#', '2}'){m.parse('\newcommand{\newcom}[1][]{#1#2}')}
299
- assert_parse_error("Option not closed.", '\newenvironment{newenv}[1]', '[test'){m.parse('\newenvironment{newenv}[1][test')}
300
- assert_parse_error("Option not closed.", '\newenvironment{newenv}[1]', '[test'){m.parse('\newenvironment{newenv}[1][test')}
301
-
302
- assert_parse_error("Block not closed.", '\newcommand', '{\newcom'){m.parse('\newcommand{\newcom')}
303
- assert_parse_error("Block not closed.", '\newcommand{\newcom}', '{test1{test2}{test3'){m.parse('\newcommand{\newcom}{test1{test2}{test3')}
304
-
305
- assert_parse_error("Parameter \# too large.", '\newenvironment{newenv}[1][]{#1 #', '2}'){m.parse('\newenvironment{newenv}[1][]{#1 #2}')}
306
- end
307
-
308
- def test_commands
309
- m = Macro.new
310
- m.parse(@src)
311
-
312
- assert_equal(0, m.commands("newcom").num)
313
- assert_equal(2, m.commands("paramcom").num)
314
- assert_equal(nil, m.commands("no"))
315
- end
316
-
317
- def test_expand_command
318
- m = Macro.new
319
- m.parse(@src)
320
-
321
- assert_equal(nil, m.expand_command("not coommand", []))
322
-
323
- assert_equal("test", m.expand_command("newcom", []))
324
- assert_equal("test", m.expand_command("newcom", ["dummy_param"]))
325
- assert_equal("param2 2, param1 1.", m.expand_command("paramcom", ["1", "2"]))
326
- assert_equal("param2 34, param1 12.", m.expand_command("paramcom", ["12", "34"]))
327
- assert_parse_error("Need more parameter.", "", ""){m.expand_command("paramcom", ["12"])}
328
- assert_parse_error("Need more parameter.", "", ""){m.expand_command("paramcom", [])}
329
- end
330
-
331
- def test_environments
332
- m = Macro.new
333
- m.parse(@src)
334
-
335
- assert_equal(0, m.environments("newenv").num)
336
- assert_equal(2, m.environments("paramenv").num)
337
- assert_equal(nil, m.environments("not_env"))
338
- assert_equal(0, m.environments("separated environment").num)
339
- end
340
-
341
- def test_expand_environment
342
- m = Macro.new
343
- m.parse(@src)
344
-
345
- assert_equal(nil, m.expand_environment('notregistered', "dummy", []))
346
- assert_equal(' begin_newenv body end_newenv ', m.expand_environment("newenv", "body", []))
347
- assert_equal(' begin 1:1, 2:2 body end 2:2 1:1 ', m.expand_environment("paramenv", "body", ["1", "2"]))
348
- assert_equal(' begin 1:12, 2:34 body end 2:34 1:12 ', m.expand_environment("paramenv", "body", ["12", "34"]))
349
- assert_parse_error("Need more parameter.", "", ""){m.expand_environment("paramenv", "body", ["1"])}
350
- assert_parse_error("Need more parameter.", "", ""){m.expand_environment("paramenv", "body", [])}
351
- assert_equal(' body ', m.expand_environment("nothing", "body", []))
352
- assert_equal(' sep body env ', m.expand_environment("separated environment", "body", []))
353
- assert_equal(' N body V ', m.expand_environment("E", "body", []))
354
- end
355
-
356
- def test_expand_with_options
357
-
358
- src = <<'EOS'
359
- \newcommand{\opt}[1][x]{#1}
360
- \newcommand{\optparam}[2][]{#1#2}
361
- \newenvironment{newenv}[1][x]{s:#1}{e:#1}
362
- \newenvironment{optenv}[2][]{s:#1}{e:#2}
363
- EOS
364
-
365
- m = Macro.new
366
- m.parse(src)
367
-
368
- assert_equal('x', m.expand_command("opt", []))
369
- assert_equal('1', m.expand_command("opt", [], "1"))
370
-
371
- assert_equal('1', m.expand_command("optparam", ["1"]))
372
- assert_equal('21', m.expand_command("optparam", ["1"], "2"))
373
-
374
- assert_equal(" s:x test e:x ", m.expand_environment("newenv", "test", []))
375
- assert_equal(" s:1 test e:1 ", m.expand_environment("newenv", "test", [], "1"))
376
-
377
- assert_equal(" s: test e:1 ", m.expand_environment("optenv", "test", ["1"]))
378
- assert_equal(" s:2 test e:1 ", m.expand_environment("optenv", "test", ["1"], "2"))
379
- end
380
- end
381
-
382
- class TC_MathML_LaTeX_Parser < Test::Unit::TestCase
383
- include MathML::LaTeX
384
- include Util4TC_MathML
385
-
386
- ### Sub routines ###
387
-
388
- def check_chr(stag, etag, str, print=false)
389
- str.each_byte do |b|
390
- assert_equal("#{stag}#{b.chr}#{etag}", smml(b.chr))
391
- puts smml(b.chr) if print
392
- end
393
- end
394
-
395
- def check_hash(stag, etag, hash, print=false)
396
- hash.each do |k, v|
397
- e = "#{stag}#{v}#{etag}"
398
- s = smml(k)
399
- assert_equal(e, s)
400
- puts "#{k} => #{s}" if print
401
- end
402
- end
403
-
404
- def check_entity(stag, etag, hash, print=false)
405
- h = Hash.new
406
- hash.each do |k, v|
407
- h[k] = "&#{v};"
408
- end
409
- check_hash(stag, etag, h, print)
410
- end
411
-
412
- ### Tests ###
413
-
414
- def test_nobody
415
- p = Parser.new
416
- assert_equal("<math display='inline' xmlns='http://www.w3.org/1998/Math/MathML' />", p.parse("").to_s)
417
- assert_equal("<math display='block' xmlns='http://www.w3.org/1998/Math/MathML' />", p.parse("", true).to_s)
418
- assert_equal("<math display='inline' xmlns='http://www.w3.org/1998/Math/MathML' />", p.parse("", false).to_s)
419
- end
420
-
421
- def test_ignore_space
422
- assert_equal("<mrow><mi>a</mi></mrow>", smml("{ a }"))
423
- end
424
-
425
- def test_block
426
- assert_parse_error("Block not closed.", "test {test} ", "{test"){smml("test {test} {test")}
427
- end
428
-
429
- def test_parse_error
430
- src = 'a\hoge c'
431
- e = assert_raises(ParseError){smml(src)}
432
- assert_equal(["Undefined command.", "a", '\hoge c'], parse_error(e))
433
-
434
- src = '\sqrt\sqrt1'
435
- e = assert_raises(ParseError){smml(src)}
436
- assert_equal(["Syntax error.", '\sqrt\sqrt', "1"], parse_error(e))
437
-
438
- src = "a{b"
439
- e = assert_raises(ParseError){smml(src)}
440
- assert_equal(["Block not closed.", "a", "{b"], parse_error(e))
441
- end
442
-
443
- def test_numerics
444
- assert_equal("<mn>1234567890</mn>", smml('1234567890'))
445
- assert_equal("<mn>1.2</mn>", smml('1.2'))
446
- assert_equal("<mn>1</mn><mo>.</mo>", smml('1.'))
447
- assert_equal("<mn>.2</mn>", smml('.2'))
448
- assert_equal("<mn>1.2</mn><mn>.3</mn>", smml('1.2.3'))
449
- end
450
-
451
- def test_alphabets
452
- check_chr("<mi>", "</mi>", "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
453
- end
454
-
455
- def test_non_alphabet_command
456
- assert_equal("<mspace width='0.167em' />", smml('\,'))
457
- assert_equal("<mo>&DoubleVerticalBar;</mo>", smml('\|'))
458
- end
459
-
460
- def test_operators
461
- check_chr("<mo>", "</mo>", ",.+-*=/()[]|;:!")
462
- check_entity("<mo>", "</mo>", {"<"=>"lt", ">"=>"gt", '"'=>"quot"})
463
- check_hash("<mo>", "</mo>", {'\backslash'=>'\\', '\%'=>'%', '\{'=>'{', '\}'=>'}', '\$'=>'$', '\#'=>'#'})
464
- end
465
-
466
- def test_prime
467
- assert_equal("<msup><mi>a</mi><mo>&prime;</mo></msup>", smml("a'"))
468
- assert_equal("<msup><mi>a</mi><mo>&prime;&prime;</mo></msup>", smml("a''"))
469
- assert_equal("<msup><mi>a</mi><mo>&prime;&prime;&prime;</mo></msup>", smml("a'''"))
470
- assert_equal("<msup><none /><mo>&prime;</mo></msup>", smml("'"))
471
-
472
- e = assert_raises(ParseError){smml("a^b'")}
473
- assert_equal(["Double superscript.", "a^b", "'"], parse_error(e))
474
-
475
- assert_equal("<msup><mi>a</mi><mrow><mo>&prime;</mo><mi>b</mi></mrow></msup>", smml("a'^b"))
476
- assert_equal("<msup><mi>a</mi><mrow><mo>&prime;&prime;&prime;</mo><mi>b</mi></mrow></msup>", smml("a'''^b"))
477
- assert_equal("<msup><mi>a</mi><mo>&prime;</mo></msup><mi>b</mi>", smml("a'b"))
478
- end
479
-
480
- def test_sqrt
481
- assert_equal("<msqrt><mi>a</mi></msqrt>", smml('\sqrt a'))
482
- assert_equal("<mroot><mn>3</mn><mn>2</mn></mroot>", smml('\sqrt[2]3'))
483
- assert_equal("<mroot><mn>3</mn><mrow><mn>2</mn><mi>a</mi></mrow></mroot>", smml('\sqrt[2a]3'))
484
- e = assert_raises(ParseError){smml('\sqrt[12')}
485
- assert_equal(["Option not closed.", '\sqrt', "[12"], parse_error(e))
486
- end
487
-
488
- def test_subsup
489
- assert_equal("<msubsup><mi>a</mi><mi>b</mi><mi>c</mi></msubsup>", smml("a_b^c"))
490
- assert_equal("<msub><mi>a</mi><mi>b</mi></msub>", smml("a_b"))
491
- assert_equal("<msup><mi>a</mi><mi>b</mi></msup>", smml("a^b"))
492
- assert_equal("<msubsup><none /><mi>a</mi><mi>b</mi></msubsup>", smml("_a^b"))
493
-
494
- e = assert_raises(ParseError){smml("a_b_c")}
495
- assert_equal(["Double subscript.", "a_b", "_c"], parse_error(e))
496
- e = assert_raises(ParseError){smml("a^b^c")}
497
- assert_equal(["Double superscript.", "a^b", "^c"], parse_error(e))
498
- e = assert_raises(ParseError){smml("a_")}
499
- assert_equal(["Subscript not exist.", "a_", ""], parse_error(e))
500
- e = assert_raises(ParseError){smml("a^")}
501
- assert_equal(["Superscript not exist.", "a^", ""], parse_error(e))
502
- end
503
-
504
- def test_underover
505
- assert_equal("<munderover><mo>&sum;</mo><mi>a</mi><mi>b</mi></munderover>", smml('\sum_a^b', true))
506
- assert_equal("<msubsup><mo>&sum;</mo><mi>a</mi><mi>b</mi></msubsup>", smml('\sum_a^b'))
507
- assert_equal("<munder><mo>&sum;</mo><mi>a</mi></munder>", smml('\sum_a', true))
508
- assert_equal("<mover><mo>&sum;</mo><mi>a</mi></mover>", smml('\sum^a', true))
509
- assert_equal("<msub><mo>&sum;</mo><mi>a</mi></msub>", smml('\sum_a'))
510
- assert_equal("<msup><mo>&sum;</mo><mi>a</mi></msup>", smml('\sum^a'))
511
- e = assert_raises(ParseError){smml('\sum_b_c')}
512
- assert_equal(["Double subscript.", '\sum_b', "_c"], parse_error(e))
513
- e = assert_raises(ParseError){smml('\sum^b^c')}
514
- assert_equal(["Double superscript.", '\sum^b', "^c"], parse_error(e))
515
- e = assert_raises(ParseError){smml('\sum_')}
516
- assert_equal(["Subscript not exist.", '\sum_', ""], parse_error(e))
517
- e = assert_raises(ParseError){smml('\sum^')}
518
- assert_equal(["Superscript not exist.", '\sum^', ""], parse_error(e))
519
- end
520
-
521
- def test_fonts
522
- assert_equal("<mi>a</mi><mrow><mi mathvariant='bold'>b</mi><mi mathvariant='bold'>c</mi></mrow><mi>d</mi>", smml('a{\bf b c}d'))
523
- assert_equal("<mi mathvariant='bold'>a</mi><mrow><mi>b</mi><mi>c</mi></mrow><mi mathvariant='bold'>d</mi>", smml('\bf a{\it b c}d'))
524
- assert_equal("<mi>a</mi><mrow><mi mathvariant='normal'>b</mi><mi mathvariant='normal'>c</mi></mrow><mi>d</mi>", smml('a{\rm b c}d'))
525
-
526
- assert_equal("<mi>a</mi><mrow><mrow><mi mathvariant='bold'>b</mi><mi mathvariant='bold'>c</mi></mrow></mrow><mi>d</mi>", smml('a \mathbf{bc}d'))
527
- assert_equal("<mrow><mn mathvariant='bold'>1</mn></mrow><mn>2</mn>", smml('\mathbf12'))
528
- assert_equal("<mi mathvariant='bold'>a</mi><mrow><mrow><mi>b</mi><mi>c</mi></mrow></mrow><mi mathvariant='bold'>d</mi>", smml('\bf a \mathit{bc} d'))
529
- assert_equal("<mi>a</mi><mrow><mrow><mi mathvariant='normal'>b</mi><mi mathvariant='normal'>c</mi></mrow></mrow><mi>d</mi>", smml('a\mathrm{bc}d'))
530
-
531
- assert_equal("<mi>a</mi><mrow><mrow><mi>&bopf;</mi><mi>&copf;</mi></mrow></mrow><mi>d</mi>", smml('a \mathbb{b c} d'))
532
- assert_equal("<mi>a</mi><mrow><mrow><mi>&bscr;</mi><mi>&cscr;</mi></mrow></mrow><mi>d</mi>", smml('a \mathscr{b c} d'))
533
- assert_equal("<mi>a</mi><mrow><mrow><mi>&bfr;</mi><mi>&cfr;</mi></mrow></mrow><mi>d</mi>", smml('a \mathfrak{b c} d'))
534
- assert_equal("<mi>a</mi><mrow><mrow><mi mathvariant='bold-italic'>b</mi><mi mathvariant='bold-italic'>c</mi></mrow></mrow><mi>d</mi>", smml('a \bm{bc}d'))
535
- assert_equal("<mrow><mi mathvariant='bold-italic'>a</mi></mrow><mi>b</mi>", smml('\bm ab'))
536
- e = assert_raises(ParseError){smml('\mathit')}
537
- assert_equal(["Syntax error.", '\mathit', ""], parse_error(e))
538
- e = assert_raises(ParseError){smml('\mathrm')}
539
- assert_equal(["Syntax error.", '\mathrm', ""], parse_error(e))
540
- e = assert_raises(ParseError){smml('\mathbf')}
541
- assert_equal(["Syntax error.", '\mathbf', ""], parse_error(e))
542
- e = assert_raises(ParseError){smml('\mathbb')}
543
- assert_equal(["Syntax error.", '\mathbb', ""], parse_error(e))
544
- e = assert_raises(ParseError){smml('\mathscr')}
545
- assert_equal(["Syntax error.", '\mathscr', ""], parse_error(e))
546
- e = assert_raises(ParseError){smml('\mathfrak')}
547
- assert_equal(["Syntax error.", '\mathfrak', ""], parse_error(e))
548
- end
549
-
550
- def test_mbox
551
- assert_equal("<mi>a</mi><mtext>b c</mtext><mi>d</mi>", smml('a\mbox{b c}d'))
552
- assert_equal('<mtext>&lt;&gt;&apos;&quot;&amp;</mtext>', smml('\mbox{<>\'"&}'))
553
- end
554
-
555
- def test_frac
556
- assert_equal("<mfrac><mi>a</mi><mi>b</mi></mfrac>", smml('\frac ab'))
557
- assert_equal("<mfrac><mn>1</mn><mn>2</mn></mfrac>", smml('\frac12'))
558
-
559
- e = assert_raises(ParseError){smml('\frac a')}
560
- assert_equal(["Syntax error.", '\frac a', ""], parse_error(e))
561
- end
562
-
563
- def test_environment
564
- e = assert_raises(ParseError){smml('{\begin}rest')}
565
- assert_equal(["Environment name not exist.", '{\begin', '}rest'], parse_error(e))
566
-
567
- e = assert_raises(ParseError){smml('{\begin{array}{c}dummy}rest')}
568
- assert_equal(['Matching \end not exist.', '{\begin{array}{c}dummy', '}rest'], parse_error(e))
569
-
570
- e = assert_raises(ParseError){smml('\begin{array}c dummy\end{test}')}
571
- assert_equal(["Environment mismatched.", '\begin{array}c dummy\end', "{test}"], parse_error(e))
572
-
573
- e = assert_raises(ParseError){smml('\left(\begin{array}\right)')}
574
- assert_equal(["Syntax error.", '\left(\begin{array}', '\right)'], parse_error(e))
575
- end
576
-
577
- def test_array_env
578
- assert_equal("<mtable columnalign='left right center'><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd><mtd><mi>c</mi></mtd></mtr><mtr><mtd><mi>d</mi></mtd><mtd><mi>e</mi></mtd><mtd><mi>f</mi></mtd></mtr></mtable>", smml('\begin{array}{lrc} a & b & c \\\\ d & e & f \\\\ \end{array}'))
579
-
580
- assert_equal("<mtable columnalign='left right center'><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd><mtd><mi>c</mi></mtd></mtr><mtr><mtd><mi>d</mi></mtd><mtd><mi>e</mi></mtd><mtd><mi>f</mi></mtd></mtr></mtable>", smml('\begin{array}{lrc}a&b&c\\\\d&e&f \end{array}'))
581
-
582
- assert_equal("<mtable />", smml('\begin{array}{c}\end{array}'))
583
-
584
- e = assert_raises(ParseError){smml('\begin{array}\end{array}')}
585
- assert_equal(['Syntax error.', '\begin{array}', '\end{array}'], parse_error(e))
586
-
587
- e = assert_raises(ParseError){smml('\begin{array}{a}\end{array}')}
588
- assert_equal(["Syntax error.", '\begin{array}{', 'a}\end{array}'], parse_error(e))
589
-
590
- e = assert_raises(ParseError){smml('\begin{array}{cc}a\\\\b&c\end{array}')}
591
- assert_equal(["Need more column.", '\begin{array}{cc}a', '\\\\b&c\end{array}'], parse_error(e))
592
-
593
- e = assert_raises(ParseError){smml('\begin{array}{cc}a\end{array}')}
594
- assert_equal(["Need more column.", '\begin{array}{cc}a', '\end{array}'], parse_error(e))
595
-
596
- e = assert_raises(ParseError){smml('\begin{array}{c}a&\end{array}')}
597
- assert_equal(["Too many column.", '\begin{array}{c}a', '&\end{array}'], parse_error(e))
598
-
599
- assert_equal("<mtable><mtr><mtd /><mtd /></mtr></mtable>", smml('\begin{array}{cc}&\end{array}'))
600
-
601
- assert_equal("<mfenced close='}' open='{'><mrow><mtable><mtr><mtd><msub><mi>a</mi><mi>b</mi></msub></mtd></mtr></mtable></mrow></mfenced>", smml('\left\{\begin{array}ca_b\end{array}\right\}'))
602
-
603
- assert_equal("<mtable columnalign='center left center center center right center'><mtr><mtd><mrow><msub><mi>a</mi><mn>1</mn></msub></mrow></mtd><mtd><mi>A</mi></mtd><mtd><mi>b</mi></mtd><mtd><mi>B</mi></mtd><mtd><mi>c</mi></mtd><mtd><mi>C</mi></mtd><mtd><mi>d</mi></mtd></mtr></mtable>", smml('\begin{array}{@{a_1}l@bc@cr@d}A&B&C\end{array}'))
604
-
605
- assert_equal("<mfenced close='}' open='{'><mrow><mtable><mtr><mtd><msub><mi>a</mi><mi>b</mi></msub></mtd></mtr></mtable></mrow></mfenced>", smml('\left\{\begin{array}ca_b\end{array}\right\}'))
606
-
607
- assert_equal("<mtable columnlines='solid'><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd></mtr><mtr><mtd><mi>c</mi></mtd><mtd><mi>d</mi></mtd></mtr></mtable>", smml('\begin{array}{c|c}a&b\\\\c&d\end{array}'))
608
- assert_equal("<mtable columnlines='solid solid'><mtr><mtd /><mtd><mi>a</mi></mtd><mtd /></mtr><mtr><mtd /><mtd><mi>c</mi></mtd><mtd /></mtr></mtable>", smml('\begin{array}{|c|}a\\\\c\end{array}'))
609
- assert_equal("<mtable rowlines='solid'><mtr /><mtr><mtd><mi>c</mi></mtd></mtr></mtable>", smml('\begin{array}{c}\hline c\end{array}'))
610
- assert_equal("<mtable rowlines='solid'><mtr><mtd><mi>c</mi></mtd><mtd><mi>a</mi></mtd><mtd><mi>c</mi></mtd><mtd><mi>c</mi></mtd></mtr><mtr><mtd /><mtd /><mtd /><mtd /></mtr></mtable>", smml('\begin{array}{c@acc}c&c&c\\\\\hline\end{array}'))
611
- assert_equal("<mtable rowlines='solid none solid'><mtr /><mtr><mtd><mi>a</mi></mtd></mtr><mtr><mtd><mi>b</mi></mtd></mtr><mtr><mtd /></mtr></mtable>", smml('\begin{array}{c}\hline a\\\\b\\\\\hline\end{array}'))
612
- end
613
-
614
- def test_leftright
615
- assert_equal("<mfenced close=')' open='('><mrow><mfrac><mn>1</mn><mn>2</mn></mfrac></mrow></mfenced>", smml('\left(\frac12\right)'))
616
-
617
- assert_equal("<mfenced close='&rfloor;' open='&lfloor;'><mrow><mi>a</mi></mrow></mfenced>", smml('\left \lfloor a\right \rfloor'))
618
-
619
- assert_equal("<mfenced close='}' open='{'><mrow><mi>a</mi></mrow></mfenced>", smml('\left \{ a \right \}'))
620
-
621
- assert_equal("<mfenced close='}' open='{'><mrow><mtable><mtr><mtd><mtable><mtr><mtd><mi>a</mi></mtd></mtr></mtable></mtd></mtr></mtable></mrow></mfenced>", smml('\left\{\begin{array}c\begin{array}ca\end{array}\end{array}\right\}'))
622
-
623
- assert_equal("<mfenced close=')' open='('><mrow><msub><mo>&sum;</mo><mi>a</mi></msub></mrow></mfenced>", smml('\left(\sum_a\right)'))
624
- assert_equal("<mfenced close=')' open='('><mrow><munder><mo>&sum;</mo><mi>a</mi></munder></mrow></mfenced>", smml('\left(\sum_a\right)', true))
625
-
626
- e = assert_raises(ParseError){smml('\left(test')}
627
- assert_equal(["Brace not closed.", '\left', '(test'], parse_error(e))
628
-
629
- assert_equal("<mfenced close='&DoubleVerticalBar;' open='&DoubleVerticalBar;'><mrow><mi>a</mi></mrow></mfenced>", smml('\left\|a\right\|'))
630
-
631
- e = assert_raises(ParseError){smml('\left')}
632
- assert_equal(["Need brace here.", '\left', ""], parse_error(e))
633
- end
634
-
635
- def test_over
636
- assert_equal("<mover><mi>a</mi><mo>&circ;</mo></mover>", smml('\hat a'))
637
- assert_equal("<mover><mn>1</mn><mo>&circ;</mo></mover><mn>2</mn>", smml('\hat12'))
638
- e = assert_raises(ParseError){smml('{\hat}a')}
639
- assert_equal(["Syntax error.", '{\hat', '}a'], parse_error(e))
640
- end
641
-
642
- def test_under
643
- assert_equal("<munder><mi>a</mi><mo>&macr;</mo></munder>", smml('\underline a'))
644
- assert_equal("<munder><mn>1</mn><mo>&macr;</mo></munder><mn>2</mn>", smml('\underline12'))
645
- e = assert_raises(ParseError){smml('{\underline}a')}
646
- assert_equal(["Syntax error.", '{\underline', '}a'], parse_error(e))
647
- end
648
-
649
- def test_stackrel
650
- assert_equal("<mover><mo>=</mo><mo>&rightarrow;</mo></mover>", smml('\stackrel\to='))
651
- assert_equal("<mover><mn>2</mn><mn>1</mn></mover>", smml('\stackrel12'))
652
- end
653
-
654
- def test_comment
655
- assert_equal("<mi>a</mi>", smml('a%b'))
656
- end
657
-
658
- def test_entity
659
- p = Parser.new
660
- e = assert_raises(ParseError){smml('\entity{therefore}', false, p)}
661
- assert_equal(["Unregistered entity.", '\entity{', "therefore}"], parse_error(e))
662
-
663
- p.unsecure_entity = true
664
- assert_equal("<mo>&therefore;</mo>", smml('\entity{therefore}', false, p))
665
-
666
- p.unsecure_entity = false
667
- e = assert_raises(ParseError){smml('\entity{therefore}', false, p)}
668
- assert_equal(["Unregistered entity.", '\entity{', "therefore}"], parse_error(e))
669
-
670
- p.add_entity(['therefore'])
671
- assert_equal("<mo>&therefore;</mo>", smml('\entity{therefore}', false, p))
672
- end
673
-
674
- def test_backslash
675
- assert_equal("<br xmlns='http://www.w3.org/1999/xhtml' />", smml('\\\\'))
676
- end
677
-
678
- def test_macro
679
- macro = <<'EOS'
680
- \newcommand{\root}[2]{\sqrt[#1]{#2}}
681
- \newcommand{\ROOT}[2]{\sqrt[#1]#2}
682
- \newenvironment{braced}[2]{\left#1}{\right#2}
683
- \newenvironment{sq}[2]{\sqrt[#2]{#1}}{\sqrt#2}
684
- \newcommand{\R}{\mathbb R}
685
- \newenvironment{BB}{\mathbb A}{\mathbb B}
686
- EOS
687
- p = Parser.new
688
- p.macro.parse(macro)
689
-
690
- assert_equal("<mroot><mrow><mn>2</mn></mrow><mn>1</mn></mroot>", smml('\root12', false, p))
691
- assert_equal("<mroot><mrow><mn>34</mn></mrow><mn>12</mn></mroot>", smml('\root{12}{34}', false, p))
692
- assert_equal("<mroot><mn>3</mn><mn>12</mn></mroot><mn>4</mn>", smml('\ROOT{12}{34}', false, p))
693
- assert_parse_error('Error in macro(Need more parameter. "").', '', '\root'){smml('\root', false, p)}
694
-
695
- assert_equal("<mfenced close=')' open='|'><mrow><mfrac><mn>1</mn><mn>2</mn></mfrac></mrow></mfenced>", smml('\begin{braced}{|}{)}\frac12\end{braced}', false, p))
696
- assert_equal("<mroot><mrow><mn>12</mn></mrow><mn>34</mn></mroot><mi>a</mi><msqrt><mn>3</mn></msqrt><mn>4</mn>", smml('\begin{sq}{12}{34}a\end{sq}', false, p))
697
- assert_parse_error("Need more parameter.", '\begin{braced}', ""){smml('\begin{braced}', false, p)}
698
- assert_parse_error('Matching \end not exist.', '\begin{braced}', "123"){smml('\begin{braced}123', false, p)}
699
- assert_parse_error("Environment mismatched.", '\begin{braced}123\end', '{brace}'){smml('\begin{braced}123\end{brace}', false, p)}
700
- assert_equal("<mrow><mi>&Ropf;</mi></mrow>", smml('\R', false, p))
701
- assert_equal("<mrow><mi>&Aopf;</mi></mrow><mrow><mi>&Bopf;</mi></mrow>", smml('\begin{BB}\end{BB}', false, p))
702
- end
703
-
704
- def test_macro_circular_reference
705
- macro = <<'EOT'
706
- \newcommand{\C}{\C}
707
- \newenvironment{E}{\begin{E}}{\end{E}}
708
- \newcommand{\D}{\begin{F}\end{F}}
709
- \newenvironment{F}{\D}{}
710
- EOT
711
- ps = Parser.new
712
- ps.macro.parse(macro)
713
-
714
- e = assert_raises(ParseError){smml('\C', false, ps)}
715
- assert_equal(["Circular reference.", "", '\C'], parse_error(e))
716
-
717
- e = assert_raises(ParseError){smml('\begin{E}\end{E}', false, ps)}
718
- assert_equal(["Circular reference.", "", '\begin{E}\end{E}'], parse_error(e))
719
-
720
- e = assert_raises(ParseError){smml('\D', false, ps)}
721
- assert_equal(["Circular reference.", "", '\D'], parse_error(e))
722
-
723
- e = assert_raises(ParseError){smml('\begin{F}\end{F}', false, ps)}
724
- assert_equal(["Circular reference.", "", '\begin{F}\end{F}'], parse_error(e))
725
- end
726
-
727
- def test_macro_non_circular_reference
728
- macro = <<'EOT'
729
- \newcommand{\C}{\dummy}
730
- \newenvironment{E}{\dummy}{}
731
- EOT
732
- ps = Parser.new
733
- ps.macro.parse(macro)
734
-
735
- e = assert_raises(ParseError){smml('\C', false, ps)}
736
- assert_equal(['Error in macro(Undefined command. "\dummy").', "", '\C'], parse_error(e))
737
- e = assert_raises(ParseError){smml('\C', false, ps)}
738
- assert_equal(['Error in macro(Undefined command. "\dummy").', "", '\C'], parse_error(e))
739
-
740
- e = assert_raises(ParseError){smml('\begin{E}\end{E}', false, ps)}
741
- assert_equal(['Error in macro(Undefined command. "\dummy").', '', '\begin{E}\end{E}'], parse_error(e))
742
- e = assert_raises(ParseError){smml('\begin{E}\end{E}', false, ps)}
743
- assert_equal(['Error in macro(Undefined command. "\dummy").', "", '\begin{E}\end{E}'], parse_error(e))
744
- end
745
-
746
- def test_macro_with_option
747
- macro = <<'EOS'
748
- \newcommand{\opt}[1][x]{#1}
749
- \newcommand{\optparam}[2][]{#1#2}
750
- \newenvironment{newenv}[1][x]{#1}{#1}
751
- \newenvironment{optenv}[2][]{#1}{#2}
752
- EOS
753
-
754
- p = Parser.new
755
- p.macro.parse(macro)
756
-
757
- assert_equal("<mi>x</mi><mi>a</mi>", smml('\opt a', false, p))
758
- assert_equal("<mn>0</mn><mi>a</mi>", smml('\opt[0] a', false, p))
759
- assert_equal("<mi>a</mi>", smml('\optparam a', false, p))
760
- assert_equal("<mn>0</mn><mi>a</mi>", smml('\optparam[0] a', false, p))
761
-
762
- assert_equal("<mi>x</mi><mi>a</mi><mi>x</mi>", smml('\begin{newenv}a\end{newenv}', false, p))
763
- assert_equal("<mn>0</mn><mi>a</mi><mn>0</mn>", smml('\begin{newenv}[0]a\end{newenv}', false, p))
764
- assert_equal("<mi>a</mi><mn>0</mn>", smml('\begin{optenv}0a\end{optenv}', false, p))
765
- assert_equal("<mn>0</mn><mi>a</mi><mn>1</mn>", smml('\begin{optenv}[0]1a\end{optenv}', false, p))
766
- end
767
-
768
- def test_matrix_env
769
- assert_equal("<mtable><mtr><mtd /><mtd /><mtd /></mtr><mtr><mtd /><mtd /></mtr></mtable>", smml('\begin{matrix}&&\\\\&\end{matrix}'))
770
- assert_parse_error("Environment mismatched.", '\begin{matrix}&&\\\\&\end', "{mat}"){smml('\begin{matrix}&&\\\\&\end{mat}')}
771
- assert_parse_error("Matching \\end not exist.", '\begin{matrix}&&\\\\&', ''){smml('\begin{matrix}&&\\\\&')}
772
- assert_equal("<mtable><mtr><mtd><mtable><mtr><mtd><mi>a</mi></mtd><mtd><mi>b</mi></mtd></mtr><mtr><mtd><mi>c</mi></mtd><mtd><mi>d</mi></mtd></mtr></mtable></mtd><mtd><mn>1</mn></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mn>1</mn></mtd></mtr></mtable>", smml('\begin{matrix}\begin{matrix}a&b\\\\c&d\end{matrix}&1\\\\0&1\\\\\end{matrix}'))
773
- assert_equal("<mtable />", smml('\begin{matrix}\end{matrix}'))
774
- assert_equal("<mtable rowlines='solid none solid'><mtr /><mtr><mtd><mi>a</mi></mtd></mtr><mtr><mtd><mi>b</mi></mtd></mtr><mtr /></mtable>", smml('\begin{matrix}\hline a\\\\b\\\\\hline\end{matrix}'))
775
-
776
- assert_equal("<mtable />", smml('\begin{smallmatrix}\end{smallmatrix}'))
777
- assert_equal("<mfenced close=')' open='('><mrow><mtable /></mrow></mfenced>", smml('\begin{pmatrix}\end{pmatrix}'))
778
- assert_equal("<mfenced close=']' open='['><mrow><mtable /></mrow></mfenced>", smml('\begin{bmatrix}\end{bmatrix}'))
779
- assert_equal("<mfenced close='}' open='{'><mrow><mtable /></mrow></mfenced>", smml('\begin{Bmatrix}\end{Bmatrix}'))
780
- assert_equal("<mfenced close='|' open='|'><mrow><mtable /></mrow></mfenced>", smml('\begin{vmatrix}\end{vmatrix}'))
781
- assert_equal("<mfenced close='&DoubleVerticalBar;' open='&DoubleVerticalBar;'><mrow><mtable /></mrow></mfenced>", smml('\begin{Vmatrix}\end{Vmatrix}'))
782
- end
783
-
784
- def test_safe_mode
785
- Thread.start do
786
- $SAFE=1
787
- assert_nothing_raised{smml('\alpha'.taint)}
788
- end.join
789
- end
790
-
791
- def test_symbol
792
- assert_equal("<mo><mfrac linethickness='0' mathsize='1%'><mo>&prec;</mo><mo>&ne;</mo></mfrac></mo>", smml('\precneqq'))
793
- end
794
- end