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.
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