rr 0.4.10 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. data/CHANGES +14 -0
  2. data/README.rdoc +67 -13
  3. data/Rakefile +1 -1
  4. data/lib/rr.rb +29 -9
  5. data/lib/rr/adapters/rr_methods.rb +38 -158
  6. data/lib/rr/double.rb +46 -41
  7. data/lib/rr/double_definitions/child_double_definition_creator.rb +23 -0
  8. data/lib/rr/double_definitions/double_definition.rb +212 -0
  9. data/lib/rr/double_definitions/double_definition_creator.rb +153 -0
  10. data/lib/rr/double_definitions/double_definition_creator_proxy.rb +25 -0
  11. data/lib/rr/double_definitions/strategies/implementation/implementation_strategy.rb +15 -0
  12. data/lib/rr/double_definitions/strategies/implementation/proxy.rb +62 -0
  13. data/lib/rr/double_definitions/strategies/implementation/reimplementation.rb +14 -0
  14. data/lib/rr/double_definitions/strategies/scope/instance.rb +15 -0
  15. data/lib/rr/double_definitions/strategies/scope/instance_of_class.rb +43 -0
  16. data/lib/rr/double_definitions/strategies/scope/scope_strategy.rb +15 -0
  17. data/lib/rr/double_definitions/strategies/strategy.rb +70 -0
  18. data/lib/rr/double_definitions/strategies/verification/dont_allow.rb +34 -0
  19. data/lib/rr/double_definitions/strategies/verification/mock.rb +44 -0
  20. data/lib/rr/double_definitions/strategies/verification/stub.rb +45 -0
  21. data/lib/rr/double_definitions/strategies/verification/verification_strategy.rb +15 -0
  22. data/lib/rr/double_injection.rb +21 -15
  23. data/lib/rr/expectations/argument_equality_expectation.rb +2 -1
  24. data/lib/rr/space.rb +23 -22
  25. data/lib/rr/wildcard_matchers/hash_including.rb +29 -0
  26. data/lib/rr/wildcard_matchers/satisfy.rb +26 -0
  27. data/spec/high_level_spec.rb +111 -64
  28. data/spec/rr/adapters/rr_methods_argument_matcher_spec.rb +1 -1
  29. data/spec/rr/adapters/rr_methods_creator_spec.rb +99 -315
  30. data/spec/rr/adapters/rr_methods_space_spec.rb +90 -109
  31. data/spec/rr/adapters/rr_methods_spec_helper.rb +1 -1
  32. data/spec/rr/adapters/rr_methods_times_matcher_spec.rb +1 -1
  33. data/spec/rr/double_definitions/child_double_definition_creator_spec.rb +103 -0
  34. data/spec/rr/double_definitions/double_definition_creator_proxy_spec.rb +83 -0
  35. data/spec/rr/double_definitions/double_definition_creator_spec.rb +495 -0
  36. data/spec/rr/double_definitions/double_definition_spec.rb +1116 -0
  37. data/spec/rr/double_injection/double_injection_bind_spec.rb +111 -0
  38. data/spec/rr/double_injection/double_injection_dispatching_spec.rb +245 -0
  39. data/spec/rr/{double → double_injection}/double_injection_has_original_method_spec.rb +9 -9
  40. data/spec/rr/double_injection/double_injection_reset_spec.rb +90 -0
  41. data/spec/rr/double_injection/double_injection_spec.rb +77 -0
  42. data/spec/rr/double_injection/double_injection_verify_spec.rb +29 -0
  43. data/spec/rr/double_spec.rb +156 -136
  44. data/spec/rr/errors/rr_error_spec.rb +1 -1
  45. data/spec/rr/expectations/any_argument_expectation_spec.rb +1 -1
  46. data/spec/rr/expectations/anything_argument_equality_expectation_spec.rb +6 -30
  47. data/spec/rr/expectations/argument_equality_expectation_spec.rb +35 -18
  48. data/spec/rr/expectations/boolean_argument_equality_expectation_spec.rb +22 -41
  49. data/spec/rr/expectations/hash_including_argument_equality_expectation_spec.rb +82 -0
  50. data/spec/rr/expectations/hash_including_spec.rb +17 -0
  51. data/spec/rr/expectations/satisfy_argument_equality_expectation_spec.rb +59 -0
  52. data/spec/rr/expectations/satisfy_spec.rb +14 -0
  53. data/spec/rr/expectations/times_called_expectation/times_called_expectation_any_times_spec.rb +30 -28
  54. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_least_spec.rb +55 -54
  55. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_most_spec.rb +49 -48
  56. data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +9 -7
  57. data/spec/rr/expectations/times_called_expectation/times_called_expectation_integer_spec.rb +77 -76
  58. data/spec/rr/expectations/times_called_expectation/times_called_expectation_proc_spec.rb +58 -57
  59. data/spec/rr/expectations/times_called_expectation/times_called_expectation_range_spec.rb +59 -58
  60. data/spec/rr/expectations/times_called_expectation/times_called_expectation_spec.rb +25 -24
  61. data/spec/rr/rspec/rspec_adapter_spec.rb +12 -11
  62. data/spec/rr/rspec/rspec_backtrace_tweaking_spec.rb +10 -8
  63. data/spec/rr/rspec/rspec_usage_spec.rb +1 -1
  64. data/spec/rr/space/hash_with_object_id_key_spec.rb +1 -1
  65. data/spec/rr/space/space_spec.rb +330 -192
  66. data/spec/rr/test_unit/test_helper.rb +1 -2
  67. data/spec/rr/test_unit/test_unit_backtrace_test.rb +1 -2
  68. data/spec/rr/test_unit/test_unit_integration_test.rb +1 -2
  69. data/spec/rr/times_called_matchers/any_times_matcher_spec.rb +1 -1
  70. data/spec/rr/times_called_matchers/at_least_matcher_spec.rb +1 -1
  71. data/spec/rr/times_called_matchers/at_most_matcher_spec.rb +1 -1
  72. data/spec/rr/times_called_matchers/integer_matcher_spec.rb +1 -1
  73. data/spec/rr/times_called_matchers/proc_matcher_spec.rb +1 -1
  74. data/spec/rr/times_called_matchers/range_matcher_spec.rb +1 -1
  75. data/spec/rr/times_called_matchers/times_called_matcher_spec.rb +1 -1
  76. data/spec/rr/wildcard_matchers/anything_spec.rb +24 -0
  77. data/spec/rr/wildcard_matchers/boolean_spec.rb +36 -0
  78. data/spec/rr/wildcard_matchers/duck_type_spec.rb +52 -0
  79. data/spec/rr/wildcard_matchers/is_a_spec.rb +32 -0
  80. data/spec/rr/wildcard_matchers/numeric_spec.rb +32 -0
  81. data/spec/rr/wildcard_matchers/range_spec.rb +35 -0
  82. data/spec/rr/wildcard_matchers/regexp_spec.rb +43 -0
  83. data/spec/rr_spec.rb +28 -0
  84. data/spec/spec_helper.rb +84 -0
  85. metadata +43 -29
  86. data/lib/rr/double_creator.rb +0 -271
  87. data/lib/rr/double_definition.rb +0 -179
  88. data/lib/rr/double_definition_builder.rb +0 -44
  89. data/lib/rr/double_definition_creator.rb +0 -156
  90. data/lib/rr/double_definition_creator_proxy.rb +0 -20
  91. data/spec/rr/double/double_injection_bind_spec.rb +0 -105
  92. data/spec/rr/double/double_injection_dispatching_spec.rb +0 -228
  93. data/spec/rr/double/double_injection_reset_spec.rb +0 -86
  94. data/spec/rr/double/double_injection_spec.rb +0 -72
  95. data/spec/rr/double/double_injection_verify_spec.rb +0 -24
  96. data/spec/rr/double_definition_creator_proxy_spec.rb +0 -85
  97. data/spec/rr/double_definition_creator_spec.rb +0 -496
  98. data/spec/rr/double_definition_spec.rb +0 -815
  99. data/spec/rr/expectations/anything_spec.rb +0 -14
  100. data/spec/rr/expectations/boolean_spec.rb +0 -14
  101. data/spec/rr/expectations/duck_type_argument_equality_expectation_spec.rb +0 -71
  102. data/spec/rr/expectations/duck_type_spec.rb +0 -14
  103. data/spec/rr/expectations/is_a_argument_equality_expectation_spec.rb +0 -51
  104. data/spec/rr/expectations/is_a_spec.rb +0 -14
  105. data/spec/rr/expectations/numeric_argument_equality_expectation_spec.rb +0 -47
  106. data/spec/rr/expectations/numeric_spec.rb +0 -14
  107. data/spec/rr/expectations/range_argument_equality_expectation_spec.rb +0 -59
  108. data/spec/rr/expectations/range_spec.rb +0 -10
  109. data/spec/rr/expectations/regexp_argument_equality_expectation_spec.rb +0 -72
  110. data/spec/rr/expectations/regexp_spec.rb +0 -10
@@ -1,81 +1,82 @@
1
- require "spec/spec_helper"
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../../spec_helper")
2
2
 
3
3
  module RR
4
4
  module Expectations
5
- describe TimesCalledExpectation, " with RangeMatcher" do
6
- it_should_behave_like "RR::Expectations::TimesCalledExpectation"
7
- attr_reader :matcher
5
+ describe TimesCalledExpectation do
6
+ context "when using a RangeMatcher" do
7
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation"
8
+ attr_reader :matcher, :expectation
8
9
 
9
- before do
10
- @matcher = TimesCalledMatchers::RangeMatcher.new(1..2)
11
- @expectation = TimesCalledExpectation.new(double, matcher)
12
- end
13
-
14
- describe "#verify" do
15
- it "returns true when times called falls within a range" do
16
- expectation.verify.should == false
17
- expectation.attempt
18
- expectation.verify.should == true
19
- expectation.attempt
20
- expectation.verify.should == true
10
+ before do
11
+ @matcher = TimesCalledMatchers::RangeMatcher.new(1..2)
12
+ @expectation = TimesCalledExpectation.new(double, matcher)
21
13
  end
22
- end
23
14
 
24
- describe "#verify! when passed a Range (1..2)" do
25
- it "passes after attempt! called 1 time" do
26
- expectation.attempt
27
- expectation.verify!
15
+ describe "#verify" do
16
+ it "returns true when times called falls within a range" do
17
+ expectation.verify.should == false
18
+ expectation.attempt
19
+ expectation.verify.should == true
20
+ expectation.attempt
21
+ expectation.verify.should == true
22
+ end
28
23
  end
29
24
 
30
- it "passes after attempt! called 2 times" do
31
- expectation.attempt
32
- expectation.attempt
33
- expectation.verify!
34
- end
25
+ describe "#verify! when passed a Range (1..2)" do
26
+ it "passes after attempt! called 1 time" do
27
+ expectation.attempt
28
+ expectation.verify!
29
+ end
35
30
 
36
- it "can't be called when attempt! is called 3 times" do
37
- expectation.attempt
38
- expectation.attempt
39
- lambda do
31
+ it "passes after attempt! called 2 times" do
40
32
  expectation.attempt
41
- end.should raise_error(Errors::TimesCalledError, "foobar()\nCalled 3 times.\nExpected 1..2 times.")
42
- end
43
- end
33
+ expectation.attempt
34
+ expectation.verify!
35
+ end
44
36
 
45
- describe "#attempt? with RangeMatcher" do
46
- it "returns true when attempted less than low end of range" do
47
- expectation.should be_attempt
37
+ it "can't be called when attempt! is called 3 times" do
38
+ expectation.attempt
39
+ expectation.attempt
40
+ lambda do
41
+ expectation.attempt
42
+ end.should raise_error(Errors::TimesCalledError, "foobar()\nCalled 3 times.\nExpected 1..2 times.")
43
+ end
48
44
  end
49
45
 
50
- it "returns false when attempted in range" do
51
- expectation.attempt
52
- expectation.should be_attempt
53
- expectation.attempt
54
- expectation.should be_attempt
55
- end
46
+ describe "#attempt? with RangeMatcher" do
47
+ it "returns true when attempted less than low end of range" do
48
+ expectation.should be_attempt
49
+ end
50
+
51
+ it "returns false when attempted in range" do
52
+ expectation.attempt
53
+ expectation.should be_attempt
54
+ expectation.attempt
55
+ expectation.should be_attempt
56
+ end
56
57
 
57
- it "raises error before attempted more than expected times" do
58
- 2.times {expectation.attempt}
59
- lambda {expectation.attempt}.should raise_error(
60
- Errors::TimesCalledError
61
- )
58
+ it "raises error before attempted more than expected times" do
59
+ 2.times {expectation.attempt}
60
+ lambda {expectation.attempt}.should raise_error(
61
+ Errors::TimesCalledError
62
+ )
63
+ end
62
64
  end
63
- end
64
65
 
65
- describe "#attempt! for a range expectation" do
66
- it "raises error when attempt! called more than range permits" do
67
- expectation.attempt
68
- expectation.attempt
69
- raises_expectation_error {expectation.attempt}
66
+ describe "#attempt! for a range expectation" do
67
+ it "raises error when attempt! called more than range permits" do
68
+ expectation.attempt
69
+ expectation.attempt
70
+ raises_expectation_error {expectation.attempt}
71
+ end
70
72
  end
71
- end
72
73
 
73
- describe "#terminal? with RangeMatcher" do
74
- it "returns true" do
75
- expectation.should be_terminal
74
+ describe "#terminal? with RangeMatcher" do
75
+ it "returns true" do
76
+ expectation.should be_terminal
77
+ end
76
78
  end
77
79
  end
78
80
  end
79
-
80
81
  end
81
82
  end
@@ -1,36 +1,37 @@
1
- require "spec/spec_helper"
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../../spec_helper")
2
2
 
3
3
  module RR
4
4
  module Expectations
5
- describe TimesCalledExpectation, " with failure" do
6
- it_should_behave_like "RR::Expectations::TimesCalledExpectation"
7
- attr_reader :times, :matcher
5
+ describe TimesCalledExpectation do
6
+ context "with a failure" do
7
+ it_should_behave_like "RR::Expectations::TimesCalledExpectation"
8
+ attr_reader :times, :matcher, :expectation
8
9
 
9
- before do
10
- @times = 0
11
- @matcher = TimesCalledMatchers::IntegerMatcher.new(times)
12
- @expectation = TimesCalledExpectation.new(double, matcher)
13
- end
10
+ before do
11
+ @times = 0
12
+ @matcher = TimesCalledMatchers::IntegerMatcher.new(times)
13
+ @expectation = TimesCalledExpectation.new(double, matcher)
14
+ end
14
15
 
15
- describe "#attempt!" do
16
- it "raises error that includes the double" do
17
- lambda {expectation.attempt}.should raise_error(
18
- Errors::TimesCalledError,
19
- "#{double.formatted_name}\n#{matcher.error_message(1)}"
20
- )
16
+ describe "#attempt!" do
17
+ it "raises error that includes the double" do
18
+ lambda {expectation.attempt}.should raise_error(
19
+ Errors::TimesCalledError,
20
+ "#{double.formatted_name}\n#{matcher.error_message(1)}"
21
+ )
22
+ end
21
23
  end
22
- end
23
24
 
24
- describe "#verify!" do
25
- it "raises error with passed in message prepended" do
26
- expectation.instance_variable_set(:@times_called, 1)
27
- lambda {expectation.verify!}.should raise_error(
28
- Errors::TimesCalledError,
29
- "#{double.formatted_name}\n#{matcher.error_message(1)}"
30
- )
25
+ describe "#verify!" do
26
+ it "raises error with passed in message prepended" do
27
+ expectation.instance_variable_set(:@times_called, 1)
28
+ lambda {expectation.verify!}.should raise_error(
29
+ Errors::TimesCalledError,
30
+ "#{double.formatted_name}\n#{matcher.error_message(1)}"
31
+ )
32
+ end
31
33
  end
32
34
  end
33
35
  end
34
-
35
36
  end
36
37
  end
@@ -1,22 +1,23 @@
1
- require "spec/spec_helper"
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
2
 
3
3
  module RR
4
4
  module Adapters
5
5
  describe Rspec do
6
+ attr_reader :fixture, :subject, :method_name
6
7
  describe "#setup_mocks_for_rspec" do
7
8
  before do
8
9
  @fixture = Object.new
9
- @fixture.extend Rspec
10
+ fixture.extend Rspec
10
11
 
11
12
  @subject = Object.new
12
13
  @method_name = :foobar
13
14
  end
14
15
 
15
16
  it "resets the double_injections" do
16
- RR.double_injection(@subject, @method_name)
17
+ RR.double_injection(subject, method_name)
17
18
  RR.double_injections.should_not be_empty
18
19
 
19
- @fixture.setup_mocks_for_rspec
20
+ fixture.setup_mocks_for_rspec
20
21
  RR.double_injections.should be_empty
21
22
  end
22
23
  end
@@ -24,20 +25,20 @@ module RR
24
25
  describe "#verify_mocks_for_rspec" do
25
26
  before do
26
27
  @fixture = Object.new
27
- @fixture.extend Rspec
28
+ fixture.extend Rspec
28
29
 
29
30
  @subject = Object.new
30
31
  @method_name = :foobar
31
32
  end
32
33
 
33
34
  it "verifies the double_injections" do
34
- double_injection = RR.double_injection(@subject, @method_name)
35
- double = RR::Double.new(double_injection)
35
+ double_injection = RR.double_injection(subject, method_name)
36
+ double = new_double(double_injection)
36
37
 
37
38
  double.once
38
39
 
39
40
  lambda do
40
- @fixture.verify_mocks_for_rspec
41
+ fixture.verify_mocks_for_rspec
41
42
  end.should raise_error(::RR::Errors::TimesCalledError)
42
43
  RR.double_injections.should be_empty
43
44
  end
@@ -46,17 +47,17 @@ module RR
46
47
  describe "#teardown_mocks_for_rspec" do
47
48
  before do
48
49
  @fixture = Object.new
49
- @fixture.extend Rspec
50
+ fixture.extend Rspec
50
51
 
51
52
  @subject = Object.new
52
53
  @method_name = :foobar
53
54
  end
54
55
 
55
56
  it "resets the double_injections" do
56
- RR.double_injection(@subject, @method_name)
57
+ RR.double_injection(subject, method_name)
57
58
  RR.double_injections.should_not be_empty
58
59
 
59
- @fixture.teardown_mocks_for_rspec
60
+ fixture.teardown_mocks_for_rspec
60
61
  RR.double_injections.should be_empty
61
62
  end
62
63
  end
@@ -1,4 +1,4 @@
1
- require "spec/spec_helper"
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
2
 
3
3
  module RR
4
4
  module Adapters
@@ -20,30 +20,32 @@ module RR
20
20
  end
21
21
 
22
22
  describe " backtrace tweaking" do
23
- attr_reader :original_rspec_options, :output
23
+ attr_reader :original_rspec_options, :error, :output
24
24
  before do
25
- @original_rspec_options = $rspec_options
25
+ @original_rspec_options = Spec::Runner.options
26
+ @error = StringIO.new("")
26
27
  @output = StringIO.new("")
27
- $rspec_options = ::Spec::Runner::Options.new(output, StringIO.new)
28
+ Spec::Runner.use(::Spec::Runner::Options.new(error, output))
28
29
  end
29
30
 
30
31
  after do
31
- $rspec_options = original_rspec_options
32
+ Spec::Runner.use(original_rspec_options)
32
33
  end
33
34
 
34
35
  it "hides rr library from the backtrace by default" do
35
36
  subject = @subject
36
- Class.new(::Spec::Example::ExampleGroup) do
37
+ example_group = Class.new(::Spec::Example::ExampleGroup) do
37
38
  describe "Example"
38
39
 
39
40
  it("hides RR framework in backtrace") do
40
41
  mock(subject).foobar()
41
- RR::Space::instance.verify_double(subject, :foobar)
42
+ RR.verify_double(subject, :foobar)
42
43
  end
43
44
  end
44
45
 
45
- $rspec_options.run_examples
46
+ Spec::Runner.options.run_examples
46
47
 
48
+ output.string.should_not be_empty
47
49
  output.string.should_not include("lib/rr")
48
50
  end
49
51
  end
@@ -1,4 +1,4 @@
1
- require "spec/spec_helper"
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
2
 
3
3
  describe RR do
4
4
  describe "#mock" do
@@ -1,4 +1,4 @@
1
- require "spec/spec_helper"
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
2
 
3
3
  module RR
4
4
  describe HashWithObjectIdKey do
@@ -1,371 +1,510 @@
1
- require "spec/spec_helper"
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
2
 
3
3
  module RR
4
4
  describe Space do
5
5
  it_should_behave_like "Swapped Space"
6
+ attr_reader :space, :subject, :method_name, :double_injection
7
+
8
+ before do
9
+ @subject = Object.new
10
+ end
6
11
 
7
12
  describe ".method_missing" do
8
13
  it "proxies to a singleton instance of Space" do
9
14
  create_double_args = nil
10
- (class << @space; self; end).class_eval do
15
+ (class << space; self; end).class_eval do
11
16
  define_method :double_injection do |*args|
12
17
  create_double_args = args
13
18
  end
14
19
  end
15
20
 
16
- Space.double_injection(:foo, :bar)
21
+ space.double_injection(:foo, :bar)
17
22
  create_double_args.should == [:foo, :bar]
18
23
  end
19
24
  end
20
25
 
21
26
  describe "#double_injection" do
22
- before do
23
- @space = Space.new
24
- end
27
+ context "when existing subject == but not === with the same method name" do
28
+ it "creates a new DoubleInjection" do
29
+ subject_1 = []
30
+ subject_2 = []
31
+ (subject_1 === subject_2).should be_true
32
+ subject_1.__id__.should_not == subject_2.__id__
25
33
 
26
- it "creates a new double_injection when existing object == but not === with the same method name" do
27
- object1 = []
28
- object2 = []
29
- (object1 === object2).should be_true
30
- object1.__id__.should_not == object2.__id__
34
+ double_1 = space.double_injection(subject_1, :foobar)
35
+ double_2 = space.double_injection(subject_2, :foobar)
31
36
 
32
- double1 = @space.double_injection(object1, :foobar)
33
- double2 = @space.double_injection(object2, :foobar)
34
-
35
- double1.should_not == double2
37
+ double_1.should_not == double_2
38
+ end
36
39
  end
37
40
 
38
41
  context "when double_injection does not exist" do
39
42
  before do
40
- @object = Object.new
41
- def @object.foobar(*args)
43
+ def subject.foobar(*args)
42
44
  :original_foobar
43
45
  end
44
46
  @method_name = :foobar
45
47
  end
46
48
 
47
- it "returns double_injection and adds double_injection to double_injection list when method_name is a symbol" do
48
- double_injection = @space.double_injection(@object, @method_name)
49
- @space.double_injection(@object, @method_name).should === double_injection
50
- double_injection.object.should === @object
51
- double_injection.method_name.should === @method_name
49
+ context "when method_name is a symbol" do
50
+ it "returns double_injection and adds double_injection to double_injection list" do
51
+ @double_injection = space.double_injection(subject, method_name)
52
+ space.double_injection(subject, method_name).should === double_injection
53
+ double_injection.subject.should === subject
54
+ double_injection.method_name.should === method_name
55
+ end
52
56
  end
53
57
 
54
- it "returns double_injection and adds double_injection to double_injection list when method_name is a string" do
55
- double_injection = @space.double_injection(@object, 'foobar')
56
- @space.double_injection(@object, @method_name).should === double_injection
57
- double_injection.object.should === @object
58
- double_injection.method_name.should === @method_name
58
+ context "when method_name is a string" do
59
+ it "returns double_injection and adds double_injection to double_injection list" do
60
+ @double_injection = space.double_injection(subject, 'foobar')
61
+ space.double_injection(subject, method_name).should === double_injection
62
+ double_injection.subject.should === subject
63
+ double_injection.method_name.should === method_name
64
+ end
59
65
  end
60
66
 
61
67
  it "overrides the method when passing a block" do
62
- double_injection = @space.double_injection(@object, @method_name)
63
- @object.methods.should include("__rr__#{@method_name}")
68
+ @double_injection = space.double_injection(subject, method_name)
69
+ subject.methods.should include("__rr__#{method_name}")
64
70
  end
65
71
  end
66
72
 
67
73
  context "when double_injection exists" do
68
74
  before do
69
- @object = Object.new
70
- def @object.foobar(*args)
75
+ def subject.foobar(*args)
71
76
  :original_foobar
72
77
  end
73
78
  @method_name = :foobar
74
79
  end
75
80
 
76
81
  it "returns the existing double_injection" do
77
- original_foobar_method = @object.method(:foobar)
78
- double_injection = @space.double_injection(@object, 'foobar')
82
+ original_foobar_method = subject.method(:foobar)
83
+ @double_injection = space.double_injection(subject, 'foobar')
79
84
 
80
85
  double_injection.object_has_original_method?.should be_true
81
86
 
82
- @space.double_injection(@object, 'foobar').should === double_injection
87
+ space.double_injection(subject, 'foobar').should === double_injection
83
88
 
84
89
  double_injection.reset
85
- @object.foobar.should == :original_foobar
90
+ subject.foobar.should == :original_foobar
86
91
  end
87
92
  end
88
93
  end
89
94
 
90
95
  describe "#reset" do
96
+ attr_reader :subject_1, :subject_2
91
97
  before do
92
- @space = Space.instance
93
- @object1 = Object.new
94
- @object2 = Object.new
98
+ @subject_1 = Object.new
99
+ @subject_2 = Object.new
95
100
  @method_name = :foobar
96
101
  end
97
102
 
98
103
  it "removes the ordered doubles" do
99
- double1 = @space.double_injection(@object1, :foobar1)
100
- double2 = @space.double_injection(@object1, :foobar2)
101
-
102
- double1 = Double.new(double1)
103
- double2 = Double.new(double2)
104
-
105
- double1.ordered
106
- double2.ordered
107
-
108
- @space.ordered_doubles.should_not be_empty
109
-
110
- @space.reset
111
- @space.ordered_doubles.should be_empty
104
+ double_1 = new_double(
105
+ space.double_injection(subject_1, :foobar1),
106
+ RR::DoubleDefinitions::DoubleDefinition.new(creator = Object.new, subject_1)
107
+ )
108
+ double_2 = new_double(
109
+ space.double_injection(subject_2, :foobar2),
110
+ RR::DoubleDefinitions::DoubleDefinition.new(creator = Object.new, subject_2)
111
+ )
112
+ double_1.ordered
113
+ double_2.ordered
114
+
115
+ space.ordered_doubles.should_not be_empty
116
+
117
+ space.reset
118
+ space.ordered_doubles.should be_empty
112
119
  end
113
120
 
114
121
  it "resets all double_injections" do
115
- double1 = @space.double_injection(@object1, @method_name)
116
- double1_reset_calls = 0
122
+ double_1 = space.double_injection(subject_1, method_name)
123
+ double_1_reset_call_count = 0
117
124
  (
118
- class << double1;
125
+ class << double_1;
119
126
  self;
120
127
  end).class_eval do
121
128
  define_method(:reset) do ||
122
- double1_reset_calls += 1
129
+ double_1_reset_call_count += 1
123
130
  end
124
131
  end
125
- double2 = @space.double_injection(@object2, @method_name)
126
- double2_reset_calls = 0
132
+ double_2 = space.double_injection(subject_2, method_name)
133
+ double_2_reset_call_count = 0
127
134
  (
128
- class << double2;
135
+ class << double_2;
129
136
  self;
130
137
  end).class_eval do
131
138
  define_method(:reset) do ||
132
- double2_reset_calls += 1
139
+ double_2_reset_call_count += 1
133
140
  end
134
141
  end
135
142
 
136
- @space.reset
137
- double1_reset_calls.should == 1
138
- double2_reset_calls.should == 1
143
+ space.reset
144
+ double_1_reset_call_count.should == 1
145
+ double_2_reset_call_count.should == 1
139
146
  end
140
147
  end
141
148
 
142
149
  describe "#reset_double" do
143
150
  before do
144
- @space = Space.new
145
- @object = Object.new
146
151
  @method_name = :foobar
147
152
  end
148
153
 
149
154
  it "resets the double_injections" do
150
- double_injection = @space.double_injection(@object, @method_name)
151
- @space.double_injections[@object][@method_name].should === double_injection
152
- @object.methods.should include("__rr__#{@method_name}")
155
+ @double_injection = space.double_injection(subject, method_name)
156
+ space.double_injections[subject][method_name].should === double_injection
157
+ subject.methods.should include("__rr__#{method_name}")
153
158
 
154
- @space.reset_double(@object, @method_name)
155
- @space.double_injections[@object][@method_name].should be_nil
156
- @object.methods.should_not include("__rr__#{@method_name}")
159
+ space.reset_double(subject, method_name)
160
+ space.double_injections[subject][method_name].should be_nil
161
+ subject.methods.should_not include("__rr__#{method_name}")
157
162
  end
158
163
 
159
- it "removes the object from the double_injections map when it has no double_injections" do
160
- double1 = @space.double_injection(@object, :foobar1)
161
- double2 = @space.double_injection(@object, :foobar2)
164
+ context "when it has no double_injections" do
165
+ it "removes the subject from the double_injections map" do
166
+ double_1 = space.double_injection(subject, :foobar1)
167
+ double_2 = space.double_injection(subject, :foobar2)
162
168
 
163
- @space.double_injections.include?(@object).should == true
164
- @space.double_injections[@object][:foobar1].should_not be_nil
165
- @space.double_injections[@object][:foobar2].should_not be_nil
169
+ space.double_injections.include?(subject).should == true
170
+ space.double_injections[subject][:foobar1].should_not be_nil
171
+ space.double_injections[subject][:foobar2].should_not be_nil
166
172
 
167
- @space.reset_double(@object, :foobar1)
168
- @space.double_injections.include?(@object).should == true
169
- @space.double_injections[@object][:foobar1].should be_nil
170
- @space.double_injections[@object][:foobar2].should_not be_nil
173
+ space.reset_double(subject, :foobar1)
174
+ space.double_injections.include?(subject).should == true
175
+ space.double_injections[subject][:foobar1].should be_nil
176
+ space.double_injections[subject][:foobar2].should_not be_nil
171
177
 
172
- @space.reset_double(@object, :foobar2)
173
- @space.double_injections.include?(@object).should == false
178
+ space.reset_double(subject, :foobar2)
179
+ space.double_injections.include?(subject).should == false
180
+ end
174
181
  end
175
182
  end
176
183
 
177
184
  describe "#reset_double_injections" do
185
+ attr_reader :subject_1, :subject_2
178
186
  before do
179
- @object1 = Object.new
180
- @object2 = Object.new
187
+ @subject_1 = Object.new
188
+ @subject_2 = Object.new
181
189
  @method_name = :foobar
182
190
  end
183
191
 
184
192
  it "resets the double_injection and removes it from the double_injections list" do
185
- double1 = @space.double_injection(@object1, @method_name)
186
- double1_reset_calls = 0
187
- (class << double1; self; end).class_eval do
188
- define_method(:reset) do ||
189
- double1_reset_calls += 1
193
+ double_injection_1 = space.double_injection(subject_1, method_name)
194
+ double_1_reset_call_count = 0
195
+ (class << double_injection_1; self; end).class_eval do
196
+ define_method(:reset) do
197
+ double_1_reset_call_count += 1
190
198
  end
191
199
  end
192
- double2 = @space.double_injection(@object2, @method_name)
193
- double2_reset_calls = 0
194
- (class << double2; self; end).class_eval do
195
- define_method(:reset) do ||
196
- double2_reset_calls += 1
200
+ double_injection_2 = space.double_injection(subject_2, method_name)
201
+ double_2_reset_call_count = 0
202
+ (class << double_injection_2; self; end).class_eval do
203
+ define_method(:reset) do
204
+ double_2_reset_call_count += 1
197
205
  end
198
206
  end
199
207
 
200
- @space.__send__(:reset_double_injections)
201
- double1_reset_calls.should == 1
202
- double2_reset_calls.should == 1
208
+ space.__send__(:reset_double_injections)
209
+ double_1_reset_call_count.should == 1
210
+ double_2_reset_call_count.should == 1
203
211
  end
204
212
  end
205
-
213
+
206
214
  describe "#register_ordered_double" do
207
215
  before(:each) do
208
- @object = Object.new
209
216
  @method_name = :foobar
210
- @double_injection = @space.double_injection(@object, @method_name)
217
+ @double_injection = space.double_injection(subject, method_name)
211
218
  end
212
219
 
213
220
  it "adds the ordered double to the ordered_doubles collection" do
214
- double1 = Double.new(@double_injection)
221
+ double_1 = new_double
215
222
 
216
- @space.ordered_doubles.should == []
217
- @space.register_ordered_double double1
218
- @space.ordered_doubles.should == [double1]
223
+ space.ordered_doubles.should == []
224
+ space.register_ordered_double double_1
225
+ space.ordered_doubles.should == [double_1]
219
226
 
220
- double2 = Double.new(@double_injection)
221
- @space.register_ordered_double double2
222
- @space.ordered_doubles.should == [double1, double2]
227
+ double_2 = new_double
228
+ space.register_ordered_double double_2
229
+ space.ordered_doubles.should == [double_1, double_2]
223
230
  end
224
231
  end
225
232
 
226
233
  describe "#verify_doubles" do
234
+ attr_reader :subject_1, :subject_2, :subject3, :double_1, :double_2, :double3
227
235
  before do
228
- @object1 = Object.new
229
- @object2 = Object.new
236
+ @subject_1 = Object.new
237
+ @subject_2 = Object.new
238
+ @subject3 = Object.new
230
239
  @method_name = :foobar
240
+ @double_1 = space.double_injection(subject_1, method_name)
241
+ @double_2 = space.double_injection(subject_2, method_name)
242
+ @double3 = space.double_injection(subject3, method_name)
231
243
  end
232
244
 
233
- it "verifies and deletes the double_injections" do
234
- double1 = @space.double_injection(@object1, @method_name)
235
- double1_verify_calls = 0
236
- double1_reset_calls = 0
237
- (class << double1; self; end).class_eval do
238
- define_method(:verify) do ||
239
- double1_verify_calls += 1
245
+ context "when passed no arguments" do
246
+ it "verifies and deletes the double_injections" do
247
+ double_1_verify_call_count = 0
248
+ double_1_reset_call_count = 0
249
+ (class << double_1; self; end).class_eval do
250
+ define_method(:verify) do
251
+ double_1_verify_call_count += 1
252
+ end
253
+ define_method(:reset) do
254
+ double_1_reset_call_count += 1
255
+ end
240
256
  end
241
- define_method(:reset) do ||
242
- double1_reset_calls += 1
257
+
258
+ double_2_verify_call_count = 0
259
+ double_2_reset_call_count = 0
260
+ (class << double_2; self; end).class_eval do
261
+ define_method(:verify) do
262
+ double_2_verify_call_count += 1
263
+ end
264
+ define_method(:reset) do
265
+ double_2_reset_call_count += 1
266
+ end
243
267
  end
268
+
269
+ space.verify_doubles
270
+ double_1_verify_call_count.should == 1
271
+ double_2_verify_call_count.should == 1
272
+ double_1_reset_call_count.should == 1
273
+ double_1_reset_call_count.should == 1
244
274
  end
245
- double2 = @space.double_injection(@object2, @method_name)
246
- double2_verify_calls = 0
247
- double2_reset_calls = 0
248
- (class << double2; self; end).class_eval do
249
- define_method(:verify) do ||
250
- double2_verify_calls += 1
275
+ end
276
+
277
+ context "when passed an Object that has at least one DoubleInjection" do
278
+ it "verifies all Doubles injected into the Object" do
279
+ double_1_verify_call_count = 0
280
+ double_1_reset_call_count = 0
281
+ (class << double_1; self; end).class_eval do
282
+ define_method(:verify) do
283
+ double_1_verify_call_count += 1
284
+ end
285
+ define_method(:reset) do
286
+ double_1_reset_call_count += 1
287
+ end
251
288
  end
252
- define_method(:reset) do ||
253
- double2_reset_calls += 1
289
+
290
+ double_2_verify_call_count = 0
291
+ double_2_reset_call_count = 0
292
+ (class << double_2; self; end).class_eval do
293
+ define_method(:verify) do
294
+ double_2_verify_call_count += 1
295
+ end
296
+ define_method(:reset) do
297
+ double_2_reset_call_count += 1
298
+ end
254
299
  end
300
+
301
+ space.verify_doubles(subject_1)
302
+
303
+ double_1_verify_call_count.should == 1
304
+ double_1_reset_call_count.should == 1
305
+ double_2_verify_call_count.should == 0
306
+ double_2_reset_call_count.should == 0
255
307
  end
308
+ end
309
+
310
+ context "when passed multiple Objects with at least one DoubleInjection" do
311
+ it "verifies the Doubles injected into all of the Objects" do
312
+ double_1_verify_call_count = 0
313
+ double_1_reset_call_count = 0
314
+ (class << double_1; self; end).class_eval do
315
+ define_method(:verify) do
316
+ double_1_verify_call_count += 1
317
+ end
318
+ define_method(:reset) do
319
+ double_1_reset_call_count += 1
320
+ end
321
+ end
256
322
 
257
- @space.verify_doubles
258
- double1_verify_calls.should == 1
259
- double2_verify_calls.should == 1
260
- double1_reset_calls.should == 1
261
- double1_reset_calls.should == 1
323
+ double_2_verify_call_count = 0
324
+ double_2_reset_call_count = 0
325
+ (class << double_2; self; end).class_eval do
326
+ define_method(:verify) do
327
+ double_2_verify_call_count += 1
328
+ end
329
+ define_method(:reset) do
330
+ double_2_reset_call_count += 1
331
+ end
332
+ end
333
+
334
+ double3_verify_call_count = 0
335
+ double3_reset_call_count = 0
336
+ (class << double3; self; end).class_eval do
337
+ define_method(:verify) do
338
+ double3_verify_call_count += 1
339
+ end
340
+ define_method(:reset) do
341
+ double3_reset_call_count += 1
342
+ end
343
+ end
344
+
345
+ space.verify_doubles(subject_1, subject_2)
346
+
347
+ double_1_verify_call_count.should == 1
348
+ double_1_reset_call_count.should == 1
349
+ double_2_verify_call_count.should == 1
350
+ double_2_reset_call_count.should == 1
351
+ double3_verify_call_count.should == 0
352
+ double3_reset_call_count.should == 0
353
+ end
354
+ end
355
+
356
+ context "when passed an subject that does not have a DoubleInjection" do
357
+ it "does not raise an error" do
358
+ double_1_verify_call_count = 0
359
+ double_1_reset_call_count = 0
360
+ (class << double_1; self; end).class_eval do
361
+ define_method(:verify) do
362
+ double_1_verify_call_count += 1
363
+ end
364
+ define_method(:reset) do
365
+ double_1_reset_call_count += 1
366
+ end
367
+ end
368
+
369
+ double_2_verify_call_count = 0
370
+ double_2_reset_call_count = 0
371
+ (class << double_2; self; end).class_eval do
372
+ define_method(:verify) do
373
+ double_2_verify_call_count += 1
374
+ end
375
+ define_method(:reset) do
376
+ double_2_reset_call_count += 1
377
+ end
378
+ end
379
+
380
+ double3_verify_call_count = 0
381
+ double3_reset_call_count = 0
382
+ (class << double3; self; end).class_eval do
383
+ define_method(:verify) do
384
+ double3_verify_call_count += 1
385
+ end
386
+ define_method(:reset) do
387
+ double3_reset_call_count += 1
388
+ end
389
+ end
390
+
391
+ no_double_injection_object = Object.new
392
+ space.verify_doubles(no_double_injection_object)
393
+
394
+ double_1_verify_call_count.should == 0
395
+ double_1_reset_call_count.should == 0
396
+ double_2_verify_call_count.should == 0
397
+ double_2_reset_call_count.should == 0
398
+ double3_verify_call_count.should == 0
399
+ double3_reset_call_count.should == 0
400
+ end
262
401
  end
263
402
  end
264
403
 
265
404
  describe "#verify_double" do
266
405
  before do
267
- @object = Object.new
268
406
  @method_name = :foobar
269
407
  end
270
408
 
271
409
  it "verifies and deletes the double_injection" do
272
- double_injection = @space.double_injection(@object, @method_name)
273
- @space.double_injections[@object][@method_name].should === double_injection
274
- @object.methods.should include("__rr__#{@method_name}")
410
+ @double_injection = space.double_injection(subject, method_name)
411
+ space.double_injections[subject][method_name].should === double_injection
412
+ subject.methods.should include("__rr__#{method_name}")
275
413
 
276
- verify_calls = 0
414
+ verify_call_count = 0
277
415
  (class << double_injection; self; end).class_eval do
278
- define_method(:verify) do ||
279
- verify_calls += 1
416
+ define_method(:verify) do
417
+ verify_call_count += 1
280
418
  end
281
419
  end
282
- @space.verify_double(@object, @method_name)
283
- verify_calls.should == 1
420
+ space.verify_double(subject, method_name)
421
+ verify_call_count.should == 1
284
422
 
285
- @space.double_injections[@object][@method_name].should be_nil
286
- @object.methods.should_not include("__rr__#{@method_name}")
423
+ space.double_injections[subject][method_name].should be_nil
424
+ subject.methods.should_not include("__rr__#{method_name}")
287
425
  end
288
426
 
289
- it "deletes the double_injection when verifying the double_injection raises an error" do
290
- double_injection = @space.double_injection(@object, @method_name)
291
- @space.double_injections[@object][@method_name].should === double_injection
292
- @object.methods.should include("__rr__#{@method_name}")
293
-
294
- verify_called = true
295
- (class << double_injection; self; end).class_eval do
296
- define_method(:verify) do ||
297
- verify_called = true
298
- raise "An Error"
427
+ context "when verifying the double_injection raises an error" do
428
+ it "deletes the double_injection" do
429
+ @double_injection = space.double_injection(subject, method_name)
430
+ space.double_injections[subject][method_name].should === double_injection
431
+ subject.methods.should include("__rr__#{method_name}")
432
+
433
+ verify_called = true
434
+ (class << double_injection; self; end).class_eval do
435
+ define_method(:verify) do
436
+ verify_called = true
437
+ raise "An Error"
438
+ end
299
439
  end
300
- end
301
- lambda {@space.verify_double(@object, @method_name)}.should raise_error
302
- verify_called.should be_true
440
+ lambda {space.verify_double(subject, method_name)}.should raise_error
441
+ verify_called.should be_true
303
442
 
304
- @space.double_injections[@object][@method_name].should be_nil
305
- @object.methods.should_not include("__rr__#{@method_name}")
443
+ space.double_injections[subject][method_name].should be_nil
444
+ subject.methods.should_not include("__rr__#{method_name}")
445
+ end
306
446
  end
307
447
  end
308
448
 
309
449
  describe "#verify_ordered_double" do
310
450
  before do
311
- @object = Object.new
312
451
  @method_name = :foobar
313
- @double_injection = @space.double_injection(@object, @method_name)
452
+ @double_injection = space.double_injection(subject, method_name)
314
453
  end
315
454
 
316
- class << self
317
- define_method "#verify_ordered_double" do
318
- it "raises an error when Double is NonTerminal" do
319
- double = Double.new(@double_injection)
320
- @space.register_ordered_double(double)
455
+ macro "#verify_ordered_double" do
456
+ it "raises an error when Double is NonTerminal" do
457
+ double = new_double
458
+ space.register_ordered_double(double)
321
459
 
322
- double.any_number_of_times
323
- double.should_not be_terminal
460
+ double.any_number_of_times
461
+ double.should_not be_terminal
324
462
 
325
- lambda do
326
- @space.verify_ordered_double(double)
327
- end.should raise_error(
328
- Errors::DoubleOrderError,
329
- "Ordered Doubles cannot have a NonTerminal TimesCalledExpectation"
330
- )
331
- end
463
+ lambda do
464
+ space.verify_ordered_double(double)
465
+ end.should raise_error(
466
+ Errors::DoubleOrderError,
467
+ "Ordered Doubles cannot have a NonTerminal TimesCalledExpectation"
468
+ )
332
469
  end
333
470
  end
334
471
 
335
472
  context "when the passed in double is at the front of the queue" do
336
473
  send "#verify_ordered_double"
337
474
  it "keeps the double when times called is not verified" do
338
- double = Double.new(@double_injection)
339
- @space.register_ordered_double(double)
475
+ double = new_double
476
+ space.register_ordered_double(double)
340
477
 
341
478
  double.twice
342
479
  double.should be_attempt
343
480
 
344
- @space.verify_ordered_double(double)
345
- @space.ordered_doubles.should include(double)
481
+ space.verify_ordered_double(double)
482
+ space.ordered_doubles.should include(double)
346
483
  end
347
484
 
348
- it "removes the double when times called expectation should no longer be attempted" do
349
- double = Double.new(@double_injection)
350
- @space.register_ordered_double(double)
485
+ context "when Double#attempt? is false" do
486
+ it "removes the double" do
487
+ double = new_double
488
+ space.register_ordered_double(double)
351
489
 
352
- double.with(1).once
353
- @object.foobar(1)
354
- double.should_not be_attempt
490
+ double.with(1).once
491
+ subject.foobar(1)
492
+ double.should_not be_attempt
355
493
 
356
- @space.verify_ordered_double(double)
357
- @space.ordered_doubles.should_not include(double)
494
+ space.verify_ordered_double(double)
495
+ space.ordered_doubles.should_not include(double)
496
+ end
358
497
  end
359
498
  end
360
499
 
361
500
  context "when the passed in double is not at the front of the queue" do
362
501
  send "#verify_ordered_double"
363
502
  it "raises error" do
364
- first_double = double
365
- second_double = double
503
+ first_double = new_double
504
+ second_double = new_double
366
505
 
367
506
  lambda do
368
- @space.verify_ordered_double(second_double)
507
+ space.verify_ordered_double(second_double)
369
508
  end.should raise_error(
370
509
  Errors::DoubleOrderError,
371
510
  "foobar() called out of order in list\n" <<
@@ -374,13 +513,12 @@ module RR
374
513
  )
375
514
  end
376
515
 
377
- def double
378
- double = Double.new(@double_injection).once
379
- @space.register_ordered_double(double.double)
516
+ def new_double
517
+ double = super.once
518
+ space.register_ordered_double(double.double)
380
519
  double.double
381
520
  end
382
521
  end
383
522
  end
384
523
  end
385
-
386
524
  end