rspec 0.8.2 → 0.9.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 (245) hide show
  1. data/CHANGES +125 -9
  2. data/EXAMPLES.rd +50 -27
  3. data/README +14 -1
  4. data/Rakefile +95 -42
  5. data/UPGRADE +31 -0
  6. data/bin/spec +0 -1
  7. data/bin/spec_translator +6 -0
  8. data/examples/auto_spec_description_example.rb +19 -0
  9. data/examples/{setup_teardown_example.rb → before_and_after_example.rb} +6 -6
  10. data/examples/behave_as_example.rb +45 -0
  11. data/examples/custom_expectation_matchers.rb +13 -12
  12. data/examples/dynamic_spec.rb +2 -2
  13. data/examples/file_accessor_spec.rb +2 -2
  14. data/examples/greeter_spec.rb +3 -3
  15. data/examples/helper_method_example.rb +2 -2
  16. data/examples/io_processor_spec.rb +4 -4
  17. data/examples/legacy_spec.rb +10 -0
  18. data/examples/mocking_example.rb +5 -5
  19. data/examples/multi_threaded_behaviour_runner.rb +25 -0
  20. data/examples/partial_mock_example.rb +4 -4
  21. data/examples/predicate_example.rb +4 -4
  22. data/examples/priority.txt +1 -0
  23. data/examples/shared_behaviours_example.rb +31 -0
  24. data/examples/stack_spec.rb +52 -69
  25. data/examples/stubbing_example.rb +10 -10
  26. data/examples/test_case_adapter_example.rb +26 -0
  27. data/examples/test_case_spec.rb +6 -6
  28. data/lib/spec.rb +9 -4
  29. data/lib/spec/dsl.rb +10 -0
  30. data/lib/spec/dsl/behaviour.rb +189 -0
  31. data/lib/spec/dsl/behaviour_callbacks.rb +43 -0
  32. data/lib/spec/dsl/behaviour_eval.rb +170 -0
  33. data/lib/spec/dsl/behaviour_factory.rb +32 -0
  34. data/lib/spec/dsl/composite_proc_builder.rb +28 -0
  35. data/lib/spec/dsl/configuration.rb +38 -0
  36. data/lib/spec/dsl/description.rb +34 -0
  37. data/lib/spec/dsl/example.rb +114 -0
  38. data/lib/spec/dsl/example_matcher.rb +28 -0
  39. data/lib/spec/{runner/spec_should_raise_handler.rb → dsl/example_should_raise_handler.rb} +4 -4
  40. data/lib/spec/expectations.rb +0 -3
  41. data/lib/spec/expectations/differs/default.rb +0 -1
  42. data/lib/spec/expectations/extensions.rb +0 -1
  43. data/lib/spec/expectations/extensions/object.rb +10 -53
  44. data/lib/spec/expectations/handler.rb +14 -18
  45. data/lib/spec/extensions.rb +1 -0
  46. data/lib/spec/extensions/object.rb +6 -0
  47. data/lib/spec/matchers.rb +19 -21
  48. data/lib/spec/matchers/be.rb +40 -11
  49. data/lib/spec/matchers/be_close.rb +2 -2
  50. data/lib/spec/matchers/operator_matcher.rb +52 -0
  51. data/lib/spec/matchers/respond_to.rb +21 -11
  52. data/lib/spec/mocks.rb +5 -28
  53. data/lib/spec/mocks/argument_constraint_matchers.rb +12 -0
  54. data/lib/spec/mocks/argument_expectation.rb +7 -4
  55. data/lib/spec/mocks/methods.rb +11 -16
  56. data/lib/spec/mocks/mock.rb +6 -3
  57. data/lib/spec/mocks/{mock_handler.rb → proxy.rb} +4 -7
  58. data/lib/spec/mocks/space.rb +28 -0
  59. data/lib/spec/mocks/spec_methods.rb +30 -0
  60. data/lib/spec/rake/spectask.rb +23 -21
  61. data/lib/spec/rake/verify_rcov.rb +1 -0
  62. data/lib/spec/runner.rb +88 -35
  63. data/lib/spec/runner/backtrace_tweaker.rb +2 -1
  64. data/lib/spec/runner/behaviour_runner.rb +102 -0
  65. data/lib/spec/runner/command_line.rb +5 -17
  66. data/lib/spec/runner/drb_command_line.rb +2 -2
  67. data/lib/spec/runner/extensions/kernel.rb +22 -9
  68. data/lib/spec/runner/formatter.rb +4 -0
  69. data/lib/spec/runner/formatter/base_formatter.rb +63 -0
  70. data/lib/spec/runner/formatter/base_text_formatter.rb +22 -52
  71. data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +25 -0
  72. data/lib/spec/runner/formatter/failing_examples_formatter.rb +22 -0
  73. data/lib/spec/runner/formatter/html_formatter.rb +74 -29
  74. data/lib/spec/runner/formatter/progress_bar_formatter.rb +6 -8
  75. data/lib/spec/runner/formatter/rdoc_formatter.rb +6 -6
  76. data/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
  77. data/lib/spec/runner/formatter/specdoc_formatter.rb +6 -6
  78. data/lib/spec/runner/heckle_runner.rb +8 -7
  79. data/lib/spec/runner/option_parser.rb +136 -55
  80. data/lib/spec/runner/options.rb +26 -0
  81. data/lib/spec/runner/reporter.rb +38 -31
  82. data/lib/spec/runner/spec_parser.rb +22 -13
  83. data/lib/spec/test_case_adapter.rb +10 -0
  84. data/lib/spec/translator.rb +103 -86
  85. data/lib/spec/version.rb +7 -15
  86. data/plugins/mock_frameworks/flexmock.rb +27 -0
  87. data/plugins/mock_frameworks/mocha.rb +21 -0
  88. data/plugins/mock_frameworks/rspec.rb +18 -0
  89. data/spec/spec/dsl/behaviour_eval_spec.rb +49 -0
  90. data/spec/spec/dsl/behaviour_factory_spec.rb +30 -0
  91. data/spec/spec/dsl/behaviour_spec.rb +508 -0
  92. data/spec/spec/dsl/composite_proc_builder_spec.rb +57 -0
  93. data/spec/spec/dsl/configuration_spec.rb +43 -0
  94. data/spec/spec/dsl/description_spec.rb +51 -0
  95. data/spec/spec/dsl/example_class_spec.rb +24 -0
  96. data/spec/spec/dsl/example_instance_spec.rb +140 -0
  97. data/spec/spec/dsl/example_should_raise_spec.rb +137 -0
  98. data/spec/spec/dsl/predicate_matcher_spec.rb +21 -0
  99. data/spec/spec/dsl/shared_behaviour_spec.rb +186 -0
  100. data/spec/spec/expectations/differs/default_spec.rb +12 -12
  101. data/spec/spec/expectations/extensions/object_spec.rb +10 -10
  102. data/spec/spec/expectations/fail_with_spec.rb +20 -20
  103. data/spec/spec/matchers/be_close_spec.rb +37 -31
  104. data/spec/spec/matchers/be_spec.rb +50 -41
  105. data/spec/spec/matchers/change_spec.rb +54 -54
  106. data/spec/spec/matchers/description_generation_spec.rb +43 -31
  107. data/spec/spec/matchers/eql_spec.rb +24 -37
  108. data/spec/spec/matchers/equal_spec.rb +24 -37
  109. data/spec/spec/matchers/exist_spec.rb +48 -0
  110. data/spec/spec/matchers/handler_spec.rb +36 -23
  111. data/spec/spec/matchers/has_spec.rb +8 -8
  112. data/spec/spec/matchers/have_spec.rb +38 -38
  113. data/spec/spec/matchers/include_spec.rb +6 -6
  114. data/spec/spec/matchers/match_spec.rb +8 -8
  115. data/spec/spec/matchers/matcher_methods_spec.rb +24 -31
  116. data/spec/spec/matchers/raise_error_spec.rb +34 -34
  117. data/spec/spec/matchers/respond_to_spec.rb +32 -8
  118. data/spec/spec/matchers/satisfy_spec.rb +6 -6
  119. data/spec/spec/matchers/should_===_spec.rb +38 -0
  120. data/spec/spec/matchers/should_==_spec.rb +37 -0
  121. data/spec/spec/matchers/should_=~_spec.rb +36 -0
  122. data/spec/spec/matchers/throw_symbol_spec.rb +47 -55
  123. data/spec/spec/mocks/any_number_of_times_spec.rb +16 -21
  124. data/spec/spec/mocks/argument_expectation_spec.rb +3 -3
  125. data/spec/spec/mocks/at_least_spec.rb +30 -30
  126. data/spec/spec/mocks/at_most_spec.rb +53 -57
  127. data/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
  128. data/spec/spec/mocks/bug_report_7611_spec.rb +3 -3
  129. data/spec/spec/mocks/bug_report_7805_spec.rb +3 -3
  130. data/spec/spec/mocks/bug_report_8165_spec.rb +5 -5
  131. data/spec/spec/mocks/bug_report_8302_spec.rb +5 -5
  132. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +26 -27
  133. data/spec/spec/mocks/mock_ordering_spec.rb +19 -15
  134. data/spec/spec/mocks/mock_space_spec.rb +54 -0
  135. data/spec/spec/mocks/mock_spec.rb +111 -141
  136. data/spec/spec/mocks/multiple_return_value_spec.rb +48 -48
  137. data/spec/spec/mocks/null_object_mock_spec.rb +10 -10
  138. data/spec/spec/mocks/once_counts_spec.rb +32 -35
  139. data/spec/spec/mocks/options_hash_spec.rb +12 -10
  140. data/spec/spec/mocks/partial_mock_spec.rb +15 -15
  141. data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +24 -22
  142. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +19 -19
  143. data/spec/spec/mocks/precise_counts_spec.rb +28 -32
  144. data/spec/spec/mocks/record_messages_spec.rb +10 -10
  145. data/spec/spec/mocks/stub_spec.rb +45 -45
  146. data/spec/spec/mocks/twice_counts_spec.rb +21 -21
  147. data/spec/spec/package/bin_spec_spec.rb +12 -0
  148. data/spec/spec/runner/behaviour_runner_spec.rb +114 -0
  149. data/spec/spec/runner/command_line_spec.rb +8 -8
  150. data/spec/spec/runner/context_matching_spec.rb +14 -15
  151. data/spec/spec/runner/drb_command_line_spec.rb +12 -12
  152. data/spec/spec/runner/execution_context_spec.rb +8 -29
  153. data/spec/spec/runner/extensions/kernel_spec.rb +36 -0
  154. data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +27 -0
  155. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +28 -0
  156. data/spec/spec/runner/formatter/html_formatter_spec.rb +9 -8
  157. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +6 -6
  158. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +10 -10
  159. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +22 -27
  160. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +6 -5
  161. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +17 -17
  162. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +11 -0
  163. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +6 -6
  164. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +17 -17
  165. data/spec/spec/runner/heckle_runner_spec.rb +21 -21
  166. data/spec/spec/runner/heckler_spec.rb +5 -5
  167. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +12 -12
  168. data/spec/spec/runner/object_ext_spec.rb +3 -3
  169. data/spec/spec/runner/option_parser_spec.rb +171 -102
  170. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +21 -12
  171. data/spec/spec/runner/reporter_spec.rb +106 -97
  172. data/spec/spec/runner/spec_matcher_spec.rb +46 -51
  173. data/spec/spec/runner/spec_parser_spec.rb +72 -16
  174. data/spec/spec/spec_classes.rb +12 -3
  175. data/spec/spec/translator_spec.rb +165 -36
  176. metadata +66 -76
  177. data/RELEASE-PLAN +0 -117
  178. data/examples/auto_spec_name_generation_example.rb +0 -18
  179. data/lib/spec/callback.rb +0 -11
  180. data/lib/spec/callback/callback_container.rb +0 -60
  181. data/lib/spec/callback/extensions/module.rb +0 -24
  182. data/lib/spec/callback/extensions/object.rb +0 -37
  183. data/lib/spec/deprecated.rb +0 -3
  184. data/lib/spec/expectations/extensions/proc.rb +0 -57
  185. data/lib/spec/expectations/should.rb +0 -5
  186. data/lib/spec/expectations/should/base.rb +0 -64
  187. data/lib/spec/expectations/should/change.rb +0 -69
  188. data/lib/spec/expectations/should/have.rb +0 -128
  189. data/lib/spec/expectations/should/not.rb +0 -74
  190. data/lib/spec/expectations/should/should.rb +0 -81
  191. data/lib/spec/expectations/sugar.rb +0 -47
  192. data/lib/spec/runner/context.rb +0 -154
  193. data/lib/spec/runner/context_eval.rb +0 -142
  194. data/lib/spec/runner/context_runner.rb +0 -55
  195. data/lib/spec/runner/execution_context.rb +0 -17
  196. data/lib/spec/runner/spec_matcher.rb +0 -25
  197. data/lib/spec/runner/specification.rb +0 -114
  198. data/spec/spec/callback/callback_container_spec.rb +0 -27
  199. data/spec/spec/callback/module_spec.rb +0 -37
  200. data/spec/spec/callback/object_spec.rb +0 -90
  201. data/spec/spec/callback/object_with_class_callback_spec.rb +0 -19
  202. data/spec/spec/expectations/should/should_==_spec.rb +0 -19
  203. data/spec/spec/expectations/should/should_=~_spec.rb +0 -13
  204. data/spec/spec/expectations/should/should_be_a_kind_of_spec.rb +0 -21
  205. data/spec/spec/expectations/should/should_be_an_instance_of_spec.rb +0 -30
  206. data/spec/spec/expectations/should/should_be_arbitrary_predicate_spec.rb +0 -81
  207. data/spec/spec/expectations/should/should_be_close_spec.rb +0 -18
  208. data/spec/spec/expectations/should/should_be_comparison_operator_spec.rb +0 -44
  209. data/spec/spec/expectations/should/should_be_false_spec.rb +0 -39
  210. data/spec/spec/expectations/should/should_be_spec.rb +0 -11
  211. data/spec/spec/expectations/should/should_be_true_spec.rb +0 -27
  212. data/spec/spec/expectations/should/should_change_spec.rb +0 -184
  213. data/spec/spec/expectations/should/should_eql_spec.rb +0 -11
  214. data/spec/spec/expectations/should/should_equal_spec.rb +0 -11
  215. data/spec/spec/expectations/should/should_have_at_least_spec.rb +0 -53
  216. data/spec/spec/expectations/should/should_have_at_most_spec.rb +0 -45
  217. data/spec/spec/expectations/should/should_have_key_spec.rb +0 -21
  218. data/spec/spec/expectations/should/should_have_spec.rb +0 -64
  219. data/spec/spec/expectations/should/should_include_spec.rb +0 -59
  220. data/spec/spec/expectations/should/should_match_spec.rb +0 -25
  221. data/spec/spec/expectations/should/should_not_==_spec.rb +0 -15
  222. data/spec/spec/expectations/should/should_not_be_a_kind_of_spec.rb +0 -21
  223. data/spec/spec/expectations/should/should_not_be_an_instance_of_spec.rb +0 -11
  224. data/spec/spec/expectations/should/should_not_be_arbitrary_predicate_spec.rb +0 -68
  225. data/spec/spec/expectations/should/should_not_be_spec.rb +0 -11
  226. data/spec/spec/expectations/should/should_not_change_spec.rb +0 -24
  227. data/spec/spec/expectations/should/should_not_eql_spec.rb +0 -11
  228. data/spec/spec/expectations/should/should_not_equal_spec.rb +0 -11
  229. data/spec/spec/expectations/should/should_not_have_key_spec.rb +0 -15
  230. data/spec/spec/expectations/should/should_not_include_spec.rb +0 -58
  231. data/spec/spec/expectations/should/should_not_match_spec.rb +0 -11
  232. data/spec/spec/expectations/should/should_not_raise_spec.rb +0 -75
  233. data/spec/spec/expectations/should/should_not_respond_to_spec.rb +0 -15
  234. data/spec/spec/expectations/should/should_not_throw_spec.rb +0 -35
  235. data/spec/spec/expectations/should/should_raise_spec.rb +0 -66
  236. data/spec/spec/expectations/should/should_respond_to_spec.rb +0 -15
  237. data/spec/spec/expectations/should/should_satisfy_spec.rb +0 -35
  238. data/spec/spec/expectations/should/should_throw_spec.rb +0 -27
  239. data/spec/spec/runner/context_runner_spec.rb +0 -100
  240. data/spec/spec/runner/context_spec.rb +0 -405
  241. data/spec/spec/runner/kernel_ext_spec.rb +0 -16
  242. data/spec/spec/runner/spec_name_generation_spec.rb +0 -102
  243. data/spec/spec/runner/specification_class_spec.rb +0 -72
  244. data/spec/spec/runner/specification_instance_spec.rb +0 -160
  245. data/spec/spec/runner/specification_should_raise_spec.rb +0 -136
@@ -0,0 +1 @@
1
+ require 'spec/extensions/object'
@@ -0,0 +1,6 @@
1
+ class Object
2
+ def args_and_options(*args)
3
+ options = Hash === args.last ? args.pop : {}
4
+ return args, options
5
+ end
6
+ end
@@ -1,5 +1,3 @@
1
- require 'spec/deprecated'
2
- require 'spec/callback'
3
1
  require 'spec/matchers/be'
4
2
  require 'spec/matchers/be_close'
5
3
  require 'spec/matchers/change'
@@ -13,6 +11,7 @@ require 'spec/matchers/raise_error'
13
11
  require 'spec/matchers/respond_to'
14
12
  require 'spec/matchers/satisfy'
15
13
  require 'spec/matchers/throw_symbol'
14
+ require 'spec/matchers/operator_matcher'
16
15
 
17
16
  module Spec
18
17
 
@@ -124,13 +123,27 @@ module Spec
124
123
  # ...
125
124
  # end
126
125
  module Matchers
127
-
128
- class << self
129
- callback_events :description_generated
126
+ module ModuleMethods
127
+ def description_generated(&callback)
128
+ description_generated_callbacks << callback
129
+ end
130
+
131
+ def unregister_description_generated(callback)
132
+ description_generated_callbacks.delete(callback)
133
+ end
134
+
130
135
  def generated_description=(name)
131
- notify_callbacks(:description_generated, name)
136
+ description_generated_callbacks.each do |callback|
137
+ callback.call(name)
138
+ end
139
+ end
140
+
141
+ private
142
+ def description_generated_callbacks
143
+ @description_generated_callbacks ||= []
132
144
  end
133
145
  end
146
+ extend ModuleMethods
134
147
 
135
148
  def method_missing(sym, *args, &block) # :nodoc:
136
149
  return Matchers::Be.new(sym, *args) if sym.starts_with?("be_")
@@ -138,21 +151,6 @@ module Spec
138
151
  super
139
152
  end
140
153
 
141
- deprecated do
142
- # This supports sugar delegating to Matchers
143
- class Matcher #:nodoc:
144
- include Matchers
145
-
146
- def respond_to?(sym)
147
- if sym.to_s[0..2] == "be_"
148
- return true
149
- else
150
- super
151
- end
152
- end
153
- end
154
- end
155
-
156
154
  class MatcherError < StandardError
157
155
  end
158
156
 
@@ -2,8 +2,8 @@ module Spec
2
2
  module Matchers
3
3
 
4
4
  class Be #:nodoc:
5
- def initialize(expected=nil, *args)
6
- @expected = parse_expected(expected)
5
+ def initialize(*args)
6
+ @expected = parse_expected(args.shift)
7
7
  @args = args
8
8
  @comparison = ""
9
9
  end
@@ -89,19 +89,25 @@ module Spec
89
89
  end
90
90
 
91
91
  def description
92
- "be #{@comparison}#{@expected}"
92
+ "#{prefix_to_sentence}#{comparison}#{expected_to_sentence}#{args_to_sentence}"
93
93
  end
94
94
 
95
95
  private
96
96
  def parse_expected(expected)
97
97
  if Symbol === expected
98
- ["be_an_","be_a_","be_"].each do |prefix|
99
- @handling_predicate = true
100
- return "#{expected.to_s.sub(prefix,"")}".to_sym if expected.starts_with?(prefix)
98
+ @handling_predicate = true
99
+ ["be_an_","be_a_","be_"].each do |@prefix|
100
+ return "#{expected.to_s.sub(@prefix,"")}".to_sym if expected.starts_with?(@prefix)
101
101
  end
102
102
  end
103
+ @prefix = "be "
103
104
  return expected
104
105
  end
106
+
107
+ def handling_predicate?
108
+ return false if [:true, :false, :nil].include?(@expected)
109
+ return @handling_predicate
110
+ end
105
111
 
106
112
  def predicate
107
113
  "#{@expected.to_s}?".to_sym
@@ -113,14 +119,37 @@ module Spec
113
119
 
114
120
  def args_to_s
115
121
  return "" if @args.empty?
116
- transformed_args = @args.collect{|a| a.inspect}
117
- return "(#{transformed_args.join(', ')})"
122
+ inspected_args = @args.collect{|a| a.inspect}
123
+ return "(#{inspected_args.join(', ')})"
118
124
  end
119
125
 
120
- def handling_predicate?
121
- return false if [:true, :false, :nil].include?(@expected)
122
- return @handling_predicate
126
+ def comparison
127
+ @comparison
128
+ end
129
+
130
+ def expected_to_sentence
131
+ split_words(@expected)
132
+ end
133
+
134
+ def prefix_to_sentence
135
+ split_words(@prefix)
136
+ end
137
+
138
+ def split_words(sym)
139
+ sym.to_s.gsub(/_/,' ')
123
140
  end
141
+
142
+ def args_to_sentence
143
+ case @args.length
144
+ when 0
145
+ ""
146
+ when 1
147
+ " #{@args[0]}"
148
+ else
149
+ " #{@args[0...-1].join(', ')} and #{@args[-1]}"
150
+ end
151
+ end
152
+
124
153
  end
125
154
 
126
155
  # :call-seq:
@@ -13,11 +13,11 @@ module Spec
13
13
  end
14
14
 
15
15
  def failure_message
16
- "expected #{@expected} +/- (<#{@delta}), got #{@actual}"
16
+ "expected #{@expected} +/- (< #{@delta}), got #{@actual}"
17
17
  end
18
18
 
19
19
  def description
20
- "be close to #{@expected} (+- #{@delta})"
20
+ "be close to #{@expected} (within +- #{@delta})"
21
21
  end
22
22
  end
23
23
 
@@ -0,0 +1,52 @@
1
+ module Spec
2
+ module Matchers
3
+ class BaseOperatorMatcher
4
+
5
+ def initialize(target)
6
+ @target = target
7
+ end
8
+
9
+ def ==(expected)
10
+ @expected = expected
11
+ __delegate_method_missing_to_target("==", expected)
12
+ end
13
+
14
+ def ===(expected)
15
+ @expected = expected
16
+ __delegate_method_missing_to_target("===", expected)
17
+ end
18
+
19
+ def =~(expected)
20
+ @expected = expected
21
+ __delegate_method_missing_to_target("=~", expected)
22
+ end
23
+
24
+ def fail_with_message(message)
25
+ Spec::Expectations.fail_with(message, @expected, @target)
26
+ end
27
+
28
+ end
29
+
30
+ class PositiveOperatorMatcher < BaseOperatorMatcher #:nodoc:
31
+
32
+ def __delegate_method_missing_to_target(operator, expected)
33
+ ::Spec::Matchers.generated_description = "should #{operator} #{expected.inspect}"
34
+ return if @target.send(operator, expected)
35
+ return fail_with_message("expected #{expected.inspect}, got #{@target.inspect} (using #{operator})") if ['==','==='].include?(operator)
36
+ return fail_with_message("expected =~ #{expected.inspect}, got #{@target.inspect}")
37
+ end
38
+
39
+ end
40
+
41
+ class NegativeOperatorMatcher < BaseOperatorMatcher #:nodoc:
42
+
43
+ def __delegate_method_missing_to_target(operator, expected)
44
+ ::Spec::Matchers.generated_description = "should not #{operator} #{expected.inspect}"
45
+ return unless @target.send(operator, expected)
46
+ return fail_with_message("expected not #{operator} #{expected.inspect}, got #{@target.inspect}")
47
+ end
48
+
49
+ end
50
+
51
+ end
52
+ end
@@ -2,34 +2,44 @@ module Spec
2
2
  module Matchers
3
3
 
4
4
  class RespondTo #:nodoc:
5
- def initialize(sym)
6
- @sym = sym
5
+ def initialize(*names)
6
+ @names = names
7
+ @names_not_responded_to = []
7
8
  end
8
9
 
9
10
  def matches?(target)
10
- return target.respond_to?(@sym)
11
+ @names.each do |name|
12
+ unless target.respond_to?(name)
13
+ @names_not_responded_to << name
14
+ end
15
+ end
16
+ return @names_not_responded_to.empty?
11
17
  end
12
18
 
13
19
  def failure_message
14
- "expected target to respond to #{@sym.inspect}"
20
+ "expected target to respond to #{@names_not_responded_to.collect {|name| name.inspect }.join(', ')}"
15
21
  end
16
22
 
17
23
  def negative_failure_message
18
- "expected target not to respond to #{@sym.inspect}"
24
+ "expected target not to respond to #{@names.collect {|name| name.inspect }.join(', ')}"
19
25
  end
20
26
 
21
27
  def description
22
- "respond to ##{@sym.to_s}"
28
+ "respond to ##{@names.to_s}"
23
29
  end
24
30
  end
25
31
 
26
32
  # :call-seq:
27
- # should respond_to(:sym)
28
- # should_not respond_to(:sym)
33
+ # should respond_to(*names)
34
+ # should_not respond_to(*names)
29
35
  #
30
- # Matches if the target object responds to :sym
31
- def respond_to(sym)
32
- Matchers::RespondTo.new(sym)
36
+ # Matches if the target object responds to all of the names
37
+ # provided. Names can be Strings or Symbols.
38
+ #
39
+ # == Examples
40
+ #
41
+ def respond_to(*names)
42
+ Matchers::RespondTo.new(*names)
33
43
  end
34
44
  end
35
45
  end
@@ -1,5 +1,7 @@
1
1
  require 'spec/mocks/methods'
2
- require 'spec/mocks/mock_handler'
2
+ require 'spec/mocks/argument_constraint_matchers'
3
+ require 'spec/mocks/spec_methods'
4
+ require 'spec/mocks/proxy'
3
5
  require 'spec/mocks/mock'
4
6
  require 'spec/mocks/argument_expectation'
5
7
  require 'spec/mocks/message_expectation'
@@ -7,6 +9,8 @@ require 'spec/mocks/order_group'
7
9
  require 'spec/mocks/errors'
8
10
  require 'spec/mocks/error_generator'
9
11
  require 'spec/mocks/extensions/object'
12
+ require 'spec/mocks/space'
13
+
10
14
 
11
15
  module Spec
12
16
  # == Mocks and Stubs
@@ -201,32 +205,5 @@ module Spec
201
205
  #
202
206
  # my_mock.should_receive(:<<).with("illegal value").once.and_raise(ArgumentError)
203
207
  module Mocks
204
- # Shortcut for creating an instance of Spec::Mocks::Mock.
205
- def mock(name, options={})
206
- Spec::Mocks::Mock.new(name, options)
207
- end
208
-
209
- # Shortcut for creating an instance of Spec::Mocks::Mock with
210
- # predefined method stubs.
211
- #
212
- # == Examples
213
- #
214
- # stub_thing = stub("thing", :a => "A")
215
- # stub_thing.a == "A" => true
216
- #
217
- # stub_person = stub("thing", :name => "Joe", :email => "joe@domain.com")
218
- # stub_person.name => "Joe"
219
- # stub_person.email => "joe@domain.com"
220
- def stub(name, stubs={})
221
- object_stub = mock(name)
222
- stubs.each { |key, value| object_stub.stub!(key).and_return(value) }
223
- object_stub
224
- end
225
-
226
- # Shortcut for creating an instance of Spec::Mocks::DuckTypeArgConstraint
227
- def duck_type(*args)
228
- return Spec::Mocks::DuckTypeArgConstraint.new(*args)
229
- end
230
-
231
208
  end
232
209
  end
@@ -0,0 +1,12 @@
1
+ module Spec
2
+ module Mocks
3
+ module ArgumentConstraintMatchers
4
+
5
+ # Shortcut for creating an instance of Spec::Mocks::DuckTypeArgConstraint
6
+ def duck_type(*args)
7
+ return Spec::Mocks::DuckTypeArgConstraint.new(*args)
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -71,12 +71,16 @@ module Spec
71
71
  end
72
72
 
73
73
  class DuckTypeArgConstraint
74
- def initialize(*methods_to_respond_do)
75
- @methods_to_respond_do = methods_to_respond_do
74
+ def initialize(*methods_to_respond_to)
75
+ @methods_to_respond_to = methods_to_respond_to
76
76
  end
77
77
 
78
78
  def matches?(value)
79
- @methods_to_respond_do.all? { |sym| value.respond_to?(sym) }
79
+ @methods_to_respond_to.all? { |sym| value.respond_to?(sym) }
80
+ end
81
+
82
+ def description
83
+ "duck_type"
80
84
  end
81
85
  end
82
86
 
@@ -104,7 +108,6 @@ module Spec
104
108
 
105
109
  def convert_constraint(constraint)
106
110
  return @@constraint_classes[constraint].new(constraint) if constraint.is_a?(Symbol)
107
- return constraint if constraint.is_a?(DuckTypeArgConstraint)
108
111
  return MatcherConstraint.new(constraint) if is_matcher?(constraint)
109
112
  return RegexpArgConstraint.new(constraint) if constraint.is_a?(Regexp)
110
113
  return LiteralArgConstraint.new(constraint)
@@ -2,38 +2,33 @@ module Spec
2
2
  module Mocks
3
3
  module Methods
4
4
  def should_receive(sym, opts={}, &block)
5
- __mock_handler.add_message_expectation(opts[:expected_from] || caller(1)[0], sym, opts, &block)
5
+ __mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], sym, opts, &block)
6
6
  end
7
7
 
8
8
  def should_not_receive(sym, &block)
9
- __mock_handler.add_negative_message_expectation(caller(1)[0], sym, &block)
9
+ __mock_proxy.add_negative_message_expectation(caller(1)[0], sym, &block)
10
10
  end
11
11
 
12
12
  def stub!(sym)
13
- __mock_handler.add_stub(caller(1)[0], sym)
13
+ __mock_proxy.add_stub(caller(1)[0], sym)
14
14
  end
15
15
 
16
16
  def received_message?(sym, *args, &block) #:nodoc:
17
- __mock_handler.received_message?(sym, *args, &block)
17
+ __mock_proxy.received_message?(sym, *args, &block)
18
18
  end
19
19
 
20
- def __verify #:nodoc:
21
- __mock_handler.verify
20
+ def rspec_verify #:nodoc:
21
+ __mock_proxy.verify
22
22
  end
23
23
 
24
- def __reset_mock #:nodoc:
25
- __mock_handler.reset
24
+ def rspec_reset #:nodoc:
25
+ __mock_proxy.reset
26
26
  end
27
27
 
28
- def method_missing(sym, *args, &block) #:nodoc:
29
- __mock_handler.instance_eval {@messages_received << [sym, args, block]}
30
- super(sym, *args, &block)
31
- end
32
-
33
- private
28
+ private
34
29
 
35
- def __mock_handler
36
- @mock_handler ||= MockHandler.new(self, @name, @options)
30
+ def __mock_proxy
31
+ @mock_proxy ||= Proxy.new(self, @name, @options)
37
32
  end
38
33
  end
39
34
  end
@@ -12,15 +12,18 @@ module Spec
12
12
  end
13
13
 
14
14
  def method_missing(sym, *args, &block)
15
- __mock_handler.instance_eval {@messages_received << [sym, args, block]}
15
+ __mock_proxy.instance_eval {@messages_received << [sym, args, block]}
16
16
  begin
17
- return self if __mock_handler.null_object?
17
+ return self if __mock_proxy.null_object?
18
18
  super(sym, *args, &block)
19
19
  rescue NoMethodError
20
- __mock_handler.raise_unexpected_message_error sym, *args
20
+ __mock_proxy.raise_unexpected_message_error sym, *args
21
21
  end
22
22
  end
23
23
 
24
+ def inspect
25
+ "#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>"
26
+ end
24
27
  end
25
28
  end
26
29
  end