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,133 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
2
+
3
+ class Alpha
4
+ def bob
5
+ end
6
+ end
7
+
8
+ describe RR::SpyVerification do
9
+ subject { Object.new }
10
+
11
+ attr_reader :recorded_calls
12
+
13
+ include_examples "Swapped Space"
14
+
15
+ include RR::DSL
16
+
17
+ before(:each) do
18
+ stub(subject).foobar
19
+ @recorded_calls = RR::RecordedCalls.new([[subject, :foobar, [1, 2], nil]])
20
+ end
21
+
22
+ describe "#call" do
23
+ context "when a subject is expected to receive a method with exact arguments" do
24
+ context "when the number of times the subject received a method is not specified" do
25
+ context "when there is an exact match one time" do
26
+ it "verifies that the method with arguments was called once" do
27
+ subject.foobar(1, 2)
28
+ received(subject).foobar(1, 2).call
29
+ subject.foobar(1, 2)
30
+ expect {
31
+ received(subject).foobar(1, 2).call
32
+ }.to raise_error(RR::Errors::SpyVerificationErrors::InvocationCountError)
33
+ end
34
+ end
35
+ end
36
+
37
+ context "when the number of times the subject received a method is specified" do
38
+ context "as one time" do
39
+ it "verifies that the method with arugments was called once" do
40
+ subject.foobar(1, 2)
41
+ received(subject).foobar(1, 2).once.call
42
+ subject.foobar(1, 2)
43
+ expect {
44
+ received(subject).foobar(1, 2).once.call
45
+ }.to raise_error(RR::Errors::SpyVerificationErrors::InvocationCountError)
46
+ end
47
+ end
48
+
49
+ context "as an at least matcher" do
50
+ it "verifies that the method with arugments was called at least the specified number of times" do
51
+ subject.foobar(1, 2)
52
+ expect {
53
+ received(subject).foobar(1, 2).at_least(2).call
54
+ }.to raise_error(RR::Errors::SpyVerificationErrors::InvocationCountError)
55
+ subject.foobar(1, 2)
56
+ received(subject).foobar(1, 2).at_least(2).call
57
+ subject.foobar(1, 2)
58
+ received(subject).foobar(1, 2).at_least(2).call
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ context "when a subject is expected to receive a method with wildcard arguments" do
65
+ context "when the number of times the subject received a method is not specified" do
66
+ context "when there is a wildcard match one time" do
67
+ it "verifies that the method with arguments was called once" do
68
+ subject.foobar(1, 2)
69
+ received(subject).foobar(1, is_a(Fixnum)).call
70
+ subject.foobar(1, 2)
71
+ expect {
72
+ received(subject).foobar(1, is_a(Fixnum)).call
73
+ }.to raise_error(RR::Errors::SpyVerificationErrors::InvocationCountError)
74
+ end
75
+ end
76
+ end
77
+
78
+ context "when the number of times the subject received a method is specified" do
79
+ context "as one time" do
80
+ it "verifies that the method with arugments was called once" do
81
+ subject.foobar(1, 2)
82
+ received(subject).foobar(1, is_a(Fixnum)).once.call
83
+ subject.foobar(1, 2)
84
+ expect {
85
+ received(subject).foobar(1, is_a(Fixnum)).once.call
86
+ }.to raise_error(RR::Errors::SpyVerificationErrors::InvocationCountError)
87
+ end
88
+ end
89
+
90
+ context "as an at least matcher" do
91
+ it "verifies that the method with arugments was called at least the specified number of times" do
92
+ subject.foobar(1, is_a(Fixnum))
93
+ expect {
94
+ received(subject).foobar(1, is_a(Fixnum)).at_least(2).call
95
+ }.to raise_error(RR::Errors::SpyVerificationErrors::InvocationCountError)
96
+ subject.foobar(1, 2)
97
+ received(subject).foobar(1, is_a(Fixnum)).at_least(2).call
98
+ subject.foobar(1, 2)
99
+ received(subject).foobar(1, is_a(Fixnum)).at_least(2).call
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ context "when checking for ordering" do
106
+ it "when the order is incorrect; raises an error" do
107
+ subject.foobar(3, 4)
108
+ subject.foobar(1, 2)
109
+ expect {
110
+ received(subject).foobar(1, 2).ordered.call
111
+ received(subject).foobar(3, 4).ordered.call
112
+ }.to raise_error(RR::Errors::SpyVerificationErrors::InvocationCountError)
113
+ end
114
+
115
+ it "when the order is correct; does not raise an error" do
116
+ subject.foobar(1, 2)
117
+ subject.foobar(1, 2)
118
+ subject.foobar(3, 4)
119
+ received(subject).foobar(1, 2).ordered.call
120
+ received(subject).foobar(3, 4).ordered.call
121
+ end
122
+ end
123
+
124
+ context "when the subject is expected where there is not DoubleInjection" do
125
+ it "raises a DoubleInjectionNotFoundError" do
126
+ expect(::RR::Injections::DoubleInjection.exists?(subject, :method_that_does_not_exist)).to be_false
127
+ expect {
128
+ received(subject).method_that_does_not_exist.call
129
+ }.to raise_error(RR::Errors::SpyVerificationErrors::DoubleInjectionNotFoundError)
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,46 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module TimesCalledMatchers
5
+ describe AnyTimesMatcher do
6
+ attr_reader :matcher
7
+ before do
8
+ @matcher = AnyTimesMatcher.new
9
+ end
10
+
11
+ describe AnyTimesMatcher, "#possible_match?" do
12
+ it "always returns true" do
13
+ expect(matcher).to be_possible_match(0)
14
+ expect(matcher).to be_possible_match(99999)
15
+ end
16
+ end
17
+
18
+ describe AnyTimesMatcher, "#matches?" do
19
+ it "always returns true" do
20
+ expect(matcher).to be_matches(0)
21
+ expect(matcher).to be_matches(99999)
22
+ end
23
+ end
24
+
25
+ describe AnyTimesMatcher, "#attempt?" do
26
+ it "always returns true" do
27
+ expect(matcher).to be_attempt(0)
28
+ expect(matcher).to be_attempt(99999)
29
+ end
30
+ end
31
+
32
+ describe AnyTimesMatcher, "#terminal?" do
33
+ it "returns false" do
34
+ matcher.should_not be_terminal
35
+ end
36
+ end
37
+
38
+ describe AnyTimesMatcher, "#error_message" do
39
+ it "has an error message" do
40
+ expect(matcher.error_message(2)).to eq \
41
+ "Called 2 times.\nExpected any number of times."
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module TimesCalledMatchers
5
+ describe AtLeastMatcher do
6
+ attr_reader :matcher, :times
7
+ before do
8
+ @times = 3
9
+ @matcher = AtLeastMatcher.new(times)
10
+ end
11
+
12
+ describe "#possible_match?" do
13
+ it "always returns true" do
14
+ expect(matcher).to be_possible_match(99999)
15
+ end
16
+ end
17
+
18
+ describe "#matches?" do
19
+ it "returns false when times_called less than times" do
20
+ matcher.should_not be_matches(2)
21
+ end
22
+
23
+ it "returns true when times_called == times" do
24
+ expect(matcher).to be_matches(3)
25
+ end
26
+
27
+ it "returns true when times_called > times" do
28
+ expect(matcher).to be_matches(4)
29
+ end
30
+ end
31
+
32
+ describe "#attempt?" do
33
+ it "always returns true" do
34
+ expect(matcher).to be_attempt(1)
35
+ expect(matcher).to be_attempt(100000)
36
+ end
37
+ end
38
+
39
+ describe AnyTimesMatcher, "#terminal?" do
40
+ it "returns false" do
41
+ matcher.should_not be_terminal
42
+ end
43
+ end
44
+
45
+ describe "#error_message" do
46
+ it "has an error message" do
47
+ expect(matcher.error_message(2)).to eq \
48
+ "Called 2 times.\nExpected at least 3 times."
49
+ end
50
+ end
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,69 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module TimesCalledMatchers
5
+ describe AtMostMatcher do
6
+ attr_reader :matcher, :times
7
+ before do
8
+ @times = 3
9
+ @matcher = AtMostMatcher.new(times)
10
+ end
11
+
12
+ describe AtMostMatcher, "#possible_match?" do
13
+ it "returns true when times called < times" do
14
+ expect(matcher).to be_possible_match(2)
15
+ end
16
+
17
+ it "returns true when times called == times" do
18
+ expect(matcher).to be_possible_match(3)
19
+ end
20
+
21
+ it "returns false when times called > times" do
22
+ matcher.should_not be_possible_match(4)
23
+ end
24
+ end
25
+
26
+ describe AtMostMatcher, "#matches?" do
27
+ it "returns true when times_called less than times" do
28
+ expect(matcher).to be_matches(2)
29
+ end
30
+
31
+ it "returns true when times_called == times" do
32
+ expect(matcher).to be_matches(3)
33
+ end
34
+
35
+ it "returns false when times_called > times" do
36
+ matcher.should_not be_matches(4)
37
+ end
38
+ end
39
+
40
+ describe AtMostMatcher, "#attempt?" do
41
+ it "returns true when less than expected times" do
42
+ expect(matcher).to be_attempt(2)
43
+ end
44
+
45
+ it "returns false when == expected times" do
46
+ matcher.should_not be_attempt(3)
47
+ end
48
+
49
+ it "returns false when > expected times" do
50
+ matcher.should_not be_attempt(4)
51
+ end
52
+ end
53
+
54
+ describe AnyTimesMatcher, "#terminal?" do
55
+ it "returns true" do
56
+ expect(matcher).to be_terminal
57
+ end
58
+ end
59
+
60
+ describe AtMostMatcher, "#error_message" do
61
+ it "has an error message" do
62
+ expect(matcher.error_message(5)).to eq \
63
+ "Called 5 times.\nExpected at most 3 times."
64
+ end
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,69 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module TimesCalledMatchers
5
+ describe IntegerMatcher do
6
+ attr_reader :matcher, :times
7
+ before do
8
+ @times = 3
9
+ @matcher = IntegerMatcher.new(times)
10
+ end
11
+
12
+ describe "#possible_match?" do
13
+ it "returns true when times called < times" do
14
+ expect(matcher).to be_possible_match(2)
15
+ end
16
+
17
+ it "returns true when times called == times" do
18
+ expect(matcher).to be_possible_match(3)
19
+ end
20
+
21
+ it "returns false when times called > times" do
22
+ matcher.should_not be_possible_match(4)
23
+ end
24
+ end
25
+
26
+ describe "#matches?" do
27
+ it "returns false when times_called less than times" do
28
+ matcher.should_not be_matches(2)
29
+ end
30
+
31
+ it "returns true when times_called == times" do
32
+ expect(matcher).to be_matches(3)
33
+ end
34
+
35
+ it "returns false when times_called > times" do
36
+ matcher.should_not be_matches(4)
37
+ end
38
+ end
39
+
40
+ describe "#attempt?" do
41
+ it "returns true when less than expected times" do
42
+ expect(matcher).to be_attempt(2)
43
+ end
44
+
45
+ it "returns false when == expected times" do
46
+ matcher.should_not be_attempt(3)
47
+ end
48
+
49
+ it "returns false when > expected times" do
50
+ matcher.should_not be_attempt(4)
51
+ end
52
+ end
53
+
54
+ describe AnyTimesMatcher, "#terminal?" do
55
+ it "returns true" do
56
+ expect(matcher).to be_terminal
57
+ end
58
+ end
59
+
60
+ describe "#error_message" do
61
+ it "has an error message" do
62
+ expect(matcher.error_message(2)).to eq \
63
+ "Called 2 times.\nExpected 3 times."
64
+ end
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,54 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module TimesCalledMatchers
5
+ describe ProcMatcher do
6
+ attr_reader :matcher, :times
7
+ before do
8
+ @times = lambda {|other| other == 3}
9
+ @matcher = ProcMatcher.new(times)
10
+ end
11
+
12
+ describe "#possible_match?" do
13
+ it "always returns true" do
14
+ expect(matcher).to be_possible_match(2)
15
+ expect(matcher).to be_possible_match(3)
16
+ expect(matcher).to be_possible_match(10)
17
+ end
18
+ end
19
+
20
+ describe "#matches?" do
21
+ it "returns false when lambda returns false" do
22
+ expect(times.call(2)).to be_false
23
+ matcher.should_not be_matches(2)
24
+ end
25
+
26
+ it "returns true when lambda returns true" do
27
+ expect(times.call(3)).to be_true
28
+ expect(matcher).to be_matches(3)
29
+ end
30
+ end
31
+
32
+ describe "#attempt?" do
33
+ it "always returns true" do
34
+ expect(matcher).to be_attempt(2)
35
+ expect(matcher).to be_attempt(3)
36
+ expect(matcher).to be_attempt(10)
37
+ end
38
+ end
39
+
40
+ describe "#terminal?" do
41
+ it "returns false" do
42
+ matcher.should_not be_terminal
43
+ end
44
+ end
45
+
46
+ describe "#error_message" do
47
+ it "has an error message" do
48
+ expect(matcher.error_message(1)).to match(/Called 1 time.\nExpected #<Proc.*> times./)
49
+ end
50
+ end
51
+ end
52
+
53
+ end
54
+ end
@@ -0,0 +1,75 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module TimesCalledMatchers
5
+ describe RangeMatcher do
6
+ attr_reader :matcher, :times
7
+ before do
8
+ @times = 2..4
9
+ @matcher = RangeMatcher.new(times)
10
+ end
11
+
12
+ describe "#possible_match?" do
13
+ it "returns true when times called < start of range" do
14
+ expect(matcher).to be_possible_match(1)
15
+ end
16
+
17
+ it "returns true when times called in range" do
18
+ expect(matcher).to be_possible_match(2)
19
+ expect(matcher).to be_possible_match(3)
20
+ expect(matcher).to be_possible_match(4)
21
+ end
22
+
23
+ it "returns false when times called > end of range" do
24
+ matcher.should_not be_possible_match(5)
25
+ end
26
+ end
27
+
28
+ describe "#matches?" do
29
+ it "returns false when times_called less than start of range" do
30
+ matcher.should_not be_matches(1)
31
+ end
32
+
33
+ it "returns true when times_called in range" do
34
+ expect(matcher).to be_matches(2)
35
+ expect(matcher).to be_matches(3)
36
+ expect(matcher).to be_matches(4)
37
+ end
38
+
39
+ it "returns false when times_called > end of range" do
40
+ matcher.should_not be_matches(5)
41
+ end
42
+ end
43
+
44
+ describe "#attempt?" do
45
+ it "returns true when less than start of range" do
46
+ expect(matcher).to be_attempt(1)
47
+ end
48
+
49
+ it "returns true when in range" do
50
+ expect(matcher).to be_attempt(2)
51
+ expect(matcher).to be_attempt(3)
52
+ expect(matcher).to be_attempt(4)
53
+ end
54
+
55
+ it "returns false when > end of range" do
56
+ matcher.should_not be_attempt(5)
57
+ end
58
+ end
59
+
60
+ describe "#terminal?" do
61
+ it "returns true" do
62
+ expect(matcher).to be_terminal
63
+ end
64
+ end
65
+
66
+ describe "#error_message" do
67
+ it "has an error message" do
68
+ expect(matcher.error_message(1)).to eq \
69
+ "Called 1 time.\nExpected 2..4 times."
70
+ end
71
+ end
72
+ end
73
+
74
+ end
75
+ end