rspec 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. data/{CHANGES → History.txt} +116 -64
  2. data/Manifest.txt +403 -0
  3. data/{MIT-LICENSE → README.txt} +43 -0
  4. data/Rakefile +39 -212
  5. data/{TODO → TODO.txt} +0 -0
  6. data/bin/autospec +4 -0
  7. data/bin/spec +1 -1
  8. data/examples/pure/yielding_example.rb +33 -0
  9. data/examples/stories/game-of-life/.loadpath +5 -0
  10. data/examples/stories/game-of-life/behaviour/everything.rb +1 -1
  11. data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +17 -17
  12. data/init.rb +9 -0
  13. data/lib/autotest/discover.rb +1 -1
  14. data/lib/autotest/rspec.rb +3 -29
  15. data/lib/spec.rb +10 -12
  16. data/lib/spec/adapters.rb +1 -0
  17. data/lib/spec/adapters/ruby_engine.rb +26 -0
  18. data/lib/spec/adapters/ruby_engine/mri.rb +8 -0
  19. data/lib/spec/adapters/ruby_engine/rubinius.rb +8 -0
  20. data/lib/spec/example/errors.rb +6 -0
  21. data/lib/spec/example/example_group_methods.rb +17 -14
  22. data/lib/spec/example/example_matcher.rb +2 -0
  23. data/lib/spec/example/example_methods.rb +4 -9
  24. data/lib/spec/example/module_inclusion_warnings.rb +2 -1
  25. data/lib/spec/expectations/extensions/object.rb +2 -2
  26. data/lib/spec/expectations/handler.rb +8 -16
  27. data/lib/spec/extensions/main.rb +2 -17
  28. data/lib/spec/matchers.rb +8 -2
  29. data/lib/spec/matchers/be.rb +0 -3
  30. data/lib/spec/matchers/change.rb +44 -40
  31. data/lib/spec/matchers/has.rb +1 -1
  32. data/lib/spec/matchers/have.rb +17 -12
  33. data/lib/spec/matchers/operator_matcher.rb +10 -4
  34. data/lib/spec/matchers/simple_matcher.rb +113 -10
  35. data/lib/spec/mocks.rb +1 -1
  36. data/lib/spec/mocks/argument_constraints.rb +185 -0
  37. data/lib/spec/mocks/argument_expectation.rb +35 -173
  38. data/lib/spec/mocks/framework.rb +1 -1
  39. data/lib/spec/mocks/message_expectation.rb +30 -5
  40. data/lib/spec/mocks/methods.rb +14 -2
  41. data/lib/spec/mocks/mock.rb +4 -0
  42. data/lib/spec/mocks/proxy.rb +46 -5
  43. data/lib/spec/mocks/spec_methods.rb +9 -1
  44. data/lib/spec/rake/spectask.rb +14 -22
  45. data/lib/spec/rake/verify_rcov.rb +3 -3
  46. data/lib/spec/runner.rb +18 -6
  47. data/lib/spec/runner/backtrace_tweaker.rb +6 -7
  48. data/lib/spec/runner/command_line.rb +6 -17
  49. data/lib/spec/runner/drb_command_line.rb +1 -1
  50. data/lib/spec/runner/formatter/base_formatter.rb +3 -1
  51. data/lib/spec/runner/formatter/base_text_formatter.rb +5 -9
  52. data/lib/spec/runner/formatter/html_formatter.rb +1 -1
  53. data/lib/spec/runner/formatter/nested_text_formatter.rb +1 -1
  54. data/lib/spec/runner/formatter/progress_bar_formatter.rb +2 -2
  55. data/lib/spec/runner/formatter/specdoc_formatter.rb +1 -1
  56. data/lib/spec/runner/formatter/story/html_formatter.rb +62 -16
  57. data/lib/spec/runner/formatter/story/plain_text_formatter.rb +68 -16
  58. data/lib/spec/runner/formatter/story/progress_bar_formatter.rb +42 -0
  59. data/lib/spec/runner/heckle_runner.rb +2 -2
  60. data/lib/spec/runner/option_parser.rb +2 -1
  61. data/lib/spec/runner/options.rb +18 -9
  62. data/lib/spec/runner/reporter.rb +24 -4
  63. data/lib/spec/runner/spec_parser.rb +1 -1
  64. data/lib/spec/story/runner.rb +1 -2
  65. data/lib/spec/story/runner/story_mediator.rb +14 -0
  66. data/lib/spec/story/runner/story_parser.rb +20 -0
  67. data/lib/spec/story/step.rb +40 -28
  68. data/lib/spec/story/step_mother.rb +2 -1
  69. data/lib/spec/story/world.rb +6 -2
  70. data/lib/spec/version.rb +13 -22
  71. data/rake_tasks/failing_examples_with_html.rake +1 -1
  72. data/rake_tasks/verify_rcov.rake +2 -2
  73. data/rspec.gemspec +33 -0
  74. data/spec/autotest/rspec_spec.rb +90 -141
  75. data/spec/spec/adapters/ruby_engine_spec.rb +16 -0
  76. data/spec/spec/example/base_formatter_spec.rb +112 -0
  77. data/spec/spec/example/example_group_factory_spec.rb +2 -2
  78. data/spec/spec/example/example_group_methods_spec.rb +55 -4
  79. data/spec/spec/example/example_group_spec.rb +4 -3
  80. data/spec/spec/example/example_methods_spec.rb +18 -14
  81. data/spec/spec/example/pending_module_spec.rb +38 -0
  82. data/spec/spec/example/shared_example_group_spec.rb +1 -1
  83. data/spec/spec/expectations/extensions/object_spec.rb +0 -12
  84. data/spec/spec/extensions/main_spec.rb +3 -8
  85. data/spec/spec/matchers/change_spec.rb +16 -6
  86. data/spec/spec/matchers/handler_spec.rb +58 -37
  87. data/spec/spec/matchers/has_spec.rb +10 -0
  88. data/spec/spec/matchers/have_spec.rb +105 -2
  89. data/spec/spec/matchers/operator_matcher_spec.rb +35 -2
  90. data/spec/spec/matchers/simple_matcher_spec.rb +64 -2
  91. data/spec/spec/mocks/any_number_of_times_spec.rb +7 -0
  92. data/spec/spec/mocks/bug_report_496.rb +17 -0
  93. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +7 -1
  94. data/spec/spec/mocks/hash_including_matcher_spec.rb +45 -24
  95. data/spec/spec/mocks/mock_spec.rb +55 -10
  96. data/spec/spec/mocks/nil_expectation_warning_spec.rb +54 -0
  97. data/spec/spec/mocks/null_object_mock_spec.rb +14 -0
  98. data/spec/spec/mocks/options_hash_spec.rb +18 -28
  99. data/spec/spec/mocks/partial_mock_spec.rb +2 -0
  100. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +20 -6
  101. data/spec/spec/mocks/stub_spec.rb +7 -0
  102. data/spec/spec/runner/command_line_spec.rb +5 -12
  103. data/spec/spec/runner/drb_command_line_spec.rb +13 -6
  104. data/spec/spec/runner/formatter/html_formatter_spec.rb +2 -1
  105. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +3 -3
  106. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +20 -2
  107. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +2 -1
  108. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +3 -3
  109. data/spec/spec/runner/formatter/story/html_formatter_spec.rb +76 -2
  110. data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +161 -0
  111. data/spec/spec/runner/formatter/story/progress_bar_formatter_spec.rb +82 -0
  112. data/spec/spec/runner/heckle_runner_spec.rb +8 -8
  113. data/spec/spec/runner/option_parser_spec.rb +21 -6
  114. data/spec/spec/runner/output_one_time_fixture_runner.rb +1 -1
  115. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +6 -0
  116. data/spec/spec/runner/reporter_spec.rb +51 -5
  117. data/spec/spec/runner/spec_parser_spec.rb +4 -4
  118. data/spec/spec/story/runner/plain_text_story_runner_spec.rb +2 -5
  119. data/spec/spec/story/runner/story_mediator_spec.rb +10 -0
  120. data/spec/spec/story/runner/story_parser_spec.rb +23 -6
  121. data/spec/spec/story/scenario_spec.rb +1 -3
  122. data/spec/spec/story/step_mother_spec.rb +12 -0
  123. data/spec/spec/story/step_spec.rb +57 -4
  124. data/spec/spec/story/story_spec.rb +1 -3
  125. data/spec/spec/story/world_spec.rb +1 -1
  126. data/spec/spec_helper.rb +21 -68
  127. data/stories/all.rb +1 -1
  128. data/stories/configuration/before_blocks.story +21 -0
  129. data/stories/configuration/stories.rb +7 -0
  130. data/stories/example_groups/stories.rb +3 -4
  131. data/stories/resources/spec/before_blocks_example.rb +32 -0
  132. data/stories/stories/multiline_steps.story +23 -0
  133. data/stories/stories/steps/multiline_steps.rb +13 -0
  134. data/stories/stories/stories.rb +6 -0
  135. data/story_server/prototype/javascripts/builder.js +136 -0
  136. data/story_server/prototype/javascripts/controls.js +972 -0
  137. data/story_server/prototype/javascripts/dragdrop.js +976 -0
  138. data/story_server/prototype/javascripts/effects.js +1117 -0
  139. data/story_server/prototype/javascripts/prototype.js +4140 -0
  140. data/story_server/prototype/javascripts/rspec.js +149 -0
  141. data/story_server/prototype/javascripts/scriptaculous.js +58 -0
  142. data/story_server/prototype/javascripts/slider.js +276 -0
  143. data/story_server/prototype/javascripts/sound.js +55 -0
  144. data/story_server/prototype/javascripts/unittest.js +568 -0
  145. data/story_server/prototype/lib/server.rb +24 -0
  146. data/story_server/prototype/stories.html +176 -0
  147. data/story_server/prototype/stylesheets/rspec.css +136 -0
  148. data/story_server/prototype/stylesheets/test.css +90 -0
  149. metadata +166 -166
  150. data/README +0 -36
  151. data/UPGRADE +0 -7
  152. data/bin/spec_translator +0 -8
  153. data/lib/spec/mocks/argument_constraint_matchers.rb +0 -31
  154. data/lib/spec/translator.rb +0 -114
  155. data/spec/spec/example/example_spec.rb +0 -53
  156. data/spec/spec/runner/execution_context_spec.rb +0 -37
  157. data/spec/spec/translator_spec.rb +0 -265
@@ -0,0 +1,16 @@
1
+ describe Spec::Adapters::RubyEngine do
2
+ it "should default to MRI" do
3
+ Spec::Adapters::RubyEngine.adapter.should be_an_instance_of(Spec::Adapters::RubyEngine::MRI)
4
+ end
5
+
6
+ it "should provide Rubinius for rbx" do
7
+ Spec::Adapters::RubyEngine.stub!(:engine).and_return('rbx')
8
+ Spec::Adapters::RubyEngine.adapter.should be_an_instance_of(Spec::Adapters::RubyEngine::Rubinius)
9
+ end
10
+
11
+ it "should try to find whatever is defined by the RUBY_ENGINE const" do
12
+ Object.stub!(:const_defined?).with('RUBY_ENGINE').and_return(true)
13
+ Object.stub!(:const_get).with('RUBY_ENGINE').and_return("xyz")
14
+ Spec::Adapters::RubyEngine.engine.should == "xyz"
15
+ end
16
+ end
@@ -0,0 +1,112 @@
1
+ require File.dirname(__FILE__) + "/../../spec_helper"
2
+
3
+ module Spec
4
+ module Runner
5
+ module Formatter
6
+ describe BaseFormatter do
7
+ before :each do
8
+ @options, @where = nil, nil
9
+ @formatter = BaseFormatter.new(@options, @where)
10
+ end
11
+
12
+ class HaveInterfaceMatcher
13
+ def initialize(method)
14
+ @method = method
15
+ end
16
+
17
+ attr_reader :object
18
+ attr_reader :method
19
+
20
+ def matches?(object)
21
+ @object = object
22
+ object.respond_to?(@method)
23
+ end
24
+
25
+ def with(arity)
26
+ WithArity.new(self, @method, arity)
27
+ end
28
+
29
+ class WithArity
30
+ def initialize(matcher, method, arity)
31
+ @have_matcher = matcher
32
+ @method = method
33
+ @arity = arity
34
+ end
35
+
36
+ def matches?(an_object)
37
+ @have_matcher.matches?(an_object) && real_arity == @arity
38
+ end
39
+
40
+ def failure_message
41
+ "#{@have_matcher} should have method :#{@method} with #{argument_arity}, but it had #{real_arity}"
42
+ end
43
+
44
+ def arguments
45
+ self
46
+ end
47
+
48
+ alias_method :argument, :arguments
49
+
50
+ private
51
+
52
+ def real_arity
53
+ @have_matcher.object.method(@method).arity
54
+ end
55
+
56
+ def argument_arity
57
+ if @arity == 1
58
+ "1 argument"
59
+ else
60
+ "#{@arity} arguments"
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ def have_interface_for(method)
67
+ HaveInterfaceMatcher.new(method)
68
+ end
69
+
70
+ it "should have start as an interface with one argument"do
71
+ @formatter.should have_interface_for(:start).with(1).argument
72
+ end
73
+
74
+ it "should have add_example_group as an interface with one argument" do
75
+ @formatter.should have_interface_for(:add_example_group).with(1).argument
76
+ end
77
+
78
+ it "should have example_started as an interface with one argument" do
79
+ @formatter.should have_interface_for(:example_started).with(1).argument
80
+ end
81
+
82
+ it "should have example_failed as an interface with three arguments" do
83
+ @formatter.should have_interface_for(:example_failed).with(3).arguments
84
+ end
85
+
86
+ it "should have example_pending as an interface with three arguments" do
87
+ @formatter.should have_interface_for(:example_pending).with(3).arguments
88
+ end
89
+
90
+ it "should have start_dump as an interface with zero arguments" do
91
+ @formatter.should have_interface_for(:start_dump).with(0).arguments
92
+ end
93
+
94
+ it "should have dump_failure as an interface with two arguments" do
95
+ @formatter.should have_interface_for(:dump_failure).with(2).arguments
96
+ end
97
+
98
+ it "should have dump_summary as an interface with two arguments" do
99
+ @formatter.should have_interface_for(:dump_failure).with(2).arguments
100
+ end
101
+
102
+ it "should have dump_pending as an interface with zero arguments" do
103
+ @formatter.should have_interface_for(:dump_pending).with(0).arguments
104
+ end
105
+
106
+ it "should have close as an interface with zero arguments" do
107
+ @formatter.should have_interface_for(:close).with(0).arguments
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -125,14 +125,14 @@ module Spec
125
125
  it "should register ExampleGroup by default" do
126
126
  example_group = Spec::Example::ExampleGroupFactory.create_example_group("The ExampleGroup") do
127
127
  end
128
- rspec_options.example_groups.should include(example_group)
128
+ Spec::Runner.options.example_groups.should include(example_group)
129
129
  end
130
130
 
131
131
  it "should enable unregistering of ExampleGroups" do
132
132
  example_group = Spec::Example::ExampleGroupFactory.create_example_group("The ExampleGroup") do
133
133
  unregister
134
134
  end
135
- rspec_options.example_groups.should_not include(example_group)
135
+ Spec::Runner.options.example_groups.should_not include(example_group)
136
136
  end
137
137
 
138
138
  after(:each) do
@@ -3,10 +3,12 @@ require File.dirname(__FILE__) + '/../../spec_helper'
3
3
  module Spec
4
4
  module Example
5
5
  describe 'ExampleGroupMethods' do
6
- it_should_behave_like "sandboxed rspec_options"
6
+ include SandboxedOptions
7
7
  attr_reader :example_group, :result, :reporter
8
8
  before(:each) do
9
- options.formatters << mock("formatter", :null_object => true)
9
+ # See http://rspec.lighthouseapp.com/projects/5645-rspec/tickets/525-arity-changed-on-partial-mocks#ticket-525-2
10
+ method_with_three_args = lambda { |arg1, arg2, arg3| }
11
+ options.formatters << mock("formatter", :null_object => true, :example_pending => method_with_three_args)
10
12
  options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true)
11
13
  @reporter = FakeReporter.new(@options)
12
14
  options.reporter = reporter
@@ -128,8 +130,11 @@ module Spec
128
130
  def testify
129
131
  raise "This is not a real test"
130
132
  end
133
+ def should_something
134
+ # forces the run
135
+ end
131
136
  end
132
- example_group.examples.length.should == 0
137
+ example_group.examples.length.should == 1
133
138
  example_group.run.should be_true
134
139
  end
135
140
 
@@ -518,6 +523,52 @@ module Spec
518
523
  example_group.registration_backtrace.join("\n").should include("#{__FILE__}:#{__LINE__-1}")
519
524
  end
520
525
  end
526
+
527
+ describe "#run" do
528
+ it "should add_example_group if there are any examples to run" do
529
+ example_group = Class.new(ExampleGroup) do
530
+ it "should do something" do end
531
+ end
532
+ reporter.should_receive(:add_example_group)
533
+ example_group.run
534
+ end
535
+
536
+ it "should NOT add_example_group if there are no examples to run" do
537
+ example_group = Class.new(ExampleGroup) do end
538
+ reporter.should_not_receive(:add_example_group)
539
+ example_group.run
540
+ end
541
+ end
542
+
543
+ describe "#matcher_class=" do
544
+ it "should call new and matches? on the class used for matching examples" do
545
+ example_group = Class.new(ExampleGroup) do
546
+ it "should do something" do end
547
+ class << self
548
+ def specified_examples
549
+ ["something"]
550
+ end
551
+ def to_s
552
+ "TestMatcher"
553
+ end
554
+ end
555
+ end
556
+
557
+ matcher = mock("matcher")
558
+ matcher.should_receive(:matches?).with(["something"]).any_number_of_times
559
+
560
+ matcher_class = Class.new
561
+ matcher_class.should_receive(:new).with("TestMatcher", "should do something").twice.and_return(matcher)
562
+
563
+ begin
564
+ ExampleGroupMethods.matcher_class = matcher_class
565
+
566
+ example_group.run
567
+ ensure
568
+ ExampleGroupMethods.matcher_class = ExampleMatcher
569
+ end
570
+ end
571
+ end
521
572
  end
522
573
  end
523
- end
574
+ end
@@ -65,10 +65,11 @@ module Spec
65
65
  end
66
66
 
67
67
  describe ExampleGroup, "#run" do
68
- it_should_behave_like "sandboxed rspec_options"
68
+ include SandboxedOptions
69
69
  attr_reader :example_group, :formatter, :reporter
70
70
  before :each do
71
- @formatter = mock("formatter", :null_object => true)
71
+ method_with_three_args = lambda { |arg1, arg2, arg3| }
72
+ @formatter = mock("formatter", :null_object => true, :example_pending => method_with_three_args)
72
73
  options.formatters << formatter
73
74
  options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true)
74
75
  @reporter = FakeReporter.new(options)
@@ -233,7 +234,7 @@ module Spec
233
234
  options.examples = ["should be run"]
234
235
  end
235
236
 
236
- it "should run only the example, when there in only one" do
237
+ it "should run only the example, when there is only one" do
237
238
  example_group.run
238
239
  examples_that_were_run.should == ["should be run"]
239
240
  end
@@ -23,9 +23,9 @@ module Spec
23
23
 
24
24
  describe "lifecycle" do
25
25
  before do
26
- @original_rspec_options = $rspec_options
26
+ @original_rspec_options = Spec::Runner.options
27
27
  @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new)
28
- $rspec_options = @options
28
+ Spec::Runner.use @options
29
29
  @options.formatters << mock("formatter", :null_object => true)
30
30
  @options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true)
31
31
  @reporter = FakeReporter.new(@options)
@@ -43,7 +43,7 @@ module Spec
43
43
  end
44
44
 
45
45
  after do
46
- $rspec_options = @original_rspec_options
46
+ Spec::Runner.use @original_rspec_options
47
47
  ExampleMethods.instance_variable_set("@before_all_parts", [])
48
48
  ExampleMethods.instance_variable_set("@before_each_parts", [])
49
49
  ExampleMethods.instance_variable_set("@after_each_parts", [])
@@ -83,19 +83,23 @@ module Spec
83
83
  ExampleMethods.count.should == 7
84
84
  end
85
85
 
86
- describe "run_with_description_capturing" do
87
- before(:each) do
88
- @example_group = Class.new(ExampleGroup) do end
89
- @example = @example_group.new("foo", &(lambda { 2.should == 2 }))
90
- @example.run_with_description_capturing
91
- end
92
-
93
- it "should provide the generated description" do
94
- @example.instance_eval { @_matcher_description }.should == "should == 2"
86
+ describe "eval_block" do
87
+ describe "with a given description" do
88
+ it "should provide the given description" do
89
+ @example_group = Class.new(ExampleGroup) do end
90
+ @example = @example_group.it("given description") { 2.should == 2 }
91
+ @example.eval_block
92
+ @example.description.should == "given description"
93
+ end
95
94
  end
96
95
 
97
- it "should clear the global generated_description" do
98
- Spec::Matchers.generated_description.should == nil
96
+ describe "with no given description" do
97
+ it "should provide the generated description" do
98
+ @example_group = Class.new(ExampleGroup) do end
99
+ @example = @example_group.it { 2.should == 2 }
100
+ @example.eval_block
101
+ @example.description.should == "should == 2"
102
+ end
99
103
  end
100
104
  end
101
105
  end
@@ -18,6 +18,17 @@ module Spec
18
18
  }.should raise_error(ExamplePendingError, /TODO/)
19
19
  end
20
20
 
21
+ it 'should raise an ExamplePendingError if a supplied block fails as expected with a mock' do
22
+ lambda {
23
+ include Pending
24
+ pending "TODO" do
25
+ m = mock('thing')
26
+ m.should_receive(:foo)
27
+ m.rspec_verify
28
+ end
29
+ }.should raise_error(ExamplePendingError, /TODO/)
30
+ end
31
+
21
32
  it 'should raise a PendingExampleFixedError if a supplied block starts working' do
22
33
  lambda {
23
34
  include Pending
@@ -27,5 +38,32 @@ module Spec
27
38
  }.should raise_error(PendingExampleFixedError, /TODO/)
28
39
  end
29
40
  end
41
+
42
+ describe ExamplePendingError do
43
+ it "should have the caller (from two calls from initialization)" do
44
+ two_calls_ago = caller[0]
45
+ ExamplePendingError.new("a message").pending_caller.should == two_calls_ago
46
+ end
47
+
48
+ it "should keep the trace information from initialization" do
49
+ two_calls_ago = caller[0]
50
+ obj = ExamplePendingError.new("a message")
51
+ obj.pending_caller
52
+ def another_caller(obj)
53
+ obj.pending_caller
54
+ end
55
+
56
+ another_caller(obj).should == two_calls_ago
57
+ end
58
+
59
+ it "should have the message provided" do
60
+ ExamplePendingError.new("a message").message.should == "a message"
61
+ end
62
+
63
+ it "should use a 'ExamplePendingError' as it's default message" do
64
+ ExamplePendingError.new.message.should == "Spec::Example::ExamplePendingError"
65
+ end
66
+ end
67
+
30
68
  end
31
69
  end
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/../../spec_helper'
3
3
  module Spec
4
4
  module Example
5
5
  describe ExampleGroup, "with :shared => true" do
6
- it_should_behave_like "sandboxed rspec_options"
6
+ include SandboxedOptions
7
7
  attr_reader :formatter, :example_group
8
8
  before(:each) do
9
9
  @formatter = Spec::Mocks::Mock.new("formatter", :null_object => true)
@@ -39,12 +39,6 @@ describe Object, "#should" do
39
39
  }.should raise_error(Spec::Expectations::InvalidMatcherError)
40
40
  end
41
41
 
42
- it "should raise error if it receives nil" do
43
- lambda {
44
- @target.should nil
45
- }.should raise_error(Spec::Expectations::InvalidMatcherError)
46
- end
47
-
48
42
  it "should raise error if it receives no argument and it is not used as a left side of an operator" do
49
43
  pending "Is it even possible to catch this?"
50
44
  lambda {
@@ -92,12 +86,6 @@ describe Object, "#should_not" do
92
86
  }.should raise_error(Spec::Expectations::InvalidMatcherError)
93
87
  end
94
88
 
95
- it "should raise error if it receives nil" do
96
- lambda {
97
- @target.should_not nil
98
- }.should raise_error(Spec::Expectations::InvalidMatcherError)
99
- end
100
-
101
89
  it "should raise error if it receives no argument and it is not used as a left side of an operator" do
102
90
  pending "Is it even possible to catch this?"
103
91
  lambda {
@@ -3,7 +3,7 @@ require File.dirname(__FILE__) + '/../../spec_helper.rb'
3
3
  module Spec
4
4
  module Extensions
5
5
  describe Main do
6
- it_should_behave_like "sandboxed rspec_options"
6
+ include SandboxedOptions
7
7
  before(:each) do
8
8
  @main = Class.new do; include Main; end
9
9
  end
@@ -12,11 +12,6 @@ module Spec
12
12
  $rspec_story_steps = @original_rspec_story_steps
13
13
  end
14
14
 
15
- it "should create an Options object" do
16
- @main.send(:rspec_options).should be_instance_of(Spec::Runner::Options)
17
- @main.send(:rspec_options).should === $rspec_options
18
- end
19
-
20
15
  specify {@main.should respond_to(:describe)}
21
16
  specify {@main.should respond_to(:context)}
22
17
 
@@ -30,7 +25,7 @@ module Spec
30
25
 
31
26
  it "should registered ExampleGroups by default" do
32
27
  example_group = @main.describe("The ExampleGroup") do end
33
- rspec_options.example_groups.should include(example_group)
28
+ Spec::Runner.options.example_groups.should include(example_group)
34
29
  end
35
30
 
36
31
  it "should not run unregistered ExampleGroups" do
@@ -38,7 +33,7 @@ module Spec
38
33
  unregister
39
34
  end
40
35
 
41
- rspec_options.example_groups.should_not include(example_group)
36
+ Spec::Runner.options.example_groups.should_not include(example_group)
42
37
  end
43
38
 
44
39
  it "should create a shared ExampleGroup with share_examples_for" do
@@ -55,10 +55,9 @@ describe "should change { block }" do
55
55
  end.should fail_with("result should have changed, but is still 5")
56
56
  end
57
57
 
58
- it "should warn if passed a block using do/end" do
58
+ it "should warn if passed a block using do/end instead of {}" do
59
59
  lambda do
60
- lambda {}.should change do
61
- end
60
+ lambda {}.should change do; end
62
61
  end.should raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/)
63
62
  end
64
63
  end
@@ -79,10 +78,9 @@ describe "should_not change { block }" do
79
78
  end.should fail_with("result should not have changed, but did change from 5 to 6")
80
79
  end
81
80
 
82
- it "should warn if passed a block using do/end" do
81
+ it "should warn if passed a block using do/end instead of {}" do
83
82
  lambda do
84
- lambda {}.should_not change do
85
- end
83
+ lambda {}.should_not change do; end
86
84
  end.should raise_error(Spec::Matchers::MatcherError, /block passed to should or should_not/)
87
85
  end
88
86
  end
@@ -317,3 +315,15 @@ describe "should change{ block }.from(old).to(new)" do
317
315
  lambda { @instance.some_value = "cat" }.should change{@instance.some_value}.from("string").to("cat")
318
316
  end
319
317
  end
318
+
319
+ describe Spec::Matchers::Change do
320
+ it "should work when the receiver has implemented #send" do
321
+ @instance = SomethingExpected.new
322
+ @instance.some_value = "string"
323
+ def @instance.send(*args); raise "DOH! Library developers shouldn't use #send!" end
324
+
325
+ lambda {
326
+ lambda { @instance.some_value = "cat" }.should change(@instance, :some_value)
327
+ }.should_not raise_error
328
+ end
329
+ end