rr 1.1.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. checksums.yaml +5 -5
  2. data/Appraisals +6 -0
  3. data/CHANGES.md +102 -1
  4. data/CREDITS.md +5 -0
  5. data/Gemfile +3 -0
  6. data/README.md +91 -110
  7. data/Rakefile +43 -0
  8. data/doc/02_syntax_comparison.md +1 -0
  9. data/gemfiles/ruby_19_rspec_2.gemfile +14 -0
  10. data/gemfiles/ruby_19_rspec_2.gemfile.lock +49 -0
  11. data/gemfiles/ruby_19_rspec_2_rails_4.gemfile +15 -0
  12. data/gemfiles/ruby_19_rspec_2_rails_4.gemfile.lock +119 -0
  13. data/lib/rr/class_instance_method_defined.rb +1 -1
  14. data/lib/rr/core_ext/array.rb +2 -0
  15. data/lib/rr/core_ext/hash.rb +2 -0
  16. data/lib/rr/deprecations.rb +97 -0
  17. data/lib/rr/double.rb +28 -10
  18. data/lib/rr/double_definitions/double_definition.rb +39 -16
  19. data/lib/rr/double_definitions/double_definition_create.rb +5 -5
  20. data/lib/rr/double_definitions/double_definition_create_blank_slate.rb +10 -4
  21. data/lib/rr/double_definitions/double_injections/any_instance_of.rb +1 -1
  22. data/lib/rr/double_definitions/double_injections/instance.rb +2 -2
  23. data/lib/rr/double_definitions/strategies/strategy.rb +27 -8
  24. data/lib/rr/double_definitions/strategies/verification/mock.rb +8 -2
  25. data/lib/rr/double_matches.rb +4 -3
  26. data/lib/rr/dsl.rb +152 -0
  27. data/lib/rr/expectations/any_argument_expectation.rb +4 -4
  28. data/lib/rr/expectations/argument_equality_expectation.rb +43 -5
  29. data/lib/rr/injections/double_injection.rb +67 -19
  30. data/lib/rr/injections/method_missing_injection.rb +37 -6
  31. data/lib/rr/integrations.rb +13 -12
  32. data/lib/rr/integrations/decorator.rb +4 -1
  33. data/lib/rr/integrations/minitest_4.rb +1 -1
  34. data/lib/rr/integrations/minitest_4_active_support.rb +1 -1
  35. data/lib/rr/integrations/rspec/invocation_matcher.rb +0 -8
  36. data/lib/rr/integrations/rspec_2.rb +28 -3
  37. data/lib/rr/keyword_arguments.rb +15 -0
  38. data/lib/rr/method_dispatches/base_method_dispatch.rb +22 -5
  39. data/lib/rr/method_dispatches/method_dispatch.rb +21 -10
  40. data/lib/rr/method_dispatches/method_missing_dispatch.rb +14 -5
  41. data/lib/rr/recorded_call.rb +35 -0
  42. data/lib/rr/recorded_calls.rb +23 -9
  43. data/lib/rr/space.rb +15 -5
  44. data/lib/rr/spy_verification.rb +13 -5
  45. data/lib/rr/version.rb +1 -2
  46. data/lib/rr/wildcard_matchers.rb +10 -10
  47. data/lib/rr/without_autohook.rb +7 -14
  48. data/rr.gemspec +14 -5
  49. data/spec/custom_formatter_for_rspec.rb +18 -0
  50. data/spec/custom_formatter_for_rspec_2.rb +40 -0
  51. data/spec/defines_spec_suite_tasks.rb +57 -0
  52. data/spec/fixtures/rubygems_patch_for_187.rb +598 -0
  53. data/spec/global_helper.rb +38 -0
  54. data/spec/spec.opts +3 -0
  55. data/spec/spec_suite_configuration.rb +126 -0
  56. data/spec/spec_suite_runner.rb +47 -0
  57. data/spec/suites.yml +10 -0
  58. data/spec/suites/rspec_2/functional/any_instance_of_spec.rb +147 -0
  59. data/spec/suites/rspec_2/functional/dont_allow_spec.rb +17 -0
  60. data/spec/suites/rspec_2/functional/mock_bang_spec.rb +20 -0
  61. data/spec/suites/rspec_2/functional/mock_instance_of_spec.rb +14 -0
  62. data/spec/suites/rspec_2/functional/mock_instance_of_strong_spec.rb +15 -0
  63. data/spec/suites/rspec_2/functional/mock_proxy_instance_of_spec.rb +15 -0
  64. data/spec/suites/rspec_2/functional/mock_proxy_spec.rb +14 -0
  65. data/spec/suites/rspec_2/functional/mock_spec.rb +17 -0
  66. data/spec/suites/rspec_2/functional/mock_strong_spec.rb +14 -0
  67. data/spec/suites/rspec_2/functional/received_spec.rb +16 -0
  68. data/spec/suites/rspec_2/functional/spy_spec.rb +102 -0
  69. data/spec/suites/rspec_2/functional/stub_bang_spec.rb +20 -0
  70. data/spec/suites/rspec_2/functional/stub_instance_of_spec.rb +15 -0
  71. data/spec/suites/rspec_2/functional/stub_instance_of_strong_spec.rb +15 -0
  72. data/spec/suites/rspec_2/functional/stub_proxy_instance_of_spec.rb +16 -0
  73. data/spec/suites/rspec_2/functional/stub_proxy_spec.rb +45 -0
  74. data/spec/suites/rspec_2/functional/stub_spec.rb +71 -0
  75. data/spec/suites/rspec_2/functional/stub_strong_spec.rb +15 -0
  76. data/spec/suites/rspec_2/functional/wildcard_matchers_spec.rb +128 -0
  77. data/spec/suites/rspec_2/helper.rb +28 -0
  78. data/spec/suites/rspec_2/integration/minitest_4_spec.rb +109 -0
  79. data/spec/suites/rspec_2/integration/minitest_spec.rb +109 -0
  80. data/spec/suites/rspec_2/spec_helper.rb +3 -0
  81. data/spec/suites/rspec_2/support/matchers/wildcard_matcher_matchers.rb +32 -0
  82. data/spec/suites/rspec_2/support/mixins/double_definition_creator_helpers.rb +173 -0
  83. data/spec/suites/rspec_2/support/mixins/mock_definition_creator_helpers.rb +45 -0
  84. data/spec/suites/rspec_2/support/mixins/proxy_definition_creator_helpers.rb +33 -0
  85. data/spec/suites/rspec_2/support/mixins/stub_creator_helpers.rb +43 -0
  86. data/spec/suites/rspec_2/support/mixins/stub_definition_creator_helpers.rb +45 -0
  87. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_never_called_qualifier.rb +39 -0
  88. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_times_called_qualifier.rb +50 -0
  89. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_without_qualifiers.rb +131 -0
  90. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/dont_allow.rb +148 -0
  91. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of.rb +26 -0
  92. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of_strong.rb +28 -0
  93. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_proxy.rb +11 -0
  94. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_strong.rb +37 -0
  95. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mocking.rb +107 -0
  96. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of.rb +32 -0
  97. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of_strong.rb +39 -0
  98. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_proxy.rb +11 -0
  99. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_strong.rb +37 -0
  100. data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stubbing.rb +57 -0
  101. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/array_flatten_bug.rb +35 -0
  102. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/block_form.rb +31 -0
  103. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/comparing_arity.rb +63 -0
  104. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/object_is_proxy.rb +43 -0
  105. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/sequential_invocations.rb +26 -0
  106. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/setting_implementation.rb +51 -0
  107. data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/yields.rb +81 -0
  108. data/spec/suites/rspec_2/support/shared_examples/space.rb +13 -0
  109. data/spec/suites/rspec_2/support/shared_examples/times_called_expectation.rb +9 -0
  110. data/spec/suites/rspec_2/unit/core_ext/array_spec.rb +39 -0
  111. data/spec/suites/rspec_2/unit/core_ext/enumerable_spec.rb +53 -0
  112. data/spec/suites/rspec_2/unit/core_ext/hash_spec.rb +55 -0
  113. data/spec/suites/rspec_2/unit/core_ext/range_spec.rb +41 -0
  114. data/spec/suites/rspec_2/unit/core_ext/regexp_spec.rb +41 -0
  115. data/spec/suites/rspec_2/unit/deprecations_spec.rb +27 -0
  116. data/spec/suites/rspec_2/unit/double_definitions/child_double_definition_create_spec.rb +114 -0
  117. data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_blank_slate_spec.rb +93 -0
  118. data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_spec.rb +446 -0
  119. data/spec/suites/rspec_2/unit/dsl/double_creators_spec.rb +133 -0
  120. data/spec/suites/rspec_2/unit/dsl/space_spec.rb +99 -0
  121. data/spec/suites/rspec_2/unit/dsl/wildcard_matchers_spec.rb +67 -0
  122. data/spec/suites/rspec_2/unit/errors/rr_error_spec.rb +67 -0
  123. data/spec/suites/rspec_2/unit/expectations/any_argument_expectation_spec.rb +48 -0
  124. data/spec/suites/rspec_2/unit/expectations/anything_argument_equality_expectation_spec.rb +14 -0
  125. data/spec/suites/rspec_2/unit/expectations/argument_equality_expectation_spec.rb +135 -0
  126. data/spec/suites/rspec_2/unit/expectations/boolean_argument_equality_expectation_spec.rb +30 -0
  127. data/spec/suites/rspec_2/unit/expectations/hash_including_argument_equality_expectation_spec.rb +92 -0
  128. data/spec/suites/rspec_2/unit/expectations/satisfy_argument_equality_expectation_spec.rb +61 -0
  129. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/any_times_matcher_spec.rb +22 -0
  130. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_least_matcher_spec.rb +37 -0
  131. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_most_matcher_spec.rb +43 -0
  132. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/integer_matcher_spec.rb +58 -0
  133. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/proc_matcher_spec.rb +35 -0
  134. data/spec/suites/rspec_2/unit/expectations/times_called_expectation/range_matcher_spec.rb +39 -0
  135. data/spec/suites/rspec_2/unit/hash_with_object_id_key_spec.rb +88 -0
  136. data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_spec.rb +533 -0
  137. data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_verify_spec.rb +32 -0
  138. data/spec/suites/rspec_2/unit/integrations/rspec/invocation_matcher_spec.rb +297 -0
  139. data/spec/suites/rspec_2/unit/integrations/rspec_spec.rb +70 -0
  140. data/spec/suites/rspec_2/unit/rr_spec.rb +28 -0
  141. data/spec/suites/rspec_2/unit/space_spec.rb +598 -0
  142. data/spec/suites/rspec_2/unit/spy_verification_spec.rb +133 -0
  143. data/spec/suites/rspec_2/unit/times_called_matchers/any_times_matcher_spec.rb +46 -0
  144. data/spec/suites/rspec_2/unit/times_called_matchers/at_least_matcher_spec.rb +54 -0
  145. data/spec/suites/rspec_2/unit/times_called_matchers/at_most_matcher_spec.rb +69 -0
  146. data/spec/suites/rspec_2/unit/times_called_matchers/integer_matcher_spec.rb +69 -0
  147. data/spec/suites/rspec_2/unit/times_called_matchers/proc_matcher_spec.rb +54 -0
  148. data/spec/suites/rspec_2/unit/times_called_matchers/range_matcher_spec.rb +75 -0
  149. data/spec/suites/rspec_2/unit/times_called_matchers/times_called_matcher_spec.rb +117 -0
  150. data/spec/suites/rspec_2/unit/wildcard_matchers/anything_spec.rb +33 -0
  151. data/spec/suites/rspec_2/unit/wildcard_matchers/boolean_spec.rb +45 -0
  152. data/spec/suites/rspec_2/unit/wildcard_matchers/duck_type_spec.rb +64 -0
  153. data/spec/suites/rspec_2/unit/wildcard_matchers/hash_including_spec.rb +64 -0
  154. data/spec/suites/rspec_2/unit/wildcard_matchers/is_a_spec.rb +55 -0
  155. data/spec/suites/rspec_2/unit/wildcard_matchers/numeric_spec.rb +46 -0
  156. data/spec/suites/rspec_2/unit/wildcard_matchers/satisfy_spec.rb +57 -0
  157. data/spec/support/adapter.rb +22 -0
  158. data/spec/support/adapter_tests/base.rb +45 -0
  159. data/spec/support/adapter_tests/minitest.rb +7 -0
  160. data/spec/support/adapter_tests/rspec.rb +70 -0
  161. data/spec/support/adapter_tests/test_unit.rb +47 -0
  162. data/spec/support/command_runner.rb +105 -0
  163. data/spec/support/generator.rb +56 -0
  164. data/spec/support/integration_tests/base.rb +64 -0
  165. data/spec/support/integration_tests/rails.rb +60 -0
  166. data/spec/support/integration_tests/rails_minitest.rb +13 -0
  167. data/spec/support/integration_tests/rails_rspec.rb +13 -0
  168. data/spec/support/integration_tests/rails_test_unit.rb +13 -0
  169. data/spec/support/integration_tests/rails_test_unit_like.rb +13 -0
  170. data/spec/support/integration_tests/ruby.rb +7 -0
  171. data/spec/support/integration_tests/ruby_minitest.rb +13 -0
  172. data/spec/support/integration_tests/ruby_rspec.rb +13 -0
  173. data/spec/support/integration_tests/ruby_test_unit.rb +13 -0
  174. data/spec/support/matchers/be_a_subset_of_matcher.rb +24 -0
  175. data/spec/support/project/cucumber.rb +50 -0
  176. data/spec/support/project/generator.rb +348 -0
  177. data/spec/support/project/minitest.rb +39 -0
  178. data/spec/support/project/rails.rb +199 -0
  179. data/spec/support/project/rails_minitest.rb +17 -0
  180. data/spec/support/project/rails_rspec.rb +50 -0
  181. data/spec/support/project/rails_test_unit.rb +17 -0
  182. data/spec/support/project/rails_test_unit_like.rb +17 -0
  183. data/spec/support/project/rspec.rb +69 -0
  184. data/spec/support/project/ruby.rb +34 -0
  185. data/spec/support/project/ruby_minitest.rb +11 -0
  186. data/spec/support/project/ruby_rspec.rb +29 -0
  187. data/spec/support/project/ruby_test_unit.rb +11 -0
  188. data/spec/support/project/ruby_test_unit_like.rb +21 -0
  189. data/spec/support/project/test_unit.rb +29 -0
  190. data/spec/support/project/test_unit_like.rb +7 -0
  191. data/spec/support/project/tests_runner.rb +22 -0
  192. data/spec/support/test.sqlite3 +0 -0
  193. data/spec/support/test_case/generator.rb +53 -0
  194. data/spec/support/test_case/minitest.rb +13 -0
  195. data/spec/support/test_case/rspec.rb +19 -0
  196. data/spec/support/test_case/test_unit.rb +21 -0
  197. data/spec/support/test_file/generator.rb +120 -0
  198. data/spec/support/test_file/minitest.rb +19 -0
  199. data/spec/support/test_file/rails_minitest.rb +7 -0
  200. data/spec/support/test_file/rails_rspec.rb +12 -0
  201. data/spec/support/test_file/rails_test_unit.rb +25 -0
  202. data/spec/support/test_file/rspec.rb +33 -0
  203. data/spec/support/test_file/test_unit.rb +36 -0
  204. data/spec/support/test_helper/generator.rb +27 -0
  205. data/spec/support/test_helper/minitest.rb +7 -0
  206. data/spec/support/test_helper/rails.rb +31 -0
  207. data/spec/support/test_helper/rails_minitest.rb +7 -0
  208. data/spec/support/test_helper/rails_rspec.rb +25 -0
  209. data/spec/support/test_helper/rails_test_unit.rb +23 -0
  210. data/spec/support/test_helper/rspec.rb +7 -0
  211. data/spec/support/test_helper/ruby.rb +31 -0
  212. data/spec/support/test_helper/test_unit.rb +7 -0
  213. metadata +240 -19
  214. data/VERSION +0 -1
  215. data/lib/rr/adapters.rb +0 -44
  216. data/lib/rr/adapters/rr_methods.rb +0 -142
  217. data/lib/rr/integrations/rspec_1.rb +0 -46
  218. data/lib/rr/integrations/test_unit_1.rb +0 -63
  219. data/lib/rr/integrations/test_unit_2.rb +0 -15
  220. data/lib/rr/integrations/test_unit_200.rb +0 -27
  221. data/lib/rr/integrations/test_unit_200_active_support.rb +0 -25
  222. data/lib/rr/integrations/test_unit_2_active_support.rb +0 -38
  223. data/lib/rr/proc_from_block.rb +0 -11
@@ -0,0 +1,63 @@
1
+ shared_examples_for 'comparing the arity between the method and double definition' do
2
+ it "succeeds if both have no arity" do
3
+ object = build_object_with_methods(some_method: -> {}) do |subject|
4
+ double_creator = double_definition_creator_for(subject)
5
+ double_creator.some_method
6
+ end
7
+ object.some_method
8
+ end
9
+
10
+ it "fails if the former has no arity and the latter does" do
11
+ build_object_with_methods(some_method: -> {}) do |subject|
12
+ double_creator = double_definition_creator_for(subject)
13
+ expect { double_creator.some_method(1) }.to \
14
+ raise_error(RR::Errors::SubjectHasDifferentArityError)
15
+ end
16
+ end
17
+
18
+ it "fails if the former has arity but the latter doesn't" do
19
+ build_object_with_methods(some_method: ->(arg) {}) do |subject|
20
+ double_creator = double_definition_creator_for(subject)
21
+ expect { double_creator.some_method }.to \
22
+ raise_error(RR::Errors::SubjectHasDifferentArityError)
23
+ end
24
+ end
25
+
26
+ it "succeeds if both have a finite number of arguments" do
27
+ object = build_object_with_methods(some_method: ->(arg) {}) do |subject|
28
+ double_creator = double_definition_creator_for(subject)
29
+ double_creator.some_method(1)
30
+ end
31
+ object.some_method(1)
32
+ end
33
+
34
+ it "succeeds if both have a variable number of arguments" do
35
+ object = build_object_with_methods(some_method: ->(*args) {}) do |subject|
36
+ double_creator = double_definition_creator_for(subject)
37
+ double_creator.some_method(1)
38
+ double_creator.some_method(1, 2, 3)
39
+ double_creator.some_method(1, 2)
40
+ end
41
+ object.some_method(1)
42
+ object.some_method(1, 2)
43
+ object.some_method(1, 2, 3)
44
+ end
45
+
46
+ it "succeeds if both have finite and variable number of arguments" do
47
+ object = build_object_with_methods(some_method: ->(arg1, arg2, *rest) {}) do |subject|
48
+ double_creator = double_definition_creator_for(subject)
49
+ double_creator.some_method(1, 2)
50
+ double_creator.some_method(1, 2, 3)
51
+ end
52
+ object.some_method(1, 2)
53
+ object.some_method(1, 2, 3)
54
+ end
55
+
56
+ it "fails if the finite arguments are not matched before the variable arguments" do
57
+ build_object_with_methods(some_method: ->(arg1, arg2, *rest) {}) do |subject|
58
+ double_creator = double_definition_creator_for(subject)
59
+ expect { double_creator.some_method(1) }.to \
60
+ raise_error(RR::Errors::SubjectHasDifferentArityError)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,43 @@
1
+ # btakita/rr issue #24
2
+ # this happens when defining a double on an ActiveRecord association object
3
+ shared_examples_for 'defining a method double on an object which is a proxy for another object' do
4
+ include DoubleDefinitionCreatorHelpers
5
+
6
+ it "places the double on the proxy object and not the target object by mistake" do
7
+ target_object = build_object_with_possible_methods(some_method: -> { 'existing value' })
8
+ proxy_object = proxy_object_class.new(target_object)
9
+ expect(proxy_object.methods).to match_array(target_object.methods)
10
+ double_definition_creator_for(proxy_object).some_method { 'value' }
11
+ expect(proxy_object.some_method).to eq 'value'
12
+ end
13
+
14
+ it "resets the double correctly" do
15
+ target_object = build_object_with_possible_methods(some_method: -> { 'existing value' })
16
+ proxy_object = proxy_object_class.new(target_object)
17
+ expect(proxy_object.methods).to match_array(target_object.methods)
18
+ double_definition_creator_for(proxy_object).some_method { 'value' }
19
+ RR.reset
20
+ expect_method_to_have_value_or_be_absent('existing value', proxy_object, :some_method)
21
+ end
22
+
23
+ def proxy_object_class
24
+ Class.new do
25
+ # This matches what AssociationProxy was like as of Rails 2
26
+ instance_methods.each do |m|
27
+ undef_method m unless m.to_s =~ /^(?:nil\?|send|object_id|to_a)$|^__|^respond_to|proxy_/
28
+ end
29
+
30
+ def initialize(target)
31
+ @target = target
32
+ end
33
+
34
+ def method_missing(name, *args, &block)
35
+ if @target.respond_to?(name)
36
+ @target.__send__(name, *args, &block)
37
+ else
38
+ super
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,26 @@
1
+ shared_examples_for 'defining a method double for sequential invocations of that method using #ordered/#then' do
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ it "works" do
5
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
6
+ double_creator = double_definition_creator_for(subject)
7
+ double_creator.some_method { 'value 1' }.twice.ordered
8
+ double_creator.some_method { 'value 2' }.once.ordered
9
+ end
10
+
11
+ expect(object.some_method).to eq 'value 1'
12
+ expect(object.some_method).to eq 'value 1'
13
+ expect(object.some_method).to eq 'value 2'
14
+ end
15
+
16
+ it "works when using #then instead of #ordered" do
17
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
18
+ double_definition_creator_for(subject).
19
+ some_method { 'value 1' }.once.then.
20
+ some_method { 'value 2' }.once
21
+ end
22
+
23
+ expect(object.some_method).to eq 'value 1'
24
+ expect(object.some_method).to eq 'value 2'
25
+ end
26
+ end
@@ -0,0 +1,51 @@
1
+ shared_examples_for 'defining a method double that sets the implementation of that method' do
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ it "works when not given a block" do
5
+ expect_that_double_can_be_defined_without_block
6
+ end
7
+
8
+ context 'by giving a block' do
9
+ it "replaces the implementation with the block" do
10
+ expect_that_double_sets_implementation do |double_creator, method_name, block|
11
+ double_creator.__send__(method_name, &block)
12
+ end
13
+ end
14
+
15
+ it "resets the double correctly" do
16
+ expect_that_double_sets_implementation_and_resets do |double_creator, method_name, block|
17
+ double_creator.__send__(method_name, &block)
18
+ end
19
+ end
20
+ end
21
+
22
+ context 'by using #returns' do
23
+ context 'with a block' do
24
+ it "replaces the implementation with the block" do
25
+ expect_that_double_sets_implementation do |double_creator, method_name, block|
26
+ double_creator.__send__(method_name).returns(&block)
27
+ end
28
+ end
29
+
30
+ it "resets the double correctly" do
31
+ expect_that_double_sets_implementation_and_resets do |double_creator, method_name, block|
32
+ double_creator.__send__(method_name).returns(&block)
33
+ end
34
+ end
35
+ end
36
+
37
+ context 'with a straight argument' do
38
+ it "makes the method return the argument" do
39
+ expect_that_double_sets_value do |double_creator, method_name, value|
40
+ double_creator.__send__(method_name).returns(value)
41
+ end
42
+ end
43
+
44
+ it "resets the double correctly" do
45
+ expect_that_double_sets_value_and_resets do |double, method_name, value|
46
+ double_creator.__send__(method_name).returns(value)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,81 @@
1
+ shared_examples_for 'defining a method double qualified with #yields' do
2
+ include DoubleDefinitionCreatorHelpers
3
+
4
+ context 'without arguments' do
5
+ it "inserts a yield that passes no arguments" do
6
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
7
+ double_definition_creator_for(subject).some_method.yields
8
+ end
9
+ x = 0
10
+ object.some_method { x = 1 }
11
+ expect(x).to eq 1
12
+ end
13
+
14
+ it "does not affect setting the implementation otherwise" do
15
+ object = build_object_with_possible_methods(some_method: -> { 'existing value' }) do |subject|
16
+ double_definition_creator_for(subject).some_method { 'value' }.yields
17
+ end
18
+ expect(object.some_method { }).to eq 'value'
19
+ end
20
+
21
+ it "also lets you set the implementation in preference to #returns" do
22
+ object = build_object_with_possible_methods(some_method: -> { 'existing value' }) do |subject|
23
+ double_definition_creator_for(subject).some_method.yields { 'value' }
24
+ end
25
+ expect(object.some_method { }).to eq 'value'
26
+ end
27
+
28
+ it "is reset correctly" do
29
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
30
+ double_definition_creator_for(subject).some_method.yields
31
+ end
32
+ RR.reset
33
+ x = 0
34
+ if methods_being_doubled_exist_already?
35
+ object.some_method { x = 1 }
36
+ expect(x).to eq 0
37
+ else
38
+ expect_method_to_not_exist(object, :some_method)
39
+ end
40
+ end
41
+ end
42
+
43
+ context 'with arguments' do
44
+ it "inserts a yield that passes those arguments" do
45
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
46
+ double_definition_creator_for(subject).some_method.yields(1)
47
+ end
48
+ x = 0
49
+ object.some_method {|a| x = a }
50
+ expect(x).to eq 1
51
+ end
52
+
53
+ it "does not affect setting the implementation otherwise" do
54
+ object = build_object_with_possible_methods(some_method: -> { 'existing value' }) do |subject|
55
+ double_definition_creator_for(subject).some_method { 'value' }.yields(1)
56
+ end
57
+ expect(object.some_method { }).to eq 'value'
58
+ end
59
+
60
+ it "also lets you set the implementation in preference to #returns" do
61
+ object = build_object_with_possible_methods(some_method: -> { 'existing value' }) do |subject|
62
+ double_definition_creator_for(subject).some_method.yields(1) { 'value' }
63
+ end
64
+ expect(object.some_method { }).to eq 'value'
65
+ end
66
+
67
+ it "is reset correctly" do
68
+ object = build_object_with_possible_methods(some_method: -> {}) do |subject|
69
+ double_definition_creator_for(subject).some_method.yields(1)
70
+ end
71
+ RR.reset
72
+ if methods_being_doubled_exist_already?
73
+ x = 0
74
+ object.some_method {|a| x = a }
75
+ expect(x).to eq 0
76
+ else
77
+ expect_method_to_not_exist(object, :some_method)
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,13 @@
1
+ shared_examples_for "Swapped Space" do
2
+ attr_reader :space, :original_space
3
+
4
+ before do
5
+ @original_space = RR::Space.instance
6
+ RR::Space.instance = RR::Space.new
7
+ @space = RR::Space.instance
8
+ end
9
+
10
+ after do
11
+ RR::Space.instance = @original_space
12
+ end
13
+ end
@@ -0,0 +1,9 @@
1
+ shared_examples_for "RR::Expectations::TimesCalledExpectation" do
2
+ include_examples "Swapped Space"
3
+
4
+ subject { Object.new }
5
+
6
+ def raises_expectation_error(&block)
7
+ expect { block.call }.to raise_error(RR::Errors::TimesCalledError)
8
+ end
9
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe Array do
4
+ include WildcardMatcherMatchers
5
+
6
+ describe '#wildcard_match?' do
7
+ context 'when this Array has items that respond to #wildcard_match?' do
8
+ subject { [hash_including({:foo => 'bar'})] }
9
+
10
+ it "returns true if all items in the given Array wildcard-match corresponding items in this Array" do
11
+ should wildcard_match([{:foo => 'bar', :baz => 'quux'}])
12
+ end
13
+
14
+ it "returns true if any items in the given Array do not wildcard-match corresponding items in this Array" do
15
+ should_not wildcard_match([{:foo => 'bat', :baz => 'quux'}])
16
+ end
17
+ end
18
+
19
+ context 'when this Array has items that do not respond to #wildcard_match?' do
20
+ subject { [:a_symbol] }
21
+
22
+ it "returns true if all items in the given Array equal-match corresponding items in this Array" do
23
+ should wildcard_match([:a_symbol])
24
+ end
25
+
26
+ it "returns true if any items in the given Array do not equal-match corresponding items in this Array" do
27
+ should_not wildcard_match([:another_symbol])
28
+ end
29
+ end
30
+
31
+ context 'when not given an Array' do
32
+ subject { [{:foo => 'bar'}] }
33
+
34
+ it "returns false" do
35
+ should_not wildcard_match(:something_else)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,53 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe Enumerable do
4
+ include WildcardMatcherMatchers
5
+
6
+ let(:klass) {
7
+ Class.new do
8
+ include Enumerable
9
+
10
+ def initialize(*items)
11
+ @arr = items
12
+ end
13
+
14
+ def each(&block)
15
+ @arr.each(&block)
16
+ end
17
+ end
18
+ }
19
+
20
+ describe '#wildcard_match?' do
21
+ context 'when this Enumerable has items that respond to #wildcard_match?' do
22
+ subject { klass.new(hash_including({:foo => 'bar'})) }
23
+
24
+ it "returns true if all items in the given Enumerable wildcard-match corresponding items in this Enumerable" do
25
+ should wildcard_match([{:foo => 'bar', :baz => 'quux'}])
26
+ end
27
+
28
+ it "returns true if any items in the given Enumerable do not wildcard-match corresponding items in this Enumerable" do
29
+ should_not wildcard_match([{:foo => 'bat', :baz => 'quux'}])
30
+ end
31
+ end
32
+
33
+ context 'when this Enumerable has items that do not respond to #wildcard_match?' do
34
+ subject { klass.new(:a_symbol) }
35
+
36
+ it "returns true if all items in the given Enumerable equal-match corresponding items in this Enumerable" do
37
+ should wildcard_match([:a_symbol])
38
+ end
39
+
40
+ it "returns true if any items in the given Enumerable do not equal-match corresponding items in this Enumerable" do
41
+ should_not wildcard_match([:another_symbol])
42
+ end
43
+ end
44
+
45
+ context 'when not given an Enumerable' do
46
+ subject { klass.new({:foo => 'bar'}) }
47
+
48
+ it "returns false" do
49
+ should_not wildcard_match(:something_else)
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,55 @@
1
+ require File.expand_path('../../../spec_helper', __FILE__)
2
+
3
+ describe Hash do
4
+ include WildcardMatcherMatchers
5
+
6
+ describe '#wildcard_match?' do
7
+ context 'when this Hash has keys that respond to #wildcard_match?' do
8
+ subject { {is_a(Symbol) => 'x'} }
9
+
10
+ it "returns true if all keys in the given Hash wildcard-match the corresponding keys in this Hash" do
11
+ should wildcard_match({:foo => 'x'})
12
+ end
13
+
14
+ it "returns true if any keys in the given Hash do not wildcard-match the corresponding keys in this Hash" do
15
+ should_not wildcard_match({'foo' => 'x'})
16
+ end
17
+ end
18
+
19
+ context 'when this Hash has values that respond to #wildcard_match?' do
20
+ subject { {'x' => is_a(Symbol)} }
21
+
22
+ it "returns true if all values in the given Hash wildcard-match the corresponding values in this Hash" do
23
+ should wildcard_match({'x' => :foo})
24
+ end
25
+
26
+ it "returns false if any values in the given Hash do not wildcard-match the corresponding values in this Hash" do
27
+ should_not wildcard_match({'x' => 'foo'})
28
+ end
29
+ end
30
+
31
+ context 'when this Hash does not have keys or values that respond to #wildcard_match?' do
32
+ subject { {:x => :y} }
33
+
34
+ it "returns true if all pairs in the given Hash wildcard-match the corresponding values in this Hash" do
35
+ should wildcard_match({:x => :y})
36
+ end
37
+
38
+ it "returns false if any keys do not equal-match corresponding items in the subject" do
39
+ should_not wildcard_match({:z => :y})
40
+ end
41
+
42
+ it "returns false if any values do not equal-match corresponding items in the subject" do
43
+ should_not wildcard_match({:x => :z})
44
+ end
45
+ end
46
+
47
+ context 'when not given a Hash' do
48
+ subject { {:foo => 'bar'} }
49
+
50
+ it "returns false" do
51
+ should_not wildcard_match(:something_else)
52
+ end
53
+ end
54
+ end
55
+ end