asciidoctor-doctest 2.0.0.beta.4 → 2.0.0.beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.adoc +58 -0
  3. data/LICENSE +21 -0
  4. data/README.adoc +310 -0
  5. data/asciidoctor-doctest.gemspec +48 -0
  6. data/data/examples/asciidoc/embedded.adoc +15 -0
  7. data/data/examples/asciidoc/preamble.adoc +1 -2
  8. data/data/examples/asciidoc/section.adoc +9 -0
  9. data/data/examples/asciidoc/toc.adoc +21 -9
  10. data/lib/asciidoctor/doctest/html/converter.rb +1 -1
  11. data/lib/asciidoctor/doctest/io/asciidoc.rb +2 -3
  12. data/lib/asciidoctor/doctest/io/base.rb +1 -1
  13. data/lib/asciidoctor/doctest/io/xml.rb +1 -1
  14. data/lib/asciidoctor/doctest/test_reporter.rb +3 -3
  15. data/lib/asciidoctor/doctest/version.rb +1 -1
  16. metadata +20 -69
  17. data/doc/img/doctest-diag.odf +0 -0
  18. data/doc/img/doctest-diag.svg +0 -56
  19. data/doc/img/failing-test-term.gif +0 -0
  20. data/features/README +0 -1
  21. data/features/fixtures/html-slim/Rakefile +0 -9
  22. data/features/fixtures/html-slim/examples/asciidoc/document.adoc +0 -4
  23. data/features/fixtures/html-slim/examples/asciidoc/inline_quoted.adoc +0 -2
  24. data/features/fixtures/html-slim/examples/asciidoc/quote.adoc +0 -12
  25. data/features/fixtures/html-slim/examples/html/document.html +0 -7
  26. data/features/fixtures/html-slim/examples/html/quote.html +0 -26
  27. data/features/fixtures/html-slim/templates/document.html.slim +0 -13
  28. data/features/fixtures/html-slim/templates/embedded.html.slim +0 -3
  29. data/features/fixtures/html-slim/templates/inline_quoted.html.slim +0 -8
  30. data/features/fixtures/html-slim/templates/paragraph.html.slim +0 -1
  31. data/features/fixtures/html-slim/templates/quote.html.slim +0 -7
  32. data/features/generator_html.feature +0 -171
  33. data/features/step_definitions/doctest_steps.rb +0 -5
  34. data/features/support/env.rb +0 -24
  35. data/features/test_html.feature +0 -98
  36. data/spec/asciidoc_converter_spec.rb +0 -64
  37. data/spec/example_spec.rb +0 -180
  38. data/spec/factory_spec.rb +0 -46
  39. data/spec/html/converter_spec.rb +0 -137
  40. data/spec/html_normalizer_spec.rb +0 -70
  41. data/spec/io/asciidoc_spec.rb +0 -139
  42. data/spec/io/xml_spec.rb +0 -141
  43. data/spec/minitest_diffy_spec.rb +0 -59
  44. data/spec/no_fallback_template_converter_spec.rb +0 -38
  45. data/spec/shared_examples/base_examples.rb +0 -289
  46. data/spec/spec_helper.rb +0 -39
  47. data/spec/support/matchers.rb +0 -7
  48. 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
@@ -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
@@ -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