rspec 1.1.4 → 1.1.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.
- data/{CHANGES → History.txt} +116 -64
- data/Manifest.txt +403 -0
- data/{MIT-LICENSE → README.txt} +43 -0
- data/Rakefile +39 -212
- data/{TODO → TODO.txt} +0 -0
- data/bin/autospec +4 -0
- data/bin/spec +1 -1
- data/examples/pure/yielding_example.rb +33 -0
- data/examples/stories/game-of-life/.loadpath +5 -0
- data/examples/stories/game-of-life/behaviour/everything.rb +1 -1
- data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +17 -17
- data/init.rb +9 -0
- data/lib/autotest/discover.rb +1 -1
- data/lib/autotest/rspec.rb +3 -29
- data/lib/spec.rb +10 -12
- data/lib/spec/adapters.rb +1 -0
- data/lib/spec/adapters/ruby_engine.rb +26 -0
- data/lib/spec/adapters/ruby_engine/mri.rb +8 -0
- data/lib/spec/adapters/ruby_engine/rubinius.rb +8 -0
- data/lib/spec/example/errors.rb +6 -0
- data/lib/spec/example/example_group_methods.rb +17 -14
- data/lib/spec/example/example_matcher.rb +2 -0
- data/lib/spec/example/example_methods.rb +4 -9
- data/lib/spec/example/module_inclusion_warnings.rb +2 -1
- data/lib/spec/expectations/extensions/object.rb +2 -2
- data/lib/spec/expectations/handler.rb +8 -16
- data/lib/spec/extensions/main.rb +2 -17
- data/lib/spec/matchers.rb +8 -2
- data/lib/spec/matchers/be.rb +0 -3
- data/lib/spec/matchers/change.rb +44 -40
- data/lib/spec/matchers/has.rb +1 -1
- data/lib/spec/matchers/have.rb +17 -12
- data/lib/spec/matchers/operator_matcher.rb +10 -4
- data/lib/spec/matchers/simple_matcher.rb +113 -10
- data/lib/spec/mocks.rb +1 -1
- data/lib/spec/mocks/argument_constraints.rb +185 -0
- data/lib/spec/mocks/argument_expectation.rb +35 -173
- data/lib/spec/mocks/framework.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +30 -5
- data/lib/spec/mocks/methods.rb +14 -2
- data/lib/spec/mocks/mock.rb +4 -0
- data/lib/spec/mocks/proxy.rb +46 -5
- data/lib/spec/mocks/spec_methods.rb +9 -1
- data/lib/spec/rake/spectask.rb +14 -22
- data/lib/spec/rake/verify_rcov.rb +3 -3
- data/lib/spec/runner.rb +18 -6
- data/lib/spec/runner/backtrace_tweaker.rb +6 -7
- data/lib/spec/runner/command_line.rb +6 -17
- data/lib/spec/runner/drb_command_line.rb +1 -1
- data/lib/spec/runner/formatter/base_formatter.rb +3 -1
- data/lib/spec/runner/formatter/base_text_formatter.rb +5 -9
- data/lib/spec/runner/formatter/html_formatter.rb +1 -1
- data/lib/spec/runner/formatter/nested_text_formatter.rb +1 -1
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +2 -2
- data/lib/spec/runner/formatter/specdoc_formatter.rb +1 -1
- data/lib/spec/runner/formatter/story/html_formatter.rb +62 -16
- data/lib/spec/runner/formatter/story/plain_text_formatter.rb +68 -16
- data/lib/spec/runner/formatter/story/progress_bar_formatter.rb +42 -0
- data/lib/spec/runner/heckle_runner.rb +2 -2
- data/lib/spec/runner/option_parser.rb +2 -1
- data/lib/spec/runner/options.rb +18 -9
- data/lib/spec/runner/reporter.rb +24 -4
- data/lib/spec/runner/spec_parser.rb +1 -1
- data/lib/spec/story/runner.rb +1 -2
- data/lib/spec/story/runner/story_mediator.rb +14 -0
- data/lib/spec/story/runner/story_parser.rb +20 -0
- data/lib/spec/story/step.rb +40 -28
- data/lib/spec/story/step_mother.rb +2 -1
- data/lib/spec/story/world.rb +6 -2
- data/lib/spec/version.rb +13 -22
- data/rake_tasks/failing_examples_with_html.rake +1 -1
- data/rake_tasks/verify_rcov.rake +2 -2
- data/rspec.gemspec +33 -0
- data/spec/autotest/rspec_spec.rb +90 -141
- data/spec/spec/adapters/ruby_engine_spec.rb +16 -0
- data/spec/spec/example/base_formatter_spec.rb +112 -0
- data/spec/spec/example/example_group_factory_spec.rb +2 -2
- data/spec/spec/example/example_group_methods_spec.rb +55 -4
- data/spec/spec/example/example_group_spec.rb +4 -3
- data/spec/spec/example/example_methods_spec.rb +18 -14
- data/spec/spec/example/pending_module_spec.rb +38 -0
- data/spec/spec/example/shared_example_group_spec.rb +1 -1
- data/spec/spec/expectations/extensions/object_spec.rb +0 -12
- data/spec/spec/extensions/main_spec.rb +3 -8
- data/spec/spec/matchers/change_spec.rb +16 -6
- data/spec/spec/matchers/handler_spec.rb +58 -37
- data/spec/spec/matchers/has_spec.rb +10 -0
- data/spec/spec/matchers/have_spec.rb +105 -2
- data/spec/spec/matchers/operator_matcher_spec.rb +35 -2
- data/spec/spec/matchers/simple_matcher_spec.rb +64 -2
- data/spec/spec/mocks/any_number_of_times_spec.rb +7 -0
- data/spec/spec/mocks/bug_report_496.rb +17 -0
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +7 -1
- data/spec/spec/mocks/hash_including_matcher_spec.rb +45 -24
- data/spec/spec/mocks/mock_spec.rb +55 -10
- data/spec/spec/mocks/nil_expectation_warning_spec.rb +54 -0
- data/spec/spec/mocks/null_object_mock_spec.rb +14 -0
- data/spec/spec/mocks/options_hash_spec.rb +18 -28
- data/spec/spec/mocks/partial_mock_spec.rb +2 -0
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +20 -6
- data/spec/spec/mocks/stub_spec.rb +7 -0
- data/spec/spec/runner/command_line_spec.rb +5 -12
- data/spec/spec/runner/drb_command_line_spec.rb +13 -6
- data/spec/spec/runner/formatter/html_formatter_spec.rb +2 -1
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +3 -3
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +20 -2
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +2 -1
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +3 -3
- data/spec/spec/runner/formatter/story/html_formatter_spec.rb +76 -2
- data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +161 -0
- data/spec/spec/runner/formatter/story/progress_bar_formatter_spec.rb +82 -0
- data/spec/spec/runner/heckle_runner_spec.rb +8 -8
- data/spec/spec/runner/option_parser_spec.rb +21 -6
- data/spec/spec/runner/output_one_time_fixture_runner.rb +1 -1
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +6 -0
- data/spec/spec/runner/reporter_spec.rb +51 -5
- data/spec/spec/runner/spec_parser_spec.rb +4 -4
- data/spec/spec/story/runner/plain_text_story_runner_spec.rb +2 -5
- data/spec/spec/story/runner/story_mediator_spec.rb +10 -0
- data/spec/spec/story/runner/story_parser_spec.rb +23 -6
- data/spec/spec/story/scenario_spec.rb +1 -3
- data/spec/spec/story/step_mother_spec.rb +12 -0
- data/spec/spec/story/step_spec.rb +57 -4
- data/spec/spec/story/story_spec.rb +1 -3
- data/spec/spec/story/world_spec.rb +1 -1
- data/spec/spec_helper.rb +21 -68
- data/stories/all.rb +1 -1
- data/stories/configuration/before_blocks.story +21 -0
- data/stories/configuration/stories.rb +7 -0
- data/stories/example_groups/stories.rb +3 -4
- data/stories/resources/spec/before_blocks_example.rb +32 -0
- data/stories/stories/multiline_steps.story +23 -0
- data/stories/stories/steps/multiline_steps.rb +13 -0
- data/stories/stories/stories.rb +6 -0
- data/story_server/prototype/javascripts/builder.js +136 -0
- data/story_server/prototype/javascripts/controls.js +972 -0
- data/story_server/prototype/javascripts/dragdrop.js +976 -0
- data/story_server/prototype/javascripts/effects.js +1117 -0
- data/story_server/prototype/javascripts/prototype.js +4140 -0
- data/story_server/prototype/javascripts/rspec.js +149 -0
- data/story_server/prototype/javascripts/scriptaculous.js +58 -0
- data/story_server/prototype/javascripts/slider.js +276 -0
- data/story_server/prototype/javascripts/sound.js +55 -0
- data/story_server/prototype/javascripts/unittest.js +568 -0
- data/story_server/prototype/lib/server.rb +24 -0
- data/story_server/prototype/stories.html +176 -0
- data/story_server/prototype/stylesheets/rspec.css +136 -0
- data/story_server/prototype/stylesheets/test.css +90 -0
- metadata +166 -166
- data/README +0 -36
- data/UPGRADE +0 -7
- data/bin/spec_translator +0 -8
- data/lib/spec/mocks/argument_constraint_matchers.rb +0 -31
- data/lib/spec/translator.rb +0 -114
- data/spec/spec/example/example_spec.rb +0 -53
- data/spec/spec/runner/execution_context_spec.rb +0 -37
- data/spec/spec/translator_spec.rb +0 -265
|
@@ -6,6 +6,7 @@ module Spec
|
|
|
6
6
|
module Runner
|
|
7
7
|
module Formatter
|
|
8
8
|
describe HtmlFormatter do
|
|
9
|
+
include SandboxedOptions
|
|
9
10
|
['--diff', '--dry-run'].each do |opt|
|
|
10
11
|
def jruby?
|
|
11
12
|
PLATFORM == 'java'
|
|
@@ -22,7 +23,7 @@ module Spec
|
|
|
22
23
|
args = ['failing_examples/mocking_example.rb', 'failing_examples/diffing_spec.rb', 'examples/pure/stubbing_example.rb', 'examples/pure/pending_example.rb', '--format', 'html', opt]
|
|
23
24
|
err = StringIO.new
|
|
24
25
|
out = StringIO.new
|
|
25
|
-
|
|
26
|
+
run_with(
|
|
26
27
|
OptionParser.parse(args, err, out)
|
|
27
28
|
)
|
|
28
29
|
|
|
@@ -5,7 +5,7 @@ module Spec
|
|
|
5
5
|
module Runner
|
|
6
6
|
module Formatter
|
|
7
7
|
describe NestedTextFormatter do
|
|
8
|
-
|
|
8
|
+
include SandboxedOptions
|
|
9
9
|
attr_reader :io, :options, :formatter, :example_group
|
|
10
10
|
before(:each) do
|
|
11
11
|
@io = StringIO.new
|
|
@@ -304,7 +304,7 @@ module Spec
|
|
|
304
304
|
|
|
305
305
|
describe "#example_pending" do
|
|
306
306
|
it "should push pending example name and message" do
|
|
307
|
-
formatter.example_pending(example_group.examples.first, 'reason')
|
|
307
|
+
formatter.example_pending(example_group.examples.first, 'reason', "#{__FILE__}:#{__LINE__}")
|
|
308
308
|
expected_output = <<-OUT
|
|
309
309
|
ExampleGroup
|
|
310
310
|
example (PENDING: reason)
|
|
@@ -313,7 +313,7 @@ module Spec
|
|
|
313
313
|
end
|
|
314
314
|
|
|
315
315
|
it "should dump pending" do
|
|
316
|
-
formatter.example_pending(example_group.examples.first, 'reason')
|
|
316
|
+
formatter.example_pending(example_group.examples.first, 'reason', "#{__FILE__}:#{__LINE__}")
|
|
317
317
|
io.rewind
|
|
318
318
|
formatter.dump_pending
|
|
319
319
|
io.string.should =~ /Pending\:\nExampleGroup example \(reason\)\n/
|
|
@@ -29,7 +29,7 @@ module Spec
|
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
example = example_group.examples.first
|
|
32
|
-
@formatter.example_pending(example, "message")
|
|
32
|
+
@formatter.example_pending(example, "message", "#{__FILE__}:#{__LINE__}")
|
|
33
33
|
@io.rewind
|
|
34
34
|
@formatter.dump_summary(3, 2, 1, 1)
|
|
35
35
|
@io.string.should eql(%Q|
|
|
@@ -94,10 +94,28 @@ EOE
|
|
|
94
94
|
end
|
|
95
95
|
end
|
|
96
96
|
example = example_group.examples.first
|
|
97
|
-
@formatter.example_pending(example, "message")
|
|
97
|
+
@formatter.example_pending(example, "message", "#{__FILE__}:#{__LINE__}")
|
|
98
98
|
@formatter.dump_pending
|
|
99
99
|
@io.string.should =~ /Pending\:\nexample_group example \(message\)\n/
|
|
100
100
|
end
|
|
101
|
+
|
|
102
|
+
it "should dump pending with file and line number" do
|
|
103
|
+
example_group = ExampleGroup.describe("example_group") do
|
|
104
|
+
specify "example" do
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
example = example_group.examples.first
|
|
108
|
+
file = __FILE__
|
|
109
|
+
line = __LINE__ + 1
|
|
110
|
+
@formatter.example_pending(example, "message", "#{__FILE__}:#{__LINE__}")
|
|
111
|
+
@formatter.dump_pending
|
|
112
|
+
@io.string.should ==(<<-HERE)
|
|
113
|
+
*
|
|
114
|
+
Pending:
|
|
115
|
+
example_group example (message)
|
|
116
|
+
Called from #{file}:#{line}
|
|
117
|
+
HERE
|
|
118
|
+
end
|
|
101
119
|
end
|
|
102
120
|
|
|
103
121
|
describe "ProgressBarFormatter outputting to custom out" do
|
|
@@ -6,6 +6,7 @@ module Spec
|
|
|
6
6
|
module Runner
|
|
7
7
|
module Formatter
|
|
8
8
|
describe TextMateFormatter do
|
|
9
|
+
include SandboxedOptions
|
|
9
10
|
attr_reader :root, :suffix, :expected_file
|
|
10
11
|
before do
|
|
11
12
|
@root = File.expand_path(File.dirname(__FILE__) + '/../../../..')
|
|
@@ -33,7 +34,7 @@ module Spec
|
|
|
33
34
|
err = StringIO.new
|
|
34
35
|
out = StringIO.new
|
|
35
36
|
options = ::Spec::Runner::OptionParser.parse(args, err, out)
|
|
36
|
-
|
|
37
|
+
run_with(options)
|
|
37
38
|
|
|
38
39
|
yield(out.string)
|
|
39
40
|
end
|
|
@@ -5,7 +5,7 @@ module Spec
|
|
|
5
5
|
module Runner
|
|
6
6
|
module Formatter
|
|
7
7
|
describe SpecdocFormatter do
|
|
8
|
-
|
|
8
|
+
include SandboxedOptions
|
|
9
9
|
attr_reader :io, :options, :formatter, :example_group
|
|
10
10
|
before(:each) do
|
|
11
11
|
@io = StringIO.new
|
|
@@ -133,12 +133,12 @@ module Spec
|
|
|
133
133
|
|
|
134
134
|
describe "#example_pending" do
|
|
135
135
|
it "should push pending example name and message" do
|
|
136
|
-
formatter.example_pending(example_group.examples.first, 'reason')
|
|
136
|
+
formatter.example_pending(example_group.examples.first, 'reason', "#{__FILE__}:#{__LINE__}")
|
|
137
137
|
io.string.should have_example_group_output("- example (PENDING: reason)\n")
|
|
138
138
|
end
|
|
139
139
|
|
|
140
140
|
it "should dump pending" do
|
|
141
|
-
formatter.example_pending(example_group.examples.first, 'reason')
|
|
141
|
+
formatter.example_pending(example_group.examples.first, 'reason', "#{__FILE__}:#{__LINE__}")
|
|
142
142
|
io.rewind
|
|
143
143
|
formatter.dump_pending
|
|
144
144
|
io.string.should =~ /Pending\:\nExampleGroup example \(reason\)\n/
|
|
@@ -37,12 +37,18 @@ module Spec
|
|
|
37
37
|
|
|
38
38
|
it "should create spans for params" do
|
|
39
39
|
@reporter.step_succeeded('given', 'a $coloured $animal', 'brown', 'dog')
|
|
40
|
-
@
|
|
40
|
+
@reporter.scenario_ended
|
|
41
|
+
@reporter.story_ended('story_title', 'narrative')
|
|
42
|
+
|
|
43
|
+
@out.string.should include(" <li class=\"passed\">Given a <span class=\"param\">brown</span> <span class=\"param\">dog</span></li>\n")
|
|
41
44
|
end
|
|
42
45
|
|
|
43
46
|
it 'should create spanes for params in regexp steps' do
|
|
44
47
|
@reporter.step_succeeded :given, /a (pink|blue) (.*)/, 'brown', 'dog'
|
|
45
|
-
@
|
|
48
|
+
@reporter.scenario_ended
|
|
49
|
+
@reporter.story_ended('story_title', 'narrative')
|
|
50
|
+
|
|
51
|
+
@out.string.should include(" <li class=\"passed\">Given a <span class=\"param\">brown</span> <span class=\"param\">dog</span></li>\n")
|
|
46
52
|
end
|
|
47
53
|
|
|
48
54
|
it "should create a ul for collected_steps" do
|
|
@@ -54,6 +60,74 @@ module Spec
|
|
|
54
60
|
</ul>
|
|
55
61
|
EOF
|
|
56
62
|
end
|
|
63
|
+
|
|
64
|
+
it 'should document additional givens using And' do
|
|
65
|
+
# when
|
|
66
|
+
@reporter.step_succeeded :given, 'step 1'
|
|
67
|
+
@reporter.step_succeeded :given, 'step 2'
|
|
68
|
+
@reporter.scenario_ended
|
|
69
|
+
@reporter.story_ended '', ''
|
|
70
|
+
|
|
71
|
+
# then
|
|
72
|
+
@out.string.should include("Given step 1")
|
|
73
|
+
@out.string.should include("And step 2")
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it 'should document additional events using And' do
|
|
77
|
+
# when
|
|
78
|
+
@reporter.step_succeeded :when, 'step 1'
|
|
79
|
+
@reporter.step_succeeded :when, 'step 2'
|
|
80
|
+
@reporter.scenario_ended
|
|
81
|
+
@reporter.story_ended '', ''
|
|
82
|
+
|
|
83
|
+
# then
|
|
84
|
+
@out.string.should include("When step 1")
|
|
85
|
+
@out.string.should include("And step 2")
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
it 'should document additional outcomes using And' do
|
|
89
|
+
# when
|
|
90
|
+
@reporter.step_succeeded :then, 'step 1'
|
|
91
|
+
@reporter.step_succeeded :then, 'step 2'
|
|
92
|
+
@reporter.scenario_ended
|
|
93
|
+
@reporter.story_ended '', ''
|
|
94
|
+
|
|
95
|
+
# then
|
|
96
|
+
@out.string.should include("Then step 1")
|
|
97
|
+
@out.string.should include("And step 2")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it 'should document a GivenScenario followed by a Given using And' do
|
|
101
|
+
# when
|
|
102
|
+
@reporter.step_succeeded :'given scenario', 'a scenario'
|
|
103
|
+
@reporter.step_succeeded :given, 'a context'
|
|
104
|
+
@reporter.scenario_ended
|
|
105
|
+
@reporter.story_ended '', ''
|
|
106
|
+
|
|
107
|
+
# then
|
|
108
|
+
@out.string.should include("Given scenario a scenario")
|
|
109
|
+
@out.string.should include("And a context")
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "should create a failed story if one of its scenarios fails" do
|
|
113
|
+
@reporter.story_started('story_title', 'narrative')
|
|
114
|
+
@reporter.scenario_started('story_title', 'succeeded_scenario_name')
|
|
115
|
+
@reporter.step_failed('then', 'failed_step', 'en', 'to')
|
|
116
|
+
@reporter.scenario_failed('story_title', 'failed_scenario_name', NameError.new('sup'))
|
|
117
|
+
@reporter.story_ended('story_title', 'narrative')
|
|
118
|
+
|
|
119
|
+
@out.string.should include(" <dl class=\"story failed\">\n <dt>Story: story_title</dt>\n")
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it "should create a failed scenario if one of its steps fails" do
|
|
123
|
+
@reporter.scenario_started('story_title', 'failed_scenario_name')
|
|
124
|
+
@reporter.step_failed('then', 'failed_step', 'en', 'to')
|
|
125
|
+
@reporter.scenario_failed('story_title', 'failed_scenario_name', NameError.new('sup'))
|
|
126
|
+
@reporter.story_ended('story_title', 'narrative')
|
|
127
|
+
|
|
128
|
+
@out.string.should include("<dl class=\"failed\">\n <dt>Scenario: failed_scenario_name</dt>\n")
|
|
129
|
+
end
|
|
130
|
+
|
|
57
131
|
end
|
|
58
132
|
end
|
|
59
133
|
end
|
|
@@ -159,6 +159,45 @@ module Spec
|
|
|
159
159
|
@out.string.should include("3 scenarios: 1 succeeded, 1 failed, 1 pending")
|
|
160
160
|
end
|
|
161
161
|
|
|
162
|
+
it 'should show test summary in red if there were failed scenarios' do
|
|
163
|
+
# when
|
|
164
|
+
@out.stub!(:tty?).and_return(true)
|
|
165
|
+
@options.stub!(:colour).and_return(true)
|
|
166
|
+
|
|
167
|
+
@formatter.scenario_started(nil, nil)
|
|
168
|
+
@formatter.scenario_failed('story', 'scenario', exception_from { raise RuntimeError, 'oops' })
|
|
169
|
+
@formatter.run_ended
|
|
170
|
+
|
|
171
|
+
# then
|
|
172
|
+
@out.string.should include("\e[31m scenarios: 0 succeeded, 1 failed, 0 pending\e[0m")
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it 'should show test summary in yellow if there are pending scenarios' do
|
|
176
|
+
# when
|
|
177
|
+
@out.stub!(:tty?).and_return(true)
|
|
178
|
+
@options.stub!(:colour).and_return(true)
|
|
179
|
+
|
|
180
|
+
@formatter.scenario_started(nil, nil)
|
|
181
|
+
@formatter.scenario_pending('story', 'scenario', '')
|
|
182
|
+
@formatter.run_ended
|
|
183
|
+
|
|
184
|
+
# then
|
|
185
|
+
@out.string.should include("\e[32m scenarios: 0 succeeded, 0 failed, 1 pending\e[0m")
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it 'should show test summary in green if all scenarios pass' do
|
|
189
|
+
# when
|
|
190
|
+
@out.stub!(:tty?).and_return(true)
|
|
191
|
+
@options.stub!(:colour).and_return(true)
|
|
192
|
+
|
|
193
|
+
@formatter.scenario_started(nil, nil)
|
|
194
|
+
@formatter.scenario_succeeded('story', 'scenario')
|
|
195
|
+
@formatter.run_ended
|
|
196
|
+
|
|
197
|
+
# then
|
|
198
|
+
@out.string.should include("\e[32m scenarios: 1 succeeded, 0 failed, 0 pending\e[0m")
|
|
199
|
+
end
|
|
200
|
+
|
|
162
201
|
it 'should produce details of the first failure each failed scenario when the run ends' do
|
|
163
202
|
# when
|
|
164
203
|
@formatter.run_started(3)
|
|
@@ -180,6 +219,19 @@ module Spec
|
|
|
180
219
|
@out.string.should include("RuntimeError: oops3")
|
|
181
220
|
end
|
|
182
221
|
|
|
222
|
+
it 'should produce details of the failures in red when the run ends' do
|
|
223
|
+
# when
|
|
224
|
+
@out.stub!(:tty?).and_return(true)
|
|
225
|
+
@options.stub!(:colour).and_return(true)
|
|
226
|
+
@formatter.scenario_started(nil, nil)
|
|
227
|
+
@formatter.scenario_failed('story', 'scenario1', exception_from { raise RuntimeError, 'oops1' })
|
|
228
|
+
@formatter.run_ended
|
|
229
|
+
|
|
230
|
+
# then
|
|
231
|
+
@out.string.should =~ /\e\[31m[\n\s]*story \(scenario1\) FAILED\e\[0m/m
|
|
232
|
+
@out.string.should =~ /\e\[31m[\n\s]*RuntimeError: oops1\e\[0m/m
|
|
233
|
+
end
|
|
234
|
+
|
|
183
235
|
it 'should produce details of each pending step when the run ends' do
|
|
184
236
|
# when
|
|
185
237
|
@formatter.run_started(2)
|
|
@@ -200,6 +252,7 @@ module Spec
|
|
|
200
252
|
it 'should document a story title and narrative' do
|
|
201
253
|
# when
|
|
202
254
|
@formatter.story_started 'story', 'narrative'
|
|
255
|
+
@formatter.story_ended 'story', 'narrative'
|
|
203
256
|
|
|
204
257
|
# then
|
|
205
258
|
@out.string.should include("Story: story\n\n narrative")
|
|
@@ -208,6 +261,8 @@ module Spec
|
|
|
208
261
|
it 'should document a scenario name' do
|
|
209
262
|
# when
|
|
210
263
|
@formatter.scenario_started 'story', 'scenario'
|
|
264
|
+
@formatter.scenario_ended
|
|
265
|
+
@formatter.story_ended '', ''
|
|
211
266
|
|
|
212
267
|
# then
|
|
213
268
|
@out.string.should include("\n\n Scenario: scenario")
|
|
@@ -218,6 +273,8 @@ module Spec
|
|
|
218
273
|
@formatter.step_succeeded :given, 'a context'
|
|
219
274
|
@formatter.step_succeeded :when, 'an event'
|
|
220
275
|
@formatter.step_succeeded :then, 'an outcome'
|
|
276
|
+
@formatter.scenario_ended
|
|
277
|
+
@formatter.story_ended '', ''
|
|
221
278
|
|
|
222
279
|
# then
|
|
223
280
|
@out.string.should include("\n\n Given a context\n\n When an event\n\n Then an outcome")
|
|
@@ -228,6 +285,8 @@ module Spec
|
|
|
228
285
|
@formatter.step_succeeded :given, 'step 1'
|
|
229
286
|
@formatter.step_succeeded :given, 'step 2'
|
|
230
287
|
@formatter.step_succeeded :given, 'step 3'
|
|
288
|
+
@formatter.scenario_ended
|
|
289
|
+
@formatter.story_ended '', ''
|
|
231
290
|
|
|
232
291
|
# then
|
|
233
292
|
@out.string.should include(" Given step 1\n And step 2\n And step 3")
|
|
@@ -238,6 +297,8 @@ module Spec
|
|
|
238
297
|
@formatter.step_succeeded :when, 'step 1'
|
|
239
298
|
@formatter.step_succeeded :when, 'step 2'
|
|
240
299
|
@formatter.step_succeeded :when, 'step 3'
|
|
300
|
+
@formatter.scenario_ended
|
|
301
|
+
@formatter.story_ended '', ''
|
|
241
302
|
|
|
242
303
|
# then
|
|
243
304
|
@out.string.should include(" When step 1\n And step 2\n And step 3")
|
|
@@ -248,6 +309,8 @@ module Spec
|
|
|
248
309
|
@formatter.step_succeeded :then, 'step 1'
|
|
249
310
|
@formatter.step_succeeded :then, 'step 2'
|
|
250
311
|
@formatter.step_succeeded :then, 'step 3'
|
|
312
|
+
@formatter.scenario_ended
|
|
313
|
+
@formatter.story_ended '', ''
|
|
251
314
|
|
|
252
315
|
# then
|
|
253
316
|
@out.string.should include(" Then step 1\n And step 2\n And step 3")
|
|
@@ -257,6 +320,8 @@ module Spec
|
|
|
257
320
|
# when
|
|
258
321
|
@formatter.step_succeeded :'given scenario', 'a scenario'
|
|
259
322
|
@formatter.step_succeeded :given, 'a context'
|
|
323
|
+
@formatter.scenario_ended
|
|
324
|
+
@formatter.story_ended '', ''
|
|
260
325
|
|
|
261
326
|
# then
|
|
262
327
|
@out.string.should include(" Given scenario a scenario\n And a context")
|
|
@@ -264,27 +329,39 @@ module Spec
|
|
|
264
329
|
|
|
265
330
|
it 'should document steps with replaced params' do
|
|
266
331
|
@formatter.step_succeeded :given, 'a $coloured dog with $n legs', 'pink', 21
|
|
332
|
+
@formatter.scenario_ended
|
|
333
|
+
@formatter.story_ended '', ''
|
|
267
334
|
@out.string.should include(" Given a pink dog with 21 legs")
|
|
268
335
|
end
|
|
269
336
|
|
|
270
337
|
it 'should document steps that include dollar signs ($)' do
|
|
271
338
|
@formatter.step_succeeded :given, 'kicks that cost $$amount', 50
|
|
339
|
+
@formatter.scenario_ended
|
|
340
|
+
@formatter.story_ended '', ''
|
|
272
341
|
@out.string.should include("Given kicks that cost $50")
|
|
273
342
|
end
|
|
274
343
|
|
|
275
344
|
it 'should document regexp steps with replaced params' do
|
|
276
345
|
@formatter.step_succeeded :given, /a (pink|blue) dog with (.*) legs/, 'pink', 21
|
|
346
|
+
@formatter.scenario_ended
|
|
347
|
+
@formatter.story_ended '', ''
|
|
277
348
|
@out.string.should include(" Given a pink dog with 21 legs")
|
|
278
349
|
end
|
|
279
350
|
|
|
280
351
|
it 'should document regex steps that include dollar signs ($)' do
|
|
281
352
|
@formatter.step_succeeded :given, /kicks that cost \$(\d+)/, 50
|
|
353
|
+
@formatter.scenario_ended
|
|
354
|
+
@formatter.story_ended '', ''
|
|
282
355
|
@out.string.should include("Given kicks that cost $50")
|
|
283
356
|
end
|
|
284
357
|
|
|
285
358
|
it "should append PENDING for the first pending step" do
|
|
286
359
|
@formatter.scenario_started('','')
|
|
360
|
+
@formatter.scenario_ended
|
|
361
|
+
@formatter.story_ended '', ''
|
|
287
362
|
@formatter.step_pending(:given, 'a context')
|
|
363
|
+
@formatter.scenario_ended
|
|
364
|
+
@formatter.story_ended '', ''
|
|
288
365
|
|
|
289
366
|
@out.string.should include('Given a context (PENDING)')
|
|
290
367
|
end
|
|
@@ -293,6 +370,8 @@ module Spec
|
|
|
293
370
|
@formatter.scenario_started('','')
|
|
294
371
|
@formatter.step_pending(:given, 'a context')
|
|
295
372
|
@formatter.step_pending(:when, 'I say hey')
|
|
373
|
+
@formatter.scenario_ended
|
|
374
|
+
@formatter.story_ended '', ''
|
|
296
375
|
|
|
297
376
|
@out.string.should include('When I say hey (PENDING)')
|
|
298
377
|
end
|
|
@@ -300,6 +379,8 @@ module Spec
|
|
|
300
379
|
it "should append FAILED for the first failiure" do
|
|
301
380
|
@formatter.scenario_started('','')
|
|
302
381
|
@formatter.step_failed(:given, 'a context')
|
|
382
|
+
@formatter.scenario_ended
|
|
383
|
+
@formatter.story_ended '', ''
|
|
303
384
|
|
|
304
385
|
@out.string.should include('Given a context (FAILED)')
|
|
305
386
|
end
|
|
@@ -308,6 +389,8 @@ module Spec
|
|
|
308
389
|
@formatter.scenario_started('','')
|
|
309
390
|
@formatter.step_failed(:given, 'a context')
|
|
310
391
|
@formatter.step_failed(:when, 'I say hey')
|
|
392
|
+
@formatter.scenario_ended
|
|
393
|
+
@formatter.story_ended '', ''
|
|
311
394
|
|
|
312
395
|
@out.string.should include('When I say hey (SKIPPED)')
|
|
313
396
|
end
|
|
@@ -316,6 +399,8 @@ module Spec
|
|
|
316
399
|
@formatter.scenario_started('','')
|
|
317
400
|
@formatter.step_pending(:given, 'a context')
|
|
318
401
|
@formatter.step_failed(:when, 'I say hey')
|
|
402
|
+
@formatter.scenario_ended
|
|
403
|
+
@formatter.story_ended '', ''
|
|
319
404
|
|
|
320
405
|
@out.string.should include('When I say hey (SKIPPED)')
|
|
321
406
|
end
|
|
@@ -326,6 +411,8 @@ module Spec
|
|
|
326
411
|
|
|
327
412
|
@formatter.scenario_started('','')
|
|
328
413
|
@formatter.step_succeeded(:given, 'a context')
|
|
414
|
+
@formatter.scenario_ended
|
|
415
|
+
@formatter.story_ended '', ''
|
|
329
416
|
|
|
330
417
|
@out.string.should =~ /\e\[32m[\n\s]+Given a context\e\[0m/m
|
|
331
418
|
end
|
|
@@ -336,6 +423,8 @@ module Spec
|
|
|
336
423
|
|
|
337
424
|
@formatter.scenario_started('','')
|
|
338
425
|
@formatter.step_failed(:given, 'a context')
|
|
426
|
+
@formatter.scenario_ended
|
|
427
|
+
@formatter.story_ended '', ''
|
|
339
428
|
|
|
340
429
|
@out.string.should =~ /\e\[31m[\n\s]+Given a context\e\[0m/m
|
|
341
430
|
end
|
|
@@ -346,6 +435,8 @@ module Spec
|
|
|
346
435
|
|
|
347
436
|
@formatter.scenario_started('','')
|
|
348
437
|
@formatter.step_failed(:given, 'a context')
|
|
438
|
+
@formatter.scenario_ended
|
|
439
|
+
@formatter.story_ended '', ''
|
|
349
440
|
|
|
350
441
|
@out.string.should =~ /\e\[31m \(FAILED\)\e\[0m/
|
|
351
442
|
end
|
|
@@ -356,6 +447,8 @@ module Spec
|
|
|
356
447
|
|
|
357
448
|
@formatter.scenario_started('','')
|
|
358
449
|
@formatter.step_pending(:given, 'a context')
|
|
450
|
+
@formatter.scenario_ended
|
|
451
|
+
@formatter.story_ended '', ''
|
|
359
452
|
|
|
360
453
|
@out.string.should =~ /\e\[33m[\n\s]+Given a context\e\[0m/m
|
|
361
454
|
end
|
|
@@ -366,10 +459,70 @@ module Spec
|
|
|
366
459
|
|
|
367
460
|
@formatter.scenario_started('','')
|
|
368
461
|
@formatter.step_pending(:given, 'a context')
|
|
462
|
+
@formatter.scenario_ended
|
|
463
|
+
@formatter.story_ended '', ''
|
|
369
464
|
|
|
370
465
|
@out.string.should =~ /\e\[33m \(PENDING\)\e\[0m/
|
|
371
466
|
end
|
|
372
467
|
|
|
468
|
+
it "should print a scenario in red if any of its steps fail" do
|
|
469
|
+
@out.stub!(:tty?).and_return(true)
|
|
470
|
+
@options.stub!(:colour).and_return(true)
|
|
471
|
+
|
|
472
|
+
@formatter.scenario_started('title','narrative')
|
|
473
|
+
@formatter.step_failed(:given, 'a context')
|
|
474
|
+
@formatter.scenario_failed('story', 'scenario1', exception_from { raise RuntimeError, 'oops1' })
|
|
475
|
+
@formatter.story_ended('title','narrative')
|
|
476
|
+
@out.string.should include("\e[31m\n\n Scenario: narrative\e[0m")
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
it "should print a scenario in yellow if its steps are pending" do
|
|
480
|
+
@out.stub!(:tty?).and_return(true)
|
|
481
|
+
@options.stub!(:colour).and_return(true)
|
|
482
|
+
|
|
483
|
+
@formatter.scenario_started('title','narrative')
|
|
484
|
+
@formatter.step_pending(:given, 'a context')
|
|
485
|
+
@formatter.scenario_ended
|
|
486
|
+
@formatter.story_ended('','')
|
|
487
|
+
@out.string.should include("\e[33m\n\n Scenario: narrative\e[0m")
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
it "should print a story in red if any of its scenarios fail" do
|
|
491
|
+
@out.stub!(:tty?).and_return(true)
|
|
492
|
+
@options.stub!(:colour).and_return(true)
|
|
493
|
+
|
|
494
|
+
@formatter.story_started('story', 'narrative')
|
|
495
|
+
@formatter.scenario_started('','')
|
|
496
|
+
@formatter.step_failed(:given, 'a context')
|
|
497
|
+
@formatter.scenario_failed('story', 'scenario1', exception_from { raise RuntimeError, 'oops1' })
|
|
498
|
+
@formatter.story_ended('story', 'narrative')
|
|
499
|
+
@out.string.should include("\e[31mStory: story\n\n narrative\e[0m")
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
it "should print a story in green if all its scenarios succeed" do
|
|
503
|
+
@out.stub!(:tty?).and_return(true)
|
|
504
|
+
@options.stub!(:colour).and_return(true)
|
|
505
|
+
|
|
506
|
+
@formatter.story_started('story', 'narrative')
|
|
507
|
+
@formatter.scenario_started('','')
|
|
508
|
+
@formatter.step_succeeded(:given, 'a context')
|
|
509
|
+
@formatter.scenario_succeeded('story', 'scenario1')
|
|
510
|
+
@formatter.story_ended('story', 'narrative')
|
|
511
|
+
@out.string.should include("\e[32mStory: story\n\n narrative\e[0m")
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
it "should print a story in yellow if all its scenarios are pending" do
|
|
515
|
+
@out.stub!(:tty?).and_return(true)
|
|
516
|
+
@options.stub!(:colour).and_return(true)
|
|
517
|
+
|
|
518
|
+
@formatter.story_started('story', 'narrative')
|
|
519
|
+
@formatter.scenario_started('','')
|
|
520
|
+
@formatter.step_pending(:given, 'a context')
|
|
521
|
+
@formatter.scenario_pending('story', 'scenario1','pending')
|
|
522
|
+
@formatter.story_ended('story', 'narrative')
|
|
523
|
+
@out.string.should include("\e[33mStory: story\n\n narrative\e[0m")
|
|
524
|
+
end
|
|
525
|
+
|
|
373
526
|
it "should print skipped steps in yellow if the scenario is already pending" do
|
|
374
527
|
@out.stub!(:tty?).and_return(true)
|
|
375
528
|
@options.stub!(:colour).and_return(true)
|
|
@@ -377,6 +530,8 @@ module Spec
|
|
|
377
530
|
@formatter.scenario_started('','')
|
|
378
531
|
@formatter.step_pending(:given, 'a context')
|
|
379
532
|
@formatter.step_failed(:when, 'I say hey')
|
|
533
|
+
@formatter.scenario_ended
|
|
534
|
+
@formatter.story_ended '', ''
|
|
380
535
|
|
|
381
536
|
@out.string.should =~ /\e\[33m[\n\s]+When I say hey\e\[0m/m
|
|
382
537
|
end
|
|
@@ -388,6 +543,8 @@ module Spec
|
|
|
388
543
|
@formatter.scenario_started('','')
|
|
389
544
|
@formatter.step_pending(:given, 'a context')
|
|
390
545
|
@formatter.step_failed(:when, 'I say hey')
|
|
546
|
+
@formatter.scenario_ended
|
|
547
|
+
@formatter.story_ended '', ''
|
|
391
548
|
|
|
392
549
|
@out.string.should =~ /\e\[33m \(SKIPPED\)\e\[0m/
|
|
393
550
|
end
|
|
@@ -399,6 +556,8 @@ module Spec
|
|
|
399
556
|
@formatter.scenario_started('','')
|
|
400
557
|
@formatter.step_failed(:given, 'a context')
|
|
401
558
|
@formatter.step_failed(:when, 'I say hey')
|
|
559
|
+
@formatter.scenario_ended
|
|
560
|
+
@formatter.story_ended '', ''
|
|
402
561
|
|
|
403
562
|
@out.string.should =~ /\e\[31m[\n\s]+When I say hey\e\[0m/m
|
|
404
563
|
end
|
|
@@ -410,6 +569,8 @@ module Spec
|
|
|
410
569
|
@formatter.scenario_started('','')
|
|
411
570
|
@formatter.step_failed(:given, 'a context')
|
|
412
571
|
@formatter.step_failed(:when, 'I say hey')
|
|
572
|
+
@formatter.scenario_failed('story', 'scenario1', exception_from { raise RuntimeError, 'oops1' })
|
|
573
|
+
@formatter.story_ended('','')
|
|
413
574
|
|
|
414
575
|
@out.string.should =~ /\e\[31m \(SKIPPED\)\e\[0m/m
|
|
415
576
|
end
|