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
+ module RR
4
+ describe DSL do
5
+ subject { Object.new }
6
+
7
+ after(:each) do
8
+ RR.reset
9
+ end
10
+
11
+ describe "normal strategy definitions" do
12
+ attr_reader :strategy_method_name
13
+
14
+ def call_strategy(*args, &block)
15
+ __send__(strategy_method_name, *args, &block)
16
+ end
17
+
18
+ describe "#mock" do
19
+ before do
20
+ @strategy_method_name = :mock
21
+ end
22
+
23
+ context "when passing no args" do
24
+ it "returns a DoubleDefinitionCreate" do
25
+ expect(call_strategy.class).to eq RR::DoubleDefinitions::DoubleDefinitionCreate
26
+ end
27
+ end
28
+
29
+ context "when passed a method_name argument" do
30
+ it "creates a mock Double for method" do
31
+ double_definition = mock(subject, :foobar).returns {:baz}
32
+ expect(double_definition.times_matcher).to eq RR::TimesCalledMatchers::IntegerMatcher.new(1)
33
+ expect(double_definition.argument_expectation.class).to eq RR::Expectations::ArgumentEqualityExpectation
34
+ expect(double_definition.argument_expectation.expected_arguments).to eq []
35
+ expect(subject.foobar).to eq :baz
36
+ end
37
+ end
38
+ end
39
+
40
+ describe "#stub" do
41
+ before do
42
+ @strategy_method_name = :stub
43
+ end
44
+
45
+ context "when passing no args" do
46
+ it "returns a DoubleDefinitionCreate" do
47
+ expect(call_strategy.class).to eq RR::DoubleDefinitions::DoubleDefinitionCreate
48
+ end
49
+ end
50
+
51
+ context "when passed a method_name argument" do
52
+ it "creates a stub Double for method when passed a method_name argument" do
53
+ double_definition = stub(subject, :foobar).returns {:baz}
54
+ expect(double_definition.times_matcher).to eq RR::TimesCalledMatchers::AnyTimesMatcher.new
55
+ expect(double_definition.argument_expectation.class).to eq RR::Expectations::AnyArgumentExpectation
56
+ expect(subject.foobar).to eq :baz
57
+ end
58
+ end
59
+ end
60
+
61
+ describe "#dont_allow" do
62
+ before do
63
+ @strategy_method_name = :dont_allow
64
+ end
65
+
66
+ context "when passing no args" do
67
+ it "returns a DoubleDefinitionCreate" do
68
+ expect(call_strategy.class).to eq RR::DoubleDefinitions::DoubleDefinitionCreate
69
+ end
70
+ end
71
+
72
+ context "when passed a method_name argument_expectation" do
73
+ it "creates a mock Double for method" do
74
+ double_definition = dont_allow(subject, :foobar)
75
+ expect(double_definition.times_matcher).to eq RR::TimesCalledMatchers::NeverMatcher.new
76
+ expect(double_definition.argument_expectation.class).to eq RR::Expectations::AnyArgumentExpectation
77
+
78
+ expect {
79
+ subject.foobar
80
+ }.to raise_error(RR::Errors::TimesCalledError)
81
+ RR.reset
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ describe "! strategy definitions" do
88
+ attr_reader :strategy_method_name
89
+ def call_strategy(*args, &definition_eval_block)
90
+ __send__(strategy_method_name, *args, &definition_eval_block)
91
+ end
92
+
93
+ describe "#mock!" do
94
+ before do
95
+ @strategy_method_name = :mock!
96
+ end
97
+
98
+ context "when passed a method_name argument" do
99
+ it "sets #verification_strategy to Mock" do
100
+ proxy = mock!(:foobar)
101
+ expect(proxy.double_definition_create.verification_strategy.class).to eq RR::DoubleDefinitions::Strategies::Verification::Mock
102
+ end
103
+ end
104
+ end
105
+
106
+ describe "#stub!" do
107
+ before do
108
+ @strategy_method_name = :stub!
109
+ end
110
+
111
+ context "when passed a method_name argument" do
112
+ it "sets #verification_strategy to Stub" do
113
+ proxy = stub!(:foobar)
114
+ expect(proxy.double_definition_create.verification_strategy.class).to eq RR::DoubleDefinitions::Strategies::Verification::Stub
115
+ end
116
+ end
117
+ end
118
+
119
+ describe "#dont_allow!" do
120
+ before do
121
+ @strategy_method_name = :dont_allow!
122
+ end
123
+
124
+ context "when passed a method_name argument" do
125
+ it "sets #verification_strategy to DontAllow" do
126
+ proxy = dont_allow!(:foobar)
127
+ expect(proxy.double_definition_create.verification_strategy.class).to eq RR::DoubleDefinitions::Strategies::Verification::DontAllow
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,99 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ describe DSL do
5
+ attr_reader :space, :subject_1, :subject_2, :method_name
6
+
7
+ include_examples "Swapped Space"
8
+
9
+ include RR::DSL
10
+
11
+ before do
12
+ @subject_1 = Object.new
13
+ @subject_2 = Object.new
14
+ @method_name = :foobar
15
+ end
16
+
17
+ describe "#verify" do
18
+ it "aliases #rr_verify" do
19
+ expect(DSL.instance_method("verify")).to eq DSL.instance_method("rr_verify")
20
+ end
21
+ end
22
+
23
+ describe "#rr_verify" do
24
+ it "verifies and deletes the double_injections" do
25
+ double_1 = ::RR::Injections::DoubleInjection.find_or_create_by_subject(subject_1, method_name)
26
+ double_1_verify_calls = 0
27
+ double_1_reset_calls = 0
28
+ (
29
+ class << double_1;
30
+ self;
31
+ end).class_eval do
32
+ define_method(:verify) do ||
33
+ double_1_verify_calls += 1
34
+ end
35
+ define_method(:reset) do ||
36
+ double_1_reset_calls += 1
37
+ end
38
+ end
39
+ double_2 = ::RR::Injections::DoubleInjection.find_or_create_by_subject(subject_2, method_name)
40
+ double_2_verify_calls = 0
41
+ double_2_reset_calls = 0
42
+ ( class << double_2; self; end).class_eval do
43
+ define_method(:verify) do ||
44
+ double_2_verify_calls += 1
45
+ end
46
+ define_method(:reset) do ||
47
+ double_2_reset_calls += 1
48
+ end
49
+ end
50
+
51
+ rr_verify
52
+ expect(double_1_verify_calls).to eq 1
53
+ expect(double_2_verify_calls).to eq 1
54
+ expect(double_1_reset_calls).to eq 1
55
+ expect(double_1_reset_calls).to eq 1
56
+ end
57
+ end
58
+
59
+ describe "#reset" do
60
+ it "aliases #rr_reset" do
61
+ expect(DSL.instance_method("reset")).to eq DSL.instance_method("rr_reset")
62
+ end
63
+ end
64
+
65
+ describe "#rr_reset" do
66
+ it "removes the ordered doubles" do
67
+ mock(subject_1).foobar1.ordered
68
+ mock(subject_2).foobar2.ordered
69
+
70
+ ::RR::Injections::DoubleInjection.instances.should_not be_empty
71
+
72
+ rr_reset
73
+ ::RR::Injections::DoubleInjection.instances
74
+ expect(::RR::Injections::DoubleInjection.instances).to be_empty
75
+ end
76
+
77
+ it "resets all double_injections" do
78
+ double_1 = ::RR::Injections::DoubleInjection.find_or_create_by_subject(subject_1, method_name)
79
+ double_1_reset_calls = 0
80
+ ( class << double_1; self; end).class_eval do
81
+ define_method(:reset) do ||
82
+ double_1_reset_calls += 1
83
+ end
84
+ end
85
+ double_2 = ::RR::Injections::DoubleInjection.find_or_create_by_subject(subject_2, method_name)
86
+ double_2_reset_calls = 0
87
+ ( class << double_2; self; end).class_eval do
88
+ define_method(:reset) do ||
89
+ double_2_reset_calls += 1
90
+ end
91
+ end
92
+
93
+ rr_reset
94
+ expect(double_1_reset_calls).to eq 1
95
+ expect(double_2_reset_calls).to eq 1
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,67 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ describe DSL do
5
+ include DSL
6
+
7
+ describe "#anything" do
8
+ it "returns an Anything matcher" do
9
+ expect(anything).to eq RR::WildcardMatchers::Anything.new
10
+ end
11
+
12
+ it "rr_anything returns an Anything matcher" do
13
+ expect(rr_anything).to eq RR::WildcardMatchers::Anything.new
14
+ end
15
+ end
16
+
17
+ describe "#is_a" do
18
+ it "returns an IsA matcher" do
19
+ expect(is_a(Integer)).to eq RR::WildcardMatchers::IsA.new(Integer)
20
+ end
21
+
22
+ it "rr_is_a returns an IsA matcher" do
23
+ expect(rr_is_a(Integer)).to eq RR::WildcardMatchers::IsA.new(Integer)
24
+ end
25
+ end
26
+
27
+ describe "#numeric" do
28
+ it "returns an Numeric matcher" do
29
+ expect(numeric).to eq RR::WildcardMatchers::Numeric.new
30
+ end
31
+
32
+ it "rr_numeric returns an Numeric matcher" do
33
+ expect(rr_numeric).to eq RR::WildcardMatchers::Numeric.new
34
+ end
35
+ end
36
+
37
+ describe "#boolean" do
38
+ it "returns an Boolean matcher" do
39
+ expect(boolean).to eq RR::WildcardMatchers::Boolean.new
40
+ end
41
+
42
+ it "rr_boolean returns an Boolean matcher" do
43
+ expect(rr_boolean).to eq RR::WildcardMatchers::Boolean.new
44
+ end
45
+ end
46
+
47
+ describe "#duck_type" do
48
+ it "returns a DuckType matcher" do
49
+ expect(duck_type(:one, :two)).to eq RR::WildcardMatchers::DuckType.new(:one, :two)
50
+ end
51
+
52
+ it "rr_duck_type returns a DuckType matcher" do
53
+ expect(rr_duck_type(:one, :two)).to eq RR::WildcardMatchers::DuckType.new(:one, :two)
54
+ end
55
+ end
56
+ end
57
+
58
+ describe "#any_times" do
59
+ it "returns an AnyTimesMatcher" do
60
+ expect(any_times).to eq RR::TimesCalledMatchers::AnyTimesMatcher.new
61
+ end
62
+
63
+ it "rr_any_times returns an AnyTimesMatcher" do
64
+ expect(rr_any_times).to eq RR::TimesCalledMatchers::AnyTimesMatcher.new
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,67 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module Errors
5
+ describe RRError do
6
+ describe "#backtrace" do
7
+ before do
8
+ @original_trim_backtrace = RR.trim_backtrace
9
+ end
10
+ after do
11
+ RR.trim_backtrace = @original_trim_backtrace
12
+ end
13
+
14
+ it "does not include the rr library files when trim_backtrace is true" do
15
+ RR.trim_backtrace = true
16
+
17
+ error = nil
18
+ begin
19
+ obj = Object.new
20
+ mock(obj).foobar
21
+ RR.verify_double(obj, :foobar)
22
+ rescue RRError=> e
23
+ error = e
24
+ end
25
+ backtrace = error.backtrace.join("\n")
26
+
27
+ backtrace.should_not include("lib/rr")
28
+ end
29
+
30
+ it "includes the rr library files when trim_backtrace is false" do
31
+ RR.trim_backtrace = false
32
+
33
+ error = nil
34
+ begin
35
+ obj = Object.new
36
+ mock(obj).foobar
37
+ RR.verify_double(obj, :foobar)
38
+ rescue RRError=> e
39
+ error = e
40
+ end
41
+ backtrace = error.backtrace.join("\n")
42
+
43
+ expect(backtrace).to include("lib/rr")
44
+ end
45
+
46
+ it "returns custom backtrace when backtrace is set" do
47
+ error = RRError.new
48
+ custom_backtrace = caller
49
+ error.backtrace = custom_backtrace
50
+ expect(error.backtrace).to eq custom_backtrace
51
+ end
52
+
53
+ it "returns normal backtrace when backtrace is not set" do
54
+ error = nil
55
+ expected_line = __LINE__ + 2
56
+ begin
57
+ raise RRError
58
+ rescue RRError => e
59
+ error = e
60
+ end
61
+ expect(error.backtrace.first).to include(__FILE__)
62
+ expect(error.backtrace.first).to include(expected_line.to_s)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,48 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe AnyArgumentExpectation do
6
+ attr_reader :expectation
7
+
8
+ before do
9
+ @expectation = AnyArgumentExpectation.new
10
+ end
11
+
12
+ describe "#expected_arguments" do
13
+ it "returns an empty array" do
14
+ expect(expectation.expected_arguments).to eq []
15
+ end
16
+ end
17
+
18
+ describe "==" do
19
+ it "returns true when comparing with another AnyArgumentExpectation" do
20
+ expect(expectation).to eq AnyArgumentExpectation.new
21
+ end
22
+
23
+ it "returns false when comparing with ArgumentEqualityExpectation" do
24
+ expect(expectation).to_not eq ArgumentEqualityExpectation.new([1], {})
25
+ end
26
+ end
27
+
28
+ describe "#exact_match?" do
29
+ it "returns false" do
30
+ expectation.should_not be_exact_match([1, 2, 3], {})
31
+ expectation.should_not be_exact_match([1, 2], {})
32
+ expectation.should_not be_exact_match([1], {})
33
+ expectation.should_not be_exact_match([], {})
34
+ expectation.should_not be_exact_match(["does not match"], {})
35
+ end
36
+ end
37
+
38
+ describe "#wildcard_match?" do
39
+ it "returns true" do
40
+ expectation = AnyArgumentExpectation.new
41
+ expect(expectation).to be_wildcard_match([1, 2, 3], {})
42
+ expect(expectation).to be_wildcard_match(["whatever"], {})
43
+ expect(expectation).to be_wildcard_match(["whatever", "else"], {})
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,14 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe ArgumentEqualityExpectation do
6
+ context "when matching anything" do
7
+ attr_reader :expectation
8
+ before do
9
+ @expectation = ArgumentEqualityExpectation.new(anything)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,135 @@
1
+ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
+
3
+ module RR
4
+ module Expectations
5
+ describe ArgumentEqualityExpectation do
6
+ attr_reader :expectation
7
+ before do
8
+ @expectation = ArgumentEqualityExpectation.new([1, 2, 3], {})
9
+ end
10
+
11
+ describe "#expected_arguments" do
12
+ it "returns the passed in expected_arguments" do
13
+ expect(expectation.expected_arguments).to eq [1, 2, 3]
14
+ end
15
+ end
16
+
17
+ describe "==" do
18
+ it "returns true when passed in expected_arguments are equal" do
19
+ expect(expectation).to eq ArgumentEqualityExpectation.new([1, 2, 3], {})
20
+ end
21
+
22
+ it "returns false when passed in expected_arguments are not equal" do
23
+ expect(expectation).to_not eq ArgumentEqualityExpectation.new([1, 2], {})
24
+ expect(expectation).to_not eq ArgumentEqualityExpectation.new([1], {})
25
+ expect(expectation).to_not eq ArgumentEqualityExpectation.new([:something], {})
26
+ expect(expectation).to_not eq ArgumentEqualityExpectation.new([], {})
27
+ end
28
+ end
29
+
30
+ describe "#exact_match?" do
31
+ context "when all arguments exactly match" do
32
+ it "returns true" do
33
+ expect(expectation).to be_exact_match([1, 2, 3], {})
34
+ end
35
+ end
36
+
37
+ context "when all arguments do not exactly match" do
38
+ it "returns false" do
39
+ expectation.should_not be_exact_match([1, 2], {})
40
+ expectation.should_not be_exact_match([1], {})
41
+ expectation.should_not be_exact_match([], {})
42
+ expectation.should_not be_exact_match(["does not match"], {})
43
+ end
44
+ end
45
+ end
46
+
47
+ describe "#wildcard_match?" do
48
+ context "when not an exact match" do
49
+ it "returns false" do
50
+ expectation = ArgumentEqualityExpectation.new([1], {})
51
+ expectation.should_not be_wildcard_match([1, 2, 3], {})
52
+ expectation.should_not be_wildcard_match(["whatever"], {})
53
+ expectation.should_not be_wildcard_match(["whatever", "else"], {})
54
+ end
55
+ end
56
+
57
+ context "when an exact match" do
58
+ it "returns true" do
59
+ expectation = ArgumentEqualityExpectation.new([1, 2], {})
60
+ expect(expectation).to be_wildcard_match([1, 2], {})
61
+ expectation.should_not be_wildcard_match([1], {})
62
+ expectation.should_not be_wildcard_match(["whatever", "else"], {})
63
+ end
64
+ end
65
+
66
+ context "when not passed correct number of arguments" do
67
+ it "returns false" do
68
+ expectation.should_not be_wildcard_match([], {})
69
+ expectation.should_not be_wildcard_match([Object.new, Object.new], {})
70
+ end
71
+ end
72
+ end
73
+
74
+ describe "Functional spec" do
75
+ class ArgumentEqualityFunctionalFixture
76
+ attr_reader :arg1, :arg2
77
+ def initialize(arg1, arg2)
78
+ @arg1, @arg2 = arg1, arg2
79
+ end
80
+
81
+ def ==(other)
82
+ arg1 == (other.arg1) &&
83
+ arg2 == (other.arg2)
84
+ end
85
+
86
+ def eql?(other)
87
+ arg1.eql?(other.arg1) &&
88
+ arg2.eql?(other.arg2)
89
+ end
90
+ end
91
+
92
+ before(:each) do
93
+ @predicate1 = 'first' # these should be mocks, waiting on rr bug fix
94
+ @predicate2 = 'second'
95
+ @predicate3 = 'third'
96
+ end
97
+
98
+ describe "when mock.proxy ==" do
99
+ it "does not have infinite recursion" do
100
+ mock.proxy(@predicate1) == @predicate1
101
+ mock.proxy(@predicate2) == @predicate2
102
+ expect(ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2)).to eq ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2)
103
+
104
+ mock.proxy(@predicate1) == @predicate1
105
+ mock.proxy(@predicate2) == @predicate3
106
+ expect(ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2)).to_not eq ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate3)
107
+ end
108
+
109
+ it "matches Hashes properly (using ==)" do
110
+ mock.proxy(@predicate1) == {:foo => :bar}
111
+ @predicate1 == {:foo => :bar}
112
+ end
113
+ end
114
+
115
+ describe "when mock.proxy .eql?" do
116
+ it "does not have infinite recursion" do
117
+ mock.proxy(@predicate1).eql? @predicate1
118
+ mock.proxy(@predicate2).eql? @predicate2
119
+ expect(ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2)).to be_eql(ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2))
120
+
121
+ mock.proxy(@predicate1).eql? @predicate1
122
+ mock.proxy(@predicate2).eql? @predicate3
123
+ ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate2).should_not be_eql(ArgumentEqualityFunctionalFixture.new(@predicate1, @predicate3))
124
+ end
125
+
126
+ it "matches Hashes properly (using ==)" do
127
+ mock.proxy(@predicate1).eql?({:foo => :bar})
128
+ @predicate1.eql?({:foo => :bar})
129
+ end
130
+ end
131
+
132
+ end
133
+ end
134
+ end
135
+ end