1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
|
require 'spec_util'
require 'math_ml'
describe MathML::LaTeX::Macro do
include MathML::Spec::Util
before(:all) do
@src = <<~'EOT'
\newcommand{\newcom}{test}
\newcommand{\paramcom}[2]{param2 #2, param1 #1.}
\newcommand\ALPHA\alpha
\newcommand\BETA[1]\beta
\newcommand{\nothing}{}
\newenvironment{newenv}{begin_newenv}{end_newenv}
\newenvironment{paramenv}[2]{begin 1:#1, 2:#2}{end 2:#2 1:#1}
\newenvironment{nothing}{}{}
\newenvironment{separated environment}{sep}{env}
\newenvironment ENV
EOT
end
before do
@m = MathML::LaTeX::Macro.new
@m.parse(@src)
end
it '#parse' do
@m = MathML::LaTeX::Macro.new
expect { @m.parse(@src) }.not_to raise_error
@m = MathML::LaTeX::Macro.new
expect do
@m.parse('\newcommand{notcommand}{}')
end.to raise_parse_error('Need newcommand.', '\\newcommand{', 'notcommand}{}')
expect do
@m.parse('\newcommand{\separated command}{}')
end.to raise_parse_error('Syntax error.', '\newcommand{\separated',
' command}{}')
expect { @m.parse('\newcommand{\nobody}') }.to raise_parse_error('Need parameter.', '\newcommand{\nobody}', '')
expect do
@m.parse('\newcommand{\noparam}{#1}')
end.to raise_parse_error("Parameter \# too large.", '\newcommand{\noparam}{#',
'1}')
expect do
@m.parse('\newcommand{\overopt}[1]{#1#2}')
end.to raise_parse_error("Parameter \# too large.",
'\newcommand{\overopt}[1]{#1#', '2}')
expect do
@m.parse('\newcommand{\strangeopt}[-1]')
end.to raise_parse_error('Need positive number.', '\newcommand{\strangeopt}[',
'-1]')
expect do
@m.parse('\newcommand{\strangeopt}[a]')
end.to raise_parse_error('Need positive number.', '\newcommand{\strangeopt}[',
'a]')
expect do
@m.parse('\newenvironment{\command}{}{}')
end.to raise_parse_error('Syntax error.', '\newenvironment{', '\command}{}{}')
expect do
@m.parse('\newenvironment{nobegin}')
end.to raise_parse_error('Need begin block.', '\newenvironment{nobegin}', '')
expect do
@m.parse('\newenvironment{noend}{}')
end.to raise_parse_error('Need end block.', '\newenvironment{noend}{}', '')
expect do
@m.parse('\newenvironment{noparam}{#1}{}')
end.to raise_parse_error("Parameter \# too large.",
'\newenvironment{noparam}{#', '1}{}')
expect do
@m.parse('\newenvironment{overparam}[1]{#1#2}{}')
end.to raise_parse_error("Parameter \# too large.",
'\newenvironment{overparam}[1]{#1#', '2}{}')
expect do
@m.parse('\newenvironment{strangeparam}[-1]{}{}')
end.to raise_parse_error('Need positive number.',
'\newenvironment{strangeparam}[', '-1]{}{}')
expect do
@m.parse('\newenvironment{strangeparam}[a]{}{}')
end.to raise_parse_error('Need positive number.',
'\newenvironment{strangeparam}[', 'a]{}{}')
expect do
@m.parse('\newcommand{\valid}{OK} \invalid{\test}{NG}')
end.to raise_parse_error('Syntax error.',
'\newcommand{\valid}{OK} ', '\invalid{\test}{NG}')
expect do
@m.parse('\newcommand{\valid}{OK} invalid{\test}{NG}')
end.to raise_parse_error('Syntax error.',
'\newcommand{\valid}{OK} ', 'invalid{\test}{NG}')
expect do
@m.parse('\newcommand{\newcom}[test')
end.to raise_parse_error('Option not closed.', '\newcommand{\newcom}', '[test')
expect do
@m.parse('\newcommand{\newcom}[1][test')
end.to raise_parse_error('Option not closed.', '\newcommand{\newcom}[1]',
'[test')
expect do
@m.parse('\newcommand{\newcom}[1][]{#1#2}')
end.to raise_parse_error("Parameter \# too large.",
'\newcommand{\newcom}[1][]{#1#', '2}')
expect do
@m.parse('\newenvironment{newenv}[1][test')
end.to raise_parse_error('Option not closed.', '\newenvironment{newenv}[1]',
'[test')
expect do
@m.parse('\newenvironment{newenv}[1][test')
end.to raise_parse_error('Option not closed.', '\newenvironment{newenv}[1]',
'[test')
expect { @m.parse('\newcommand{\newcom') }.to raise_parse_error('Block not closed.', '\newcommand', '{\newcom')
expect do
@m.parse('\newcommand{\newcom}{test1{test2}{test3')
end.to raise_parse_error('Block not closed.',
'\newcommand{\newcom}', '{test1{test2}{test3')
expect do
@m.parse('\newenvironment{newenv}[1][]{#1 #2}')
end.to raise_parse_error("Parameter \# too large.",
'\newenvironment{newenv}[1][]{#1 #', '2}')
end
it '#commands' do
expect(@m.commands('newcom').num).to eq(0)
expect(@m.commands('paramcom').num).to eq(2)
expect(@m.commands('no')).to be_nil
end
it '#expand_command' do
expect(@m.expand_command('not coommand', [])).to be_nil
expect(@m.expand_command('newcom', [])).to eq('test')
expect(@m.expand_command('newcom', ['dummy_param'])).to eq('test')
expect(@m.expand_command('paramcom', %w[1 2])).to eq('param2 2, param1 1.')
expect(@m.expand_command('paramcom', %w[12 34])).to eq('param2 34, param1 12.')
expect { @m.expand_command('paramcom', ['12']) }.to raise_parse_error('Need more parameter.', '', '')
expect { @m.expand_command('paramcom', []) }.to raise_parse_error('Need more parameter.', '', '')
end
it '#environments' do
expect(@m.environments('newenv').num).to eq(0)
expect(@m.environments('paramenv').num).to eq(2)
expect(@m.environments('not_env')).to be_nil
expect(@m.environments('separated environment').num).to eq(0)
end
it '#expand_environment' do
expect(@m.expand_environment('notregistered', 'dummy', [])).to be_nil
expect(@m.expand_environment('newenv', 'body', [])).to eq(' begin_newenv body end_newenv ')
expect(@m.expand_environment('paramenv', 'body', %w[1 2])).to eq(' begin 1:1, 2:2 body end 2:2 1:1 ')
expect(@m.expand_environment('paramenv', 'body', %w[12 34])).to eq(' begin 1:12, 2:34 body end 2:34 1:12 ')
expect { @m.expand_environment('paramenv', 'body', ['1']) }.to raise_parse_error('Need more parameter.', '', '')
expect { @m.expand_environment('paramenv', 'body', []) }.to raise_parse_error('Need more parameter.', '', '')
expect(@m.expand_environment('nothing', 'body', [])).to eq(' body ')
expect(@m.expand_environment('separated environment', 'body', [])).to eq(' sep body env ')
expect(@m.expand_environment('E', 'body', [])).to eq(' N body V ')
end
it '#expand_with_options' do
src = <<~'EOT'
\newcommand{\opt}[1][x]{#1}
\newcommand{\optparam}[2][]{#1#2}
\newenvironment{newenv}[1][x]{s:#1}{e:#1}
\newenvironment{optenv}[2][]{s:#1}{e:#2}
EOT
m = MathML::LaTeX::Macro.new
m.parse(src)
expect(m.expand_command('opt', [])).to eq('x')
expect(m.expand_command('opt', [], '1')).to eq('1')
expect(m.expand_command('optparam', ['1'])).to eq('1')
expect(m.expand_command('optparam', ['1'], '2')).to eq('21')
expect(m.expand_environment('newenv', 'test', [])).to eq(' s:x test e:x ')
expect(m.expand_environment('newenv', 'test', [], '1')).to eq(' s:1 test e:1 ')
expect(m.expand_environment('optenv', 'test', ['1'])).to eq(' s: test e:1 ')
expect(m.expand_environment('optenv', 'test', ['1'], '2')).to eq(' s:2 test e:1 ')
end
end
|