require 'test_helper' require 'review/compiler' require 'review/book' require 'review/topbuilder' require 'review/i18n' class TOPBuidlerTest < Test::Unit::TestCase include ReVIEW def setup @builder = TOPBuilder.new @config = ReVIEW::Configure.values @config['secnolevel'] = 2 @config['language'] = 'ja' @book = Book::Base.new @book.config = @config @compiler = ReVIEW::Compiler.new(@builder) @chapter = Book::Chapter.new(@book, 1, '-', nil, StringIO.new) location = Location.new(nil, nil) @builder.bind(@compiler, @chapter, location) I18n.setup(@config['language']) end def test_headline_level1 actual = compile_block("={test} this is test.\n") assert_equal %Q(■H1■第1章 this is test.\n), actual end def test_headline_level1_without_secno @config['secnolevel'] = 0 actual = compile_block("={test} this is test.\n") assert_equal %Q(■H1■this is test.\n), actual end def test_headline_level2 actual = compile_block("=={test} this is test.\n") assert_equal %Q(■H2■1.1 this is test.\n), actual end def test_headline_level3 actual = compile_block("==={test} this is test.\n") assert_equal %Q(■H3■this is test.\n), actual end def test_headline_level3_with_secno @config['secnolevel'] = 3 actual = compile_block("==={test} this is test.\n") assert_equal %Q(■H3■1.0.1 this is test.\n), actual end def test_href actual = compile_inline('@{http://github.com, GitHub}') assert_equal 'GitHub(△http://github.com☆)', actual end def test_href_without_label actual = compile_inline('@{http://github.com}') assert_equal '△http://github.com☆', actual end def test_inline_raw actual = compile_inline('@{@{inline\}}') assert_equal '@{inline}', actual end def test_inline_ruby actual = compile_inline('@{coffin,bed}') assert_equal 'coffin◆→DTP連絡:「coffin」に「bed」とルビ←◆', actual end def test_inline_kw actual = compile_inline('@{ISO, International Organization for Standardization } @{Ruby<>}') assert_equal '★ISO☆(International Organization for Standardization) ★Ruby<>☆', actual end def test_inline_maru actual = compile_inline('@{1}@{20}@{A}@{z}') assert_equal '1◆→丸数字1←◆20◆→丸数字20←◆A◆→丸数字A←◆z◆→丸数字z←◆', actual end def test_inline_br actual = compile_inline('@
{}') assert_equal "\n", actual end def test_inline_i actual = compile_inline('test @{inline test} test2') assert_equal 'test ▲inline test☆ test2', actual end def test_inline_i_and_escape actual = compile_inline('test @{inline<&;\\ test} test2') assert_equal 'test ▲inline<&;\\ test☆ test2', actual end def test_inline_b actual = compile_inline('test @{inline test} test2') assert_equal 'test ★inline test☆ test2', actual end def test_inline_b_and_escape actual = compile_inline('test @{inline<&;\\ test} test2') assert_equal 'test ★inline<&;\\ test☆ test2', actual end def test_inline_tt actual = compile_inline('test @{inline test} test2@{\\}}') assert_equal 'test △inline test☆ test2△}☆', actual end def test_inline_tti actual = compile_inline('test @{inline test} test2') assert_equal 'test ▲inline test☆◆→等幅フォントイタ←◆ test2', actual end def test_inline_ttb actual = compile_inline('test @{inline test} test2') assert_equal 'test ★inline test☆◆→等幅フォント太字←◆ test2', actual end def test_inline_uchar actual = compile_inline('test @{2460} test2') assert_equal 'test ① test2', actual end def test_inline_comment actual = compile_inline('test @{コメント} test2') assert_equal 'test test2', actual end def test_inline_comment_for_draft @config['draft'] = true actual = compile_inline('test @{コメント} test2') assert_equal 'test ◆→コメント←◆ test2', actual end def test_inline_fence actual = compile_inline('@|a|, @{\\frac{1\\}{2\\}}, @$\\frac{1}{2}$, @{\\{ \\\\\\}}, @|\\{ \\}|, test @|@{$サンプル$}|') assert_equal '◆→TeX式ここから←◆a◆→TeX式ここまで←◆, ◆→TeX式ここから←◆\\frac{1}{2}◆→TeX式ここまで←◆, ◆→TeX式ここから←◆\\frac{1}{2}◆→TeX式ここまで←◆, ◆→TeX式ここから←◆\\{ \\}◆→TeX式ここまで←◆, ◆→TeX式ここから←◆\\{ \\}◆→TeX式ここまで←◆, test △@{$サンプル$}☆', actual end def test_inline_in_table actual = compile_block("//table{\n★1☆\t▲2☆\n------------\n★3☆\t▲4☆<>&\n//}\n") expected = <<-EOS ◆→開始:表←◆ ★★1☆☆\t★▲2☆☆ ★3☆\t▲4☆<>& ◆→終了:表←◆ EOS assert_equal expected, actual end def test_dlist_beforeulol actual = compile_block(" : foo\n foo.\n\npara\n\n : foo\n foo.\n\n 1. bar\n\n : foo\n foo.\n\n * bar\n") expected = <<-EOS ★foo☆ \tfoo. para ★foo☆ \tfoo. 1\tbar ★foo☆ \tfoo. ●\tbar EOS assert_equal expected, actual end def test_dt_inline fn = Book::FootnoteIndex.parse(['//footnote[bar][bar]']) @chapter.instance_eval { @footnote_index = fn } actual = compile_block(" : foo@{bar}[]<>&@$\\alpha[]$\n") expected = <<-EOS ★foo【注1】[]<>&◆→TeX式ここから←◆\\alpha[]◆→TeX式ここまで←◆☆ EOS assert_equal expected, actual end def test_paragraph actual = compile_block("foo\nbar\n") assert_equal %Q(foobar\n), actual @book.config['join_lines_by_lang'] = true actual = compile_block("foo\nbar\n") assert_equal %Q(foo bar\n), actual end def test_tabbed_paragraph actual = compile_block("\tfoo\nbar\n") assert_equal %Q(\tfoobar\n), actual @book.config['join_lines_by_lang'] = true actual = compile_block("\tfoo\nbar\n") assert_equal %Q(\tfoo bar\n), actual end def test_flushright actual = compile_block("//flushright{\nfoo\nbar\n\nbuz\n//}\n") expected = <<-EOS ◆→開始:右寄せ←◆ foobar buz ◆→終了:右寄せ←◆ EOS assert_equal expected, actual @book.config['join_lines_by_lang'] = true actual = compile_block("//flushright{\nfoo\nbar\n\nbuz\n//}\n") expected = <<-EOS ◆→開始:右寄せ←◆ foo bar buz ◆→終了:右寄せ←◆ EOS assert_equal expected, actual end def test_blankline actual = compile_block("//blankline\nfoo\n") assert_equal %Q(\nfoo\n), actual end def test_noindent actual = compile_block("//noindent\nfoo\nbar\n\nfoo2\nbar2\n") expected = <<-EOS ◆→DTP連絡:次の1行インデントなし←◆ foobar foo2bar2 EOS assert_equal expected, actual @book.config['join_lines_by_lang'] = true actual = compile_block("//noindent\nfoo\nbar\n\nfoo2\nbar2\n") expected = <<-EOS ◆→DTP連絡:次の1行インデントなし←◆ foo bar foo2 bar2 EOS assert_equal expected, actual end def test_comment actual = compile_block('//comment[コメント]') assert_equal '', actual end def test_comment_for_draft @config['draft'] = true actual = compile_block('//comment[コメント<]') assert_equal %Q(◆→コメント<←◆\n), actual actual = compile_block("//comment{\nA<>\nB&\n//}") assert_equal %Q(◆→A<>\nB&←◆\n), actual end def test_list def @chapter.list(_id) Book::Index::Item.new('test', 1) end actual = compile_block("//list[samplelist][this is @{test}<&>_]{\nfoo\nbar\n//}\n") expected = <<-EOS ◆→開始:リスト←◆ リスト1.1 this is ★test☆<&>_ foo bar ◆→終了:リスト←◆ EOS assert_equal expected, actual end def test_listnum def @chapter.list(_id) Book::Index::Item.new('test', 1) end actual = compile_block("//listnum[test][this is @{test}<&>_]{\nfoo\nbar\n//}\n") expected = <<-EOS ◆→開始:リスト←◆ リスト1.1 this is ★test☆<&>_ 1: foo 2: bar ◆→終了:リスト←◆ EOS assert_equal expected, actual end def test_source actual = compile_block("//source[foo/bar/test.rb]{\nfoo\nbar\n\nbuz\n//}\n") expected = <<-EOS ◆→開始:ソースコードリスト←◆ ■foo/bar/test.rb foo bar buz ◆→終了:ソースコードリスト←◆ EOS assert_equal expected, actual end def test_source_empty_caption actual = compile_block("//source[]{\nfoo\nbar\n\nbuz\n//}\n") expected = <<-EOS ◆→開始:ソースコードリスト←◆ foo bar buz ◆→終了:ソースコードリスト←◆ EOS assert_equal expected, actual end def test_box actual = compile_block("//box{\nfoo\nbar\n//}\n") expected = <<-EOS ◆→開始:書式←◆ foo bar ◆→終了:書式←◆ EOS assert_equal expected, actual actual = compile_block("//box[FOO]{\nfoo\nbar\n//}\n") expected = <<-EOS ◆→開始:書式←◆ ■FOO foo bar ◆→終了:書式←◆ EOS assert_equal expected, actual end def test_cmd actual = compile_block("//cmd{\nlineA\nlineB\n//}\n") expected = <<-EOS ◆→開始:コマンド←◆ lineA lineB ◆→終了:コマンド←◆ EOS assert_equal expected, actual actual = compile_block("//cmd[cap1]{\nlineA\nlineB\n//}\n") expected = <<-EOS ◆→開始:コマンド←◆ ■cap1 lineA lineB ◆→終了:コマンド←◆ EOS assert_equal expected, actual end def test_emlist actual = compile_block("//emlist{\nlineA\nlineB\n//}\n") expected = <<-EOS ◆→開始:インラインリスト←◆ lineA lineB ◆→終了:インラインリスト←◆ EOS assert_equal expected, actual end def test_emlist_caption actual = compile_block("//emlist[cap1]{\nlineA\nlineB\n//}\n") expected = <<-EOS ◆→開始:インラインリスト←◆ ■cap1 lineA lineB ◆→終了:インラインリスト←◆ EOS assert_equal expected, actual end def test_emlistnum actual = compile_block("//emlistnum[this is @{test}<&>_]{\nfoo\nbar\n//}\n") expected = <<-EOS ◆→開始:インラインリスト←◆ ■this is ★test☆<&>_ 1: foo 2: bar ◆→終了:インラインリスト←◆ EOS assert_equal expected, actual end def test_bib def @chapter.bibpaper(_id) Book::Index::Item.new('samplebib', 1, 'sample bib') end assert_equal '[1]', compile_inline('@{samplebib}') end def test_table actual = compile_block("//table{\naaa\tbbb\n------------\nccc\tddd<>&\n//}\n") expected = <<-EOS ◆→開始:表←◆ ★aaa☆\t★bbb☆ ccc\tddd<>& ◆→終了:表←◆ EOS assert_equal expected, actual actual = compile_block("//table[foo][FOO]{\naaa\tbbb\n------------\nccc\tddd<>&\n//}\n") expected = <<-EOS ◆→開始:表←◆ 表1.1 FOO ★aaa☆\t★bbb☆ ccc\tddd<>& ◆→終了:表←◆ EOS assert_equal expected, actual end def test_empty_table e = assert_raises(ReVIEW::ApplicationError) { compile_block "//table{\n//}\n" } assert_equal ':2: error: no rows in the table', e.message e = assert_raises(ReVIEW::ApplicationError) { compile_block "//table{\n------------\n//}\n" } assert_equal ':3: error: no rows in the table', e.message end def test_inline_table def @chapter.table(_id) Book::Index::Item.new('sampletable', 1) end actual = compile_block("@{sampletest}\n") assert_equal "表1.1\n", actual end def test_emtable actual = compile_block("//emtable[foo]{\naaa\tbbb\n------------\nccc\tddd<>&\n//}\n//emtable{\naaa\tbbb\n------------\nccc\tddd<>&\n//}\n") expected = <<-EOS ◆→開始:表←◆ foo ★aaa☆\t★bbb☆ ccc\tddd<>& ◆→終了:表←◆ ◆→開始:表←◆ ★aaa☆\t★bbb☆ ccc\tddd<>& ◆→終了:表←◆ EOS assert_equal expected, actual end def test_table_row_separator src = "//table{\n1\t2\t\t3 4| 5\n------------\na b\tc d |e\n//}\n" expected = <<-EOS ◆→開始:表←◆ ★1☆ ★2☆ ★3 4| 5☆ a b c d |e ◆→終了:表←◆ EOS actual = compile_block(src) assert_equal expected, actual @config['table_row_separator'] = 'singletab' actual = compile_block(src) expected = <<-EOS ◆→開始:表←◆ ★1☆ ★2☆ ★☆ ★3 4| 5☆ a b c d |e ◆→終了:表←◆ EOS assert_equal expected, actual @config['table_row_separator'] = 'spaces' actual = compile_block(src) expected = <<-EOS ◆→開始:表←◆ ★1☆ ★2☆ ★3☆ ★4|☆ ★5☆ a b c d |e ◆→終了:表←◆ EOS assert_equal expected, actual @config['table_row_separator'] = 'verticalbar' actual = compile_block(src) expected = <<-EOS ◆→開始:表←◆ ★1 2 3 4☆ ★5☆ a b c d e ◆→終了:表←◆ EOS assert_equal expected, actual end def test_major_blocks actual = compile_block("//note{\nA\n\nB\n//}\n//note[caption]{\nA\n//}") expected = <<-EOS ◆→開始:ノート←◆ A B ◆→終了:ノート←◆ ◆→開始:ノート←◆ ■caption A ◆→終了:ノート←◆ EOS assert_equal expected, actual actual = compile_block("//memo{\nA\n\nB\n//}\n//memo[caption]{\nA\n//}") expected = <<-EOS ◆→開始:メモ←◆ A B ◆→終了:メモ←◆ ◆→開始:メモ←◆ ■caption A ◆→終了:メモ←◆ EOS assert_equal expected, actual actual = compile_block("//info{\nA\n\nB\n//}\n//info[caption]{\nA\n//}") expected = <<-EOS ◆→開始:情報←◆ A B ◆→終了:情報←◆ ◆→開始:情報←◆ ■caption A ◆→終了:情報←◆ EOS assert_equal expected, actual actual = compile_block("//important{\nA\n\nB\n//}\n//important[caption]{\nA\n//}") expected = <<-EOS ◆→開始:重要←◆ A B ◆→終了:重要←◆ ◆→開始:重要←◆ ■caption A ◆→終了:重要←◆ EOS assert_equal expected, actual actual = compile_block("//caution{\nA\n\nB\n//}\n//caution[caption]{\nA\n//}") expected = <<-EOS ◆→開始:警告←◆ A B ◆→終了:警告←◆ ◆→開始:警告←◆ ■caption A ◆→終了:警告←◆ EOS assert_equal expected, actual actual = compile_block("//notice{\nA\n\nB\n//}\n//notice[caption]{\nA\n//}") expected = <<-EOS ◆→開始:注意←◆ A B ◆→終了:注意←◆ ◆→開始:注意←◆ ■caption A ◆→終了:注意←◆ EOS assert_equal expected, actual actual = compile_block("//warning{\nA\n\nB\n//}\n//warning[caption]{\nA\n//}") expected = <<-EOS ◆→開始:危険←◆ A B ◆→終了:危険←◆ ◆→開始:危険←◆ ■caption A ◆→終了:危険←◆ EOS assert_equal expected, actual actual = compile_block("//tip{\nA\n\nB\n//}\n//tip[caption]{\nA\n//}") expected = <<-EOS ◆→開始:TIP←◆ A B ◆→終了:TIP←◆ ◆→開始:TIP←◆ ■caption A ◆→終了:TIP←◆ EOS assert_equal expected, actual end def test_image def @chapter.image(_id) item = Book::Index::Item.new('sampleimg', 1) item.instance_eval { @path = './images/chap1-sampleimg.png' } item end actual = compile_block("//image[sampleimg][sample photo]{\nfoo\n//}\n") expected = <<-EOS ◆→開始:図←◆ 図1.1 sample photo ◆→./images/chap1-sampleimg.png←◆ ◆→終了:図←◆ EOS assert_equal expected, actual end def test_image_with_metric def @chapter.image(_id) item = Book::Index::Item.new('sampleimg', 1) item.instance_eval { @path = './images/chap1-sampleimg.png' } item end actual = compile_block("//image[sampleimg][sample photo][scale=1.2]{\nfoo\n//}\n") expected = <<-EOS ◆→開始:図←◆ 図1.1 sample photo ◆→./images/chap1-sampleimg.png scale=1.2←◆ ◆→終了:図←◆ EOS assert_equal expected, actual end def test_texequation actual = compile_block("//texequation{\n\\sin\n1^{2}\n//}\n") expected = <<-EOS ◆→開始:TeX式←◆ \\sin 1^{2} ◆→終了:TeX式←◆ EOS assert_equal expected, actual end def test_inline_w Dir.mktmpdir do |dir| File.open(File.join(dir, 'words.csv'), 'w') do |f| f.write <_@{BAZ}" EOB end @book.config['words_file'] = File.join(dir, 'words.csv') io = StringIO.new @builder.instance_eval{ @logger = ReVIEW::Logger.new(io) } actual = compile_block('@{F} @{B} @{B} @{N}') assert_equal %Q(foo bar"\\<>_@{BAZ} ★bar"\\<>_@{BAZ}☆ [missing word: N]\n), actual assert_match(/WARN --: :1: word not bound: N/, io.string) end end def test_inline_unknown e = assert_raises(ReVIEW::ApplicationError) { compile_block "@{n}\n" } assert_equal ':1: error: unknown image: n', e.message e = assert_raises(ReVIEW::ApplicationError) { compile_block "@{n}\n" } assert_equal ':1: error: unknown footnote: n', e.message e = assert_raises(ReVIEW::ApplicationError) { compile_block "@{n}\n" } assert_equal ':1: error: unknown headline: n', e.message %w[list table column].each do |name| e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<#{name}>{n}\n" } assert_equal ":1: error: unknown #{name}: n", e.message end %w[chap chapref title].each do |name| e = assert_raises(ReVIEW::ApplicationError) { compile_block "@<#{name}>{n}\n" } assert_equal ':1: error: key not found: "n"', e.message end end def test_inline_raw0 assert_equal 'normal', compile_inline('@{normal}') end def test_inline_raw1 assert_equal 'body', compile_inline('@{|top|body}') end def test_inline_raw2 assert_equal 'body', compile_inline('@{|top, latex|body}') end def test_inline_raw3 assert_equal '', compile_inline('@{|idgxml, html|body}') end def test_inline_raw4 assert_equal '|top body', compile_inline('@{|top body}') end def test_inline_raw5 assert_equal "nor\nmal", compile_inline('@{|top|nor\\nmal}') end def test_block_raw0 actual = compile_block(%Q(//raw[<>!"\\n& ]\n)) expected = %Q(<>!"\n& ) assert_equal expected.chomp, actual end def test_block_raw1 actual = compile_block(%Q(//raw[|top|<>!"\\n& ]\n)) expected = %Q(<>!"\n& ) assert_equal expected.chomp, actual end def test_block_raw2 actual = compile_block(%Q(//raw[|top, latex|<>!"\\n& ]\n)) expected = %Q(<>!"\n& ) assert_equal expected.chomp, actual end def test_block_raw3 actual = compile_block(%Q(//raw[|latex, idgxml|<>!"\\n& ]\n)) expected = '' assert_equal expected.chomp, actual end def test_block_raw4 actual = compile_block(%Q(//raw[|top <>!"\\n& ]\n)) expected = %Q(|top <>!"\n& ) assert_equal expected.chomp, actual end def column_helper(review) compile_block(review) end def test_column_ref review = <<-EOS ===[column]{foo} test inside column === next level this is @{foo}. EOS expected = <<-EOS ◆→開始:コラム←◆ ■test inside column ◆→終了:コラム←◆ ■H3■next level this is コラム「test」. EOS assert_equal expected, column_helper(review) end def test_texequation_with_caption src = <<-EOS @{emc2} //texequation[emc2][The Equivalence of Mass @{and} Energy]{ e=mc^2 //} EOS expected = <<-EOS 式1.1 ◆→開始:TeX式←◆ 式1.1 The Equivalence of Mass ▲and☆ Energy e=mc^2 ◆→終了:TeX式←◆ EOS actual = compile_block(src) assert_equal expected, actual end end