# -*- coding: utf-8 -*- require 'test_helper' require 'review/compiler' require 'review/book' require 'review/latexbuilder' require 'review/i18n' class LATEXBuidlerTest < Test::Unit::TestCase include ReVIEW def setup @builder = LATEXBuilder.new() @config = { "secnolevel" => 2, # for IDGXMLBuilder, EPUBBuilder "toclevel" => 2, "inencoding" => "UTF-8", "outencoding" => "UTF-8", "stylesheet" => nil, # for EPUBBuilder } ReVIEW.book.config = @config @compiler = ReVIEW::Compiler.new(@builder) @chapter = Book::Chapter.new(Book::Base.new(nil), 1, 'chap1', nil, StringIO.new) location = Location.new(nil, nil) @builder.bind(@compiler, @chapter, location) end def test_headline_level1 @builder.headline(1,"test","this is test.") assert_equal %Q|\\chapter{this is test.}\n\\label{chap:chap1}\n|, @builder.result end def test_headline_level1_without_secno @config["secnolevel"] = 0 @builder.headline(1,"test","this is test.") assert_equal %Q|\\chapter*{this is test.}\n\\addcontentsline{toc}{chapter}{this is test.}\n\\label{chap:chap1}\n|, @builder.result end def test_headline_level1_with_inlinetag @builder.headline(1,"test","this @{is} test.<&\"_>") assert_equal %Q|\\chapter{this \\textbf{is} test.\\textless{}\\&\"\\textunderscore{}\\textgreater{}}\n\\label{chap:chap1}\n|, @builder.result end def test_headline_level2 @builder.headline(2,"test","this is test.") assert_equal %Q|\\section{this is test.}\n\\label{sec:1-1}\n|, @builder.result end def test_headline_level3 @builder.headline(3,"test","this is test.") assert_equal %Q|\\subsection*{this is test.}\n\\label{sec:1-0-1}\n|, @builder.result end def test_headline_level3_with_secno @config["secnolevel"] = 3 @builder.headline(3,"test","this is test.") assert_equal %Q|\\subsection{this is test.}\n\\label{sec:1-0-1}\n|, @builder.result end def test_label @builder.label("label_test") assert_equal %Q|\\label{label_test}\n|, @builder.result end def test_href ret = @builder.compile_inline('@{http://github.com,GitHub}') assert_equal %Q|\\href{http://github.com}{GitHub}|, ret end def test_inline_href ret = @builder.compile_inline('@{http://github.com,Git\\,Hub}') assert_equal %Q|\\href{http://github.com}{Git,Hub}|, ret end def test_href_without_label ret = @builder.compile_inline('@{http://github.com}') assert_equal %Q|\\url{http://github.com}|, ret end def test_href_with_underscore ret = @builder.compile_inline('@{http://example.com/aaa/bbb, AAA_BBB}') assert_equal %Q|\\href{http://example.com/aaa/bbb}{AAA\\textunderscore{}BBB}|, ret end def test_href_mailto ret = @builder.compile_inline('@{mailto:takahashim@example.com, takahashim@example.com}') assert_equal %Q|\\href{mailto:takahashim@example.com}{takahashim@example.com}|, ret end def test_inline_br ret = @builder.inline_br("") assert_equal %Q|\\\\\n|, ret end def test_inline_br_with_other_strings ret = @builder.compile_inline("abc@
{}def") assert_equal %Q|abc\\\\\ndef|, ret end def test_inline_i ret = @builder.compile_inline("abc@{def}ghi") assert_equal %Q|abc\\textit{def}ghi|, ret end def test_inline_i_and_escape ret = @builder.compile_inline("test @{inline<&;\\ test} test2") assert_equal %Q|test \\textit{inline\\textless{}\\&;\\reviewbackslash{} test} test2|, ret end def test_inline_dtp ret = @builder.compile_inline("abc@{def}ghi") assert_equal %Q|abcghi|, ret end def test_inline_code ret = @builder.compile_inline("abc@{def}ghi") assert_equal %Q|abc\\texttt{def}ghi|, ret end def test_inline_raw ret = @builder.compile_inline("@{@{inline!$%\\}}") assert_equal "@{inline!$%}", ret end def test_inline_sup ret = @builder.compile_inline("abc@{def}") assert_equal %Q|abc\\textsuperscript{def}|, ret end def test_inline_sub ret = @builder.compile_inline("abc@{def}") assert_equal %Q|abc\\textsubscript{def}|, ret end def test_inline_b ret = @builder.compile_inline("abc@{def}") assert_equal %Q|abc\\textbf{def}|, ret end def test_inline_b_and_escape ret = @builder.compile_inline("test @{inline<&;\\ test} test2") assert_equal %Q|test \\textbf{inline\\textless{}\\&;\\reviewbackslash{} test} test2|, ret end def test_inline_em ret = @builder.compile_inline("abc@{def}") assert_equal %Q|abc\\reviewem{def}|, ret end def test_inline_strong ret = @builder.compile_inline("abc@{def}") assert_equal %Q|abc\\reviewstrong{def}|, ret end def test_inline_u ret = @builder.compile_inline("abc@{def}ghi") assert_equal %Q|abc\\Underline{def}ghi|, ret end def test_inline_m ret = @builder.compile_inline("abc@{\\alpha^n = \inf < 2}ghi") assert_equal "abc $\\alpha^n = inf < 2$ ghi", ret end def test_inline_tt ret = @builder.compile_inline("test @{inline test} test2") assert_equal %Q|test \\texttt{inline test} test2|, ret end def test_inline_tt_endash ret = @builder.compile_inline("test @{in-line --test ---foo ----bar -----buz} --test2") assert_equal %Q|test \\texttt{in{-}line {-}{-}test {-}{-}{-}foo {-}{-}{-}{-}bar {-}{-}{-}{-}{-}buz} {-}{-}test2|, ret end def test_inline_tti ret = @builder.compile_inline("test @{inline test} test2") assert_equal %Q|test \\texttt{\\textit{inline test}} test2|, ret end def test_inline_ttb ret = @builder.compile_inline("test @{inline test} test2") assert_equal %Q|test \\texttt{\\textbf{inline test}} test2|, ret end def test_inline_hd_chap def @chapter.headline_index items = [Book::HeadlineIndex::Item.new("chap1|test", [1, 1], "te_st")] Book::HeadlineIndex.new(items, self) end @config["secnolevel"] = 3 ret = @builder.compile_inline("test @{chap1|test} test2") assert_equal %Q|test 「1.1.1 te\\textunderscore{}st」 test2|, ret end def test_inline_ruby_comma ret = @builder.compile_inline("@{foo\\, bar\\, buz,フー・バー・バズ}") assert_equal "\\ruby{foo, bar, buz}{フー・バー・バズ}", ret end def test_inline_uchar ret = @builder.compile_inline("test @{2460} test2") assert_equal %Q|test \\UTF{2460} test2|, ret end def test_inline_idx ret = @builder.compile_inline("@{__TEST%$}, @{__TEST%$}") assert_equal %Q|\\textunderscore{}\\textunderscore{}TEST\\%\\textdollar{}\\index{__TEST%$}, \\index{__TEST%$}|, ret end def test_jis_x_0201_kana ret = @builder.compile_inline("foo・カンジ、テスト") assert_equal %Q|foo\\aj半角{・}\\aj半角{カ}\\aj半角{ン}\\aj半角{シ}\\aj半角{゛}\\aj半角{、}テスト|, ret end def test_dlist @builder.dl_begin @builder.dt "foo" @builder.dd ["foo.\n", "bar.\n"] @builder.dl_end assert_equal %Q|\n\\begin{description}\n\\item[foo] \\mbox{} \\\\\nfoo.\nbar.\n\\end{description}\n|, @builder.result end def test_dlist_with_bracket @builder.dl_begin @builder.dt "foo[bar]" @builder.dd ["foo.\n", "bar.\n"] @builder.dl_end assert_equal %Q|\n\\begin{description}\n\\item[foo\\lbrack{}bar\\rbrack{}] \\mbox{} \\\\\nfoo.\nbar.\n\\end{description}\n|, @builder.result end def test_cmd lines = ["foo", "bar", "","buz"] @builder.cmd(lines) assert_equal %Q|\n\\begin{reviewcmd}\nfoo\nbar\n\nbuz\n\\end{reviewcmd}\n|, @builder.result end def test_cmd_caption lines = ["foo", "bar", "","buz"] @builder.cmd(lines, "cap1") assert_equal %Q|\n\\reviewcmdcaption{cap1}\n\\begin{reviewcmd}\nfoo\nbar\n\nbuz\n\\end{reviewcmd}\n|, @builder.result end def test_emlist lines = ["foo", "bar", "","buz"] @builder.emlist(lines) assert_equal %Q|\n\\begin{reviewemlist}\nfoo\nbar\n\nbuz\n\\end{reviewemlist}\n|, @builder.result end def test_emlist_caption lines = ["foo", "bar", "","buz"] @builder.emlist(lines, "cap1") assert_equal %Q|\n\\reviewemlistcaption{cap1}\n\\begin{reviewemlist}\nfoo\nbar\n\nbuz\n\\end{reviewemlist}\n|, @builder.result end def test_emlist_with_tab lines = ["\tfoo", "\t\tbar", "","\tbuz"] @builder.emlist(lines) assert_equal %Q|\n\\begin{reviewemlist}\n foo\n bar\n\n buz\n\\end{reviewemlist}\n|, @builder.result end def test_emlist_with_tab4 lines = ["\tfoo", "\t\tbar", "","\tbuz"] @builder.instance_eval{@tabwidth=4} @builder.emlist(lines) assert_equal %Q|\n\\begin{reviewemlist}\n foo\n bar\n\n buz\n\\end{reviewemlist}\n|, @builder.result end def test_quote lines = ["foo", "bar", "","buz"] @builder.quote(lines) assert_equal %Q|\n\\begin{quote}\nfoobar\n\nbuz\n\\end{quote}\n|, @builder.result end def test_memo @builder.memo(["test1", "", "test2"], "this is @{test}<&>_") assert_equal %Q|\\begin{reviewminicolumn}\n\\reviewminicolumntitle{this is \\textbf{test}\\textless{}\\&\\textgreater{}\\textunderscore{}}\ntest1\n\ntest2\n\\end{reviewminicolumn}\n|, @builder.result end def test_flushright @builder.flushright(["foo", "bar", "","buz"]) assert_equal %Q|\n\\begin{flushright}\nfoobar\n\nbuz\n\\end{flushright}\n|, @builder.raw_result end def test_centering @builder.centering(["foo", "bar", "","buz"]) assert_equal %Q|\n\\begin{center}\nfoobar\n\nbuz\n\\end{center}\n|, @builder.raw_result end def test_noindent @builder.noindent @builder.paragraph(["foo", "bar"]) @builder.paragraph(["foo2", "bar2"]) assert_equal %Q|\\noindent\nfoo\nbar\n\nfoo2\nbar2\n|, @builder.raw_result end def test_image def @chapter.image(id) item = Book::ImageIndex::Item.new("sampleimg",1) item.instance_eval{@path="./images/chap1-sampleimg.png"} item end @builder.image_image("sampleimg","sample photo",nil) assert_equal %Q|\\begin{reviewimage}\n\\includegraphics[width=\\maxwidth]{./images/chap1-sampleimg.png}\n\\caption{sample photo}\n\\label{image:chap1:sampleimg}\n\\end{reviewimage}\n|, @builder.raw_result end def test_image_with_metric def @chapter.image(id) item = Book::ImageIndex::Item.new("sampleimg",1) item.instance_eval{@path="./images/chap1-sampleimg.png"} item end @builder.image_image("sampleimg","sample photo","scale=1.2") assert_equal %Q|\\begin{reviewimage}\n\\includegraphics[scale=1.2]{./images/chap1-sampleimg.png}\n\\caption{sample photo}\n\\label{image:chap1:sampleimg}\n\\end{reviewimage}\n|, @builder.raw_result end def test_image_with_metric2 def @chapter.image(id) item = Book::ImageIndex::Item.new("sampleimg",1) item.instance_eval{@path="./images/chap1-sampleimg.png"} item end @builder.image_image("sampleimg","sample photo","scale=1.2, html::class=\"sample\", latex::height=3cm") assert_equal %Q|\\begin{reviewimage}\n\\includegraphics[scale=1.2,height=3cm]{./images/chap1-sampleimg.png}\n\\caption{sample photo}\n\\label{image:chap1:sampleimg}\n\\end{reviewimage}\n|, @builder.raw_result end def test_indepimage def @chapter.image(id) item = Book::ImageIndex::Item.new("sampleimg",1) item.instance_eval{@path="./images/chap1-sampleimg.png"} item end @builder.indepimage("sampleimg","sample photo",nil) assert_equal %Q|\\begin{reviewimage}\n\\includegraphics[width=\\maxwidth]{./images/chap1-sampleimg.png}\n\\reviewindepimagecaption{図: sample photo}\n\\end{reviewimage}\n|, @builder.raw_result end def test_indepimage_without_caption def @chapter.image(id) item = Book::ImageIndex::Item.new("sampleimg",1) item.instance_eval{@path="./images/chap1-sampleimg.png"} item end # FIXME: indepimage's caption should not be with a counter. @builder.indepimage("sampleimg",nil,nil) assert_equal %Q|\\begin{reviewimage}\n\\includegraphics[width=\\maxwidth]{./images/chap1-sampleimg.png}\n\\end{reviewimage}\n|, @builder.raw_result end def test_indepimage_with_metric def @chapter.image(id) item = Book::ImageIndex::Item.new("sampleimg",1) item.instance_eval{@path="./images/chap1-sampleimg.png"} item end @builder.indepimage("sampleimg","sample photo","scale=1.2") assert_equal %Q|\\begin{reviewimage}\n\\includegraphics[scale=1.2]{./images/chap1-sampleimg.png}\n\\reviewindepimagecaption{図: sample photo}\n\\end{reviewimage}\n|, @builder.raw_result end def test_indepimage_with_metric2 def @chapter.image(id) item = Book::ImageIndex::Item.new("sampleimg",1) item.instance_eval{@path="./images/chap1-sampleimg.png"} item end @builder.indepimage("sampleimg","sample photo","scale=1.2, latex::height=3cm, html::class=\"sample\"") assert_equal %Q|\\begin{reviewimage}\n\\includegraphics[scale=1.2,height=3cm]{./images/chap1-sampleimg.png}\n\\reviewindepimagecaption{図: sample photo}\n\\end{reviewimage}\n|, @builder.raw_result end def test_indepimage_without_caption_but_with_metric def @chapter.image(id) item = Book::ImageIndex::Item.new("sampleimg",1) item.instance_eval{@path="./images/chap1-sampleimg.png"} item end # FIXME: indepimage's caption should not be with a counter. @builder.indepimage("sampleimg",nil,"scale=1.2") assert_equal %Q|\\begin{reviewimage}\n\\includegraphics[scale=1.2]{./images/chap1-sampleimg.png}\n\\end{reviewimage}\n|, @builder.raw_result end def test_bib def @chapter.bibpaper(id) Book::BibpaperIndex::Item.new("samplebib",1,"sample bib") end assert_equal "\\reviewbibref{[1]}{bib:samplebib}", @builder.inline_bib("samplebib") end def test_bibpaper def @chapter.bibpaper(id) Book::BibpaperIndex::Item.new("samplebib",1,"sample bib") end @builder.bibpaper(["a", "b"], "samplebib", "sample bib @{bold}") assert_equal %Q|[1] sample bib \\textbf{bold}\n\\label{bib:samplebib}\n\nab\n\n|, @builder.raw_result end def test_bibpaper_without_body def @chapter.bibpaper(id) Book::BibpaperIndex::Item.new("samplebib",1,"sample bib") end @builder.bibpaper([], "samplebib", "sample bib") assert_equal %Q|[1] sample bib\n\\label{bib:samplebib}\n\n|, @builder.raw_result end def column_helper(review) chap_singleton = class << @chapter; self; end chap_singleton.send(:define_method, :content) { review } @compiler.compile(@chapter) end def test_column_1 review =<<-EOS ===[column] prev column inside prev column ===[column] test inside column ===[/column] EOS expect =<<-EOS \\begin{reviewcolumn} \\hypertarget{column:chap1:1}{} \\reviewcolumnhead{}{prev column} \\addcontentsline{toc}{subsection}{prev column} inside prev column \\end{reviewcolumn} \\begin{reviewcolumn} \\hypertarget{column:chap1:2}{} \\reviewcolumnhead{}{test} \\addcontentsline{toc}{subsection}{test} inside column \\end{reviewcolumn} EOS @config["toclevel"] = 3 assert_equal expect, column_helper(review) end def test_column_2 review =<<-EOS ===[column] test inside column === next level EOS expect =<<-EOS \\begin{reviewcolumn} \\hypertarget{column:chap1:1}{} \\reviewcolumnhead{}{test} inside column \\end{reviewcolumn} \\subsection*{next level} \\label{sec:1-0-1} EOS @config["toclevel"] = 1 assert_equal expect, column_helper(review) end def test_column_3 review =<<-EOS ===[column] test inside column ===[/column_dummy] EOS assert_raise(ReVIEW::CompileError) do column_helper(review) end end def test_ul src =<<-EOS * AAA * BBB EOS expect =<<-EOS \\begin{itemize} \\item AAA \\item BBB \\end{itemize} EOS ul_helper(src, expect) end def test_ul_with_bracket src =<<-EOS * AAA * []BBB EOS expect =<<-EOS \\begin{itemize} \\item AAA \\item \\lbrack{}]BBB \\end{itemize} EOS ul_helper(src, expect) end def test_cont src =<<-EOS * AAA -AA * BBB -BB EOS expect =<<-EOS \\begin{itemize} \\item AAA{-}AA \\item BBB{-}BB \\end{itemize} EOS ul_helper(src, expect) end def test_ul_nest1 src =<<-EOS * AAA ** AA EOS expect =<<-EOS \\begin{itemize} \\item AAA \\begin{itemize} \\item AA \\end{itemize} \\end{itemize} EOS ul_helper(src, expect) end def test_ul_nest3 src =<<-EOS * AAA ** AA * BBB ** BB EOS expect =<<-EOS \\begin{itemize} \\item AAA \\begin{itemize} \\item AA \\end{itemize} \\item BBB \\begin{itemize} \\item BB \\end{itemize} \\end{itemize} EOS ul_helper(src, expect) end def test_ol src =<<-EOS 3. AAA 3. BBB EOS expect =<<-EOS \\begin{enumerate} \\item AAA \\item BBB \\end{enumerate} EOS ol_helper(src, expect) end def test_ol_with_bracket src =<<-EOS 1. AAA 2. []BBB EOS expect =<<-EOS \\begin{enumerate} \\item AAA \\item \\lbrack{}]BBB \\end{enumerate} EOS builder_helper(src, expect, :compile_olist) end def test_inline_raw0 assert_equal "normal", @builder.inline_raw("normal") end def test_inline_raw1 assert_equal "body", @builder.inline_raw("|latex|body") end def test_inline_raw2 assert_equal "body", @builder.inline_raw("|html, latex|body") end def test_inline_raw3 assert_equal "", @builder.inline_raw("|idgxml, html|body") end def test_inline_raw4 assert_equal "|latex body", @builder.inline_raw("|latex body") end def test_inline_raw5 assert_equal "nor\nmal", @builder.inline_raw("|latex|nor\\nmal") end def test_inline_endash ret = @builder.compile_inline("- -- --- ----") assert_equal "{-} {-}{-} {-}{-}{-} {-}{-}{-}{-}", ret end def test_block_raw0 @builder.raw("<>!\"\\n& ") expect = %Q(<>!\"\n& ) assert_equal expect.chomp, @builder.raw_result end def test_block_raw1 @builder.raw("|latex|<>!\"\\n& ") expect = %Q(<>!\"\n& ) assert_equal expect.chomp, @builder.raw_result end def test_block_raw2 @builder.raw("|html, latex|<>!\"\\n& ") expect = %Q(<>!\"\n& ) assert_equal expect.chomp, @builder.raw_result end def test_block_raw3 @builder.raw("|html, idgxml|<>!\"\\n& ") expect = '' assert_equal expect.chomp, @builder.raw_result end def test_block_raw4 @builder.raw("|latex <>!\"\\n& ") expect = %Q(|latex <>!\"\n& ) assert_equal expect.chomp, @builder.raw_result end end