rspec 1.2.6 → 1.2.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/History.rdoc +22 -0
  2. data/Manifest.txt +9 -4
  3. data/Rakefile +13 -12
  4. data/Upgrade.rdoc +1 -1
  5. data/features/command_line/line_number_option.feature +56 -0
  6. data/features/command_line/line_number_option_with_example_with_no_name.feature +22 -0
  7. data/features/mocks/stub_implementation.feature +26 -0
  8. data/lib/autotest/rspec.rb +7 -7
  9. data/lib/spec/autorun.rb +1 -1
  10. data/lib/spec/deprecation.rb +3 -3
  11. data/lib/spec/dsl.rb +0 -1
  12. data/lib/spec/dsl/main.rb +6 -6
  13. data/lib/spec/example.rb +28 -29
  14. data/lib/spec/example/args_and_options.rb +1 -1
  15. data/lib/spec/example/before_and_after_hooks.rb +10 -10
  16. data/lib/spec/example/errors.rb +8 -3
  17. data/lib/spec/example/example_group.rb +0 -1
  18. data/lib/spec/example/example_group_factory.rb +3 -3
  19. data/lib/spec/example/example_group_hierarchy.rb +10 -10
  20. data/lib/spec/example/example_group_methods.rb +37 -29
  21. data/lib/spec/example/example_group_proxy.rb +9 -10
  22. data/lib/spec/example/example_matcher.rb +3 -3
  23. data/lib/spec/example/example_methods.rb +11 -11
  24. data/lib/spec/example/example_proxy.rb +5 -5
  25. data/lib/spec/example/module_reopening_fix.rb +7 -7
  26. data/lib/spec/example/pending.rb +1 -1
  27. data/lib/spec/example/predicate_matchers.rb +0 -1
  28. data/lib/spec/example/shared_example_group.rb +5 -5
  29. data/lib/spec/example/subject.rb +12 -16
  30. data/lib/spec/expectations/extensions/kernel.rb +1 -1
  31. data/lib/spec/expectations/fail_with.rb +4 -0
  32. data/lib/spec/matchers/generated_descriptions.rb +4 -16
  33. data/lib/spec/matchers/match.rb +5 -4
  34. data/lib/spec/matchers/matcher.rb +21 -3
  35. data/lib/spec/matchers/operator_matcher.rb +1 -1
  36. data/lib/spec/mocks/errors.rb +1 -1
  37. data/lib/spec/mocks/message_expectation.rb +3 -2
  38. data/lib/spec/mocks/methods.rb +8 -5
  39. data/lib/spec/mocks/proxy.rb +2 -2
  40. data/lib/spec/rake/spectask.rb +9 -3
  41. data/lib/spec/runner.rb +1 -1
  42. data/lib/spec/runner/{spec_parser.rb → line_number_query.rb} +20 -9
  43. data/lib/spec/runner/options.rb +10 -2
  44. data/lib/spec/version.rb +3 -2
  45. data/spec/autotest/failed_results_re_spec.rb +7 -0
  46. data/spec/spec/example/example_group_methods_spec.rb +61 -0
  47. data/spec/spec/example/example_matcher_spec.rb +7 -0
  48. data/spec/spec/example/example_methods_spec.rb +35 -7
  49. data/spec/spec/expectations/fail_with_spec.rb +18 -1
  50. data/spec/spec/matchers/match_spec.rb +20 -0
  51. data/spec/spec/matchers/matcher_spec.rb +27 -28
  52. data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
  53. data/spec/spec/mocks/bug_report_10263_spec.rb +4 -1
  54. data/spec/spec/mocks/bug_report_830_spec.rb +21 -0
  55. data/spec/spec/mocks/options_hash_spec.rb +1 -1
  56. data/spec/spec/mocks/stub_chain_spec.rb +7 -0
  57. data/spec/spec/mocks/stub_implementation_spec.rb +31 -0
  58. data/spec/spec/rake/spectask_spec.rb +150 -0
  59. data/spec/spec/runner/{spec_parser/spec_parser_fixture.rb → line_number_query/line_number_query_fixture.rb} +4 -4
  60. data/spec/spec/runner/{spec_parser_spec.rb → line_number_query_spec.rb} +31 -10
  61. data/spec/spec/runner/option_parser_spec.rb +1 -1
  62. data/spec/spec/runner/options_spec.rb +33 -25
  63. metadata +15 -10
  64. data/.autotest +0 -5
@@ -33,7 +33,7 @@ describe "should_not ==" do
33
33
 
34
34
  it "should return true on success" do
35
35
  subject = "apple"
36
- (subject.should_not == "orange").should be_true
36
+ (subject.should_not == "orange").should be_false
37
37
  end
38
38
 
39
39
  it "should fail when target.==(actual) returns false" do
@@ -7,7 +7,10 @@ describe "Mock" do
7
7
  @mock.should_receive(:msg) do |b|
8
8
  b.should be_true #this call exposes the problem
9
9
  end
10
- @mock.msg(false) rescue nil
10
+ begin
11
+ @mock.msg(false)
12
+ rescue Exception
13
+ end
11
14
  end
12
15
 
13
16
  specify "then the next example should behave as expected instead of saying" do
@@ -0,0 +1,21 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ describe 'Calling a method that catches StandardError' do
6
+ class Foo
7
+ def self.foo
8
+ bar
9
+ rescue StandardError
10
+ end
11
+ end
12
+
13
+ it 'still reports mock failures' do
14
+ Foo.should_not_receive :bar
15
+ lambda do
16
+ Foo.foo
17
+ end.should raise_error(MockExpectationError)
18
+ end
19
+ end
20
+ end
21
+ end
@@ -8,7 +8,7 @@ module Spec
8
8
  mock = Spec::Mocks::Mock.new("a mock")
9
9
  mock.should_receive(:message, :expected_from => "/path/to/blah.ext:37")
10
10
  mock.rspec_verify
11
- rescue => e
11
+ rescue Exception => e
12
12
  ensure
13
13
  e.backtrace.to_s.should =~ /\/path\/to\/blah.ext:37/m
14
14
  end
@@ -22,6 +22,13 @@ module Spec
22
22
  @subject.msg1.msg2.msg3.msg4.should equal(:return_value)
23
23
  end
24
24
 
25
+ it "returns expected value from chaining four method calls twice with some shared" do
26
+ @subject.stub_chain(:msg1, :msg2, :msg3, :msg4).and_return(:first)
27
+ @subject.stub_chain(:msg5, :msg2, :msg3, :msg4).and_return(:second)
28
+
29
+ @subject.msg1.msg2.msg3.msg4.should equal(:first)
30
+ @subject.msg5.msg2.msg3.msg4.should equal(:second)
31
+ end
25
32
  end
26
33
  end
27
34
  end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+
3
+ module Spec
4
+ module Mocks
5
+ describe "stub implementation" do
6
+ context "with no args" do
7
+ it "execs the block when called" do
8
+ obj = stub()
9
+ obj.stub(:foo) { :bar }
10
+ obj.foo.should == :bar
11
+ end
12
+ end
13
+
14
+ context "with one arg" do
15
+ it "execs the block with that arg when called" do
16
+ obj = stub()
17
+ obj.stub(:foo) {|given| given}
18
+ obj.foo(:bar).should == :bar
19
+ end
20
+ end
21
+
22
+ context "with variable args" do
23
+ it "execs the block when called" do
24
+ obj = stub()
25
+ obj.stub(:foo) {|*given| given.first}
26
+ obj.foo(:bar).should == :bar
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,150 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
+ require File.dirname(__FILE__) + '/../../../lib/spec/rake/spectask.rb'
3
+
4
+ module Spec
5
+ module Rake
6
+
7
+ class MockTask
8
+ class << self
9
+ attr_accessor :last_instance, :last_cmd
10
+ end
11
+
12
+ def self.tasks
13
+ @tasks ||= {}
14
+ end
15
+
16
+ def self.reset_tasks
17
+ @tasks = {}
18
+ end
19
+
20
+ def self.task(name)
21
+ tasks[name]
22
+ end
23
+
24
+ def self.register_task(name, block)
25
+ tasks[name] = block
26
+ end
27
+
28
+ def initialize(name, &block)
29
+ MockTask.register_task(name, block)
30
+ MockTask.last_instance = block
31
+ end
32
+
33
+ def self.create_task(name, &block)
34
+ new(name, &block)
35
+ end
36
+ end
37
+
38
+ class SpecTask
39
+ def task(name, &block)
40
+ MockTask.create_task(name, &block)
41
+ end
42
+
43
+ def system(cmd)
44
+ MockTask.last_cmd = cmd
45
+ true
46
+ end
47
+
48
+ def default_ruby_path
49
+ RUBY
50
+ end
51
+ end
52
+
53
+ describe SpecTask do
54
+
55
+ before(:each) do
56
+ MockTask.reset_tasks
57
+ end
58
+
59
+ it "should execute rake's ruby path by default" do
60
+ task = SpecTask.new
61
+ MockTask.last_instance.call
62
+ MockTask.last_cmd.should match(/^#{task.default_ruby_path} /)
63
+ end
64
+
65
+ it "should execute the command with system if ruby_cmd is specified" do
66
+ task = SpecTask.new {|t| t.ruby_cmd = "path_to_multiruby"}
67
+ task.should_receive(:system).and_return(true)
68
+ MockTask.last_instance.call
69
+ end
70
+
71
+ it "should execute the ruby_cmd path if specified" do
72
+ SpecTask.new {|t| t.ruby_cmd = "path_to_multiruby"}
73
+ MockTask.last_instance.call
74
+ MockTask.last_cmd.should match(/^path_to_multiruby /)
75
+ end
76
+
77
+ it "should produce a deprecation warning if the out option is used" do
78
+ SpecTask.new {|t| t.out = "somewhere_over_the_rainbow"}
79
+ STDERR.should_receive(:puts).with("The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead.")
80
+ MockTask.last_instance.call
81
+ end
82
+
83
+ it "should produce an error if failure_message is set and the command fails" do
84
+ task = SpecTask.new {|t| t.failure_message = "oops"; t.fail_on_error = false}
85
+ STDERR.should_receive(:puts).with("oops")
86
+ task.stub(:system).and_return(false)
87
+ MockTask.last_instance.call
88
+ end
89
+
90
+ it "should raise if fail_on_error is set and the command fails" do
91
+ task = SpecTask.new
92
+ task.stub(:system).and_return(false)
93
+ lambda {MockTask.last_instance.call}.should raise_error
94
+ end
95
+
96
+ it "should not raise if fail_on_error is not set and the command fails" do
97
+ task = SpecTask.new {|t| t.fail_on_error = false}
98
+ task.stub(:system).and_return(false)
99
+ lambda {MockTask.last_instance.call}.should_not raise_error
100
+ end
101
+
102
+ context "with ENV['SPEC'] set" do
103
+ before(:each) do
104
+ @orig_env_spec = ENV['SPEC']
105
+ ENV['SPEC'] = 'foo.rb'
106
+ end
107
+ after(:each) do
108
+ ENV['SPEC'] = @orig_env_spec
109
+ end
110
+ it "should use the provided file list" do
111
+ task = SpecTask.new
112
+ task.spec_file_list.should == ["foo.rb"]
113
+ end
114
+ end
115
+
116
+ context "with the rcov option" do
117
+
118
+ it "should create a clobber_rcov task" do
119
+ MockTask.stub!(:create_task)
120
+ MockTask.should_receive(:create_task).with(:clobber_rcov)
121
+ SpecTask.new(:rcov) {|t| t.rcov = true}
122
+ end
123
+
124
+ it "should setup the clobber_rcov task to remove the rcov directory" do
125
+ task = SpecTask.new(:rcov) {|t| t.rcov = true; t.rcov_dir = "path_to_rcov_directory"}
126
+ task.should_receive(:rm_r).with("path_to_rcov_directory")
127
+ MockTask.task(:clobber_rcov).call
128
+ end
129
+
130
+ it "should make the clobber task depend on clobber_rcov" do
131
+ MockTask.stub!(:create_task)
132
+ MockTask.should_receive(:create_task).with(:clobber => [:clobber_rcov])
133
+ SpecTask.new(:rcov) {|t| t.rcov = true}
134
+ end
135
+
136
+ it "should make the rcov task depend on clobber_rcov" do
137
+ MockTask.stub!(:create_task)
138
+ MockTask.should_receive(:create_task).with(:rcov => :clobber_rcov)
139
+ SpecTask.new(:rcov) {|t| t.rcov = true}
140
+ end
141
+
142
+ it "creates an rcov options list" do
143
+ MockTask.stub!(:create_task)
144
+ task = SpecTask.new(:rcov) {|t| t.rcov = true, t.rcov_opts = ['a','b']}
145
+ task.rcov_option_list.should == "a b"
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -20,24 +20,24 @@ describe "d" do
20
20
 
21
21
  end
22
22
 
23
- class SpecParserSubject
23
+ class LineNumberQuerySubject
24
24
  end
25
25
 
26
- describe SpecParserSubject do
26
+ describe LineNumberQuerySubject do
27
27
 
28
28
  it "5" do
29
29
  end
30
30
 
31
31
  end
32
32
 
33
- describe SpecParserSubject, "described" do
33
+ describe LineNumberQuerySubject, "described" do
34
34
 
35
35
  it "6" do
36
36
  end
37
37
 
38
38
  end
39
39
 
40
- describe SpecParserSubject, "described", :something => :something_else do
40
+ describe LineNumberQuerySubject, "described", :something => :something_else do
41
41
 
42
42
  it "7" do
43
43
  end
@@ -1,12 +1,12 @@
1
1
  require File.dirname(__FILE__) + '/../../spec_helper.rb'
2
2
 
3
- describe "SpecParser" do
3
+ describe "LineNumberQuery" do
4
4
  with_sandboxed_options do
5
5
  attr_reader :parser, :file
6
6
 
7
7
  before do
8
- @parser = Spec::Runner::SpecParser.new(options)
9
- @file = "#{File.dirname(__FILE__)}/spec_parser/spec_parser_fixture.rb"
8
+ @parser = Spec::Runner::LineNumberQuery.new(options)
9
+ @file = "#{File.dirname(__FILE__)}/line_number_query/line_number_query_fixture.rb"
10
10
  load file
11
11
  end
12
12
 
@@ -43,27 +43,27 @@ describe "SpecParser" do
43
43
  end
44
44
 
45
45
  it "should find context name for type" do
46
- parser.spec_name_for(file, 26).should == "SpecParserSubject"
46
+ parser.spec_name_for(file, 26).should == "LineNumberQuerySubject"
47
47
  end
48
48
 
49
49
  it "should find context and spec name for type" do
50
- parser.spec_name_for(file, 28).should == "SpecParserSubject 5"
50
+ parser.spec_name_for(file, 28).should == "LineNumberQuerySubject 5"
51
51
  end
52
52
 
53
53
  it "should find context and description for type" do
54
- parser.spec_name_for(file, 33).should == "SpecParserSubject described"
54
+ parser.spec_name_for(file, 33).should == "LineNumberQuerySubject described"
55
55
  end
56
56
 
57
57
  it "should find context and description and example for type" do
58
- parser.spec_name_for(file, 36).should == "SpecParserSubject described 6"
58
+ parser.spec_name_for(file, 36).should == "LineNumberQuerySubject described 6"
59
59
  end
60
60
 
61
61
  it "should find context and description for type with modifications" do
62
- parser.spec_name_for(file, 40).should == "SpecParserSubject described"
62
+ parser.spec_name_for(file, 40).should == "LineNumberQuerySubject described"
63
63
  end
64
64
 
65
65
  it "should find context and described and example for type with modifications" do
66
- parser.spec_name_for(file, 43).should == "SpecParserSubject described 7"
66
+ parser.spec_name_for(file, 43).should == "LineNumberQuerySubject described 7"
67
67
  end
68
68
 
69
69
  it "should find example group" do
@@ -91,9 +91,30 @@ describe "SpecParser" do
91
91
  options = stub('options', :example_groups => [
92
92
  stub('example_group', :location => nil)
93
93
  ])
94
- parser = Spec::Runner::SpecParser.new(options)
94
+ parser = Spec::Runner::LineNumberQuery.new(options)
95
95
  parser.spec_name_for('foo',37).should == nil
96
96
  end
97
97
 
98
+ describe "#example_line_for" do
99
+ it "should find example declared on same line" do
100
+ parser.example_line_for(file, 5).should == 5
101
+ end
102
+
103
+ it "should find example declared on the line above, while still inside the example" do
104
+ parser.example_line_for(file, 6).should == 5
105
+ end
106
+
107
+ it "should find example declared from empty line below the example" do
108
+ parser.example_line_for(file, 7).should == 5
109
+ end
110
+
111
+ it "should find the group declared on the same line" do
112
+ parser.example_line_for(file, 3).should == 3
113
+ end
114
+
115
+ it "should find the group declared above the first example" do
116
+ parser.example_line_for(file, 4).should == 3
117
+ end
118
+ end
98
119
  end
99
120
  end
@@ -267,7 +267,7 @@ describe "OptionParser" do
267
267
  attr_reader :file, :dir
268
268
  before(:each) do
269
269
  @original_rspec_options = Spec::Runner.options
270
- @file = "#{File.dirname(__FILE__)}/spec_parser/spec_parser_fixture.rb"
270
+ @file = "#{File.dirname(__FILE__)}/line_number_query/line_number_query_fixture.rb"
271
271
  @dir = File.dirname(file)
272
272
  end
273
273
 
@@ -19,26 +19,34 @@ module Spec
19
19
  Spec::Expectations.differ = nil
20
20
  end
21
21
 
22
+ describe "#require_ruby_debug" do
23
+ it "should require ruby-debug" do
24
+ @options.stub!(:require)
25
+ @options.should_receive(:require).with("ruby-debug")
26
+ @options.require_ruby_debug
27
+ end
28
+ end
29
+
22
30
  describe "#examples" do
23
31
  it "should default to empty array" do
24
32
  @options.examples.should == []
25
33
  end
26
34
  end
27
-
35
+
28
36
  describe "#include_pattern" do
29
37
  it "should default to '**/*_spec.rb'" do
30
38
  @options.filename_pattern.should == "**/*_spec.rb"
31
39
  end
32
40
  end
33
-
41
+
34
42
  describe "#files_to_load" do
35
-
43
+
36
44
  it "should load files not following pattern if named explicitly" do
37
45
  file = File.expand_path(File.dirname(__FILE__) + "/resources/a_bar.rb")
38
46
  @options.files << file
39
47
  @options.files_to_load.should include(file)
40
48
  end
41
-
49
+
42
50
  describe "with default --pattern" do
43
51
  it "should load files named _spec.rb" do
44
52
  dir = File.expand_path(File.dirname(__FILE__) + "/resources/")
@@ -46,33 +54,33 @@ module Spec
46
54
  @options.files_to_load.should == ["#{dir}/a_spec.rb"]
47
55
  end
48
56
  end
49
-
57
+
50
58
  describe "with explicit pattern (single)" do
51
59
  before(:each) do
52
60
  @options.filename_pattern = "**/*_foo.rb"
53
61
  end
54
-
62
+
55
63
  it "should load files following pattern" do
56
64
  file = File.expand_path(File.dirname(__FILE__) + "/resources/a_foo.rb")
57
65
  @options.files << file
58
66
  @options.files_to_load.should include(file)
59
67
  end
60
-
68
+
61
69
  it "should load files in directories following pattern" do
62
70
  dir = File.expand_path(File.dirname(__FILE__) + "/resources")
63
71
  @options.files << dir
64
72
  @options.files_to_load.should include("#{dir}/a_foo.rb")
65
73
  end
66
-
74
+
67
75
  it "should not load files in directories not following pattern" do
68
76
  dir = File.expand_path(File.dirname(__FILE__) + "/resources")
69
77
  @options.files << dir
70
78
  @options.files_to_load.should_not include("#{dir}/a_bar.rb")
71
79
  end
72
80
  end
73
-
81
+
74
82
  describe "with explicit pattern (comma,separated,values)" do
75
-
83
+
76
84
  before(:each) do
77
85
  @options.filename_pattern = "**/*_foo.rb,**/*_bar.rb"
78
86
  end
@@ -83,16 +91,16 @@ module Spec
83
91
  @options.files_to_load.should include("#{dir}/a_foo.rb")
84
92
  @options.files_to_load.should include("#{dir}/a_bar.rb")
85
93
  end
86
-
94
+
87
95
  it "should support comma separated values with spaces" do
88
96
  dir = File.expand_path(File.dirname(__FILE__) + "/resources")
89
97
  @options.files << dir
90
98
  @options.files_to_load.should include("#{dir}/a_foo.rb")
91
99
  @options.files_to_load.should include("#{dir}/a_bar.rb")
92
100
  end
93
-
101
+
94
102
  end
95
-
103
+
96
104
  end
97
105
 
98
106
  describe "#backtrace_tweaker" do
@@ -106,7 +114,7 @@ module Spec
106
114
  @options.dry_run.should == false
107
115
  end
108
116
  end
109
-
117
+
110
118
  describe "#debug" do
111
119
  it "should default to false" do
112
120
  @options.debug.should == false
@@ -228,7 +236,7 @@ module Spec
228
236
  @options.run_examples.should be_true
229
237
  end
230
238
  end
231
-
239
+
232
240
  describe "debug option not specified" do
233
241
  it "should not cause ruby_debug to be required" do
234
242
  @options.debug = false
@@ -236,7 +244,7 @@ module Spec
236
244
  @options.run_examples.should be_true
237
245
  end
238
246
  end
239
-
247
+
240
248
  describe "#load_class" do
241
249
  it "should raise error when not class name" do
242
250
  lambda do
@@ -251,7 +259,7 @@ module Spec
251
259
  @options.reporter.options.should === @options
252
260
  end
253
261
  end
254
-
262
+
255
263
  describe "#number_of_examples" do
256
264
  context "when --example is parsed" do
257
265
  it "provides the number of examples parsed instead of the total number of examples collected" do
@@ -339,16 +347,16 @@ module Spec
339
347
  Spec::Runner.configuration.stub!(:predicate_matchers).and_return({:this => :that?})
340
348
  group = Class.new(::Spec::Example::ExampleGroupDouble).describe("Some Examples")
341
349
  example = group.new(::Spec::Example::ExampleProxy.new)
342
-
350
+
343
351
  @options.run_examples
344
352
  example.this
345
353
  end
346
-
354
+
347
355
  after(:each) do
348
356
  Spec::Example::ExampleMethods.class_eval "undef :this"
349
357
  end
350
358
  end
351
-
359
+
352
360
  describe "with a mock framework defined as a Symbol" do
353
361
  it "includes Spec::Adapters::MockFramework" do
354
362
  Spec::Runner.configuration.stub!(:mock_framework).and_return('spec/adapters/mock_frameworks/rspec')
@@ -358,7 +366,7 @@ module Spec
358
366
  @options.run_examples
359
367
  end
360
368
  end
361
-
369
+
362
370
  describe "with a mock framework defined as a Module" do
363
371
  it "includes the module in ExampleMethods" do
364
372
  mod = Module.new
@@ -367,7 +375,7 @@ module Spec
367
375
  @options.run_examples
368
376
  end
369
377
  end
370
-
378
+
371
379
  describe "when not given a custom runner" do
372
380
  it "should use the standard" do
373
381
  runner = ::Spec::Runner::ExampleGroupRunner.new(@options)
@@ -430,7 +438,7 @@ module Spec
430
438
  @options.after_suite_parts << lambda do |success|
431
439
  success_result = success
432
440
  end
433
-
441
+
434
442
  @options.run_examples
435
443
  success_result.should be_true
436
444
  end
@@ -457,12 +465,12 @@ module Spec
457
465
  @heckle_runner_mock = mock("HeckleRunner")
458
466
  @options.heckle_runner = @heckle_runner_mock
459
467
  end
460
-
468
+
461
469
  it "should heckle" do
462
470
  @heckle_runner_mock.should_receive(:heckle_with)
463
471
  @options.run_examples
464
472
  end
465
-
473
+
466
474
  it "shouldn't heckle recursively" do
467
475
  heckled = false
468
476
  @heckle_runner_mock.should_receive(:heckle_with) {