asciidoctor-doctest 2.0.0.beta.4 → 2.0.0.beta.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.adoc +58 -0
- data/LICENSE +21 -0
- data/README.adoc +310 -0
- data/asciidoctor-doctest.gemspec +48 -0
- data/data/examples/asciidoc/embedded.adoc +15 -0
- data/data/examples/asciidoc/preamble.adoc +1 -2
- data/data/examples/asciidoc/section.adoc +9 -0
- data/data/examples/asciidoc/toc.adoc +21 -9
- data/lib/asciidoctor/doctest/html/converter.rb +1 -1
- data/lib/asciidoctor/doctest/io/asciidoc.rb +2 -3
- data/lib/asciidoctor/doctest/io/base.rb +1 -1
- data/lib/asciidoctor/doctest/io/xml.rb +1 -1
- data/lib/asciidoctor/doctest/test_reporter.rb +3 -3
- data/lib/asciidoctor/doctest/version.rb +1 -1
- metadata +20 -69
- data/doc/img/doctest-diag.odf +0 -0
- data/doc/img/doctest-diag.svg +0 -56
- data/doc/img/failing-test-term.gif +0 -0
- data/features/README +0 -1
- data/features/fixtures/html-slim/Rakefile +0 -9
- data/features/fixtures/html-slim/examples/asciidoc/document.adoc +0 -4
- data/features/fixtures/html-slim/examples/asciidoc/inline_quoted.adoc +0 -2
- data/features/fixtures/html-slim/examples/asciidoc/quote.adoc +0 -12
- data/features/fixtures/html-slim/examples/html/document.html +0 -7
- data/features/fixtures/html-slim/examples/html/quote.html +0 -26
- data/features/fixtures/html-slim/templates/document.html.slim +0 -13
- data/features/fixtures/html-slim/templates/embedded.html.slim +0 -3
- data/features/fixtures/html-slim/templates/inline_quoted.html.slim +0 -8
- data/features/fixtures/html-slim/templates/paragraph.html.slim +0 -1
- data/features/fixtures/html-slim/templates/quote.html.slim +0 -7
- data/features/generator_html.feature +0 -171
- data/features/step_definitions/doctest_steps.rb +0 -5
- data/features/support/env.rb +0 -24
- data/features/test_html.feature +0 -98
- data/spec/asciidoc_converter_spec.rb +0 -64
- data/spec/example_spec.rb +0 -180
- data/spec/factory_spec.rb +0 -46
- data/spec/html/converter_spec.rb +0 -137
- data/spec/html_normalizer_spec.rb +0 -70
- data/spec/io/asciidoc_spec.rb +0 -139
- data/spec/io/xml_spec.rb +0 -141
- data/spec/minitest_diffy_spec.rb +0 -59
- data/spec/no_fallback_template_converter_spec.rb +0 -38
- data/spec/shared_examples/base_examples.rb +0 -289
- data/spec/spec_helper.rb +0 -39
- data/spec/support/matchers.rb +0 -7
- data/spec/tester_spec.rb +0 -153
data/spec/factory_spec.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
|
3
|
-
describe DocTest::Factory do
|
4
|
-
|
5
|
-
subject(:factory) { Module.new { extend DocTest::Factory } }
|
6
|
-
|
7
|
-
let(:default_opts) { {} }
|
8
|
-
|
9
|
-
before do
|
10
|
-
factory.register(:foo, OpenStruct, default_opts)
|
11
|
-
factory.register(:bar, String, 'illegal')
|
12
|
-
factory.register(:baz, Integer)
|
13
|
-
end
|
14
|
-
|
15
|
-
describe '.create' do
|
16
|
-
it "returns instance of registered class" do
|
17
|
-
expect( factory.create(:foo) ).to eq OpenStruct.new
|
18
|
-
end
|
19
|
-
|
20
|
-
context "with opts" do
|
21
|
-
it "initializes class with opts" do
|
22
|
-
expect( factory.create(:foo, a: 42) ).to eq OpenStruct.new(a: 42)
|
23
|
-
end
|
24
|
-
|
25
|
-
context "when class with default_opts" do
|
26
|
-
let(:default_opts) { {a: 1, b: 2} }
|
27
|
-
|
28
|
-
it "initializes class with opts merged with default_opts" do
|
29
|
-
expect( factory.create(:foo, b: 6) ).to eq OpenStruct.new(a: 1, b: 6)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
context "when class with default_opts" do
|
35
|
-
let(:default_opts) { {a: 1, b: 2} }
|
36
|
-
|
37
|
-
it "initializes class with default_opts" do
|
38
|
-
expect( factory.create(:foo) ).to eq OpenStruct.new(default_opts)
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context "with unregistered name" do
|
43
|
-
it { expect { factory.create(:unknown) }.to raise_error(ArgumentError) }
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
data/spec/html/converter_spec.rb
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
require 'forwardable'
|
2
|
-
|
3
|
-
using Corefines::String::unindent
|
4
|
-
|
5
|
-
module DocTest
|
6
|
-
describe HTML::Converter do
|
7
|
-
extend Forwardable
|
8
|
-
|
9
|
-
def_delegator :converter, :convert_examples
|
10
|
-
|
11
|
-
subject(:converter) { described_class.new }
|
12
|
-
|
13
|
-
describe '#convert_examples' do
|
14
|
-
|
15
|
-
let(:input) { Example.new 's:dummy', content: '*chunky* bacon', opts: input_opts }
|
16
|
-
let(:input_opts) { {} }
|
17
|
-
let(:output) { Example.new 's:dummy', content: output_content, opts: output_opts }
|
18
|
-
let(:output_content) { '<b>chunky</b> bacon' }
|
19
|
-
let(:output_opts) { {dummy: 'value'} }
|
20
|
-
let(:converter_opts) { {header_footer: false} }
|
21
|
-
|
22
|
-
subject(:result) { convert_examples input, output }
|
23
|
-
|
24
|
-
let :rendered do
|
25
|
-
<<-EOF
|
26
|
-
<section>
|
27
|
-
<h1>Title</h1>
|
28
|
-
<div>
|
29
|
-
<p><b>Chunky</b> bacon</p>
|
30
|
-
</div>
|
31
|
-
<code>meh</code>
|
32
|
-
</section>
|
33
|
-
<div>
|
34
|
-
<p>why?</p>
|
35
|
-
</div>
|
36
|
-
EOF
|
37
|
-
end
|
38
|
-
|
39
|
-
before do
|
40
|
-
expect(converter).to receive(:convert)
|
41
|
-
.with(input.content, converter_opts).and_return(rendered)
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'returns array of converted input content and output content'
|
45
|
-
|
46
|
-
context 'with :exclude option' do
|
47
|
-
let(:output_opts) { {exclude: ['.//p', './/code']} }
|
48
|
-
|
49
|
-
it 'returns content without HTML (sub)elements specified by XPath' do
|
50
|
-
expect(result.first.gsub(/\s*/, '')).to eq \
|
51
|
-
'<section><h1>Title</h1><div></div></section><div></div>'
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context 'with :include option' do
|
56
|
-
let(:output_opts) { {include: ['.//p']} }
|
57
|
-
|
58
|
-
it 'returns content with only HTML (sub)elements specified by XPath' do
|
59
|
-
expect(result.first.gsub(/\s*/, '')).to eq '<p><b>Chunky</b>bacon</p><p>why?</p>'
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
context 'with :header_footer option' do
|
64
|
-
let(:converter_opts) { {header_footer: true} }
|
65
|
-
|
66
|
-
context 'specified in output example' do
|
67
|
-
let(:output_opts) { {header_footer: true} }
|
68
|
-
|
69
|
-
it 'renders content with :header_footer => true' do
|
70
|
-
convert_examples input, output
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
context 'specified in input example' do
|
75
|
-
let(:input_opts) { {header_footer: true} }
|
76
|
-
|
77
|
-
it 'renders content with :header_footer => true' do
|
78
|
-
convert_examples input, output
|
79
|
-
end
|
80
|
-
|
81
|
-
context 'and disabled in output example' do
|
82
|
-
let(:output_opts) { {header_footer: false} }
|
83
|
-
let(:converter_opts) { {header_footer: false} }
|
84
|
-
|
85
|
-
it 'renders content with :header_footer => false' do
|
86
|
-
convert_examples input, output
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
context 'with example named /^document.*/' do
|
93
|
-
let(:input) { Example.new 'document:dummy', content: '*chunky* bacon' }
|
94
|
-
let(:converter_opts) { {header_footer: true} }
|
95
|
-
|
96
|
-
it 'renders content with :header_footer => true' do
|
97
|
-
convert_examples input, output
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
context 'with example named /inline_.*/' do
|
102
|
-
let(:input) { Example.new 'inline_quoted:dummy', content: '*chunky* bacon' }
|
103
|
-
let(:rendered) { '<p><b>chunky</b> bacon</p>' }
|
104
|
-
|
105
|
-
it 'returns content without top-level <p> tags' do
|
106
|
-
expect(result.first).to eq '<b>chunky</b> bacon'
|
107
|
-
end
|
108
|
-
|
109
|
-
context 'with :include option' do
|
110
|
-
let(:output_opts) { {include: ['.//b']} }
|
111
|
-
|
112
|
-
it 'preferes the include option' do
|
113
|
-
expect(result.first).to eq '<b>chunky</b>'
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
context 'with output example including DOCTYPE' do
|
119
|
-
let :output_content do
|
120
|
-
<<-EOF.unindent.strip
|
121
|
-
<!DOCTYPE html>
|
122
|
-
<html>
|
123
|
-
<head>
|
124
|
-
<title>Test</title>
|
125
|
-
</head>
|
126
|
-
<body></body>
|
127
|
-
</html>
|
128
|
-
EOF
|
129
|
-
end
|
130
|
-
|
131
|
-
it 'returns expected content with DOCTYPE' do
|
132
|
-
expect(result.last).to eq output_content
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
describe DocTest::HtmlNormalizer do
|
2
|
-
|
3
|
-
[Nokogiri::HTML::Document, Nokogiri::HTML::DocumentFragment].each do |klass|
|
4
|
-
it "HtmlNormalizer should be included in #{klass}" do
|
5
|
-
expect(klass).to have_method :normalize!
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
describe 'normalize!' do
|
10
|
-
|
11
|
-
it 'sorts attributes by name' do
|
12
|
-
output = normalize '<img src="tux.png" width="60" height="100" alt="Tux!">'
|
13
|
-
expect(output).to eq '<img alt="Tux!" height="100" src="tux.png" width="60">'
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'removes all blank text nodes' do
|
17
|
-
output = normalize " <section>\n <p>Lorem ipsum</p>\n\t</section>\n\n"
|
18
|
-
expect(output).to eq '<section><p>Lorem ipsum</p></section>'
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'in "style" attribute' do
|
22
|
-
|
23
|
-
it 'sorts CSS declarations by name' do
|
24
|
-
output = normalize %(<div style="width: 100%; color: 'red'; font-style: bold"></div>)
|
25
|
-
expect(output).to eq %(<div style="color: 'red'; font-style: bold; width: 100%;"></div>)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'in text node' do
|
30
|
-
|
31
|
-
it 'strips nonsignificant leading and trailing whitespaces' do
|
32
|
-
output = normalize "<p> Lorem<b> ipsum</b> dolor\n<br> sit <i>amet</i></p>"
|
33
|
-
expect(output).to eq '<p>Lorem<b> ipsum</b> dolor<br>sit <i>amet</i></p>'
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'strips nonsignificant repeated whitespaces' do
|
37
|
-
output = normalize "<p>Lorem ipsum\t\tdolor</p>"
|
38
|
-
expect(output).to eq "<p>Lorem ipsum\tdolor</p>"
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'replaces newlines with spaces' do
|
42
|
-
output = normalize "<p>Lorem\nipsum\n\ndolor</p>"
|
43
|
-
expect(output).to eq '<p>Lorem ipsum dolor</p>'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
context 'in preformatted node or descendant' do
|
48
|
-
|
49
|
-
it 'does not strip leading and trailing whitespaces' do
|
50
|
-
input = "<pre> Lorem<b> ipsum</b> dolor\n<br> sit amet</pre>"
|
51
|
-
expect(normalize(input)).to eq input
|
52
|
-
end
|
53
|
-
|
54
|
-
it 'does not strip repeated whitespaces' do
|
55
|
-
input = "<pre>Lorem ipsum\t\tdolor\n<code>sit amet</code></pre>"
|
56
|
-
output = normalize input
|
57
|
-
expect(output).to eq input
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'does not replace newlines with spaces' do
|
61
|
-
input = "<pre>Lorem\n<code>\nipsum</code>\n\ndolor</pre>"
|
62
|
-
expect(normalize(input)).to eq input
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
def normalize(input)
|
68
|
-
Nokogiri::HTML.fragment(input).normalize!.to_s
|
69
|
-
end
|
70
|
-
end
|
data/spec/io/asciidoc_spec.rb
DELETED
@@ -1,139 +0,0 @@
|
|
1
|
-
using Corefines::String::unindent
|
2
|
-
|
3
|
-
describe DocTest::IO::Asciidoc do
|
4
|
-
|
5
|
-
it_should_behave_like DocTest::IO::Base
|
6
|
-
|
7
|
-
subject(:suite) { described_class.new(file_ext: '.adoc') }
|
8
|
-
|
9
|
-
|
10
|
-
describe '#initialize' do
|
11
|
-
|
12
|
-
it 'uses ".adoc" as default file_ext' do
|
13
|
-
expect(suite.file_ext).to eq '.adoc'
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
describe 'parsing/serialization:' do
|
19
|
-
|
20
|
-
context 'one example' do
|
21
|
-
|
22
|
-
shared_examples :example do
|
23
|
-
let(:parsed) { suite.parse input, 's' }
|
24
|
-
let(:serialized) { suite.serialize output }
|
25
|
-
|
26
|
-
it { expect(parsed).to have(1).items }
|
27
|
-
|
28
|
-
it 'returns an array with parsed example object' do
|
29
|
-
expect(parsed.first).to eql output
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'returns a serialized example as string' do
|
33
|
-
expect(serialized).to eql input
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'with name only' do
|
38
|
-
let(:input) { "// .basic\n" }
|
39
|
-
let(:output) { create_example 's:basic' }
|
40
|
-
|
41
|
-
include_examples :example
|
42
|
-
end
|
43
|
-
|
44
|
-
context 'with multiline content' do
|
45
|
-
let :content do
|
46
|
-
<<-EOF.unindent
|
47
|
-
Paragraphs don't require
|
48
|
-
any special markup.
|
49
|
-
|
50
|
-
To begin a new one, separate it by blank line.
|
51
|
-
EOF
|
52
|
-
end
|
53
|
-
|
54
|
-
let(:input) { "// .multiline\n#{content}" }
|
55
|
-
let(:output) { create_example 's:multiline', content: content.chomp }
|
56
|
-
|
57
|
-
include_examples :example
|
58
|
-
end
|
59
|
-
|
60
|
-
context 'with description' do
|
61
|
-
let :input do
|
62
|
-
<<-EOF.unindent
|
63
|
-
// .strong
|
64
|
-
// This is a description,
|
65
|
-
// see?
|
66
|
-
*allons-y!*
|
67
|
-
EOF
|
68
|
-
end
|
69
|
-
|
70
|
-
let :output do
|
71
|
-
create_example 's:strong', content: '*allons-y!*',
|
72
|
-
desc: "This is a description,\nsee?"
|
73
|
-
end
|
74
|
-
|
75
|
-
include_examples :example
|
76
|
-
end
|
77
|
-
|
78
|
-
context 'with options' do
|
79
|
-
let :input do
|
80
|
-
<<-EOF.unindent
|
81
|
-
// .basic
|
82
|
-
// :exclude: /^=+.*/
|
83
|
-
// :exclude: /^#+.*/
|
84
|
-
// :include: /^----\\n(.*)\\n----/m
|
85
|
-
// :header_footer:
|
86
|
-
_dummy_
|
87
|
-
EOF
|
88
|
-
end
|
89
|
-
|
90
|
-
let :output do
|
91
|
-
create_example 's:basic', content: '_dummy_', opts: {
|
92
|
-
exclude: ['/^=+.*/', '/^#+.*/'],
|
93
|
-
include: ['/^----\\n(.*)\\n----/m'],
|
94
|
-
header_footer: true
|
95
|
-
}
|
96
|
-
end
|
97
|
-
include_examples :example
|
98
|
-
end
|
99
|
-
|
100
|
-
context 'with description and options' do
|
101
|
-
let :input do
|
102
|
-
<<-EOF.unindent
|
103
|
-
// .basic
|
104
|
-
// This is a description.
|
105
|
-
// :exclude: /^=+.*/
|
106
|
-
EOF
|
107
|
-
end
|
108
|
-
|
109
|
-
let :output do
|
110
|
-
create_example 's:basic', desc: 'This is a description.', opts: {
|
111
|
-
exclude: ['/^=+.*/']
|
112
|
-
}
|
113
|
-
end
|
114
|
-
include_examples :example
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
context 'multiple examples' do
|
119
|
-
let :input do
|
120
|
-
<<-EOF.unindent
|
121
|
-
// .basic
|
122
|
-
http://asciidoctor.org
|
123
|
-
|
124
|
-
// .xref
|
125
|
-
Refer to <<section-a>>.
|
126
|
-
EOF
|
127
|
-
end
|
128
|
-
|
129
|
-
subject(:parsed) { suite.parse input, 's' }
|
130
|
-
|
131
|
-
it { is_expected.to have(2).items }
|
132
|
-
|
133
|
-
it 'returns an array with parsed Example objects' do
|
134
|
-
expect(parsed[0]).to eql create_example('s:basic', content: 'http://asciidoctor.org')
|
135
|
-
expect(parsed[1]).to eql create_example('s:xref', content: 'Refer to <<section-a>>.')
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|
data/spec/io/xml_spec.rb
DELETED
@@ -1,141 +0,0 @@
|
|
1
|
-
using Corefines::String::unindent
|
2
|
-
|
3
|
-
describe DocTest::IO::XML do
|
4
|
-
|
5
|
-
it_should_behave_like DocTest::IO::Base
|
6
|
-
|
7
|
-
subject(:suite) { described_class.new(file_ext: '.html') }
|
8
|
-
|
9
|
-
|
10
|
-
describe '#initialize' do
|
11
|
-
|
12
|
-
it 'uses ".html" as default file_ext' do
|
13
|
-
expect(suite.file_ext).to eq '.html'
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
|
18
|
-
describe 'parsing/serialization:' do
|
19
|
-
|
20
|
-
context 'one example' do
|
21
|
-
|
22
|
-
shared_examples :example do
|
23
|
-
let(:parsed) { suite.parse input, 's' }
|
24
|
-
let(:serialized) { suite.serialize output }
|
25
|
-
|
26
|
-
it { (expect parsed).to have(1).items }
|
27
|
-
|
28
|
-
it 'returns an array with parsed example object' do
|
29
|
-
(expect parsed.first).to eql output
|
30
|
-
end
|
31
|
-
|
32
|
-
it 'returns a serialized example as string' do
|
33
|
-
(expect serialized).to eql input
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
context 'with name only' do
|
38
|
-
let(:input) { "<!-- .basic -->\n" }
|
39
|
-
let(:output) { create_example 's:basic' }
|
40
|
-
|
41
|
-
include_examples :example
|
42
|
-
end
|
43
|
-
|
44
|
-
context 'with multiline content' do
|
45
|
-
let :content do
|
46
|
-
<<-EOF.unindent
|
47
|
-
<p>Paragraphs don't require
|
48
|
-
any special markup.</p>
|
49
|
-
|
50
|
-
<p>To begin a new one, separate it by blank line.</p>
|
51
|
-
EOF
|
52
|
-
end
|
53
|
-
|
54
|
-
let(:input) { "<!-- .multiline -->\n#{content}" }
|
55
|
-
let(:output) { create_example 's:multiline', content: content.chomp }
|
56
|
-
|
57
|
-
include_examples :example
|
58
|
-
end
|
59
|
-
|
60
|
-
context 'with description' do
|
61
|
-
let :input do
|
62
|
-
<<-EOF.unindent
|
63
|
-
<!-- .strong
|
64
|
-
This is a description,
|
65
|
-
see?
|
66
|
-
-->
|
67
|
-
<strong>allons-y!</strong>
|
68
|
-
EOF
|
69
|
-
end
|
70
|
-
|
71
|
-
let :output do
|
72
|
-
create_example 's:strong', content: '<strong>allons-y!</strong>',
|
73
|
-
desc: "This is a description,\nsee?"
|
74
|
-
end
|
75
|
-
include_examples :example
|
76
|
-
end
|
77
|
-
|
78
|
-
context 'with options' do
|
79
|
-
let :input do
|
80
|
-
<<-EOF.unindent
|
81
|
-
<!-- .basic
|
82
|
-
:exclude: .//code
|
83
|
-
:exclude: .//section
|
84
|
-
:include: ./p/node()
|
85
|
-
:header_footer:
|
86
|
-
-->
|
87
|
-
<p>dummy</p>
|
88
|
-
EOF
|
89
|
-
end
|
90
|
-
|
91
|
-
let :output do
|
92
|
-
create_example 's:basic', content: '<p>dummy</p>', opts: {
|
93
|
-
exclude: ['.//code', './/section'],
|
94
|
-
include: ['./p/node()'],
|
95
|
-
header_footer: true
|
96
|
-
}
|
97
|
-
end
|
98
|
-
include_examples :example
|
99
|
-
end
|
100
|
-
|
101
|
-
context 'with description and options' do
|
102
|
-
let :input do
|
103
|
-
<<-EOF.unindent
|
104
|
-
<!-- .basic
|
105
|
-
This is a description.
|
106
|
-
:exclude: .//code
|
107
|
-
-->
|
108
|
-
EOF
|
109
|
-
end
|
110
|
-
|
111
|
-
let :output do
|
112
|
-
create_example 's:basic', desc: 'This is a description.', opts: {
|
113
|
-
exclude: ['.//code']
|
114
|
-
}
|
115
|
-
end
|
116
|
-
include_examples :example
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
context 'multiple examples' do
|
121
|
-
let :input do
|
122
|
-
<<-EOF.unindent
|
123
|
-
<!-- .basic -->
|
124
|
-
http://asciidoctor.org
|
125
|
-
|
126
|
-
<!-- .xref -->
|
127
|
-
Refer to <<section-a>>.
|
128
|
-
EOF
|
129
|
-
end
|
130
|
-
|
131
|
-
subject(:parsed) { suite.parse input, 's' }
|
132
|
-
|
133
|
-
it { is_expected.to have(2).items }
|
134
|
-
|
135
|
-
it 'returns an array with parsed Example objects' do
|
136
|
-
expect(parsed[0]).to eql create_example('s:basic', content: 'http://asciidoctor.org')
|
137
|
-
expect(parsed[1]).to eql create_example('s:xref', content: 'Refer to <<section-a>>.')
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|