summaryrefslogtreecommitdiff
path: root/spec/cli_spec.rb
blob: 800f13d37d9073b33e62e5b9c6c0e28066f1e069 (plain) (blame)
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
# frozen_string_literal: true

require_relative 'spec_helper'

describe 'asciidoctor-pdf' do
  context 'Options' do
    it 'should print the version of Asciidoctor PDF to stdout when invoked with the -V flag', cli: true do
      out, _, res = run_command asciidoctor_pdf_bin, '-V'
      (expect res.exitstatus).to be 0
      (expect out).to include %(Asciidoctor PDF #{Asciidoctor::PDF::VERSION} using Asciidoctor #{Asciidoctor::VERSION})
    end

    it 'should enable sourcemap if --sourcemap option is specified', cli: true do
      with_tmp_file '.adoc', tmpdir: output_dir do |tmp_file|
        tmp_file.write <<~'EOS'
        before

        ****
        content
        EOS
        tmp_file.close
        out, err, res = run_command asciidoctor_pdf_bin, '--sourcemap', tmp_file.path
        (expect res.exitstatus).to be 0
        (expect out).to be_empty
        (expect err.chomp).to eql %(asciidoctor: WARNING: #{File.basename tmp_file.path}: line 3: unterminated sidebar block)
      end
    end
  end

  context 'Packaging' do
    it 'should install bin script named asciidoctor-pdf' do
      bin_script = (Pathname.new Gem.bindir) / 'asciidoctor-pdf'
      bin_script = Pathname.new Gem.bin_path 'asciidoctor-pdf', 'asciidoctor-pdf' unless bin_script.exist?
      (expect bin_script).to exist
    end
  end if defined? Bundler

  context 'Require' do
    it 'should load converter if backend is pdf and require is asciidoctor-pdf', cli: true do
      out, err, res = run_command asciidoctor_bin, '-r', 'asciidoctor-pdf', '-b', 'pdf', '-D', output_dir, (fixture_file 'hello.adoc'), use_bundler: true
      (expect res.exitstatus).to be 0
      (expect out).to be_empty
      (expect err).to be_empty
      (expect Pathname.new output_file 'hello.pdf').to exist
    end

    it 'should load converter if backend is pdf and require is asciidoctor/pdf', cli: true do
      out, err, res = run_command asciidoctor_bin, '-r', 'asciidoctor/pdf', '-b', 'pdf', '-D', output_dir, (fixture_file 'hello.adoc'), use_bundler: true
      (expect res.exitstatus).to be 0
      (expect out).to be_empty
      (expect err).to be_empty
      (expect Pathname.new output_file 'hello.pdf').to exist
    end
  end if defined? Bundler

  context 'Theme' do
    it 'should use theme specified by pdf-theme attribute', cli: true do
      out, err, res = run_command asciidoctor_pdf_bin, '-D', output_dir, '-a', %(pdf-theme=#{fixture_file 'custom-theme.yml'}), (fixture_file 'hello.adoc')
      (expect res.exitstatus).to be 0
      (expect out).to be_empty
      (expect err).to be_empty
      to_file = Pathname.new output_file 'hello.pdf'
      (expect to_file).to exist
      pdf = TextInspector.analyze to_file
      hello_text = pdf.find_unique_text 'hello'
      (expect hello_text[:font_name]).to eql 'Times-Roman'
    end

    it 'should use theme specified by --theme option', cli: true do
      [true, false].each do |adjoin_value|
        args = ['-D', output_dir]
        if adjoin_value
          args << %(--theme=#{fixture_file 'custom-theme.yml'})
        else
          args << '--theme'
          args << (fixture_file 'custom-theme.yml')
        end
        args << (fixture_file 'hello.adoc')
        out, err, res = run_command asciidoctor_pdf_bin, *args
        (expect res.exitstatus).to be 0
        (expect out).to be_empty
        (expect err).to be_empty
        to_file = Pathname.new output_file 'hello.pdf'
        (expect to_file).to exist
        pdf = TextInspector.analyze to_file
        hello_text = pdf.find_unique_text 'hello'
        (expect hello_text[:font_name]).to eql 'Times-Roman'
      end
    end
  end

  context 'Examples' do
    it 'should convert the basic example', cli: true, visual: true, if: (gem_available? 'rouge'), &(proc do
      out, err, res = run_command asciidoctor_pdf_bin, '-D', output_dir, (example_file 'basic-example.adoc')
      (expect res.exitstatus).to be 0
      (expect out).to be_empty
      (expect err).to be_empty
      reference_file = File.absolute_path example_file 'basic-example.pdf'
      (expect output_file 'basic-example.pdf').to visually_match reference_file
    end)

    it 'should convert the chronicles example', cli: true, visual: true, if: (gem_available? 'rouge'), &(proc do
      out, err, res = run_command asciidoctor_pdf_bin, '-D', output_dir, (example_file 'chronicles-example.adoc')
      (expect res.exitstatus).to be 0
      (expect out).to be_empty
      (expect err).to be_empty
      skip_pages = [10, 11, 14] if Gem.loaded_specs['rouge'].version < (Gem::Version.new '2.1.0')
      reference_file = File.absolute_path example_file 'chronicles-example.pdf'
      (expect output_file 'chronicles-example.pdf').to visually_match reference_file, skip_pages: skip_pages
    end)
  end

  context 'redirection', unless: windows? && jruby? do
    it 'should be able to write output to file via stdout', cli: true do
      run_command asciidoctor_pdf_bin, '-o', '-', (fixture_file 'book.adoc'), out: (to_file = output_file 'book.pdf')
      (expect Pathname.new to_file).to exist
      (expect { PDF::Reader.new to_file }).not_to raise_exception
    end
  end

  context 'nogmagick' do
    it 'should unregister Gmagick handler if asciidoctor/pdf/nogmagick is required', cli: true do
      out, err, res = run_command asciidoctor_pdf_bin, '-D', output_dir, '-r', 'asciidoctor/pdf/nogmagick', (fixture_file 'interlaced-png.adoc'), use_bundler: true
      (expect out).to be_empty
      (expect err).not_to be_empty
      (expect err).to include 'PNG uses unsupported interlace method'
      (expect res.exitstatus).to be 0
    end

    it 'should unregister Gmagick handler for PNG images if asciidoctor/pdf/nopngmagick is required', cli: true do
      out, err, res = run_command asciidoctor_pdf_bin, '-D', output_dir, '-r', 'asciidoctor/pdf/nopngmagick', (fixture_file 'interlaced-png.adoc'), use_bundler: true
      (expect out).to be_empty
      (expect err).not_to be_empty
      (expect err).to include 'PNG uses unsupported interlace method'
      (expect res.exitstatus).to be 0
    end

    it 'should unregister Gmagick handler only for PNG images if asciidoctor/pdf/nopngmagick is required', cli: true do
      out, err, res = run_command asciidoctor_pdf_bin, '-D', output_dir, '-r', 'asciidoctor/pdf/nopngmagick', (fixture_file 'bmp.adoc'), use_bundler: true
      (expect out).to be_empty
      (expect err).to be_empty
      (expect res.exitstatus).to be 0
    end
  end if defined? GMagick::Image

  context 'pdfmark' do
    it 'should generate pdfmark file if pdfmark attribute is set', cli: true do
      out, err, res = run_command asciidoctor_pdf_bin, '-D', output_dir, '-a', 'pdfmark', (fixture_file 'book.adoc')
      (expect res.exitstatus).to be 0
      (expect out).to be_empty
      (expect err).to be_empty
      pdfmark_file = Pathname.new output_file 'book.pdfmark'
      (expect pdfmark_file).to exist
      pdfmark_contents = pdfmark_file.read
      (expect pdfmark_contents).to include '/Title (Book Title)'
      (expect pdfmark_contents).to include '/Author (Author Name)'
      (expect pdfmark_contents).to include '/DOCINFO pdfmark'
    end
  end

  context 'keep artifacts' do
    it 'should generate scratch file if KEEP_ARTIFACTS environment variable is set', cli: true do
      out, err, res = run_command asciidoctor_pdf_bin, '-D', output_dir, (fixture_file 'dry-run-block.adoc'), env: { 'KEEP_ARTIFACTS' => 'true' }
      (expect res.exitstatus).to be 0
      (expect out).to be_empty
      (expect err).to be_empty
      scratch_file = Pathname.new output_file 'dry-run-block-scratch.pdf'
      (expect scratch_file).to exist
      (expect { PDF::Reader.new scratch_file }).not_to raise_exception
    end
  end
end