rspec 1.1.4 → 1.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,82 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../../spec_helper'
|
2
|
+
require 'spec/runner/formatter/story/progress_bar_formatter'
|
3
|
+
|
4
|
+
module Spec
|
5
|
+
module Runner
|
6
|
+
module Formatter
|
7
|
+
module Story
|
8
|
+
describe ProgressBarFormatter do
|
9
|
+
before :each do
|
10
|
+
# given
|
11
|
+
@out = StringIO.new
|
12
|
+
@out.stub!(:tty?).and_return(true)
|
13
|
+
@tweaker = mock('tweaker')
|
14
|
+
@tweaker.stub!(:tweak_backtrace)
|
15
|
+
@options = mock('options')
|
16
|
+
@options.stub!(:colour).and_return(true)
|
17
|
+
@options.stub!(:backtrace_tweaker).and_return(@tweaker)
|
18
|
+
|
19
|
+
@formatter = ProgressBarFormatter.new(@options, @out)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should print some white space before test summary' do
|
23
|
+
#when
|
24
|
+
@formatter.run_started(1)
|
25
|
+
@formatter.run_ended
|
26
|
+
|
27
|
+
#then
|
28
|
+
@out.string.should =~ /^\n{2}/
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should print how long tests took to complete" do
|
32
|
+
#when
|
33
|
+
now = Time.now
|
34
|
+
future = now+1
|
35
|
+
Time.stub!(:now).and_return(now)
|
36
|
+
@formatter.run_started(1)
|
37
|
+
Time.stub!(:now).and_return(future)
|
38
|
+
@formatter.run_ended
|
39
|
+
|
40
|
+
#then
|
41
|
+
@out.string.should include("Finished in %f seconds" % (future-now))
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
it "should push green dot for passing scenario" do
|
46
|
+
#when
|
47
|
+
@formatter.scenario_started('','')
|
48
|
+
@formatter.step_succeeded('', '')
|
49
|
+
@formatter.scenario_ended
|
50
|
+
@formatter.story_ended '', ''
|
51
|
+
|
52
|
+
#then
|
53
|
+
@out.string.should eql("\e[32m.\e[0m")
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should push red F for failure scenario" do
|
57
|
+
#when
|
58
|
+
@formatter.scenario_started('','')
|
59
|
+
@formatter.step_failed('', '')
|
60
|
+
@formatter.scenario_failed('', '', '')
|
61
|
+
@formatter.story_ended '', ''
|
62
|
+
|
63
|
+
#then
|
64
|
+
@out.string.should eql("\e[31mF\e[0m")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should push yellow P for pending scenario" do
|
68
|
+
#when
|
69
|
+
@formatter.scenario_started('','')
|
70
|
+
@formatter.step_pending('', '')
|
71
|
+
@formatter.scenario_pending('story', '', '')
|
72
|
+
@formatter.story_ended '', ''
|
73
|
+
|
74
|
+
#then
|
75
|
+
@out.string.should eql("\e[33mP\e[0m")
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -21,18 +21,18 @@ unless [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM}
|
|
21
21
|
end
|
22
22
|
|
23
23
|
it "should heckle all methods in all classes in a module" do
|
24
|
-
@heckle_class.should_receive(:new).with("Foo::Bar", "one",
|
25
|
-
@heckle_class.should_receive(:new).with("Foo::Bar", "two",
|
26
|
-
@heckle_class.should_receive(:new).with("Foo::Zap", "three",
|
27
|
-
@heckle_class.should_receive(:new).with("Foo::Zap", "four",
|
24
|
+
@heckle_class.should_receive(:new).with("Foo::Bar", "one", Spec::Runner.options).and_return(@heckle)
|
25
|
+
@heckle_class.should_receive(:new).with("Foo::Bar", "two", Spec::Runner.options).and_return(@heckle)
|
26
|
+
@heckle_class.should_receive(:new).with("Foo::Zap", "three", Spec::Runner.options).and_return(@heckle)
|
27
|
+
@heckle_class.should_receive(:new).with("Foo::Zap", "four", Spec::Runner.options).and_return(@heckle)
|
28
28
|
|
29
29
|
heckle_runner = Spec::Runner::HeckleRunner.new("Foo", @heckle_class)
|
30
30
|
heckle_runner.heckle_with
|
31
31
|
end
|
32
32
|
|
33
33
|
it "should heckle all methods in a class" do
|
34
|
-
@heckle_class.should_receive(:new).with("Foo::Bar", "one",
|
35
|
-
@heckle_class.should_receive(:new).with("Foo::Bar", "two",
|
34
|
+
@heckle_class.should_receive(:new).with("Foo::Bar", "one", Spec::Runner.options).and_return(@heckle)
|
35
|
+
@heckle_class.should_receive(:new).with("Foo::Bar", "two", Spec::Runner.options).and_return(@heckle)
|
36
36
|
|
37
37
|
heckle_runner = Spec::Runner::HeckleRunner.new("Foo::Bar", @heckle_class)
|
38
38
|
heckle_runner.heckle_with
|
@@ -46,14 +46,14 @@ unless [/mswin/, /java/].detect{|p| p =~ RUBY_PLATFORM}
|
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should heckle specific method in a class (with #)" do
|
49
|
-
@heckle_class.should_receive(:new).with("Foo::Bar", "two",
|
49
|
+
@heckle_class.should_receive(:new).with("Foo::Bar", "two", Spec::Runner.options).and_return(@heckle)
|
50
50
|
|
51
51
|
heckle_runner = Spec::Runner::HeckleRunner.new("Foo::Bar#two", @heckle_class)
|
52
52
|
heckle_runner.heckle_with
|
53
53
|
end
|
54
54
|
|
55
55
|
it "should heckle specific method in a class (with .)" do
|
56
|
-
@heckle_class.should_receive(:new).with("Foo::Bar", "two",
|
56
|
+
@heckle_class.should_receive(:new).with("Foo::Bar", "two", Spec::Runner.options).and_return(@heckle)
|
57
57
|
|
58
58
|
heckle_runner = Spec::Runner::HeckleRunner.new("Foo::Bar.two", @heckle_class)
|
59
59
|
heckle_runner.heckle_with
|
@@ -1,6 +1,21 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
2
|
require 'fileutils'
|
3
3
|
|
4
|
+
module Custom
|
5
|
+
class ExampleGroupRunner
|
6
|
+
attr_reader :options, :arg
|
7
|
+
def initialize(options, arg)
|
8
|
+
@options, @arg = options, arg
|
9
|
+
end
|
10
|
+
|
11
|
+
def load_files(files)
|
12
|
+
end
|
13
|
+
|
14
|
+
def run
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
4
19
|
describe "OptionParser" do
|
5
20
|
before(:each) do
|
6
21
|
@out = StringIO.new
|
@@ -76,7 +91,7 @@ describe "OptionParser" do
|
|
76
91
|
it "should print version to stdout" do
|
77
92
|
options = parse(["--version"])
|
78
93
|
@out.rewind
|
79
|
-
@out.read.should match(/
|
94
|
+
@out.read.should match(/rspec version \d+\.\d+\.\d+/n)
|
80
95
|
end
|
81
96
|
|
82
97
|
it "should require file when require specified" do
|
@@ -231,19 +246,19 @@ describe "OptionParser" do
|
|
231
246
|
|
232
247
|
describe "when attempting a focussed spec" do
|
233
248
|
attr_reader :file, :dir
|
234
|
-
before do
|
235
|
-
@original_rspec_options =
|
249
|
+
before(:each) do
|
250
|
+
@original_rspec_options = Spec::Runner.options
|
236
251
|
@file = "#{File.dirname(__FILE__)}/spec_parser/spec_parser_fixture.rb"
|
237
252
|
@dir = File.dirname(file)
|
238
253
|
end
|
239
254
|
|
240
|
-
after do
|
241
|
-
|
255
|
+
after(:each) do
|
256
|
+
Spec::Runner.use @original_rspec_options
|
242
257
|
end
|
243
258
|
|
244
259
|
def parse(args)
|
245
260
|
options = super
|
246
|
-
|
261
|
+
Spec::Runner.use options
|
247
262
|
options.filename_pattern = "*_fixture.rb"
|
248
263
|
options
|
249
264
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
dir = File.dirname(__FILE__)
|
2
2
|
require "#{dir}/../../spec_helper"
|
3
3
|
|
4
|
-
triggering_double_output =
|
4
|
+
triggering_double_output = Spec::Runner.options
|
5
5
|
options = Spec::Runner::OptionParser.parse(
|
6
6
|
["#{dir}/output_one_time_fixture.rb"], $stderr, $stdout
|
7
7
|
)
|
@@ -51,6 +51,12 @@ module Spec
|
|
51
51
|
@tweaker.tweak_backtrace(@error)
|
52
52
|
@error.backtrace.should include("/a/b/c/d.rb")
|
53
53
|
end
|
54
|
+
|
55
|
+
it "should gracefully handle backtraces with newlines" do
|
56
|
+
@error.set_backtrace(["we like\nbin/spec:\nnewlines"])
|
57
|
+
@tweaker.tweak_backtrace(@error)
|
58
|
+
@error.backtrace.should include("we like\nnewlines")
|
59
|
+
end
|
54
60
|
end
|
55
61
|
end
|
56
62
|
end
|
@@ -17,7 +17,7 @@ module Spec
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def failure
|
20
|
-
Mocks::DuckTypeArgConstraint.new(:header, :exception)
|
20
|
+
Mocks::ArgumentConstraints::DuckTypeArgConstraint.new(:header, :exception)
|
21
21
|
end
|
22
22
|
|
23
23
|
def create_example_group(description_text)
|
@@ -155,26 +155,72 @@ module Spec
|
|
155
155
|
end
|
156
156
|
|
157
157
|
describe Reporter, "reporting one pending example (ExamplePendingError)" do
|
158
|
+
before :each do
|
159
|
+
@pending_error = Spec::Example::ExamplePendingError.new("reason")
|
160
|
+
@pending_caller = @pending_error.pending_caller
|
161
|
+
end
|
162
|
+
|
158
163
|
it "should tell formatter example is pending" do
|
159
164
|
example = ExampleGroup.new("example")
|
160
|
-
formatter.should_receive(:example_pending).with(example, "reason")
|
165
|
+
formatter.should_receive(:example_pending).with(example, "reason", @pending_caller)
|
161
166
|
formatter.should_receive(:add_example_group).with(example_group)
|
162
167
|
reporter.add_example_group(example_group)
|
163
|
-
reporter.example_finished(example,
|
168
|
+
reporter.example_finished(example, @pending_error)
|
164
169
|
end
|
165
170
|
|
166
171
|
it "should account for pending example in stats" do
|
167
172
|
example = ExampleGroup.new("example")
|
168
|
-
formatter.should_receive(:example_pending).with(example, "reason")
|
173
|
+
formatter.should_receive(:example_pending).with(example, "reason", @pending_caller)
|
169
174
|
formatter.should_receive(:start_dump)
|
170
175
|
formatter.should_receive(:dump_pending)
|
171
176
|
formatter.should_receive(:dump_summary).with(anything(), 1, 0, 1)
|
172
177
|
formatter.should_receive(:close).with(no_args)
|
173
178
|
formatter.should_receive(:add_example_group).with(example_group)
|
174
179
|
reporter.add_example_group(example_group)
|
175
|
-
reporter.example_finished(example,
|
180
|
+
reporter.example_finished(example, @pending_error)
|
176
181
|
reporter.dump
|
177
182
|
end
|
183
|
+
|
184
|
+
describe "to formatters which have example_pending's arity of 2 (which is now deprecated)" do
|
185
|
+
before :each do
|
186
|
+
Kernel.stub!(:warn).with(Spec::Runner::Reporter::EXAMPLE_PENDING_DEPRECATION_WARNING)
|
187
|
+
|
188
|
+
@deprecated_formatter = Class.new(@formatter.class) do
|
189
|
+
attr_reader :example_passed_to_method, :message_passed_to_method
|
190
|
+
|
191
|
+
def example_pending(example_passed_to_method, message_passed_to_method)
|
192
|
+
@example_passed_to_method = example_passed_to_method
|
193
|
+
@message_passed_to_method = message_passed_to_method
|
194
|
+
end
|
195
|
+
end.new(options, formatter_output)
|
196
|
+
|
197
|
+
options.formatters << @deprecated_formatter
|
198
|
+
end
|
199
|
+
|
200
|
+
it "should pass the correct example to the formatter" do
|
201
|
+
example = ExampleGroup.new("example")
|
202
|
+
reporter.add_example_group(example_group)
|
203
|
+
reporter.example_finished(example, @pending_error)
|
204
|
+
|
205
|
+
@deprecated_formatter.example_passed_to_method.should == example
|
206
|
+
end
|
207
|
+
|
208
|
+
it "should pass the correct pending error message to the formatter" do
|
209
|
+
example = ExampleGroup.new("example")
|
210
|
+
reporter.add_example_group(example_group)
|
211
|
+
reporter.example_finished(example, @pending_error)
|
212
|
+
|
213
|
+
@deprecated_formatter.message_passed_to_method.should == @pending_error.message
|
214
|
+
end
|
215
|
+
|
216
|
+
it "should raise a deprecation warning" do
|
217
|
+
Kernel.should_receive(:warn).with(Spec::Runner::Reporter::EXAMPLE_PENDING_DEPRECATION_WARNING)
|
218
|
+
|
219
|
+
example = ExampleGroup.new("example")
|
220
|
+
reporter.add_example_group(example_group)
|
221
|
+
reporter.example_finished(example, @pending_error)
|
222
|
+
end
|
223
|
+
end
|
178
224
|
end
|
179
225
|
|
180
226
|
describe Reporter, "reporting one pending example (PendingExampleFixedError)" do
|
@@ -3,15 +3,15 @@ require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
|
3
3
|
describe "SpecParser" do
|
4
4
|
attr_reader :parser, :file
|
5
5
|
before(:each) do
|
6
|
-
@original_rspec_options =
|
7
|
-
|
6
|
+
@original_rspec_options = Spec::Runner.options
|
7
|
+
Spec::Runner.use ::Spec::Runner::Options.new(StringIO.new, StringIO.new)
|
8
8
|
@parser = Spec::Runner::SpecParser.new
|
9
9
|
@file = "#{File.dirname(__FILE__)}/spec_parser/spec_parser_fixture.rb"
|
10
10
|
load file
|
11
11
|
end
|
12
12
|
|
13
|
-
after do
|
14
|
-
|
13
|
+
after(:each) do
|
14
|
+
Spec::Runner.use @original_rspec_options
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should find spec name for 'specify' at same line" do
|
@@ -22,11 +22,8 @@ module Spec
|
|
22
22
|
|
23
23
|
it "should parse a story file" do
|
24
24
|
runner = PlainTextStoryRunner.new("path")
|
25
|
-
|
26
|
-
|
27
|
-
}.expect {
|
28
|
-
@parser.should_receive(:parse).with(["this", "and that"])
|
29
|
-
}
|
25
|
+
@parser.should_receive(:parse).with(["this", "and that"])
|
26
|
+
runner.run(mock('runner'))
|
30
27
|
end
|
31
28
|
|
32
29
|
it "should build up a mediator with its own steps and the singleton story_runner" do
|
@@ -126,6 +126,16 @@ module Spec
|
|
126
126
|
@runner.stories.first[:foo].should == :bar
|
127
127
|
end
|
128
128
|
|
129
|
+
it "should description" do
|
130
|
+
@mediator = StoryMediator.new @step_group, @runner, :foo => :bar
|
131
|
+
@mediator.create_story "title", "narrative"
|
132
|
+
@mediator.create_scenario "scenario"
|
133
|
+
@mediator.create_given "something"
|
134
|
+
given = @mediator.last_step
|
135
|
+
@mediator.add_to_last " else"
|
136
|
+
given.name.should == "something else"
|
137
|
+
end
|
138
|
+
|
129
139
|
end
|
130
140
|
|
131
141
|
end
|
@@ -244,9 +244,15 @@ module Spec
|
|
244
244
|
@parser.parse(["Story: s", "Scenario: s", "Given first", "Then: and there"])
|
245
245
|
end
|
246
246
|
|
247
|
-
it "should ignore
|
248
|
-
@parser.parse(["Story: s", "Scenario: s", "Given first", "this is ignored"])
|
247
|
+
it "should ignore lines beginning with '#'" do
|
248
|
+
@parser.parse(["Story: s", "Scenario: s", "Given first", "#this is ignored"])
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should not ignore lines beginning with non-keywords" do
|
252
|
+
@story_mediator.should_receive(:add_to_last).with("\nthis is not ignored")
|
253
|
+
@parser.parse(["Story: s", "Scenario: s", "Given first", "this is not ignored"])
|
249
254
|
end
|
255
|
+
|
250
256
|
end
|
251
257
|
|
252
258
|
describe StoryParser, "in When state" do
|
@@ -309,8 +315,13 @@ module Spec
|
|
309
315
|
@parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: and there"])
|
310
316
|
end
|
311
317
|
|
312
|
-
it "should ignore
|
313
|
-
@parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "this is ignored"])
|
318
|
+
it "should ignore lines beginning with '#'" do
|
319
|
+
@parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "#this is ignored"])
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should not ignore lines beginning with non-keywords" do
|
323
|
+
@story_mediator.should_receive(:add_to_last).with("\nthis is not ignored")
|
324
|
+
@parser.parse(["Story: s", "Scenario: s", "Given: first", "When else", "this is not ignored"])
|
314
325
|
end
|
315
326
|
end
|
316
327
|
|
@@ -375,8 +386,14 @@ module Spec
|
|
375
386
|
@parser.parse(["Story: s", "Scenario: s", "Given: first", "When: else", "Then: what", "And: ever"])
|
376
387
|
end
|
377
388
|
|
378
|
-
|
379
|
-
|
389
|
+
|
390
|
+
it "should ignore lines beginning with '#'" do
|
391
|
+
@parser.parse(["Story: s", "Scenario: s", "Given first", "When else", "Then what", "#this is ignored"])
|
392
|
+
end
|
393
|
+
|
394
|
+
it "should not ignore lines beginning with non-keywords" do
|
395
|
+
@story_mediator.should_receive(:add_to_last).with("\nthis is not ignored")
|
396
|
+
@parser.parse(["Story: s", "Scenario: s", "Given: first", "When else", "Then what", "this is not ignored"])
|
380
397
|
end
|
381
398
|
end
|
382
399
|
end
|
@@ -42,6 +42,18 @@ module Spec
|
|
42
42
|
end.should raise_error(Spec::Example::ExamplePendingError, /Unimplemented/)
|
43
43
|
end
|
44
44
|
|
45
|
+
it "should create a default step with it's name stripped" do
|
46
|
+
# given
|
47
|
+
step_mother = StepMother.new
|
48
|
+
|
49
|
+
# when
|
50
|
+
step = step_mother.find(:given, "doesn't exist\n\n")
|
51
|
+
|
52
|
+
# then
|
53
|
+
step.should be_an_instance_of(Step)
|
54
|
+
step.name.should == "doesn't exist"
|
55
|
+
end
|
56
|
+
|
45
57
|
it 'should clear itself' do
|
46
58
|
# given
|
47
59
|
step_mother = StepMother.new
|
@@ -2,12 +2,17 @@ require File.dirname(__FILE__) + '/story_helper'
|
|
2
2
|
|
3
3
|
module Spec
|
4
4
|
module Story
|
5
|
-
describe Step, "matching" do
|
5
|
+
describe Step, "#matching" do
|
6
6
|
it "should match a text string" do
|
7
7
|
step = Step.new("this text") {}
|
8
8
|
step.matches?("this text").should be_true
|
9
9
|
end
|
10
10
|
|
11
|
+
it "should match a text string that has additional line returns" do
|
12
|
+
step = Step.new("this text") {}
|
13
|
+
step.matches?("this text\n\n").should be_true
|
14
|
+
end
|
15
|
+
|
11
16
|
it "should not match a text string that does not start the same" do
|
12
17
|
step = Step.new("this text") {}
|
13
18
|
step.matches?("Xthis text").should be_false
|
@@ -32,6 +37,11 @@ module Spec
|
|
32
37
|
step = Step.new("1 $one 2 $two 3 $three 4") {}
|
33
38
|
step.matches?("1 a 2 b 3 c 4").should be_true
|
34
39
|
end
|
40
|
+
|
41
|
+
it "should match a text string with two params sharing a prefix" do
|
42
|
+
step = Step.new("I am cool $n times out of $n_total")
|
43
|
+
step.matches?("I am cool 3 times out of 7").should be_true
|
44
|
+
end
|
35
45
|
|
36
46
|
it "should match a text string with a param at the beginning" do
|
37
47
|
step = Step.new("$one 2 3") {}
|
@@ -88,6 +98,11 @@ module Spec
|
|
88
98
|
step.matches?("before () after").should be_true
|
89
99
|
end
|
90
100
|
|
101
|
+
it "should not get bogged down by regular expression special characters in strings" do
|
102
|
+
step = Step.new("These characters should work ? ( ) [ ] { } ^ !") {}
|
103
|
+
step.matches?("These characters should work ? ( ) [ ] { } ^ !").should be_true
|
104
|
+
end
|
105
|
+
|
91
106
|
it "should match any option of an alteration" do
|
92
107
|
step = Step.new(/(he|she) is cool/) {}
|
93
108
|
step.matches?("he is cool").should be_true
|
@@ -121,13 +136,51 @@ module Spec
|
|
121
136
|
step = Step.new(/show me the \$$money/) {}
|
122
137
|
step.matches?("show me the $123").should be_true
|
123
138
|
end
|
139
|
+
|
140
|
+
it "should match a multiline regex" do
|
141
|
+
step = Step.new(/.*should have text.$text/) {}
|
142
|
+
step.matches?(<<TEXT).should be_true
|
143
|
+
should have text
|
144
|
+
this is the text
|
145
|
+
and so is this
|
146
|
+
TEXT
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should match the beginning of the string, not the line" do
|
150
|
+
step = Step.new(/should have text/) {}
|
151
|
+
step.matches?(<<TEXT).should be_false
|
152
|
+
whatever
|
153
|
+
should have text
|
154
|
+
TEXT
|
155
|
+
end
|
156
|
+
|
157
|
+
it "should match the end of the string, not the line" do
|
158
|
+
step = Step.new(/should have text/) {}
|
159
|
+
step.matches?(<<TEXT).should be_false
|
160
|
+
should have text
|
161
|
+
whatever
|
162
|
+
TEXT
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe Step, "#parse_args" do
|
167
|
+
it "should return an empty array for a text string with no parameters" do
|
168
|
+
step = Step.new("this text") {}
|
169
|
+
step.parse_args("this text").should == []
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should return an empty array for a text string with additional line returns and no parameters" do
|
173
|
+
step = Step.new("this text") {}
|
174
|
+
step.parse_args("this text\n\n").should == []
|
175
|
+
end
|
124
176
|
end
|
125
177
|
|
126
178
|
describe Step do
|
127
|
-
it "should
|
179
|
+
it "should be pending with no block" do
|
180
|
+
step = Step.new("foo")
|
128
181
|
lambda {
|
129
|
-
step
|
130
|
-
}.should raise_error
|
182
|
+
step.perform(Object.new)
|
183
|
+
}.should raise_error(Spec::Example::ExamplePendingError, "Not Yet Implemented")
|
131
184
|
end
|
132
185
|
|
133
186
|
it "should perform itself on an object" do
|