rr 1.0.4 → 1.0.5.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +15 -0
  2. data/CHANGES.md +376 -0
  3. data/Gemfile +7 -10
  4. data/README.md +822 -0
  5. data/Rakefile +24 -78
  6. data/VERSION +1 -0
  7. data/lib/rr.rb +3 -0
  8. data/lib/rr/adapters/minitest.rb +6 -0
  9. data/lib/rr/adapters/rr_methods.rb +6 -10
  10. data/lib/rr/adapters/rspec.rb +3 -0
  11. data/lib/rr/adapters/rspec2.rb +30 -0
  12. data/lib/rr/adapters/test_unit.rb +2 -0
  13. data/lib/rr/double.rb +3 -2
  14. data/lib/rr/double_definitions/child_double_definition_create.rb +3 -2
  15. data/lib/rr/double_definitions/double_definition.rb +15 -13
  16. data/lib/rr/double_definitions/double_definition_create.rb +9 -5
  17. data/lib/rr/double_definitions/double_injections/any_instance_of.rb +3 -2
  18. data/lib/rr/double_definitions/strategies/strategy.rb +5 -4
  19. data/lib/rr/double_definitions/strategies/strategy_methods.rb +6 -8
  20. data/lib/rr/double_definitions/strategies/verification/mock.rb +3 -3
  21. data/lib/rr/double_matches.rb +2 -1
  22. data/lib/rr/expectations/argument_equality_expectation.rb +2 -2
  23. data/lib/rr/expectations/times_called_expectation.rb +2 -2
  24. data/lib/rr/injections/double_injection.rb +12 -11
  25. data/lib/rr/injections/injection.rb +2 -2
  26. data/lib/rr/injections/method_missing_injection.rb +21 -7
  27. data/lib/rr/injections/singleton_method_added_injection.rb +3 -1
  28. data/lib/rr/method_dispatches/base_method_dispatch.rb +1 -1
  29. data/lib/rr/method_dispatches/method_dispatch.rb +2 -1
  30. data/lib/rr/method_dispatches/method_missing_dispatch.rb +2 -1
  31. data/lib/rr/proc_from_block.rb +8 -4
  32. data/lib/rr/space.rb +3 -2
  33. data/lib/rr/times_called_matchers/times_called_matcher.rb +2 -2
  34. data/lib/rr/version.rb +5 -0
  35. data/lib/rr/wildcard_matchers/boolean.rb +2 -2
  36. data/spec/runner.rb +41 -0
  37. metadata +45 -133
  38. data/.gitignore +0 -10
  39. data/.runrc +0 -3
  40. data/.rvmrc +0 -2
  41. data/CHANGES +0 -266
  42. data/Gemfile.lock +0 -31
  43. data/README.rdoc +0 -392
  44. data/benchmarks/rr_benchmark.rb +0 -32
  45. data/benchmarks/rspec_benchmark.rb +0 -14
  46. data/doc/0.6.0.release.markdown +0 -81
  47. data/doc/todo.txt +0 -0
  48. data/introducting_rr.txt +0 -206
  49. data/rr.gemspec +0 -37
  50. data/spec/api/any_instance_of/all_instances_of_spec.rb +0 -12
  51. data/spec/api/any_instance_of/any_instance_of_spec.rb +0 -47
  52. data/spec/api/any_instance_of/instance_of_spec.rb +0 -12
  53. data/spec/api/dont_allow/dont_allow_after_stub_spec.rb +0 -14
  54. data/spec/api/mock/mock_spec.rb +0 -193
  55. data/spec/api/proxy/proxy_spec.rb +0 -86
  56. data/spec/api/spy/spy_spec.rb +0 -49
  57. data/spec/api/strong/strong_spec.rb +0 -87
  58. data/spec/api/stub/stub_spec.rb +0 -152
  59. data/spec/core_spec_suite.rb +0 -19
  60. data/spec/environment_fixture_setup.rb +0 -8
  61. data/spec/minitest_spec_suite.rb +0 -21
  62. data/spec/proc_from_block_spec.rb +0 -14
  63. data/spec/rr/adapters/rr_methods_argument_matcher_spec.rb +0 -67
  64. data/spec/rr/adapters/rr_methods_creator_spec.rb +0 -137
  65. data/spec/rr/adapters/rr_methods_space_spec.rb +0 -98
  66. data/spec/rr/adapters/rr_methods_spec_helper.rb +0 -11
  67. data/spec/rr/adapters/rr_methods_times_matcher_spec.rb +0 -13
  68. data/spec/rr/double_definitions/child_double_definition_creator_spec.rb +0 -112
  69. data/spec/rr/double_definitions/double_definition_create_blank_slate_spec.rb +0 -91
  70. data/spec/rr/double_definitions/double_definition_create_spec.rb +0 -443
  71. data/spec/rr/double_injection/double_injection_spec.rb +0 -546
  72. data/spec/rr/double_injection/double_injection_verify_spec.rb +0 -29
  73. data/spec/rr/errors/rr_error_spec.rb +0 -67
  74. data/spec/rr/expectations/any_argument_expectation_spec.rb +0 -47
  75. data/spec/rr/expectations/anything_argument_equality_expectation_spec.rb +0 -14
  76. data/spec/rr/expectations/argument_equality_expectation_spec.rb +0 -135
  77. data/spec/rr/expectations/boolean_argument_equality_expectation_spec.rb +0 -34
  78. data/spec/rr/expectations/hash_including_argument_equality_expectation_spec.rb +0 -82
  79. data/spec/rr/expectations/hash_including_spec.rb +0 -17
  80. data/spec/rr/expectations/satisfy_argument_equality_expectation_spec.rb +0 -59
  81. data/spec/rr/expectations/satisfy_spec.rb +0 -14
  82. data/spec/rr/expectations/times_called_expectation/times_called_expectation_any_times_spec.rb +0 -22
  83. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_least_spec.rb +0 -37
  84. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_most_spec.rb +0 -43
  85. data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +0 -15
  86. data/spec/rr/expectations/times_called_expectation/times_called_expectation_integer_spec.rb +0 -58
  87. data/spec/rr/expectations/times_called_expectation/times_called_expectation_proc_spec.rb +0 -35
  88. data/spec/rr/expectations/times_called_expectation/times_called_expectation_range_spec.rb +0 -39
  89. data/spec/rr/minitest/minitest_integration_test.rb +0 -59
  90. data/spec/rr/minitest/test_helper.rb +0 -7
  91. data/spec/rr/rspec/invocation_matcher_spec.rb +0 -279
  92. data/spec/rr/rspec/rspec_adapter_spec.rb +0 -63
  93. data/spec/rr/rspec/rspec_backtrace_tweaking_spec.rb +0 -31
  94. data/spec/rr/rspec/rspec_backtrace_tweaking_spec_fixture.rb +0 -11
  95. data/spec/rr/rspec/rspec_usage_spec.rb +0 -86
  96. data/spec/rr/space/hash_with_object_id_key_spec.rb +0 -88
  97. data/spec/rr/space/space_spec.rb +0 -596
  98. data/spec/rr/test_unit/test_helper.rb +0 -7
  99. data/spec/rr/test_unit/test_unit_backtrace_test.rb +0 -36
  100. data/spec/rr/test_unit/test_unit_integration_test.rb +0 -59
  101. data/spec/rr/times_called_matchers/any_times_matcher_spec.rb +0 -47
  102. data/spec/rr/times_called_matchers/at_least_matcher_spec.rb +0 -55
  103. data/spec/rr/times_called_matchers/at_most_matcher_spec.rb +0 -70
  104. data/spec/rr/times_called_matchers/integer_matcher_spec.rb +0 -70
  105. data/spec/rr/times_called_matchers/proc_matcher_spec.rb +0 -55
  106. data/spec/rr/times_called_matchers/range_matcher_spec.rb +0 -76
  107. data/spec/rr/times_called_matchers/times_called_matcher_spec.rb +0 -118
  108. data/spec/rr/wildcard_matchers/anything_spec.rb +0 -24
  109. data/spec/rr/wildcard_matchers/boolean_spec.rb +0 -36
  110. data/spec/rr/wildcard_matchers/duck_type_spec.rb +0 -52
  111. data/spec/rr/wildcard_matchers/is_a_spec.rb +0 -32
  112. data/spec/rr/wildcard_matchers/numeric_spec.rb +0 -32
  113. data/spec/rr/wildcard_matchers/range_spec.rb +0 -35
  114. data/spec/rr/wildcard_matchers/regexp_spec.rb +0 -43
  115. data/spec/rr_spec.rb +0 -28
  116. data/spec/rspec_spec_suite.rb +0 -17
  117. data/spec/spec.opts +0 -10
  118. data/spec/spec_helper.rb +0 -41
  119. data/spec/spec_suite.rb +0 -54
  120. data/spec/spy_verification_spec.rb +0 -129
  121. data/spec/test_unit_spec_suite.rb +0 -21
@@ -1,63 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
-
3
- module RR
4
- module Adapters
5
- describe Rspec do
6
- attr_reader :fixture, :subject, :method_name
7
- describe "#setup_mocks_for_rspec" do
8
- before do
9
- @fixture = Object.new
10
- fixture.extend Rspec
11
-
12
- @subject = Object.new
13
- @method_name = :foobar
14
- end
15
-
16
- it "resets the double_injections" do
17
- stub(subject).foobar
18
- ::RR::Injections::DoubleInjection.instances.should_not be_empty
19
-
20
- fixture.setup_mocks_for_rspec
21
- ::RR::Injections::DoubleInjection.instances.should be_empty
22
- end
23
- end
24
-
25
- describe "#verify_mocks_for_rspec" do
26
- before do
27
- @fixture = Object.new
28
- fixture.extend Rspec
29
-
30
- @subject = Object.new
31
- @method_name = :foobar
32
- end
33
-
34
- it "verifies the double_injections" do
35
- mock(subject).foobar
36
-
37
- lambda do
38
- fixture.verify_mocks_for_rspec
39
- end.should raise_error(::RR::Errors::TimesCalledError)
40
- ::RR::Injections::DoubleInjection.instances.should be_empty
41
- end
42
- end
43
-
44
- describe "#teardown_mocks_for_rspec" do
45
- before do
46
- @fixture = Object.new
47
- fixture.extend Rspec
48
-
49
- @subject = Object.new
50
- @method_name = :foobar
51
- end
52
-
53
- it "resets the double_injections" do
54
- stub(subject).foobar
55
- ::RR::Injections::DoubleInjection.instances.should_not be_empty
56
-
57
- fixture.teardown_mocks_for_rspec
58
- ::RR::Injections::DoubleInjection.instances.should be_empty
59
- end
60
- end
61
- end
62
- end
63
- end
@@ -1,31 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
-
3
- module RR
4
- module Adapters
5
- describe Rspec do
6
- describe "#trim_backtrace" do
7
- it "does not set trim_backtrace" do
8
- RR.trim_backtrace.should == false
9
- end
10
- end
11
-
12
- describe ".included" do
13
- it "does not add backtrace identifier twice" do
14
- length = ::Spec::Runner::QuietBacktraceTweaker::IGNORE_PATTERNS.length
15
- class << Object.new
16
- include ::RR::Adapters::Rspec
17
- end
18
- ::Spec::Runner::QuietBacktraceTweaker::IGNORE_PATTERNS.length.should == length
19
- end
20
- end
21
-
22
- describe "backtrace tweaking" do
23
- it "hides rr library from the backtrace by default" do
24
- dir = File.dirname(__FILE__)
25
- output = `ruby #{dir}/rspec_backtrace_tweaking_spec_fixture.rb`
26
- output.should_not include("lib/rr")
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,11 +0,0 @@
1
- require 'rubygems'
2
- require "spec"
3
- dir = File.dirname(__FILE__)
4
- require File.expand_path("#{dir}/../../../lib/rr")
5
-
6
- describe "Example" do
7
- it("hides RR framework in backtrace") do
8
- mock(subject).foobar()
9
- RR.verify_double(subject, :foobar)
10
- end
11
- end
@@ -1,86 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
-
3
- describe RR do
4
- attr_reader :subject
5
- before do
6
- @subject = Object.new
7
- end
8
-
9
- describe "#mock" do
10
- it "creates a mock DoubleInjection Double" do
11
- mock(subject).foobar(1, 2) {:baz}
12
- subject.foobar(1, 2).should == :baz
13
- end
14
- end
15
-
16
- describe "#stub" do
17
- it "creates a stub DoubleInjection Double" do
18
- stub(subject).foobar {:baz}
19
- subject.foobar("any", "thing").should == :baz
20
- end
21
- end
22
-
23
- describe "#mock and #proxy" do
24
- before do
25
- def subject.foobar
26
- :baz
27
- end
28
- end
29
-
30
- it "creates a proxy DoubleInjection Double" do
31
- mock.proxy(subject).foobar
32
- subject.foobar.should == :baz
33
- end
34
- end
35
-
36
- describe "#stub and #proxy" do
37
- before do
38
- def subject.foobar
39
- :baz
40
- end
41
- end
42
-
43
- it "creates a proxy DoubleInjection Double" do
44
- stub.proxy(subject).foobar
45
- subject.foobar.should == :baz
46
- end
47
- end
48
-
49
- describe "#stub and #proxy" do
50
- before do
51
- def subject.foobar
52
- :baz
53
- end
54
- end
55
-
56
- it "creates a proxy DoubleInjection Double" do
57
- stub.proxy(subject).foobar
58
- subject.foobar.should == :baz
59
- end
60
- end
61
-
62
- describe "spies" do
63
- it "validates that a Double was called after it was called" do
64
- stub(subject).foobar
65
- subject.foobar(1, 2)
66
-
67
- subject.should have_received.foobar(1, 2)
68
- lambda do
69
- subject.should have_received.foobar(1, 2, 3)
70
- end.should raise_error(Spec::Expectations::ExpectationNotMetError)
71
- end
72
- end
73
-
74
- it "creates an invocation matcher with a method name" do
75
- method = :test
76
- matcher = 'fake'
77
- mock(RR::Adapters::Rspec::InvocationMatcher).new(method) { matcher }
78
- have_received(method).should == matcher
79
- end
80
-
81
- it "creates an invocation matcher without a method name" do
82
- matcher = 'fake'
83
- mock(RR::Adapters::Rspec::InvocationMatcher).new(nil) { matcher }
84
- have_received.should == matcher
85
- end
86
- end
@@ -1,88 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
-
3
- module RR
4
- describe HashWithObjectIdKey do
5
- describe "#[] and #[]=" do
6
- it "stores object via object id" do
7
- hash = HashWithObjectIdKey.new
8
- array_1 = []
9
- hash[array_1] = 1
10
- array_2 = []
11
- hash[array_2] = 2
12
-
13
- hash[array_1].should_not == hash[array_2]
14
- end
15
-
16
- it "stores the passed in object" do
17
- hash = HashWithObjectIdKey.new
18
- obj = Object.new
19
- hash[obj] = 1
20
- hash.instance_eval {@keys}.should == {obj.__id__ => obj}
21
- end
22
- end
23
-
24
- describe "#each" do
25
- it "iterates through the items in the hash" do
26
- hash = HashWithObjectIdKey.new
27
- hash['one'] = 1
28
- hash['two'] = 2
29
-
30
- keys = []
31
- values = []
32
- hash.each do |key, value|
33
- keys << key
34
- values << value
35
- end
36
-
37
- keys.sort.should == ['one', 'two']
38
- values.sort.should == [1, 2]
39
- end
40
- end
41
-
42
- describe "#delete" do
43
- before do
44
- @hash = HashWithObjectIdKey.new
45
- @key = Object.new
46
- @hash[@key] = 1
47
- end
48
-
49
- it "removes the object from the hash" do
50
- @hash.delete(@key)
51
- @hash[@key].should be_nil
52
- end
53
-
54
- it "removes the object from the keys hash" do
55
- @hash.delete(@key)
56
- @hash.instance_eval {@keys}.should == {}
57
- end
58
- end
59
-
60
- describe "#keys" do
61
- before do
62
- @hash = HashWithObjectIdKey.new
63
- @key = Object.new
64
- @hash[@key] = 1
65
- end
66
-
67
- it "returns an array of the keys" do
68
- @hash.keys.should == [@key]
69
- end
70
- end
71
-
72
- describe "#include?" do
73
- before do
74
- @hash = HashWithObjectIdKey.new
75
- @key = Object.new
76
- @hash[@key] = 1
77
- end
78
-
79
- it "returns true when the key is in the Hash" do
80
- @hash.include?(@key).should be_true
81
- end
82
-
83
- it "returns false when the key is not in the Hash" do
84
- @hash.include?(Object.new).should be_false
85
- end
86
- end
87
- end
88
- end
@@ -1,596 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
-
3
- module RR
4
- describe Space do
5
- it_should_behave_like "Swapped Space"
6
- attr_reader :subject, :method_name, :double_injection
7
-
8
- before do
9
- @subject = Object.new
10
- end
11
-
12
- describe "#record_call" do
13
- it "should add a call to the list" do
14
- object = Object.new
15
- block = lambda {}
16
- space.record_call(object, :to_s, [], block)
17
- space.recorded_calls.should == RR::RecordedCalls.new([[object, :to_s, [], block]])
18
- end
19
- end
20
-
21
- describe "#double_injection" do
22
- context "when existing subject == but not === with the same method name" do
23
- it "creates a new DoubleInjection" do
24
- subject_1 = []
25
- subject_2 = []
26
- (subject_1 === subject_2).should be_true
27
- subject_1.__id__.should_not == subject_2.__id__
28
-
29
- injection_1 = Injections::DoubleInjection.find_or_create_by_subject(subject_1, :foobar)
30
- injection_2 = Injections::DoubleInjection.find_or_create_by_subject(subject_2, :foobar)
31
-
32
- injection_1.should_not == injection_2
33
- end
34
- end
35
-
36
- context "when a DoubleInjection is not registered for the subject and method_name" do
37
- before do
38
- def subject.foobar(*args)
39
- :original_foobar
40
- end
41
-
42
- @method_name = :foobar
43
- end
44
-
45
- context "when method_name is a symbol" do
46
- it "returns double_injection and adds double_injection to double_injection list" do
47
- double_injection = Injections::DoubleInjection.find_or_create_by_subject(subject, method_name)
48
- Injections::DoubleInjection.find_or_create_by_subject(subject, method_name).should === double_injection
49
- double_injection.subject_class.should == (class << subject; self; end)
50
- double_injection.method_name.should === method_name
51
- end
52
- end
53
-
54
- context "when method_name is a string" do
55
- it "returns double_injection and adds double_injection to double_injection list" do
56
- double_injection = Injections::DoubleInjection.find_or_create_by_subject(subject, 'foobar')
57
- Injections::DoubleInjection.find_or_create_by_subject(subject, method_name).should === double_injection
58
- double_injection.subject_class.should == (class << subject; self; end)
59
- double_injection.method_name.should === method_name
60
- end
61
- end
62
-
63
- it "overrides the method when passing a block" do
64
- original_method = subject.method(:foobar)
65
- Injections::DoubleInjection.find_or_create_by_subject(subject, method_name)
66
- subject.method(:foobar).should_not == original_method
67
- end
68
- end
69
-
70
- context "when double_injection exists" do
71
- before do
72
- def subject.foobar(*args)
73
- :original_foobar
74
- end
75
-
76
- @method_name = :foobar
77
- end
78
-
79
- context "when a DoubleInjection is registered for the subject and method_name" do
80
- it "returns the existing DoubleInjection" do
81
- @double_injection = Injections::DoubleInjection.find_or_create_by_subject(subject, 'foobar')
82
-
83
- double_injection.subject_has_original_method?.should be_true
84
-
85
- Injections::DoubleInjection.find_or_create_by_subject(subject, 'foobar').should === double_injection
86
-
87
- double_injection.reset
88
- subject.foobar.should == :original_foobar
89
- end
90
- end
91
- end
92
- end
93
-
94
- describe "#method_missing_injection" do
95
- context "when existing subject == but not === with the same method name" do
96
- it "creates a new DoubleInjection" do
97
- subject_1 = []
98
- subject_2 = []
99
- (subject_1 === subject_2).should be_true
100
- subject_1.__id__.should_not == subject_2.__id__
101
-
102
- injection_1 = Injections::MethodMissingInjection.find_or_create(class << subject_1; self; end)
103
- injection_2 = Injections::MethodMissingInjection.find_or_create(class << subject_2; self; end)
104
-
105
- injection_1.should_not == injection_2
106
- end
107
- end
108
-
109
- context "when a MethodMissingInjection is not registered for the subject and method_name" do
110
- before do
111
- def subject.method_missing(method_name, *args, &block)
112
- :original_method_missing
113
- end
114
- end
115
-
116
- it "overrides the method when passing a block" do
117
- original_method = subject.method(:method_missing)
118
- Injections::MethodMissingInjection.find_or_create(class << subject; self; end)
119
- subject.method(:method_missing).should_not == original_method
120
- end
121
- end
122
-
123
- context "when a MethodMissingInjection is registered for the subject and method_name" do
124
- before do
125
- def subject.method_missing(method_name, *args, &block)
126
- :original_method_missing
127
- end
128
- end
129
-
130
- context "when a DoubleInjection is registered for the subject and method_name" do
131
- it "returns the existing DoubleInjection" do
132
- injection = Injections::MethodMissingInjection.find_or_create(class << subject; self; end)
133
- injection.subject_has_original_method?.should be_true
134
-
135
- Injections::MethodMissingInjection.find_or_create(class << subject; self; end).should === injection
136
-
137
- injection.reset
138
- subject.method_missing(:foobar).should == :original_method_missing
139
- end
140
- end
141
- end
142
- end
143
-
144
- describe "#singleton_method_added_injection" do
145
- context "when existing subject == but not === with the same method name" do
146
- it "creates a new DoubleInjection" do
147
- subject_1 = []
148
- subject_2 = []
149
- (subject_1 === subject_2).should be_true
150
- subject_1.__id__.should_not == subject_2.__id__
151
-
152
- injection_1 = Injections::SingletonMethodAddedInjection.find_or_create(class << subject_1; self; end)
153
- injection_2 = Injections::SingletonMethodAddedInjection.find_or_create(class << subject_2; self; end)
154
-
155
- injection_1.should_not == injection_2
156
- end
157
- end
158
-
159
- context "when a SingletonMethodAddedInjection is not registered for the subject and method_name" do
160
- before do
161
- def subject.singleton_method_added(method_name)
162
- :original_singleton_method_added
163
- end
164
- end
165
-
166
- it "overrides the method when passing a block" do
167
- original_method = subject.method(:singleton_method_added)
168
- Injections::SingletonMethodAddedInjection.find_or_create(class << subject; self; end)
169
- subject.method(:singleton_method_added).should_not == original_method
170
- end
171
- end
172
-
173
- context "when a SingletonMethodAddedInjection is registered for the subject and method_name" do
174
- before do
175
- def subject.singleton_method_added(method_name)
176
- :original_singleton_method_added
177
- end
178
- end
179
-
180
- context "when a DoubleInjection is registered for the subject and method_name" do
181
- it "returns the existing DoubleInjection" do
182
- injection = Injections::SingletonMethodAddedInjection.find_or_create(class << subject; self; end)
183
- injection.subject_has_original_method?.should be_true
184
-
185
- Injections::SingletonMethodAddedInjection.find_or_create(class << subject; self; end).should === injection
186
-
187
- injection.reset
188
- subject.singleton_method_added(:foobar).should == :original_singleton_method_added
189
- end
190
- end
191
- end
192
- end
193
-
194
- describe "#reset" do
195
- attr_reader :subject_1, :subject_2
196
- before do
197
- @subject_1 = Object.new
198
- @subject_2 = Object.new
199
- @method_name = :foobar
200
- end
201
-
202
- it "should clear the #recorded_calls" do
203
- object = Object.new
204
- space.record_call(object, :to_s, [], nil)
205
-
206
- space.reset
207
- space.recorded_calls.should == RR::RecordedCalls.new([])
208
- end
209
-
210
- it "removes the ordered doubles" do
211
- mock(subject_1).foobar1.ordered
212
- mock(subject_2).foobar2.ordered
213
-
214
- space.ordered_doubles.should_not be_empty
215
-
216
- space.reset
217
- space.ordered_doubles.should be_empty
218
- end
219
-
220
- it "resets all double_injections" do
221
- subject_1.respond_to?(method_name).should be_false
222
- subject_2.respond_to?(method_name).should be_false
223
-
224
- Injections::DoubleInjection.find_or_create_by_subject(subject_1, method_name)
225
- Injections::DoubleInjection.exists_by_subject?(subject_1, method_name).should be_true
226
- subject_1.respond_to?(method_name).should be_true
227
-
228
- Injections::DoubleInjection.find_or_create_by_subject(subject_2, method_name)
229
- Injections::DoubleInjection.exists_by_subject?(subject_2, method_name).should be_true
230
- subject_2.respond_to?(method_name).should be_true
231
-
232
- space.reset
233
-
234
- subject_1.respond_to?(method_name).should be_false
235
- Injections::DoubleInjection.exists?(subject_1, method_name).should be_false
236
-
237
- subject_2.respond_to?(method_name).should be_false
238
- Injections::DoubleInjection.exists?(subject_2, method_name).should be_false
239
- end
240
-
241
- it "resets all method_missing_injections" do
242
- subject_1.respond_to?(:method_missing).should be_false
243
- subject_2.respond_to?(:method_missing).should be_false
244
-
245
- Injections::MethodMissingInjection.find_or_create(class << subject_1; self; end)
246
- Injections::MethodMissingInjection.exists?(class << subject_1; self; end).should be_true
247
- subject_1.respond_to?(:method_missing).should be_true
248
-
249
- Injections::MethodMissingInjection.find_or_create(class << subject_2; self; end)
250
- Injections::MethodMissingInjection.exists?(class << subject_2; self; end).should be_true
251
- subject_2.respond_to?(:method_missing).should be_true
252
-
253
- space.reset
254
-
255
- subject_1.respond_to?(:method_missing).should be_false
256
- Injections::MethodMissingInjection.exists?(subject_1).should be_false
257
-
258
- subject_2.respond_to?(:method_missing).should be_false
259
- Injections::MethodMissingInjection.exists?(subject_2).should be_false
260
- end
261
-
262
- it "resets all singleton_method_added_injections" do
263
- subject_1.respond_to?(:singleton_method_added).should be_false
264
- subject_2.respond_to?(:singleton_method_added).should be_false
265
-
266
- Injections::SingletonMethodAddedInjection.find_or_create(class << subject_1; self; end)
267
- Injections::SingletonMethodAddedInjection.exists?(class << subject_1; self; end).should be_true
268
- subject_1.respond_to?(:singleton_method_added).should be_true
269
-
270
- Injections::SingletonMethodAddedInjection.find_or_create(class << subject_2; self; end)
271
- Injections::SingletonMethodAddedInjection.exists?(class << subject_2; self; end).should be_true
272
- subject_2.respond_to?(:singleton_method_added).should be_true
273
-
274
- space.reset
275
-
276
- subject_1.respond_to?(:singleton_method_added).should be_false
277
- Injections::SingletonMethodAddedInjection.exists?(subject_1).should be_false
278
-
279
- subject_2.respond_to?(:singleton_method_added).should be_false
280
- Injections::SingletonMethodAddedInjection.exists?(subject_2).should be_false
281
- end
282
-
283
- it "clears RR::Injections::DoubleInjection::BoundObjects" do
284
- stub(subject).foobar
285
- RR::Injections::DoubleInjection::BoundObjects.should_not be_empty
286
- space.reset
287
- pending "Clearing BoundObjects" do
288
- RR::Injections::DoubleInjection::BoundObjects.should be_empty
289
- end
290
- end
291
- end
292
-
293
- describe "#reset_double" do
294
- before do
295
- @method_name = :foobar
296
-
297
- def subject.foobar
298
- end
299
- end
300
-
301
- it "resets the double_injections and restores the original method" do
302
- original_method = subject.method(method_name)
303
-
304
- @double_injection = Injections::DoubleInjection.find_or_create_by_subject(subject, method_name)
305
- Injections::DoubleInjection.instances.keys.should include(class << subject; self; end)
306
- Injections::DoubleInjection.find_by_subject(subject, method_name).should_not be_nil
307
- subject.method(method_name).should_not == original_method
308
-
309
- space.reset_double(subject, method_name)
310
- Injections::DoubleInjection.instances.keys.should_not include(subject)
311
- subject.method(method_name).should == original_method
312
- end
313
-
314
- context "when it has no double_injections" do
315
- it "removes the subject from the double_injections map" do
316
- double_1 = Injections::DoubleInjection.find_or_create_by_subject(subject, :foobar1)
317
- double_2 = Injections::DoubleInjection.find_or_create_by_subject(subject, :foobar2)
318
-
319
- Injections::DoubleInjection.instances.include?(class << subject; self; end).should == true
320
- Injections::DoubleInjection.find_by_subject(subject, :foobar1).should_not be_nil
321
- Injections::DoubleInjection.find_by_subject(subject, :foobar2).should_not be_nil
322
-
323
- space.reset_double(subject, :foobar1)
324
- Injections::DoubleInjection.instances.include?(class << subject; self; end).should == true
325
- Injections::DoubleInjection.find_by_subject(subject, :foobar1).should be_nil
326
- Injections::DoubleInjection.find_by_subject(subject, :foobar2).should_not be_nil
327
-
328
- space.reset_double(subject, :foobar2)
329
- Injections::DoubleInjection.instances.include?(subject).should == false
330
- end
331
- end
332
- end
333
-
334
- describe "#DoubleInjection.reset" do
335
- attr_reader :subject_1, :subject_2
336
- before do
337
- @subject_1 = Object.new
338
- @subject_2 = Object.new
339
- @method_name = :foobar
340
- end
341
-
342
- it "resets the double_injection and removes it from the double_injections list" do
343
- double_injection_1 = Injections::DoubleInjection.find_or_create_by_subject(subject_1, method_name)
344
- double_1_reset_call_count = 0
345
- ( class << double_injection_1; self; end).class_eval do
346
- define_method(:reset) do
347
- double_1_reset_call_count += 1
348
- end
349
- end
350
- double_injection_2 = Injections::DoubleInjection.find_or_create_by_subject(subject_2, method_name)
351
- double_2_reset_call_count = 0
352
- ( class << double_injection_2; self; end).class_eval do
353
- define_method(:reset) do
354
- double_2_reset_call_count += 1
355
- end
356
- end
357
-
358
- Injections::DoubleInjection.reset
359
- double_1_reset_call_count.should == 1
360
- double_2_reset_call_count.should == 1
361
- end
362
- end
363
-
364
- describe "#verify_doubles" do
365
- attr_reader :subject_1, :subject_2, :subject3, :double_1, :double_2, :double3
366
- before do
367
- @subject_1 = Object.new
368
- @subject_2 = Object.new
369
- @subject3 = Object.new
370
- @method_name = :foobar
371
- @double_1 = Injections::DoubleInjection.find_or_create_by_subject(subject_1, method_name)
372
- @double_2 = Injections::DoubleInjection.find_or_create_by_subject(subject_2, method_name)
373
- @double3 = Injections::DoubleInjection.find_or_create_by_subject(subject3, method_name)
374
- end
375
-
376
- context "when passed no arguments" do
377
- it "verifies and deletes the double_injections" do
378
- double_1_verify_call_count = 0
379
- double_1_reset_call_count = 0
380
- (
381
- class << double_1;
382
- self;
383
- end).class_eval do
384
- define_method(:verify) do
385
- double_1_verify_call_count += 1
386
- end
387
- define_method(:reset) do
388
- double_1_reset_call_count += 1
389
- end
390
- end
391
-
392
- double_2_verify_call_count = 0
393
- double_2_reset_call_count = 0
394
- (
395
- class << double_2;
396
- self;
397
- end).class_eval do
398
- define_method(:verify) do
399
- double_2_verify_call_count += 1
400
- end
401
- define_method(:reset) do
402
- double_2_reset_call_count += 1
403
- end
404
- end
405
-
406
- space.verify_doubles
407
- double_1_verify_call_count.should == 1
408
- double_2_verify_call_count.should == 1
409
- double_1_reset_call_count.should == 1
410
- double_1_reset_call_count.should == 1
411
- end
412
- end
413
-
414
- context "when passed an Object that has at least one DoubleInjection" do
415
- it "verifies all Doubles injected into the Object" do
416
- double_1_verify_call_count = 0
417
- double_1_reset_call_count = 0
418
- (
419
- class << double_1;
420
- self;
421
- end).class_eval do
422
- define_method(:verify) do
423
- double_1_verify_call_count += 1
424
- end
425
- define_method(:reset) do
426
- double_1_reset_call_count += 1
427
- end
428
- end
429
-
430
- double_2_verify_call_count = 0
431
- double_2_reset_call_count = 0
432
- (
433
- class << double_2;
434
- self;
435
- end).class_eval do
436
- define_method(:verify) do
437
- double_2_verify_call_count += 1
438
- end
439
- define_method(:reset) do
440
- double_2_reset_call_count += 1
441
- end
442
- end
443
-
444
- space.verify_doubles(subject_1)
445
-
446
- double_1_verify_call_count.should == 1
447
- double_1_reset_call_count.should == 1
448
- double_2_verify_call_count.should == 0
449
- double_2_reset_call_count.should == 0
450
- end
451
- end
452
-
453
- context "when passed multiple Objects with at least one DoubleInjection" do
454
- it "verifies the Doubles injected into all of the Objects" do
455
- double_1_verify_call_count = 0
456
- double_1_reset_call_count = 0
457
- ( class << double_1; self; end).class_eval do
458
- define_method(:verify) do
459
- double_1_verify_call_count += 1
460
- end
461
- define_method(:reset) do
462
- double_1_reset_call_count += 1
463
- end
464
- end
465
-
466
- double_2_verify_call_count = 0
467
- double_2_reset_call_count = 0
468
- ( class << double_2; self; end).class_eval do
469
- define_method(:verify) do
470
- double_2_verify_call_count += 1
471
- end
472
- define_method(:reset) do
473
- double_2_reset_call_count += 1
474
- end
475
- end
476
-
477
- double3_verify_call_count = 0
478
- double3_reset_call_count = 0
479
- ( class << double3; self; end).class_eval do
480
- define_method(:verify) do
481
- double3_verify_call_count += 1
482
- end
483
- define_method(:reset) do
484
- double3_reset_call_count += 1
485
- end
486
- end
487
-
488
- space.verify_doubles(subject_1, subject_2)
489
-
490
- double_1_verify_call_count.should == 1
491
- double_1_reset_call_count.should == 1
492
- double_2_verify_call_count.should == 1
493
- double_2_reset_call_count.should == 1
494
- double3_verify_call_count.should == 0
495
- double3_reset_call_count.should == 0
496
- end
497
- end
498
-
499
- context "when passed an subject that does not have a DoubleInjection" do
500
- it "does not raise an error" do
501
- double_1_verify_call_count = 0
502
- double_1_reset_call_count = 0
503
- ( class << double_1; self; end).class_eval do
504
- define_method(:verify) do
505
- double_1_verify_call_count += 1
506
- end
507
- define_method(:reset) do
508
- double_1_reset_call_count += 1
509
- end
510
- end
511
-
512
- double_2_verify_call_count = 0
513
- double_2_reset_call_count = 0
514
- ( class << double_2; self; end).class_eval do
515
- define_method(:verify) do
516
- double_2_verify_call_count += 1
517
- end
518
- define_method(:reset) do
519
- double_2_reset_call_count += 1
520
- end
521
- end
522
-
523
- double3_verify_call_count = 0
524
- double3_reset_call_count = 0
525
- ( class << double3; self; end).class_eval do
526
- define_method(:verify) do
527
- double3_verify_call_count += 1
528
- end
529
- define_method(:reset) do
530
- double3_reset_call_count += 1
531
- end
532
- end
533
-
534
- no_double_injection_object = Object.new
535
- space.verify_doubles(no_double_injection_object)
536
-
537
- double_1_verify_call_count.should == 0
538
- double_1_reset_call_count.should == 0
539
- double_2_verify_call_count.should == 0
540
- double_2_reset_call_count.should == 0
541
- double3_verify_call_count.should == 0
542
- double3_reset_call_count.should == 0
543
- end
544
- end
545
- end
546
-
547
- describe "#verify_double" do
548
- before do
549
- @method_name = :foobar
550
-
551
- def subject.foobar
552
- end
553
- end
554
-
555
- it "verifies and deletes the double_injection" do
556
- @double_injection = Injections::DoubleInjection.find_or_create_by_subject(subject, method_name)
557
- Injections::DoubleInjection.find_by_subject(subject, method_name).should === double_injection
558
-
559
- verify_call_count = 0
560
- ( class << double_injection; self; end).class_eval do
561
- define_method(:verify) do
562
- verify_call_count += 1
563
- end
564
- end
565
- space.verify_double(subject, method_name)
566
- verify_call_count.should == 1
567
-
568
- Injections::DoubleInjection.find(subject, method_name).should be_nil
569
- end
570
-
571
- context "when verifying the double_injection raises an error" do
572
- it "deletes the double_injection and restores the original method" do
573
- original_method = subject.method(method_name)
574
-
575
- @double_injection = Injections::DoubleInjection.find_or_create_by_subject(subject, method_name)
576
- subject.method(method_name).should_not == original_method
577
-
578
- Injections::DoubleInjection.find_by_subject(subject, method_name).should === double_injection
579
-
580
- verify_called = true
581
- ( class << double_injection; self; end).class_eval do
582
- define_method(:verify) do
583
- verify_called = true
584
- raise "An Error"
585
- end
586
- end
587
- lambda {space.verify_double(subject, method_name)}.should raise_error
588
- verify_called.should be_true
589
-
590
- Injections::DoubleInjection.find(subject, method_name).should be_nil
591
- subject.method(method_name).should == original_method
592
- end
593
- end
594
- end
595
- end
596
- end