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,28 @@
1
+ require 'rspec/core'
2
+ require 'rspec/expectations'
3
+ require 'rspec/autorun'
4
+
5
+ require 'rr'
6
+
7
+ module ExampleMethods
8
+ def eigen(object)
9
+ class << object; self; end
10
+ end
11
+ end
12
+
13
+ module ExampleGroupMethods
14
+ def macro(name, &implementation)
15
+ (class << self; self; end).class_eval do
16
+ define_method(name, &implementation)
17
+ end
18
+ end
19
+ end
20
+
21
+ RSpec.configure do |c|
22
+ c.include ExampleMethods
23
+ c.extend ExampleGroupMethods
24
+ c.order = :random
25
+ end
26
+
27
+ Dir[ File.expand_path('../shared/*.rb', __FILE__) ].sort.each {|fn| require fn }
28
+ Dir[ File.expand_path('../support/**/*.rb', __FILE__) ].sort.each {|fn| require fn }
@@ -0,0 +1,109 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe 'Integration with MiniTest 4' do
4
+ include IntegrationTests::RubyMinitest
5
+
6
+ def configure_project_generator(project_generator)
7
+ super
8
+ project_generator.configure do |project|
9
+ project.minitest_version = 4
10
+ end
11
+ end
12
+
13
+ def self.including_the_adapter_manually_works
14
+ specify "including the adapter manually works" do
15
+ project = generate_project do |project|
16
+ project.add_to_prelude <<-EOT
17
+ class MiniTest::Unit::TestCase
18
+ include RR::Adapters::MiniTest
19
+ end
20
+ EOT
21
+ end
22
+ project.add_test_file do |file|
23
+ file.add_working_test_case_with_adapter_tests do |test_case|
24
+ test_case.add_to_body <<-EOT
25
+ def test_the_correct_adapters_are_loaded
26
+ assert_adapters_loaded #{adapters_that_should_be_loaded.inspect}
27
+ end
28
+ EOT
29
+ end
30
+ end
31
+ result = project.run_tests
32
+ result.should be_success
33
+ result.should_not have_errors_or_failures
34
+ end
35
+ end
36
+
37
+ def self.rr_hooks_into_the_test_framework_automatically
38
+ specify "RR hooks into the test framework automatically" do
39
+ project = generate_project
40
+ project.add_test_file do |file|
41
+ file.add_working_test_case
42
+ end
43
+ result = project.run_tests
44
+ result.should be_success
45
+ result.should_not have_errors_or_failures
46
+ end
47
+ end
48
+
49
+ context 'when Bundler is autorequiring RR' do
50
+ def configure_project_generator(project_generator)
51
+ super
52
+ project_generator.configure do |project|
53
+ project.autorequire_gems = true
54
+ end
55
+ end
56
+
57
+ def adapters_that_should_be_loaded
58
+ [:MiniTest4]
59
+ end
60
+
61
+ including_the_adapter_manually_works
62
+ end
63
+
64
+ context 'when RR is being required manually' do
65
+ def configure_project_generator(project_generator)
66
+ super
67
+ project_generator.configure do |project|
68
+ project.autorequire_gems = false
69
+ end
70
+ end
71
+
72
+ def adapters_that_should_be_loaded
73
+ [:MiniTest4]
74
+ end
75
+
76
+ rr_hooks_into_the_test_framework_automatically
77
+ including_the_adapter_manually_works
78
+
79
+ specify "when RR raises an error it raises a failure not an exception" do
80
+ project = generate_project
81
+ project.add_test_file do |file|
82
+ file.add_test_case do |test_case|
83
+ test_case.add_test <<-EOT
84
+ object = Object.new
85
+ mock(object).foo
86
+ EOT
87
+ end
88
+ end
89
+ result = project.run_tests
90
+ result.should fail_with_output(/1 failure/)
91
+ end
92
+
93
+ specify "throwing an error in teardown doesn't mess things up" do
94
+ project = generate_project
95
+ project.add_test_file do |file|
96
+ file.add_test_case do |test_case|
97
+ test_case.add_to_body <<-EOT
98
+ def teardown
99
+ raise 'hell'
100
+ end
101
+ EOT
102
+ test_case.add_test("") # doesn't matter
103
+ end
104
+ end
105
+ result = project.run_tests
106
+ result.should fail_with_output(/1 error/)
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,109 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe 'Integration with MiniTest >= 5' do
4
+ include IntegrationTests::RubyMinitest
5
+
6
+ def configure_project_generator(project_generator)
7
+ super
8
+ project_generator.configure do |project|
9
+ project.minitest_version = 5
10
+ end
11
+ end
12
+
13
+ def self.including_the_adapter_manually_works
14
+ specify "including the adapter manually works" do
15
+ project = generate_project do |project|
16
+ project.add_to_prelude <<-EOT
17
+ class MiniTest::Unit::TestCase
18
+ include RR::Adapters::MiniTest
19
+ end
20
+ EOT
21
+ end
22
+ project.add_test_file do |file|
23
+ file.add_working_test_case_with_adapter_tests do |test_case|
24
+ test_case.add_to_body <<-EOT
25
+ def test_the_correct_adapters_are_loaded
26
+ assert_adapters_loaded #{adapters_that_should_be_loaded.inspect}
27
+ end
28
+ EOT
29
+ end
30
+ end
31
+ result = project.run_tests
32
+ result.should be_success
33
+ result.should_not have_errors_or_failures
34
+ end
35
+ end
36
+
37
+ def self.rr_hooks_into_the_test_framework_automatically
38
+ specify "RR hooks into the test framework automatically" do
39
+ project = generate_project
40
+ project.add_test_file do |file|
41
+ file.add_working_test_case
42
+ end
43
+ result = project.run_tests
44
+ result.should be_success
45
+ result.should_not have_errors_or_failures
46
+ end
47
+ end
48
+
49
+ context 'when Bundler is autorequiring RR' do
50
+ def configure_project_generator(project_generator)
51
+ super
52
+ project_generator.configure do |project|
53
+ project.autorequire_gems = true
54
+ end
55
+ end
56
+
57
+ def adapters_that_should_be_loaded
58
+ [:Minitest]
59
+ end
60
+
61
+ including_the_adapter_manually_works
62
+ end
63
+
64
+ context 'when RR is being required manually' do
65
+ def configure_project_generator(project_generator)
66
+ super
67
+ project_generator.configure do |project|
68
+ project.autorequire_gems = false
69
+ end
70
+ end
71
+
72
+ def adapters_that_should_be_loaded
73
+ [:Minitest]
74
+ end
75
+
76
+ rr_hooks_into_the_test_framework_automatically
77
+ including_the_adapter_manually_works
78
+
79
+ specify "when RR raises an error it raises a failure not an exception" do
80
+ project = generate_project
81
+ project.add_test_file do |file|
82
+ file.add_test_case do |test_case|
83
+ test_case.add_test <<-EOT
84
+ object = Object.new
85
+ mock(object).foo
86
+ EOT
87
+ end
88
+ end
89
+ result = project.run_tests
90
+ result.should fail_with_output(/1 failure/)
91
+ end
92
+
93
+ specify "throwing an error in teardown doesn't mess things up" do
94
+ project = generate_project
95
+ project.add_test_file do |file|
96
+ file.add_test_case do |test_case|
97
+ test_case.add_to_body <<-EOT
98
+ def teardown
99
+ raise 'hell'
100
+ end
101
+ EOT
102
+ test_case.add_test("") # doesn't matter
103
+ end
104
+ end
105
+ result = project.run_tests
106
+ result.should fail_with_output(/1 error/)
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,3 @@
1
+ require File.expand_path('../../../global_helper', __FILE__)
2
+ RR::Test.setup_test_suite(:rspec_2)
3
+ require File.expand_path('../helper', __FILE__)
@@ -0,0 +1,32 @@
1
+ module WildcardMatcherMatchers
2
+ extend RSpec::Matchers::DSL
3
+
4
+ matcher :equal_match do |value|
5
+ match { |matcher|
6
+ matcher == value &&
7
+ matcher.eql?(value)
8
+ }
9
+
10
+ failure_message_for_should {
11
+ "Expected matcher to equal match #{value.inspect}, but it didn't"
12
+ }
13
+
14
+ failure_message_for_should_not {
15
+ "Expected matcher to not equal match #{value.inspect}, but it did"
16
+ }
17
+ end
18
+
19
+ matcher :wildcard_match do |value|
20
+ match { |matcher|
21
+ matcher.wildcard_match?(value)
22
+ }
23
+
24
+ failure_message_for_should {
25
+ "Expected matcher to wildcard equal match #{value.inspect}, but it didn't"
26
+ }
27
+
28
+ failure_message_for_should_not {
29
+ "Expected matcher to not wildcard equal match #{value.inspect}, but it did"
30
+ }
31
+ end
32
+ end
@@ -0,0 +1,173 @@
1
+ module DoubleDefinitionCreatorHelpers
2
+ module ClassMethods
3
+ def methods_being_doubled_exist_already?
4
+ metadata[:methods_exist] || supports_proxying? || supports_mocking?
5
+ end
6
+
7
+ def type_of_methods_being_tested
8
+ metadata[:method_type]
9
+ end
10
+
11
+ def supports_proxying?
12
+ metadata[:is_proxy]
13
+ end
14
+
15
+ def supports_instance_of?
16
+ metadata[:is_instance_of]
17
+ end
18
+
19
+ def supports_mocking?
20
+ metadata[:is_mock]
21
+ end
22
+
23
+ def supports_strong?
24
+ metadata[:is_strong]
25
+ end
26
+
27
+ def supports_dont_allow?
28
+ metadata[:is_dont_allow]
29
+ end
30
+ end
31
+
32
+ def self.included(base)
33
+ base.extend(ClassMethods)
34
+ end
35
+
36
+ def build_object_with_possible_methods(methods = {}, actually_add_methods = methods_being_doubled_exist_already?)
37
+ subject =
38
+ if type_of_methods_being_tested == :class
39
+ Class.new
40
+ else
41
+ Object.new
42
+ end
43
+
44
+ if actually_add_methods
45
+ if supports_instance_of?
46
+ add_methods_to_class(subject, methods)
47
+ else
48
+ add_methods_to_class(subject.singleton_class, methods)
49
+ end
50
+ end
51
+
52
+ object =
53
+ if type_of_methods_being_tested == :class && supports_instance_of?
54
+ subject.new
55
+ else
56
+ subject
57
+ end
58
+
59
+ if block_given?
60
+ yield subject, object
61
+ end
62
+
63
+ object
64
+ end
65
+
66
+ def build_object_with_methods(methods = {}, &block)
67
+ build_object_with_possible_methods(methods, true, &block)
68
+ end
69
+ alias_method :build_object, :build_object_with_methods
70
+
71
+ def add_methods_to_class(klass, methods)
72
+ klass.class_eval do
73
+ methods.each do |method_name, implementation|
74
+ implementation ||= ->(*args) { }
75
+ define_method(method_name, &implementation)
76
+ end
77
+ end
78
+ end
79
+
80
+ def expect_method_to_have_value_or_be_absent(return_value, object, method_name, *args, &block)
81
+ if methods_being_doubled_exist_already?
82
+ expect(object.__send__(method_name, *args, &block)).to eq return_value
83
+ else
84
+ expect_method_to_not_exist(object, method_name)
85
+ end
86
+ end
87
+
88
+ def expect_method_to_not_exist(object, method_name)
89
+ expect { object.method_name }.to raise_error(NoMethodError)
90
+ # Commenting this out for now since this is broken.
91
+ # See: btakita/rr #43
92
+ #expect(object).not_to respond_to(method_name)
93
+ end
94
+
95
+ def build_object_with_doubled_method_which_is_called(original_value, new_value=nil, opts={}, &define_double)
96
+ method_name = :some_method
97
+
98
+ object = build_object_with_methods(method_name => -> { original_value }) do |subject|
99
+ double_creator = double_definition_creator_for(subject)
100
+
101
+ if define_double
102
+ define_double.call(double_creator, method_name, new_value)
103
+ else
104
+ double_creator.__send__(method_name)
105
+ end
106
+ end
107
+
108
+ if opts[:before_method_call]
109
+ opts[:before_method_call].call
110
+ end
111
+
112
+ return_value = object.__send__(method_name)
113
+ [object, method_name, return_value]
114
+ end
115
+
116
+ def build_object_with_doubled_method_which_is_reset_and_called(original_value, new_value, opts={})
117
+ opts = opts.merge(before_method_call: -> { RR.reset })
118
+ build_object_with_doubled_method_which_is_called(original_value, new_value, opts)
119
+ end
120
+
121
+ def call_possible_method_on(object, method_name, *args, &block)
122
+ object.__send__(method_name, *args, &block)
123
+ rescue NoMethodError
124
+ end
125
+
126
+ def expect_call_to_return_or_raise_times_called_error(return_value, object, method_name, *args, &block)
127
+ if supports_dont_allow?
128
+ expect { object.__send__(method_name, *args, &block) }.
129
+ to raise_error(RR::Errors::TimesCalledError)
130
+ else
131
+ expect(object.__send__(method_name, *args, &block)).to eq return_value
132
+ end
133
+ end
134
+
135
+ def call_method_rescuing_times_called_error(object, method_name, *args, &block)
136
+ if supports_dont_allow?
137
+ begin
138
+ object.__send__(method_name, *args, &block)
139
+ rescue RR::Errors::TimesCalledError
140
+ end
141
+ else
142
+ object.__send__(method_name, *args, &block)
143
+ end
144
+ end
145
+
146
+ def methods_being_doubled_exist_already?
147
+ self.class.methods_being_doubled_exist_already?
148
+ end
149
+
150
+ def type_of_methods_being_tested
151
+ self.class.type_of_methods_being_tested
152
+ end
153
+
154
+ def supports_proxying?
155
+ self.class.supports_proxying?
156
+ end
157
+
158
+ def supports_instance_of?
159
+ self.class.supports_instance_of?
160
+ end
161
+
162
+ def supports_mocking?
163
+ self.class.supports_mocking?
164
+ end
165
+
166
+ def supports_strong?
167
+ self.class.supports_strong?
168
+ end
169
+
170
+ def supports_dont_allow?
171
+ self.class.supports_dont_allow?
172
+ end
173
+ end