require 'test_helper' require 'review/epubmaker' class EPUBMakerTest < Test::Unit::TestCase def setup config = ReVIEW::Configure.values config.merge!( 'bookname' => 'sample', 'title' => 'Sample Book', 'epubversion' => 2, 'urnid' => 'http://example.jp/', 'date' => '2011-01-01', 'language' => 'en', 'titlepage' => nil ) @producer = ReVIEW::EPUBMaker::Producer.new(config) end def test_initialize assert ReVIEW::EPUBMaker::Producer.new(ReVIEW::Configure.values) end def test_resource_en @producer.config['language'] = 'en' @producer.modify_config assert_equal 'Table of Contents', ReVIEW::I18n.t('toctitle') end def test_resource_ja @producer.config['language'] = 'ja' @producer.modify_config assert_equal '目次', ReVIEW::I18n.t('toctitle') end def test_mimetype output = @producer.instance_eval { @epub.mimetype } assert_equal 'application/epub+zip', output end def test_container output = @producer.instance_eval { @epub.container } expect = < EOT assert_equal expect, output end def test_stage1_opf output = @producer.instance_eval { @epub.opf } expect = < Sample Book en 2011-01-01 http://example.jp/ EOT assert_equal expect, output end def test_stage1_opf_escape @producer.config['title'] = 'Sample<>Book' @producer.modify_config output = @producer.instance_eval { @epub.opf } expect = < Sample<>Book en 2011-01-01 http://example.jp/ EOT assert_equal expect, output end def test_stage1_ncx output = @producer.instance_eval { @epub.ncx([]) } expect = < Sample Book Sample Book EOT assert_equal expect, output end def test_stage1_ncx_escape @producer.config['title'] = 'Sample<>Book' @producer.modify_config output = @producer.instance_eval { @epub.ncx([]) } expect = < Sample<>Book Sample<>Book EOT assert_equal expect, output end def stage2 # add one item @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch01.html', title: 'CH01', level: 1) end def test_stage2_add_l1item stage2 expect = ReVIEW::EPUBMaker::Content.new(file: 'ch01.html', id: 'ch01-html', media: 'application/xhtml+xml', title: 'CH01', level: 1) assert_equal expect, @producer.contents[0] end def test_stage2_opf stage2 output = @producer.instance_eval { @epub.opf } expect = < Sample Book en 2011-01-01 http://example.jp/ EOT assert_equal expect, output end def test_stage2_ncx stage2 output = @producer.instance_eval { @epub.ncx([]) } expect = < Sample Book Sample Book CH01 EOT assert_equal expect, output end def stage3 # add more items @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch01.html', title: %Q(CH01<>&"), level: 1) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch02.html', title: 'CH02', level: 1) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S1', title: 'CH02.1', level: 2) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S1.1', title: 'CH02.1.1', level: 3) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S1.1.1', title: 'CH02.1.1.1', level: 4) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S1.1.1.1', title: 'CH02.1.1.1.1', level: 5) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S1.1.2', title: 'CH02.1.1.2', level: 4) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S2', title: 'CH02.2', level: 2) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S2.1', title: 'CH02.2.1', level: 3) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch03.html', title: 'CH03', level: 1) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch03.html#S1', title: 'CH03.1', level: 2) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch03.html#S1.1', title: 'CH03.1.1', level: 3) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'ch04.html', title: 'CH04', level: 1) @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'sample.png') @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'sample.jpg') @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'sample.JPEG') @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'sample.SvG') @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'sample.GIF') @producer.contents << ReVIEW::EPUBMaker::Content.new(file: 'sample.css') end def test_stage3_add_various_items stage3 expect = [ ReVIEW::EPUBMaker::Content.new(file: 'ch01.html', id: 'ch01-html', media: 'application/xhtml+xml', title: %Q(CH01<>&"), level: 1), ReVIEW::EPUBMaker::Content.new(file: 'ch02.html', id: 'ch02-html', media: 'application/xhtml+xml', title: 'CH02', level: 1), ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S1', id: 'ch02-html#S1', media: 'html#s1', title: 'CH02.1', level: 2), ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S1.1', id: 'ch02-html#S1-1', media: '1', title: 'CH02.1.1', level: 3), ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S1.1.1', id: 'ch02-html#S1-1-1', media: '1', title: 'CH02.1.1.1', level: 4), ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S1.1.1.1', id: 'ch02-html#S1-1-1-1', media: '1', title: 'CH02.1.1.1.1', level: 5), ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S1.1.2', id: 'ch02-html#S1-1-2', media: '2', title: 'CH02.1.1.2', level: 4), ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S2', id: 'ch02-html#S2', media: 'html#s2', title: 'CH02.2', level: 2), ReVIEW::EPUBMaker::Content.new(file: 'ch02.html#S2.1', id: 'ch02-html#S2-1', media: '1', title: 'CH02.2.1', level: 3), ReVIEW::EPUBMaker::Content.new(file: 'ch03.html', id: 'ch03-html', media: 'application/xhtml+xml', title: 'CH03', level: 1), ReVIEW::EPUBMaker::Content.new(file: 'ch03.html#S1', id: 'ch03-html#S1', media: 'html#s1', title: 'CH03.1', level: 2), ReVIEW::EPUBMaker::Content.new(file: 'ch03.html#S1.1', id: 'ch03-html#S1-1', media: '1', title: 'CH03.1.1', level: 3), ReVIEW::EPUBMaker::Content.new(file: 'ch04.html', id: 'ch04-html', media: 'application/xhtml+xml', title: 'CH04', level: 1), ReVIEW::EPUBMaker::Content.new(file: 'sample.png', id: 'sample-png', media: 'image/png'), ReVIEW::EPUBMaker::Content.new(file: 'sample.jpg', id: 'sample-jpg', media: 'image/jpeg'), ReVIEW::EPUBMaker::Content.new(file: 'sample.JPEG', id: 'sample-JPEG', media: 'image/jpeg'), ReVIEW::EPUBMaker::Content.new(file: 'sample.SvG', id: 'sample-SvG', media: 'image/svg+xml'), ReVIEW::EPUBMaker::Content.new(file: 'sample.GIF', id: 'sample-GIF', media: 'image/gif'), ReVIEW::EPUBMaker::Content.new(file: 'sample.css', id: 'sample-css', media: 'text/css') ] assert_equal expect, @producer.contents end def test_stage3_opf stage3 output = @producer.instance_eval { @epub.opf } expect = < Sample Book en 2011-01-01 http://example.jp/ EOT assert_equal expect, output end def test_stage3_ncx stage3 output = @producer.instance_eval { @epub.ncx([]) } expect = < Sample Book Sample Book CH01<>&" CH02 CH02.1 CH02.1.1 CH02.1.1.1 CH02.1.1.1.1 CH02.1.1.2 CH02.2 CH02.2.1 CH03 CH03.1 CH03.1.1 CH04 EOT assert_equal expect, output end def test_stage3_mytoc stage3 @producer.config['toclevel'] = 2 @producer.modify_config output = @producer.instance_eval { @epub.mytoc } expect = < Table of Contents

Table of Contents

EOT assert_equal expect, output end def test_stage3_flat @producer.config.deep_merge!( 'epubmaker' => { 'flattoc' => true, 'flattocindent' => false }, 'toclevel' => 2 ) @producer.modify_config stage3 output = @producer.instance_eval { @epub.mytoc } expect = < Table of Contents

Table of Contents

EOT assert_equal expect, output end def test_stage3_cover stage3 output = @producer.instance_eval { @epub.cover } expect = < Sample Book

Sample Book

EOT assert_equal expect, output end def test_stage3_cover_escape stage3 @producer.config['title'] = 'Sample<>Book' @producer.modify_config output = @producer.instance_eval { @epub.cover } expect = < Sample<>Book

Sample<>Book

EOT assert_equal expect, output end def test_stage3_cover_with_image stage3 @producer.config['coverimage'] = 'sample.png' @producer.modify_config output = @producer.instance_eval { @epub.cover } expect = < Sample Book
Sample Book
EOT assert_equal expect, output end def test_stage3_cover_with_image_escape stage3 @producer.config.merge!( 'title' => 'Sample<>Book', 'coverimage' => 'sample.png' ) @producer.modify_config output = @producer.instance_eval { @epub.cover } expect = < Sample<>Book
Sample<>Book
EOT assert_equal expect, output end def test_colophon_default @producer.config.merge!( 'aut' => ['Mr.Smith'], 'pbl' => ['BLUEPRINT'], 'isbn' => '9784797372274' ) @producer.modify_config output = @producer.instance_eval { @epub.colophon } expect = < Colophon

Sample Book

published by Jan. 1, 2011

AuthorMr.Smith
PublisherBLUEPRINT
ISBN978-4-79737-227-4
EOT assert_equal expect, output end def test_colophon_default_escape_and_multiple @producer.config.merge!( 'title' => '<&Sample Book>', 'subtitle' => 'Sample<>Subtitle', 'aut' => ['Mr.Smith', 'Mr.&Anderson'], 'pbl' => ['BLUEPRINT', 'COPY<>EDIT'], 'isbn' => '9784797372274', 'rights' => ['COPYRIGHT 2016 <>', '& REVIEW'] ) @producer.modify_config output = @producer.instance_eval { @epub.colophon } expect = < Colophon

<&Sample Book>
Sample<>Subtitle

published by Jan. 1, 2011

AuthorMr.Smith, Mr.&Anderson
PublisherBLUEPRINT, COPY<>EDIT
ISBN978-4-79737-227-4
EOT assert_equal expect, output end def test_colophon_history @producer.config.merge!( 'aut' => ['Mr.Smith'], 'pbl' => ['BLUEPRINT'], 'pht' => ['Mrs.Smith'], 'language' => 'ja', 'history' => [['2011-08-03', '2012-02-15'], ['2012-10-01'], ['2013-03-01']] ) @producer.modify_config epub = @producer.instance_eval { @epub } result = epub.colophon_history expect = <<-EOT

2011年8月3日 初版第1刷 発行

2012年2月15日 初版第2刷 発行

2012年10月1日 第2版第1刷 発行

2013年3月1日 第3版第1刷 発行

EOT assert_equal expect, result end def test_colophon_history_freeformat @producer.config.merge!( 'aut' => ['Mr.Smith'], 'pbl' => ['BLUEPRINT'], 'pht' => ['Mrs.Smith'], 'language' => 'ja', 'history' => [['2011年8月3日 ver 1.1.0発行'], ['2011年10月12日 ver 1.2.0発行'], ['2012年1月31日 ver 1.2.1発行']] ) @producer.modify_config epub = @producer.instance_eval { @epub } result = epub.colophon_history expect = <<-EOT

2011年8月3日 ver 1.1.0発行

2011年10月12日 ver 1.2.0発行

2012年1月31日 ver 1.2.1発行

EOT assert_equal expect, result end def test_colophon_pht @producer.config.merge!( 'aut' => ['Mr.Smith'], 'pbl' => ['BLUEPRINT'], 'pht' => ['Mrs.Smith'] ) @producer.modify_config output = @producer.instance_eval { @epub.colophon } expect = < Colophon

Sample Book

published by Jan. 1, 2011

AuthorMr.Smith
PublisherBLUEPRINT
Director of PhotographyMrs.Smith
EOT assert_equal expect, output end def test_isbn13 @producer.config['isbn'] = '9784797372274' @producer.modify_config isbn = @producer.instance_eval { @epub.isbn_hyphen } assert_equal '978-4-79737-227-4', isbn end def test_isbn10 @producer.config['isbn'] = '4797372273' @producer.modify_config isbn = @producer.instance_eval { @epub.isbn_hyphen } assert_equal '4-79737-227-3', isbn end def test_isbn_nil @producer.config['isbn'] = nil @producer.modify_config isbn = @producer.instance_eval { @epub.isbn_hyphen } assert_equal nil, isbn end def test_title @producer.config.merge!( 'aut' => ['Mr.Smith'], 'pbl' => ['BLUEPRINT'] ) @producer.modify_config output = @producer.instance_eval { @epub.titlepage } expect = < Sample Book

Sample Book



Mr.Smith





BLUEPRINT

EOT assert_equal expect, output end def test_title_single_value_param @producer.config.merge!( 'aut' => 'Mr.Smith', 'pbl' => 'BLUEPRINT' ) @producer.modify_config output = @producer.instance_eval { @epub.titlepage } expect = < Sample Book

Sample Book



Mr.Smith





BLUEPRINT

EOT assert_equal expect, output end def test_epub_unsafe_id content = ReVIEW::EPUBMaker::Content.new(file: 'sample.png') assert_equal 'sample-png', content.id content = ReVIEW::EPUBMaker::Content.new(file: 'sample-&()-=+@:,漢字.png') assert_equal 'sample-_25_26_25_28_25_29-_25_3D_25_2B_25_40_25_3A_25_2C_25_E6_25_BC_25_A2_25_E5_25_AD_25_97-png', content.id end def epubmaker_instance Dir.mktmpdir do |tmpdir| epubmaker = ReVIEW::EPUBMaker.new epubmaker.instance_eval do @config = ReVIEW::Configure.create(maker: 'epubmaker') @config['titlepage'] = nil @producer = ReVIEW::EPUBMaker::Producer.new(@config) @htmltoc = ReVIEW::HTMLToc.new(tmpdir) def config @config end def error(s) raise ApplicationError, s end end File.write(File.join(tmpdir, 'exist.css'), 'body {}') File.write(File.join(tmpdir, 'exist.html'), '') Dir.chdir(tmpdir) do Dir.mkdir('test') yield(epubmaker, File.join(tmpdir, 'test')) end end end def test_copy_static_file epubmaker_instance do |epubmaker, tmpdir| epubmaker.config['stylesheet'] = ['exist.css'] assert_nothing_raised { epubmaker.copy_stylesheet(tmpdir) } epubmaker.config['stylesheet'] = ['nothing.css'] e = assert_raise(ApplicationError) { epubmaker.copy_stylesheet(tmpdir) } assert_equal 'stylesheet: nothing.css is not found.', e.message end epubmaker_instance do |epubmaker, tmpdir| epubmaker.config['titlepage'] = true epubmaker.config['titlefile'] = 'exist.html' assert_nothing_raised { epubmaker.copy_frontmatter(tmpdir) } epubmaker.config['titlefile'] = 'nothing.html' e = assert_raise(ApplicationError) { epubmaker.copy_frontmatter(tmpdir) } assert_equal 'titlefile: nothing.html is not found.', e.message end # XXX: only `cover' is allowed to have invalid file name. %w[originaltitlefile creditfile].each do |name| epubmaker_instance do |epubmaker, tmpdir| epubmaker.config[name] = 'exist.html' assert_nothing_raised { epubmaker.copy_frontmatter(tmpdir) } epubmaker.config[name] = 'nothing.html' e = assert_raise(ApplicationError) { epubmaker.copy_frontmatter(tmpdir) } assert_equal "#{name}: nothing.html is not found.", e.message end end %w[profile advfile colophon backcover].each do |name| epubmaker_instance do |epubmaker, tmpdir| epubmaker.config[name] = 'exist.html' assert_nothing_raised { epubmaker.copy_backmatter(tmpdir) } epubmaker.config[name] = 'nothing.html' e = assert_raise(ApplicationError) { epubmaker.copy_backmatter(tmpdir) } assert_equal "#{name}: nothing.html is not found.", e.message end end end end