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,30 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe ArgumentEqualityExpectation do
6
+ context "with a boolean matcher" do
7
+ attr_reader :expectation
8
+
9
+ before do
10
+ @expectation = ArgumentEqualityExpectation.new([boolean], {})
11
+ end
12
+
13
+ describe "#wildcard_match?" do
14
+ context "when passed a Boolean" do
15
+ it "returns true" do
16
+ expect(expectation).to be_wildcard_match([true], {})
17
+ expect(expectation).to be_wildcard_match([false], {})
18
+ end
19
+ end
20
+
21
+ context "when not passed a Boolean" do
22
+ it "returns false" do
23
+ expectation.should_not be_wildcard_match([:not_a_boolean], {})
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,92 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe ArgumentEqualityExpectation, "with HashIncluding argument" do
6
+ attr_reader :expectation, :expected_hash
7
+
8
+ before do
9
+ @expected_hash = {:texas => "Austin", :maine => "Augusta"}
10
+ end
11
+
12
+ describe "#exact_match?" do
13
+ before do
14
+ @expectation = ArgumentEqualityExpectation.new([hash_including(expected_hash)], {})
15
+ end
16
+
17
+ it "returns true when passed in a HashIncluding matcher with the same hash" do
18
+ expect(expectation).to be_exact_match([RR::WildcardMatchers::HashIncluding.new(expected_hash)],
19
+ {})
20
+ end
21
+
22
+ it "returns false when passed in a HashIncluding matcher with a different argument list" do
23
+ expectation.should_not be_exact_match([RR::WildcardMatchers::HashIncluding.new(:foo => 1)],
24
+ {})
25
+ end
26
+
27
+ it "returns false otherwise" do
28
+ expectation.should_not be_exact_match(["hello"], {})
29
+ expectation.should_not be_exact_match([:hello], {})
30
+ expectation.should_not be_exact_match([1], {})
31
+ expectation.should_not be_exact_match([nil], {})
32
+ expectation.should_not be_exact_match([true], {})
33
+ expectation.should_not be_exact_match([], {})
34
+ end
35
+ end
36
+
37
+ describe "#wildcard_match?" do
38
+ before do
39
+ @expectation = ArgumentEqualityExpectation.new([hash_including(expected_hash)],
40
+ {})
41
+ end
42
+
43
+ it "returns true when hash contains same key/values as the expectation" do
44
+ expect(expectation).to be_wildcard_match([expected_hash], {})
45
+ end
46
+
47
+ it "returns true when hash contains at least expectation's key/values" do
48
+ expect(expectation).to be_wildcard_match([expected_hash.merge(:oregon => "Salem")],
49
+ {})
50
+ end
51
+
52
+ it "returns true when passed the same hash, even after the original is modified" do
53
+ original_expected_hash = expected_hash.clone
54
+ expected_hash[:texas] = nil
55
+ expect(expectation).to be_wildcard_match([original_expected_hash], {})
56
+ end
57
+
58
+ it "returns true even if one of the expectation's values is nil" do
59
+ expectation = ArgumentEqualityExpectation.new([hash_including(:foo => nil)],
60
+ {})
61
+ expect(expectation).to be_wildcard_match([{:foo => nil}],
62
+ {})
63
+ end
64
+
65
+ it "returns false when hash matches only some required key/values" do
66
+ expectation.should_not be_wildcard_match([{:texas => "Austin"}],
67
+ {})
68
+ end
69
+
70
+ it "returns false when hash matches all the keys but not all the values" do
71
+ expectation.should_not be_wildcard_match([{:texas => "Austin", :maine => "Portland"}],
72
+ {})
73
+ end
74
+
75
+ it "returns false when passed a hash that matches all values but not all keys" do
76
+ expectation.should_not be_wildcard_match([{:texas => "Austin", :georgia => "Augusta"}],
77
+ {})
78
+ end
79
+
80
+ it "returns true when an exact match" do
81
+ expect(expectation).to be_wildcard_match([hash_including(expected_hash)],
82
+ {})
83
+ end
84
+
85
+ it "returns false when not passed correct number of arguments" do
86
+ expectation.should_not be_wildcard_match([], {})
87
+ expectation.should_not be_wildcard_match([:a, :b], {})
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,61 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ =begin
4
+ module RR
5
+ module Expectations
6
+ describe ArgumentEqualityExpectation, "with Satisfy argument" do
7
+ attr_reader :expectation, :expectation_proc, :expected_value, :satisfy_matcher
8
+
9
+ before do
10
+ @expected_value = :foo
11
+ @expectation_proc = lambda {|argument| puts 'called'; argument == expected_value}
12
+ @satisfy_matcher = satisfy(&expectation_proc)
13
+ @expectation = ArgumentEqualityExpectation.new(satisfy_matcher)
14
+ end
15
+
16
+ describe "#exact_match?" do
17
+ before do
18
+ end
19
+
20
+ it "returns true when passed a Satisfy matcher with the same proc" do
21
+ expect(expectation).to be_exact_match(RR::WildcardMatchers::Satisfy.new(expectation_proc))
22
+ end
23
+
24
+ it "returns false when passed a Satisfy matcher with another proc" do
25
+ expectation.should_not be_exact_match(RR::WildcardMatchers::Satisfy.new(lambda {}))
26
+ end
27
+
28
+ it "returns false otherwise" do
29
+ expectation.should_not be_exact_match("hello")
30
+ expectation.should_not be_exact_match(:hello)
31
+ expectation.should_not be_exact_match(1)
32
+ expectation.should_not be_exact_match(nil)
33
+ expectation.should_not be_exact_match(true)
34
+ expectation.should_not be_exact_match()
35
+ end
36
+ end
37
+
38
+ describe "#wildcard_match?" do
39
+ it "returns true when the proc returns a truthy value" do
40
+ expect((!!expectation_proc.call(expected_value))).to be_true
41
+ expect(expectation).to be_wildcard_match(expected_value)
42
+ end
43
+
44
+ it "returns false when the proc returns a falsey value" do
45
+ expect((!!expectation_proc.call(:bar))).to be_false
46
+ expectation.should_not be_wildcard_match(:bar)
47
+ end
48
+
49
+ it "returns true when an exact match" do
50
+ expect(expectation).to be_wildcard_match(satisfy_matcher)
51
+ end
52
+
53
+ it "returns false when not passed correct number of arguments" do
54
+ expectation.should_not be_wildcard_match()
55
+ expectation.should_not be_wildcard_match(:a, :b)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ =end
@@ -0,0 +1,22 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe TimesCalledExpectation do
6
+ context "when using an AnyTimesMatcher" do
7
+ include_examples "RR::Expectations::TimesCalledExpectation"
8
+
9
+ describe "#verify!" do
10
+ it "always passes" do
11
+ stub(subject).foobar.any_number_of_times
12
+ RR.verify
13
+
14
+ stub(subject).foobar.any_number_of_times
15
+ 10.times {subject.foobar}
16
+ RR.verify
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,37 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe TimesCalledExpectation do
6
+ context "when using an AtLeastMatcher" do
7
+ include_examples "RR::Expectations::TimesCalledExpectation"
8
+
9
+ before do
10
+ mock(subject).foobar.at_least(3)
11
+ end
12
+
13
+ describe "#verify!" do
14
+ it "passes when times called > times" do
15
+ 4.times {subject.foobar}
16
+ RR.verify
17
+ end
18
+
19
+ it "passes when times called == times" do
20
+ 3.times {subject.foobar}
21
+ RR.verify
22
+ end
23
+
24
+ it "raises error when times called < times" do
25
+ subject.foobar
26
+ expect {
27
+ RR.verify
28
+ }.to raise_error(
29
+ RR::Errors::TimesCalledError,
30
+ "foobar()\nCalled 1 time.\nExpected at least 3 times."
31
+ )
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe TimesCalledExpectation do
6
+ context "when using an AtMostMatcher" do
7
+ include_examples "RR::Expectations::TimesCalledExpectation"
8
+
9
+ before do
10
+ stub(subject).foobar.at_most(3)
11
+ end
12
+
13
+ describe "#verify!" do
14
+ it "passes when times called == times" do
15
+ 3.times {subject.foobar}
16
+ RR.verify
17
+ end
18
+
19
+ it "passes when times called < times" do
20
+ 2.times {subject.foobar}
21
+ RR.verify
22
+ end
23
+
24
+ it "raises error when times called > times" do
25
+ expect {
26
+ 4.times {subject.foobar}
27
+ }.to raise_error(
28
+ RR::Errors::TimesCalledError,
29
+ "foobar()\nCalled 4 times.\nExpected at most 3 times."
30
+ )
31
+
32
+ expect {
33
+ RR.verify
34
+ }.to raise_error(
35
+ RR::Errors::TimesCalledError,
36
+ "foobar()\nCalled 4 times.\nExpected at most 3 times."
37
+ )
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,58 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe TimesCalledExpectation do
6
+ context "when using an IntegerMatcher" do
7
+ include_examples "RR::Expectations::TimesCalledExpectation"
8
+
9
+ before do
10
+ stub(subject).foobar.times(2)
11
+ end
12
+
13
+ describe "verify" do
14
+ it "passes after attempt! called 2 times" do
15
+ subject.foobar
16
+ subject.foobar
17
+ RR.verify
18
+ end
19
+
20
+ it "fails after attempt! called 1 time" do
21
+ subject.foobar
22
+ expect { RR.verify }.to raise_error(
23
+ RR::Errors::TimesCalledError,
24
+ "foobar()\nCalled 1 time.\nExpected 2 times."
25
+ )
26
+ end
27
+
28
+ it "can't be called when attempt! is called 3 times" do
29
+ subject.foobar
30
+ subject.foobar
31
+ expect {
32
+ subject.foobar
33
+ }.to raise_error(RR::Errors::TimesCalledError, "foobar()\nCalled 3 times.\nExpected 2 times.")
34
+ expect {
35
+ RR.verify
36
+ }.to raise_error(RR::Errors::TimesCalledError, "foobar()\nCalled 3 times.\nExpected 2 times.")
37
+ end
38
+
39
+ it "has a backtrace to where the TimesCalledExpectation was instantiated on failure" do
40
+ error = nil
41
+ begin
42
+ RR.verify
43
+ rescue RR::Errors::TimesCalledError => e
44
+ error = e
45
+ end
46
+ expect(e.backtrace.join("\n")).to include(__FILE__)
47
+ end
48
+
49
+ it "has an error message that includes the number of times called and expected number of times" do
50
+ expect {
51
+ RR.verify
52
+ }.to raise_error(RR::Errors::TimesCalledError, "foobar()\nCalled 0 times.\nExpected 2 times.")
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,35 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe TimesCalledExpectation do
6
+ context "when using a ProcMatcher" do
7
+ include_examples "RR::Expectations::TimesCalledExpectation"
8
+
9
+ before do
10
+ stub(subject).foobar.times(lambda {|value| value == 2})
11
+ end
12
+
13
+ describe "#verify" do
14
+ it "passes after attempt! called 2 times" do
15
+ subject.foobar
16
+ subject.foobar
17
+ RR.verify
18
+ end
19
+
20
+ it "fails after attempt! called 1 time" do
21
+ subject.foobar
22
+ expect { RR.verify }.to raise_error(RR::Errors::TimesCalledError)
23
+ end
24
+
25
+ it "fails after attempt! called 3 times" do
26
+ subject.foobar
27
+ subject.foobar
28
+ subject.foobar
29
+ expect { RR.verify }.to raise_error(RR::Errors::TimesCalledError)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,39 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe TimesCalledExpectation do
6
+ context "when using a RangeMatcher" do
7
+ include_examples "RR::Expectations::TimesCalledExpectation"
8
+
9
+ before do
10
+ stub(subject).foobar.times(1..2)
11
+ end
12
+
13
+ describe "#verify" do
14
+ it "passes after attempt! called 1 time" do
15
+ subject.foobar
16
+ RR.verify
17
+ end
18
+
19
+ it "passes after attempt! called 2 times" do
20
+ subject.foobar
21
+ subject.foobar
22
+ RR.verify
23
+ end
24
+
25
+ it "can't be called when attempt! is called 3 times" do
26
+ subject.foobar
27
+ subject.foobar
28
+ expect {
29
+ subject.foobar
30
+ }.to raise_error(RR::Errors::TimesCalledError, "foobar()\nCalled 3 times.\nExpected 1..2 times.")
31
+ expect {
32
+ RR.verify
33
+ }.to raise_error(RR::Errors::TimesCalledError, "foobar()\nCalled 3 times.\nExpected 1..2 times.")
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,88 @@
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
+ expect(hash[array_1]).to_not eq 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
+ expect(hash.instance_eval {@keys}).to eq({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
+ expect(keys.sort).to eq ['one', 'two']
38
+ expect(values.sort).to eq [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
+ expect(@hash[@key]).to be_nil
52
+ end
53
+
54
+ it "removes the object from the keys hash" do
55
+ @hash.delete(@key)
56
+ expect(@hash.instance_eval { @keys }).to eq({})
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
+ expect(@hash.keys).to eq [@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
+ expect(@hash.include?(@key)).to be_true
81
+ end
82
+
83
+ it "returns false when the key is not in the Hash" do
84
+ expect(@hash.include?(Object.new)).to be_false
85
+ end
86
+ end
87
+ end
88
+ end