rr 0.3.11 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (150) hide show
  1. data/CHANGES +8 -3
  2. data/README +130 -39
  3. data/Rakefile +6 -5
  4. data/lib/rr.rb +8 -8
  5. data/lib/rr/adapters/rr_methods.rb +228 -0
  6. data/lib/rr/adapters/rspec.rb +1 -1
  7. data/lib/rr/adapters/test_unit.rb +1 -1
  8. data/lib/rr/double.rb +294 -89
  9. data/lib/rr/{scenario_creator.rb → double_creator.rb} +65 -66
  10. data/lib/rr/{scenario_definition.rb → double_definition.rb} +36 -36
  11. data/lib/rr/{scenario_definition_builder.rb → double_definition_builder.rb} +3 -3
  12. data/lib/rr/double_insertion.rb +132 -0
  13. data/lib/rr/{scenario_matches.rb → double_matches.rb} +2 -2
  14. data/lib/rr/{scenario_method_proxy.rb → double_method_proxy.rb} +2 -2
  15. data/lib/rr/errors/argument_equality_error.rb +3 -3
  16. data/lib/rr/errors/rr_error.rb +13 -13
  17. data/lib/rr/errors/scenario_definition_error.rb +3 -3
  18. data/lib/rr/errors/scenario_not_found_error.rb +3 -3
  19. data/lib/rr/errors/scenario_order_error.rb +3 -3
  20. data/lib/rr/errors/times_called_error.rb +3 -3
  21. data/lib/rr/expectations/any_argument_expectation.rb +1 -1
  22. data/lib/rr/expectations/argument_equality_expectation.rb +1 -1
  23. data/lib/rr/expectations/times_called_expectation.rb +1 -1
  24. data/lib/rr/hash_with_object_id_key.rb +1 -1
  25. data/lib/rr/space.rb +40 -40
  26. data/lib/rr/times_called_matchers/any_times_matcher.rb +13 -13
  27. data/lib/rr/times_called_matchers/at_least_matcher.rb +11 -11
  28. data/lib/rr/times_called_matchers/at_most_matcher.rb +16 -16
  29. data/lib/rr/times_called_matchers/integer_matcher.rb +13 -13
  30. data/lib/rr/times_called_matchers/non_terminal.rb +21 -21
  31. data/lib/rr/times_called_matchers/proc_matcher.rb +7 -7
  32. data/lib/rr/times_called_matchers/range_matcher.rb +14 -14
  33. data/lib/rr/times_called_matchers/terminal.rb +16 -16
  34. data/lib/rr/times_called_matchers/times_called_matcher.rb +32 -32
  35. data/spec/core_spec_suite.rb +18 -0
  36. data/{examples → spec}/environment_fixture_setup.rb +0 -1
  37. data/{examples/high_level_example.rb → spec/high_level_spec.rb} +11 -11
  38. data/spec/rr/adapters/rr_methods_argument_matcher_spec.rb +67 -0
  39. data/spec/rr/adapters/rr_methods_creator_spec.rb +365 -0
  40. data/spec/rr/adapters/rr_methods_space_spec.rb +134 -0
  41. data/spec/rr/adapters/rr_methods_spec_helper.rb +11 -0
  42. data/{examples/rr/extensions/instance_methods_times_matcher_example.rb → spec/rr/adapters/rr_methods_times_matcher_spec.rb} +4 -4
  43. data/spec/rr/double/double_insertion_bind_spec.rb +78 -0
  44. data/spec/rr/double/double_insertion_dispatching_spec.rb +221 -0
  45. data/spec/rr/double/double_insertion_has_original_method_spec.rb +56 -0
  46. data/spec/rr/double/double_insertion_register_scenario_spec.rb +24 -0
  47. data/spec/rr/double/double_insertion_reset_spec.rb +89 -0
  48. data/spec/rr/double/double_insertion_spec.rb +66 -0
  49. data/spec/rr/double/double_insertion_verify_spec.rb +23 -0
  50. data/spec/rr/double_creator_spec.rb +454 -0
  51. data/{examples/rr/scenario_definition_example.rb → spec/rr/double_definition_spec.rb} +143 -143
  52. data/spec/rr/double_method_proxy_spec.rb +71 -0
  53. data/spec/rr/double_spec.rb +654 -0
  54. data/spec/rr/errors/rr_error_spec.rb +65 -0
  55. data/spec/rr/expectations/any_argument_expectation_spec.rb +47 -0
  56. data/spec/rr/expectations/anything_argument_equality_expectation_spec.rb +38 -0
  57. data/spec/rr/expectations/argument_equality_expectation_spec.rb +58 -0
  58. data/spec/rr/expectations/boolean_argument_equality_expectation_spec.rb +53 -0
  59. data/spec/rr/expectations/duck_type_argument_equality_expectation_spec.rb +71 -0
  60. data/spec/rr/expectations/is_a_argument_equality_expectation_spec.rb +51 -0
  61. data/spec/rr/expectations/numeric_argument_equality_expectation_spec.rb +47 -0
  62. data/spec/rr/expectations/range_argument_equality_expectation_spec.rb +59 -0
  63. data/spec/rr/expectations/regexp_argument_equality_expectation_spec.rb +72 -0
  64. data/spec/rr/expectations/times_called_expectation/times_called_expectation_any_times_spec.rb +43 -0
  65. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_least_spec.rb +67 -0
  66. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_most_spec.rb +71 -0
  67. data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +21 -0
  68. data/spec/rr/expectations/times_called_expectation/times_called_expectation_integer_spec.rb +103 -0
  69. data/spec/rr/expectations/times_called_expectation/times_called_expectation_proc_spec.rb +79 -0
  70. data/spec/rr/expectations/times_called_expectation/times_called_expectation_range_spec.rb +81 -0
  71. data/spec/rr/expectations/times_called_expectation/times_called_expectation_spec.rb +40 -0
  72. data/spec/rr/rspec/rspec_adapter_spec.rb +65 -0
  73. data/spec/rr/rspec/rspec_backtrace_tweaking_spec.rb +52 -0
  74. data/spec/rr/rspec/rspec_usage_spec.rb +67 -0
  75. data/spec/rr/space/hash_with_object_id_key_spec.rb +88 -0
  76. data/spec/rr/space/space_create_spec.rb +278 -0
  77. data/spec/rr/space/space_helper.rb +7 -0
  78. data/spec/rr/space/space_register_spec.rb +32 -0
  79. data/spec/rr/space/space_reset_spec.rb +131 -0
  80. data/spec/rr/space/space_spec.rb +32 -0
  81. data/spec/rr/space/space_verify_spec.rb +181 -0
  82. data/{examples → spec}/rr/test_unit/test_helper.rb +1 -1
  83. data/{examples → spec}/rr/test_unit/test_unit_backtrace_test.rb +0 -0
  84. data/{examples → spec}/rr/test_unit/test_unit_integration_test.rb +4 -4
  85. data/spec/rr/times_called_matchers/any_times_matcher_spec.rb +47 -0
  86. data/spec/rr/times_called_matchers/at_least_matcher_spec.rb +55 -0
  87. data/spec/rr/times_called_matchers/at_most_matcher_spec.rb +70 -0
  88. data/spec/rr/times_called_matchers/integer_matcher_spec.rb +70 -0
  89. data/spec/rr/times_called_matchers/proc_matcher_spec.rb +55 -0
  90. data/spec/rr/times_called_matchers/range_matcher_spec.rb +76 -0
  91. data/spec/rr/times_called_matchers/times_called_matcher_spec.rb +118 -0
  92. data/spec/rspec_spec_suite.rb +16 -0
  93. data/spec/spec_helper.rb +9 -0
  94. data/{examples/example_suite.rb → spec/spec_suite.rb} +3 -3
  95. data/{examples/test_unit_example_suite.rb → spec/test_unit_spec_suite.rb} +0 -0
  96. metadata +93 -93
  97. data/examples/core_example_suite.rb +0 -31
  98. data/examples/example_helper.rb +0 -9
  99. data/examples/rr/double/double_bind_example.rb +0 -70
  100. data/examples/rr/double/double_dispatching_example.rb +0 -236
  101. data/examples/rr/double/double_example.rb +0 -66
  102. data/examples/rr/double/double_has_original_method_example.rb +0 -56
  103. data/examples/rr/double/double_register_scenario_example.rb +0 -24
  104. data/examples/rr/double/double_reset_example.rb +0 -89
  105. data/examples/rr/double/double_verify_example.rb +0 -23
  106. data/examples/rr/errors/rr_error_example.rb +0 -65
  107. data/examples/rr/expectations/any_argument_expectation_example.rb +0 -52
  108. data/examples/rr/expectations/anything_argument_equality_expectation_example.rb +0 -38
  109. data/examples/rr/expectations/argument_equality_expectation_example.rb +0 -62
  110. data/examples/rr/expectations/boolean_argument_equality_expectation_example.rb +0 -48
  111. data/examples/rr/expectations/duck_type_argument_equality_expectation_example.rb +0 -67
  112. data/examples/rr/expectations/is_a_argument_equality_expectation_example.rb +0 -50
  113. data/examples/rr/expectations/numeric_argument_equality_expectation_example.rb +0 -46
  114. data/examples/rr/expectations/range_argument_equality_expectation_example.rb +0 -59
  115. data/examples/rr/expectations/regexp_argument_equality_expectation_example.rb +0 -67
  116. data/examples/rr/expectations/times_called_expectation/times_called_expectation_any_times_example.rb +0 -50
  117. data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_least_example.rb +0 -73
  118. data/examples/rr/expectations/times_called_expectation/times_called_expectation_at_most_example.rb +0 -77
  119. data/examples/rr/expectations/times_called_expectation/times_called_expectation_example.rb +0 -42
  120. data/examples/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +0 -20
  121. data/examples/rr/expectations/times_called_expectation/times_called_expectation_integer_example.rb +0 -111
  122. data/examples/rr/expectations/times_called_expectation/times_called_expectation_proc_example.rb +0 -88
  123. data/examples/rr/expectations/times_called_expectation/times_called_expectation_range_example.rb +0 -90
  124. data/examples/rr/extensions/instance_methods_argument_matcher_example.rb +0 -65
  125. data/examples/rr/extensions/instance_methods_creator_example.rb +0 -363
  126. data/examples/rr/extensions/instance_methods_example_helper.rb +0 -11
  127. data/examples/rr/extensions/instance_methods_space_example.rb +0 -122
  128. data/examples/rr/rspec/rspec_adapter_example.rb +0 -63
  129. data/examples/rr/rspec/rspec_backtrace_tweaking_example.rb +0 -36
  130. data/examples/rr/rspec/rspec_usage_example.rb +0 -65
  131. data/examples/rr/scenario_creator_example.rb +0 -459
  132. data/examples/rr/scenario_example.rb +0 -701
  133. data/examples/rr/scenario_method_proxy_example.rb +0 -71
  134. data/examples/rr/space/hash_with_object_id_key_example.rb +0 -86
  135. data/examples/rr/space/space_create_example.rb +0 -278
  136. data/examples/rr/space/space_example.rb +0 -29
  137. data/examples/rr/space/space_helper.rb +0 -7
  138. data/examples/rr/space/space_register_example.rb +0 -32
  139. data/examples/rr/space/space_reset_example.rb +0 -120
  140. data/examples/rr/space/space_verify_example.rb +0 -169
  141. data/examples/rr/times_called_matchers/any_times_matcher_example.rb +0 -63
  142. data/examples/rr/times_called_matchers/at_least_matcher_example.rb +0 -70
  143. data/examples/rr/times_called_matchers/at_most_matcher_example.rb +0 -85
  144. data/examples/rr/times_called_matchers/integer_matcher_example.rb +0 -91
  145. data/examples/rr/times_called_matchers/proc_matcher_example.rb +0 -77
  146. data/examples/rr/times_called_matchers/range_matcher_example.rb +0 -97
  147. data/examples/rr/times_called_matchers/times_called_matcher_example.rb +0 -53
  148. data/examples/rspec_example_suite.rb +0 -25
  149. data/lib/rr/extensions/instance_methods.rb +0 -228
  150. data/lib/rr/scenario.rb +0 -337
@@ -0,0 +1,56 @@
1
+ require "spec/spec_helper"
2
+
3
+ module RR
4
+ describe DoubleInsertion, "#object_has_original_method?" do
5
+ before do
6
+ @space = Space.new
7
+ @object = Object.new
8
+ @method_name = :to_s
9
+ @double_insertion = DoubleInsertion.new(@space, @object, @method_name)
10
+ class << @double_insertion
11
+ public :original_method_name
12
+ end
13
+ end
14
+
15
+ it "returns true when method is still in object" do
16
+ @double_insertion.bind
17
+ @double_insertion.object_has_original_method?.should be_true
18
+ end
19
+
20
+ it "returns true when respond_to is true and methods include method" do
21
+ @double_insertion.bind
22
+ def @object.methods
23
+ [:__rr_original_to_s]
24
+ end
25
+ def @object.respond_to?(value)
26
+ true
27
+ end
28
+
29
+ @double_insertion.object_has_original_method?.should be_true
30
+ end
31
+
32
+ it "returns true when respond_to is true and methods do not include method" do
33
+ @double_insertion.bind
34
+ def @object.methods
35
+ []
36
+ end
37
+ def @object.respond_to?(value)
38
+ true
39
+ end
40
+
41
+ @double_insertion.object_has_original_method?.should be_true
42
+ end
43
+
44
+ it "returns false when respond_to is false and methods do not include method" do
45
+ @double_insertion.bind
46
+ def @object.methods
47
+ []
48
+ end
49
+ def @object.respond_to?(value)
50
+ false
51
+ end
52
+
53
+ @double_insertion.object_has_original_method?.should be_false
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,24 @@
1
+ require "spec/spec_helper"
2
+
3
+ module RR
4
+ describe DoubleInsertion, "#register_scenario" do
5
+ before do
6
+ @space = Space.new
7
+ @object = Object.new
8
+ @method_name = :foobar
9
+ @object.methods.should_not include(@method_name.to_s)
10
+ @double_insertion = DoubleInsertion.new(@space, @object, @method_name)
11
+ def @double_insertion.scenarios
12
+ @scenarios
13
+ end
14
+ end
15
+
16
+ it "adds the scenario to the scenarios list" do
17
+ scenario = Double.new(@space, @double_insertion, @space.scenario_definition)
18
+
19
+ @double_insertion.scenarios.should_not include(scenario)
20
+ @double_insertion.register_scenario scenario
21
+ @double_insertion.scenarios.should include(scenario)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,89 @@
1
+ require "spec/spec_helper"
2
+
3
+ module RR
4
+ describe DoubleInsertion, "#reset", :shared => true do
5
+ it "cleans up by removing the __rr__method" do
6
+ @double_insertion.bind
7
+ @object.methods.should include("__rr__foobar")
8
+
9
+ @double_insertion.reset
10
+ @object.methods.should_not include("__rr__foobar")
11
+ end
12
+ end
13
+
14
+ describe DoubleInsertion, "#reset when method does not exist" do
15
+ it_should_behave_like "RR::DoubleInsertion#reset"
16
+
17
+ before do
18
+ @space = Space.new
19
+ @object = Object.new
20
+ @method_name = :foobar
21
+ @object.methods.should_not include(@method_name.to_s)
22
+ @double_insertion = DoubleInsertion.new(@space, @object, @method_name)
23
+ end
24
+
25
+ it "removes the method" do
26
+ @double_insertion.bind
27
+ @object.methods.should include(@method_name.to_s)
28
+
29
+ @double_insertion.reset
30
+ @object.methods.should_not include(@method_name.to_s)
31
+ proc {@object.foobar}.should raise_error(NoMethodError)
32
+ end
33
+ end
34
+
35
+ describe DoubleInsertion, "#reset when method exists" do
36
+ it_should_behave_like "RR::DoubleInsertion#reset"
37
+
38
+ before do
39
+ @space = Space.new
40
+ @object = Object.new
41
+ @method_name = :foobar
42
+ def @object.foobar
43
+ :original_foobar
44
+ end
45
+ @object.methods.should include(@method_name.to_s)
46
+ @original_method = @object.method(@method_name)
47
+ @double_insertion = DoubleInsertion.new(@space, @object, @method_name)
48
+
49
+ @double_insertion.bind
50
+ @object.methods.should include(@method_name.to_s)
51
+ end
52
+
53
+ it "rebind original method" do
54
+ @double_insertion.reset
55
+ @object.methods.should include(@method_name.to_s)
56
+ @object.foobar.should == :original_foobar
57
+ end
58
+ end
59
+
60
+ describe DoubleInsertion, "#reset when method with block exists" do
61
+ it_should_behave_like "RR::DoubleInsertion#reset"
62
+
63
+ before do
64
+ @space = Space.new
65
+ @object = Object.new
66
+ @method_name = :foobar
67
+ def @object.foobar
68
+ yield(:original_argument)
69
+ end
70
+ @object.methods.should include(@method_name.to_s)
71
+ @original_method = @object.method(@method_name)
72
+ @double_insertion = DoubleInsertion.new(@space, @object, @method_name)
73
+
74
+ @double_insertion.bind
75
+ @object.methods.should include(@method_name.to_s)
76
+ end
77
+
78
+ it "rebinds original method with block" do
79
+ @double_insertion.reset
80
+ @object.methods.should include(@method_name.to_s)
81
+
82
+ original_argument = nil
83
+ @object.foobar do |arg|
84
+ original_argument = arg
85
+ end
86
+ original_argument.should == :original_argument
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,66 @@
1
+ require "spec/spec_helper"
2
+
3
+ module RR
4
+ describe DoubleInsertion, :shared => true do
5
+ it "sets up object and method_name" do
6
+ @double_insertion.object.should === @object
7
+ @double_insertion.method_name.should == @method_name.to_sym
8
+ end
9
+ end
10
+
11
+ describe DoubleInsertion, "#initialize where method_name is a symbol" do
12
+ it_should_behave_like "RR::DoubleInsertion"
13
+
14
+ before do
15
+ @space = Space.new
16
+ @object = Object.new
17
+ @method_name = :foobar
18
+ @object.methods.should_not include(@method_name.to_s)
19
+ @double_insertion = DoubleInsertion.new(@space, @object, @method_name)
20
+ end
21
+ end
22
+
23
+ describe DoubleInsertion, "#initialize where method_name is a string" do
24
+ it_should_behave_like "RR::DoubleInsertion"
25
+
26
+ before do
27
+ @space = Space.new
28
+ @object = Object.new
29
+ @method_name = 'foobar'
30
+ @object.methods.should_not include(@method_name)
31
+ @double_insertion = DoubleInsertion.new(@space, @object, @method_name)
32
+ end
33
+ end
34
+
35
+ describe DoubleInsertion, "#initialize where method does not exist on object" do
36
+ it_should_behave_like "RR::DoubleInsertion"
37
+
38
+ before do
39
+ @space = Space.new
40
+ @object = Object.new
41
+ @method_name = :foobar
42
+ @object.methods.should_not include(@method_name.to_s)
43
+ @double_insertion = DoubleInsertion.new(@space, @object, @method_name)
44
+ end
45
+
46
+ it "object does not have original method" do
47
+ @double_insertion.object_has_original_method?.should be_false
48
+ end
49
+ end
50
+
51
+ describe DoubleInsertion, "#initialize where method exists on object" do
52
+ it_should_behave_like "RR::DoubleInsertion"
53
+
54
+ before do
55
+ @space = Space.new
56
+ @object = Object.new
57
+ @method_name = :to_s
58
+ @object.methods.should include(@method_name.to_s)
59
+ @double_insertion = DoubleInsertion.new(@space, @object, @method_name)
60
+ end
61
+
62
+ it "has a original_method" do
63
+ @double_insertion.object_has_original_method?.should be_true
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,23 @@
1
+ require "spec/spec_helper"
2
+
3
+ module RR
4
+ describe DoubleInsertion, "#verify" do
5
+ before do
6
+ @space = Space.new
7
+ @object = Object.new
8
+ @method_name = :foobar
9
+ @object.methods.should_not include(@method_name.to_s)
10
+ @double_insertion = @space.double_insertion(@object, @method_name)
11
+ end
12
+
13
+ it "verifies each scenario was met" do
14
+ scenario = Double.new(@space, @double_insertion, @space.scenario_definition)
15
+ @double_insertion.register_scenario scenario
16
+
17
+ scenario.with(1).once.returns {nil}
18
+ proc {@double_insertion.verify}.should raise_error(Errors::TimesCalledError)
19
+ @object.foobar(1)
20
+ proc {@double_insertion.verify}.should_not raise_error
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,454 @@
1
+ require "spec/spec_helper"
2
+
3
+ module RR
4
+ describe DoubleCreator, " strategy definition", :shared => true do
5
+ it "returns self when passing no args" do
6
+ creator.__send__(method_name).should === creator
7
+ end
8
+
9
+ it "returns a DoubleMethodProxy when passed a subject" do
10
+ scenario = creator.__send__(method_name, subject).foobar
11
+ scenario.should be_instance_of(DoubleDefinition)
12
+ end
13
+
14
+ it "returns a DoubleMethodProxy when passed Kernel" do
15
+ scenario = creator.__send__(method_name, Kernel).foobar
16
+ scenario.should be_instance_of(DoubleDefinition)
17
+ end
18
+
19
+ it "raises error if passed a method name and a block" do
20
+ proc do
21
+ creator.__send__(method_name, subject, :foobar) {}
22
+ end.should raise_error(ArgumentError, "Cannot pass in a method name and a block")
23
+ end
24
+
25
+ it "raises error when using mock strategy" do
26
+ creator.mock
27
+ proc do
28
+ creator.__send__(method_name)
29
+ end.should raise_error(
30
+ Errors::DoubleDefinitionError,
31
+ "This Double already has a mock strategy"
32
+ )
33
+ end
34
+
35
+ it "raises error when using stub strategy" do
36
+ creator.stub
37
+ proc do
38
+ creator.__send__(method_name)
39
+ end.should raise_error(
40
+ Errors::DoubleDefinitionError,
41
+ "This Double already has a stub strategy"
42
+ )
43
+ end
44
+
45
+ it "raises error when using dont_allow strategy" do
46
+ creator.dont_allow
47
+ proc do
48
+ creator.__send__(method_name)
49
+ end.should raise_error(
50
+ Errors::DoubleDefinitionError,
51
+ "This Double already has a dont_allow strategy"
52
+ )
53
+ end
54
+ end
55
+
56
+ describe DoubleCreator do
57
+ attr_reader :creator, :subject, :space, :method_name
58
+ before(:each) do
59
+ @space = Space.new
60
+ @subject = Object.new
61
+ @creator = DoubleCreator.new(space)
62
+ end
63
+
64
+ describe "#mock" do
65
+ it_should_behave_like "RR::DoubleCreator strategy definition"
66
+
67
+ before do
68
+ @method_name = :mock
69
+ end
70
+
71
+ it "sets up the RR mock call chain" do
72
+ creates_mock_call_chain(creator.mock(subject))
73
+ end
74
+
75
+ it "creates a mock Double for method when passed a second argument with rr_mock" do
76
+ creates_scenario_with_method_name(
77
+ creator.mock(subject, :foobar)
78
+ )
79
+ end
80
+
81
+ it "sets up the DoubleDefinition to be in returns block_callback_strategy" do
82
+ scenario = creator.mock(subject, :foobar)
83
+ scenario.block_callback_strategy.should == :returns
84
+ end
85
+
86
+ def creates_scenario_with_method_name(scenario)
87
+ scenario.with(1, 2) {:baz}
88
+ scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
89
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
90
+ scenario.argument_expectation.expected_arguments.should == [1, 2]
91
+
92
+ subject.foobar(1, 2).should == :baz
93
+ end
94
+
95
+ def creates_mock_call_chain(creator)
96
+ scenario = creator.foobar(1, 2) {:baz}
97
+ scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(1)
98
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
99
+ scenario.argument_expectation.expected_arguments.should == [1, 2]
100
+
101
+ subject.foobar(1, 2).should == :baz
102
+ end
103
+ end
104
+
105
+ describe "#stub" do
106
+ it_should_behave_like "RR::DoubleCreator strategy definition"
107
+
108
+ before do
109
+ @method_name = :stub
110
+ end
111
+
112
+ it "sets up the RR stub call chain" do
113
+ creates_stub_call_chain(creator.stub(subject))
114
+ end
115
+
116
+ it "creates a stub Double for method when passed a second argument" do
117
+ creates_scenario_with_method_name(creator.stub(subject, :foobar))
118
+ end
119
+
120
+ it "sets up the DoubleDefinition to be in returns block_callback_strategy" do
121
+ scenario = creator.stub(subject, :foobar)
122
+ scenario.block_callback_strategy.should == :returns
123
+ end
124
+
125
+ def creates_scenario_with_method_name(scenario)
126
+ scenario.with(1, 2) {:baz}
127
+ scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
128
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
129
+ subject.foobar(1, 2).should == :baz
130
+ end
131
+
132
+ def creates_stub_call_chain(creator)
133
+ scenario = creator.foobar(1, 2) {:baz}
134
+ scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
135
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
136
+ subject.foobar(1, 2).should == :baz
137
+ end
138
+ end
139
+
140
+ describe "#dont_allow" do
141
+ it_should_behave_like "RR::DoubleCreator strategy definition"
142
+
143
+ before do
144
+ @method_name = :dont_allow
145
+ end
146
+
147
+ it "raises error when proxied" do
148
+ creator.proxy
149
+ proc do
150
+ creator.dont_allow
151
+ end.should raise_error(
152
+ Errors::DoubleDefinitionError,
153
+ "Doubles cannot be proxied when using dont_allow strategy"
154
+ )
155
+ end
156
+
157
+ it "sets up the RR dont_allow call chain" do
158
+ creates_dont_allow_call_chain(creator.dont_allow(subject))
159
+ end
160
+
161
+ it "sets up the RR dont_allow call chain" do
162
+ creates_dont_allow_call_chain(creator.dont_call(subject))
163
+ end
164
+
165
+ it "sets up the RR dont_allow call chain" do
166
+ creates_dont_allow_call_chain(creator.do_not_allow(subject))
167
+ end
168
+
169
+ it "sets up the RR dont_allow call chain" do
170
+ creates_dont_allow_call_chain(creator.dont_allow(subject))
171
+ end
172
+
173
+ it "creates a mock Double for method when passed a second argument" do
174
+ creates_scenario_with_method_name(creator.dont_allow(subject, :foobar))
175
+ end
176
+
177
+ it "creates a mock Double for method when passed a second argument" do
178
+ creates_scenario_with_method_name(creator.dont_call(subject, :foobar))
179
+ end
180
+
181
+ it "creates a mock Double for method when passed a second argument" do
182
+ creates_scenario_with_method_name(creator.do_not_allow(subject, :foobar))
183
+ end
184
+
185
+ it "creates a mock Double for method when passed a second argument" do
186
+ creates_scenario_with_method_name(creator.dont_allow(subject, :foobar))
187
+ end
188
+
189
+ def creates_scenario_with_method_name(scenario)
190
+ scenario.with(1, 2)
191
+ scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(0)
192
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
193
+ scenario.argument_expectation.expected_arguments.should == [1, 2]
194
+
195
+ proc do
196
+ subject.foobar(1, 2)
197
+ end.should raise_error(Errors::TimesCalledError)
198
+ reset
199
+ nil
200
+ end
201
+
202
+ def creates_dont_allow_call_chain(creator)
203
+ scenario = creator.foobar(1, 2)
204
+ scenario.times_matcher.should == TimesCalledMatchers::IntegerMatcher.new(0)
205
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
206
+ scenario.argument_expectation.expected_arguments.should == [1, 2]
207
+
208
+ proc do
209
+ subject.foobar(1, 2)
210
+ end.should raise_error(Errors::TimesCalledError)
211
+ reset
212
+ nil
213
+ end
214
+ end
215
+
216
+ describe "(#proxy or #proxy) and #stub" do
217
+ before do
218
+ class << subject
219
+ def foobar(*args)
220
+ :original_foobar
221
+ end
222
+ end
223
+ end
224
+
225
+ it "raises error when using dont_allow strategy" do
226
+ creator.dont_allow
227
+ proc do
228
+ creator.proxy
229
+ end.should raise_error(
230
+ Errors::DoubleDefinitionError,
231
+ "Doubles cannot be proxied when using dont_allow strategy"
232
+ )
233
+ end
234
+
235
+ it "sets up the RR proxy call chain" do
236
+ scenario = creator.stub.proxy(subject).foobar(1, 2) {:baz}
237
+ scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
238
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
239
+ subject.foobar(1, 2).should == :baz
240
+ end
241
+
242
+ it "sets up the RR proxy call chain" do
243
+ scenario = creator.stub.proxy(subject).foobar(1, 2) {:baz}
244
+ scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
245
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
246
+ subject.foobar(1, 2).should == :baz
247
+ end
248
+
249
+ it "creates a proxy Double for method when passed a second argument" do
250
+ scenario = creator.stub.proxy(subject, :foobar)
251
+ scenario.with(1, 2) {:baz}
252
+ scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
253
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
254
+ subject.foobar(1, 2).should == :baz
255
+ end
256
+
257
+ it "creates a proxy Double for method when passed a second argument" do
258
+ scenario = creator.stub.proxy(subject, :foobar)
259
+ scenario.with(1, 2) {:baz}
260
+ scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
261
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
262
+ subject.foobar(1, 2).should == :baz
263
+ end
264
+
265
+ it "sets up the DoubleDefinition to be in after_call block_callback_strategy" do
266
+ def subject.foobar
267
+ :original_implementation_value
268
+ end
269
+
270
+ args = nil
271
+ scenario = creator.stub.proxy(subject, :foobar).with() do |*args|
272
+ args = args
273
+ end
274
+ subject.foobar
275
+ args.should == [:original_implementation_value]
276
+ scenario.block_callback_strategy.should == :after_call
277
+ end
278
+ end
279
+
280
+ describe "#instance_of" do
281
+ it "raises an error when not passed a class" do
282
+ proc do
283
+ creator.instance_of(Object.new)
284
+ end.should raise_error(ArgumentError, "instance_of only accepts class objects")
285
+ end
286
+
287
+ it "sets up the RR proxy call chain" do
288
+ klass = Class.new
289
+ scenario = creator.stub.instance_of(klass).foobar(1, 2) {:baz}
290
+ scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
291
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
292
+ klass.new.foobar(1, 2).should == :baz
293
+ end
294
+
295
+ it "creates a proxy Double for method when passed a second argument" do
296
+ klass = Class.new
297
+ scenario = creator.stub.instance_of(klass, :foobar)
298
+ scenario.with(1, 2) {:baz}
299
+ scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
300
+ scenario.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
301
+ klass.new.foobar(1, 2).should == :baz
302
+ end
303
+ end
304
+
305
+ describe "#create! using no strategy" do
306
+ it "raises error" do
307
+ proc do
308
+ creator.create!(subject, :foobar, 1, 2)
309
+ end.should raise_error(
310
+ Errors::DoubleDefinitionError,
311
+ "This Double has no strategy"
312
+ )
313
+ end
314
+ end
315
+
316
+ describe "#create! using mock strategy" do
317
+ before do
318
+ creator.mock
319
+ end
320
+
321
+ it "sets expectations on the subject" do
322
+ creator.create!(subject, :foobar, 1, 2) {:baz}.twice
323
+
324
+ subject.foobar(1, 2).should == :baz
325
+ subject.foobar(1, 2).should == :baz
326
+ proc {subject.foobar(1, 2)}.should raise_error(Errors::TimesCalledError)
327
+ end
328
+ end
329
+
330
+ describe "#create! using stub strategy" do
331
+ before do
332
+ creator.stub
333
+ end
334
+
335
+ it "stubs the subject without any args" do
336
+ creator.create!(subject, :foobar) {:baz}
337
+ subject.foobar.should == :baz
338
+ end
339
+
340
+ it "stubs the subject mapping passed in args with the output" do
341
+ creator.create!(subject, :foobar, 1, 2) {:one_two}
342
+ creator.create!(subject, :foobar, 1) {:one}
343
+ creator.create!(subject, :foobar) {:nothing}
344
+ subject.foobar.should == :nothing
345
+ subject.foobar(1).should == :one
346
+ subject.foobar(1, 2).should == :one_two
347
+ end
348
+ end
349
+
350
+ describe "#create! using dont_allow strategy" do
351
+ before do
352
+ creator.dont_allow
353
+ end
354
+
355
+ it "sets expectation for method to never be called with any arguments when on arguments passed in" do
356
+ creator.create!(subject, :foobar)
357
+ proc {subject.foobar}.should raise_error(Errors::TimesCalledError)
358
+ proc {subject.foobar(1, 2)}.should raise_error(Errors::TimesCalledError)
359
+ end
360
+
361
+ it "sets expectation for method to never be called with passed in arguments" do
362
+ creator.create!(subject, :foobar, 1, 2)
363
+ proc {subject.foobar}.should raise_error(Errors::DoubleNotFoundError)
364
+ proc {subject.foobar(1, 2)}.should raise_error(Errors::TimesCalledError)
365
+ end
366
+
367
+ it "sets expectation for method to never be called with no arguments when with_no_args is set" do
368
+ creator.create!(subject, :foobar).with_no_args
369
+ proc {subject.foobar}.should raise_error(Errors::TimesCalledError)
370
+ proc {subject.foobar(1, 2)}.should raise_error(Errors::DoubleNotFoundError)
371
+ end
372
+ end
373
+
374
+ describe "#create! using mock strategy with proxy" do
375
+ before do
376
+ creator.mock
377
+ creator.proxy
378
+ end
379
+
380
+ it "sets expectations on the subject while calling the original method" do
381
+ def subject.foobar(*args)
382
+ ; :baz;
383
+ end
384
+ creator.create!(subject, :foobar, 1, 2).twice
385
+ subject.foobar(1, 2).should == :baz
386
+ subject.foobar(1, 2).should == :baz
387
+ proc {subject.foobar(1, 2)}.should raise_error(Errors::TimesCalledError)
388
+ end
389
+
390
+ it "sets after_call on the scenario when passed a block" do
391
+ real_value = Object.new
392
+ (
393
+ class << subject;
394
+ self;
395
+ end).class_eval do
396
+ define_method(:foobar) {real_value}
397
+ end
398
+ creator.create!(subject, :foobar, 1, 2) do |value|
399
+ mock(value).a_method {99}
400
+ value
401
+ end
402
+
403
+ return_value = subject.foobar(1, 2)
404
+ return_value.should === return_value
405
+ return_value.a_method.should == 99
406
+ end
407
+ end
408
+
409
+ describe "#create! using stub strategy with proxy" do
410
+ before do
411
+ creator.stub
412
+ creator.proxy
413
+ end
414
+
415
+ it "sets up a scenario with passed in arguments" do
416
+ def subject.foobar(*args)
417
+ ; :baz;
418
+ end
419
+ creator.create!(subject, :foobar, 1, 2)
420
+ proc do
421
+ subject.foobar
422
+ end.should raise_error(Errors::DoubleNotFoundError)
423
+ end
424
+
425
+ it "sets expectations on the subject while calling the original method" do
426
+ def subject.foobar(*args)
427
+ ; :baz;
428
+ end
429
+ creator.create!(subject, :foobar, 1, 2) {:new_value}
430
+ 10.times do
431
+ subject.foobar(1, 2).should == :new_value
432
+ end
433
+ end
434
+
435
+ it "sets after_call on the scenario when passed a block" do
436
+ real_value = Object.new
437
+ (
438
+ class << subject;
439
+ self;
440
+ end).class_eval do
441
+ define_method(:foobar) {real_value}
442
+ end
443
+ creator.create!(subject, :foobar, 1, 2) do |value|
444
+ mock(value).a_method {99}
445
+ value
446
+ end
447
+
448
+ return_value = subject.foobar(1, 2)
449
+ return_value.should === return_value
450
+ return_value.a_method.should == 99
451
+ end
452
+ end
453
+ end
454
+ end