rspec 1.1.12 → 1.2.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 (267) hide show
  1. data/.autotest +2 -1
  2. data/.document +7 -0
  3. data/History.txt +58 -0
  4. data/License.txt +1 -1
  5. data/Manifest.txt +45 -82
  6. data/README.txt +3 -6
  7. data/Rakefile +33 -13
  8. data/Ruby1.9.markdown +32 -0
  9. data/TODO.txt +10 -4
  10. data/Upgrade.markdown +63 -0
  11. data/bin/spec +1 -1
  12. data/cucumber.yml +3 -0
  13. data/examples/failing/{failing_autogenerated_docstrings_example.rb → failing_implicit_docstrings_example.rb} +0 -0
  14. data/examples/failing/pending_example.rb +9 -0
  15. data/examples/failing/spec_helper.rb +1 -1
  16. data/examples/passing/{custom_expectation_matchers.rb → custom_matchers.rb} +0 -0
  17. data/examples/passing/filtered_formatter.rb +18 -0
  18. data/examples/passing/filtered_formatter_example.rb +31 -0
  19. data/examples/passing/implicit_docstrings_example.rb +18 -0
  20. data/examples/passing/spec_helper.rb +1 -1
  21. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +17 -18
  22. data/features/before_and_after_blocks/before_and_after_blocks.feature +4 -4
  23. data/features/example_groups/example_group_with_should_methods.feature +1 -1
  24. data/features/example_groups/{autogenerated_docstrings.feature → implicit_docstrings.feature} +7 -9
  25. data/features/example_groups/nested_groups.feature +1 -1
  26. data/features/heckle/heckle.feature +56 -0
  27. data/features/interop/examples_and_tests_together.feature +1 -1
  28. data/features/interop/test_but_not_test_unit.feature +1 -1
  29. data/features/interop/test_case_with_should_methods.feature +1 -1
  30. data/features/matchers/create_matcher.feature +115 -0
  31. data/features/mock_framework_integration/use_flexmock.feature +22 -4
  32. data/features/mock_framework_integration/use_mocha.feature +27 -0
  33. data/features/mock_framework_integration/use_rr.feature +27 -0
  34. data/features/mocks/mix_stubs_and_mocks.feature +22 -0
  35. data/features/pending/pending_examples.feature +81 -0
  36. data/features/step_definitions/running_rspec.rb +5 -3
  37. data/features/support/env.rb +1 -1
  38. data/features/support/matchers/smart_match.rb +2 -2
  39. data/lib/autotest/rspec.rb +1 -1
  40. data/lib/spec.rb +1 -1
  41. data/lib/{adapters → spec/adapters}/mock_frameworks/flexmock.rb +0 -0
  42. data/lib/{adapters → spec/adapters}/mock_frameworks/mocha.rb +0 -0
  43. data/lib/{adapters → spec/adapters}/mock_frameworks/rr.rb +0 -0
  44. data/lib/{adapters → spec/adapters}/mock_frameworks/rspec.rb +0 -1
  45. data/lib/spec/autorun.rb +3 -0
  46. data/lib/spec/dsl.rb +3 -1
  47. data/lib/spec/dsl/matchers.rb +13 -0
  48. data/lib/spec/example.rb +4 -0
  49. data/lib/spec/example/before_and_after_hooks.rb +5 -20
  50. data/lib/spec/example/errors.rb +3 -3
  51. data/lib/spec/example/example_description.rb +15 -0
  52. data/lib/spec/example/example_group.rb +0 -15
  53. data/lib/spec/example/example_group_factory.rb +34 -46
  54. data/lib/spec/example/example_group_hierarchy.rb +53 -0
  55. data/lib/spec/example/example_group_methods.rb +101 -211
  56. data/lib/spec/example/example_methods.rb +61 -81
  57. data/lib/spec/example/module_reopening_fix.rb +23 -1
  58. data/lib/spec/example/pending.rb +3 -2
  59. data/lib/spec/example/predicate_matchers.rb +47 -0
  60. data/lib/spec/example/subject.rb +91 -0
  61. data/lib/spec/expectations.rb +1 -1
  62. data/lib/spec/expectations/differs/default.rb +0 -1
  63. data/lib/spec/expectations/extensions.rb +0 -1
  64. data/lib/spec/expectations/handler.rb +13 -6
  65. data/lib/spec/interop/test.rb +5 -0
  66. data/lib/spec/interop/test/unit/testcase.rb +5 -22
  67. data/lib/spec/matchers.rb +22 -8
  68. data/lib/spec/matchers/be.rb +4 -9
  69. data/lib/spec/matchers/be_close.rb +20 -5
  70. data/lib/spec/matchers/be_instance_of.rb +45 -0
  71. data/lib/spec/matchers/be_kind_of.rb +45 -0
  72. data/lib/spec/matchers/change.rb +8 -6
  73. data/lib/spec/matchers/compatibility.rb +14 -0
  74. data/lib/spec/matchers/eql.rb +24 -6
  75. data/lib/spec/matchers/equal.rb +24 -6
  76. data/lib/spec/matchers/exist.rb +21 -5
  77. data/lib/spec/matchers/extensions/instance_exec.rb +25 -0
  78. data/lib/spec/matchers/generated_descriptions.rb +2 -2
  79. data/lib/spec/matchers/has.rb +28 -11
  80. data/lib/spec/matchers/have.rb +2 -2
  81. data/lib/spec/matchers/include.rb +2 -2
  82. data/lib/spec/matchers/match.rb +25 -7
  83. data/lib/spec/matchers/match_array.rb +3 -3
  84. data/lib/spec/matchers/matcher.rb +51 -0
  85. data/lib/spec/matchers/method_missing.rb +2 -2
  86. data/lib/spec/matchers/operator_matcher.rb +12 -5
  87. data/lib/spec/matchers/raise_error.rb +3 -3
  88. data/lib/spec/matchers/respond_to.rb +3 -3
  89. data/lib/spec/matchers/satisfy.rb +7 -7
  90. data/lib/spec/matchers/throw_symbol.rb +3 -5
  91. data/lib/spec/mocks.rb +3 -3
  92. data/lib/spec/mocks/argument_expectation.rb +15 -15
  93. data/lib/spec/mocks/{argument_constraints.rb → argument_matchers.rb} +19 -23
  94. data/lib/spec/mocks/error_generator.rb +5 -8
  95. data/lib/spec/mocks/framework.rb +1 -1
  96. data/lib/spec/mocks/message_expectation.rb +5 -13
  97. data/lib/spec/mocks/mock.rb +4 -5
  98. data/lib/spec/mocks/proxy.rb +9 -5
  99. data/lib/spec/mocks/spec_methods.rb +10 -1
  100. data/lib/spec/rake/spectask.rb +0 -1
  101. data/lib/spec/runner.rb +6 -28
  102. data/lib/spec/runner/configuration.rb +3 -3
  103. data/lib/spec/runner/drb_command_line.rb +2 -1
  104. data/lib/spec/runner/example_group_runner.rb +3 -2
  105. data/lib/spec/runner/formatter/base_text_formatter.rb +34 -19
  106. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +3 -5
  107. data/lib/spec/runner/formatter/html_formatter.rb +2 -3
  108. data/lib/spec/runner/formatter/nested_text_formatter.rb +7 -25
  109. data/lib/spec/runner/formatter/progress_bar_formatter.rb +1 -1
  110. data/lib/spec/runner/formatter/snippet_extractor.rb +1 -1
  111. data/lib/spec/runner/formatter/specdoc_formatter.rb +1 -7
  112. data/lib/spec/runner/heckle_runner.rb +3 -6
  113. data/lib/spec/runner/heckle_runner_unsupported.rb +1 -1
  114. data/lib/spec/runner/option_parser.rb +19 -21
  115. data/lib/spec/runner/options.rb +32 -27
  116. data/lib/spec/runner/reporter.rb +8 -9
  117. data/lib/spec/test/unit.rb +10 -0
  118. data/lib/spec/version.rb +2 -2
  119. data/{features/support → resources}/helpers/cmdline.rb +2 -2
  120. data/resources/rake/verify_rcov.rake +1 -1
  121. data/resources/spec/example_group_with_should_methods.rb +1 -1
  122. data/resources/spec/simple_spec.rb +1 -1
  123. data/resources/test/spec_and_test_together.rb +2 -3
  124. data/resources/test/spec_including_test_but_not_unit.rb +1 -1
  125. data/resources/test/test_case_with_should_methods.rb +2 -3
  126. data/spec/autotest/autotest_helper.rb +0 -1
  127. data/spec/autotest/rspec_spec.rb +95 -98
  128. data/spec/spec/dsl/main_spec.rb +3 -3
  129. data/spec/spec/dsl/matchers_spec.rb +25 -0
  130. data/spec/spec/example/example_group_class_definition_spec.rb +14 -15
  131. data/spec/spec/example/example_group_factory_spec.rb +31 -44
  132. data/spec/spec/example/example_group_methods_spec.rb +86 -52
  133. data/spec/spec/example/example_group_spec.rb +32 -79
  134. data/spec/spec/example/example_matcher_spec.rb +10 -10
  135. data/spec/spec/example/example_methods_spec.rb +108 -242
  136. data/spec/spec/example/nested_example_group_spec.rb +2 -2
  137. data/spec/spec/example/pending_module_spec.rb +66 -41
  138. data/spec/spec/example/shared_example_group_spec.rb +4 -4
  139. data/spec/spec/{matchers → expectations}/handler_spec.rb +52 -4
  140. data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +2 -2
  141. data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +2 -2
  142. data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +2 -2
  143. data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +2 -2
  144. data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +2 -2
  145. data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +2 -2
  146. data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +2 -2
  147. data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +2 -2
  148. data/spec/spec/interop/test/unit/testcase_spec.rb +0 -4
  149. data/spec/spec/matchers/be_close_spec.rb +1 -1
  150. data/spec/spec/matchers/be_instance_of_spec.rb +29 -0
  151. data/spec/spec/matchers/be_kind_of_spec.rb +29 -0
  152. data/spec/spec/matchers/change_spec.rb +20 -0
  153. data/spec/spec/matchers/compatibility_spec.rb +34 -0
  154. data/spec/spec/matchers/description_generation_spec.rb +0 -12
  155. data/spec/spec/matchers/eql_spec.rb +2 -2
  156. data/spec/spec/matchers/equal_spec.rb +2 -2
  157. data/spec/spec/matchers/exist_spec.rb +8 -4
  158. data/spec/spec/matchers/have_spec.rb +4 -4
  159. data/spec/spec/matchers/match_spec.rb +2 -2
  160. data/spec/spec/matchers/matcher_methods_spec.rb +1 -1
  161. data/spec/spec/matchers/matcher_spec.rb +97 -0
  162. data/spec/spec/matchers/throw_symbol_spec.rb +8 -8
  163. data/spec/spec/mocks/{bug_report_496.rb → bug_report_496_spec.rb} +0 -0
  164. data/spec/spec/mocks/{failing_mock_argument_constraints_spec.rb → failing_argument_matchers_spec.rb} +2 -2
  165. data/spec/spec/mocks/hash_including_matcher_spec.rb +4 -4
  166. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +3 -3
  167. data/spec/spec/mocks/mock_spec.rb +27 -2
  168. data/spec/spec/mocks/nil_expectation_warning_spec.rb +1 -1
  169. data/spec/spec/mocks/partial_mock_spec.rb +18 -3
  170. data/spec/spec/mocks/{passing_mock_argument_constraints_spec.rb → passing_argument_matchers_spec.rb} +6 -6
  171. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +13 -1
  172. data/spec/spec/package/bin_spec_spec.rb +2 -2
  173. data/spec/spec/runner/configuration_spec.rb +12 -12
  174. data/spec/spec/runner/drb_command_line_spec.rb +71 -73
  175. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +82 -1
  176. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +8 -8
  177. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +4 -4
  178. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +8 -8
  179. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +38 -26
  180. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +61 -53
  181. data/spec/spec/runner/formatter/html_formatter_spec.rb +100 -48
  182. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +20 -34
  183. data/spec/spec/runner/formatter/profile_formatter_spec.rb +2 -1
  184. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +9 -6
  185. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +6 -6
  186. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +20 -20
  187. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +38 -26
  188. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +55 -47
  189. data/spec/spec/runner/formatter/{spec_mate_formatter_spec.rb → text_mate_formatter_spec.rb} +11 -9
  190. data/spec/spec/runner/heckle_runner_spec.rb +1 -1
  191. data/spec/spec/runner/heckler_spec.rb +1 -1
  192. data/spec/spec/runner/option_parser_spec.rb +28 -11
  193. data/spec/spec/runner/options_spec.rb +34 -0
  194. data/spec/spec/runner/reporter_spec.rb +66 -62
  195. data/spec/spec/runner/resources/utf8_encoded.rb +1 -0
  196. data/spec/spec/runner/spec_drb.opts +1 -0
  197. data/spec/spec/runner_spec.rb +7 -5
  198. data/spec/spec_helper.rb +24 -2
  199. metadata +49 -90
  200. data/examples/passing/autogenerated_docstrings_example.rb +0 -25
  201. data/examples/passing/before_and_after_example.rb +0 -40
  202. data/examples/passing/behave_as_example.rb +0 -45
  203. data/examples/passing/legacy_spec.rb +0 -11
  204. data/examples/passing/priority.txt +0 -1
  205. data/features/support/helpers/story_helper.rb +0 -16
  206. data/lib/spec/expectations/extensions/string_and_symbol.rb +0 -17
  207. data/lib/spec/runner/formatter/story/html_formatter.rb +0 -174
  208. data/lib/spec/runner/formatter/story/plain_text_formatter.rb +0 -194
  209. data/lib/spec/runner/formatter/story/progress_bar_formatter.rb +0 -42
  210. data/lib/spec/story.rb +0 -10
  211. data/lib/spec/story/extensions.rb +0 -3
  212. data/lib/spec/story/extensions/main.rb +0 -86
  213. data/lib/spec/story/extensions/regexp.rb +0 -9
  214. data/lib/spec/story/extensions/string.rb +0 -9
  215. data/lib/spec/story/given_scenario.rb +0 -14
  216. data/lib/spec/story/runner.rb +0 -57
  217. data/lib/spec/story/runner/plain_text_story_runner.rb +0 -48
  218. data/lib/spec/story/runner/scenario_collector.rb +0 -18
  219. data/lib/spec/story/runner/scenario_runner.rb +0 -54
  220. data/lib/spec/story/runner/story_mediator.rb +0 -137
  221. data/lib/spec/story/runner/story_parser.rb +0 -247
  222. data/lib/spec/story/runner/story_runner.rb +0 -74
  223. data/lib/spec/story/scenario.rb +0 -14
  224. data/lib/spec/story/step.rb +0 -70
  225. data/lib/spec/story/step_group.rb +0 -89
  226. data/lib/spec/story/step_mother.rb +0 -38
  227. data/lib/spec/story/story.rb +0 -39
  228. data/lib/spec/story/world.rb +0 -124
  229. data/resources/spec/spec_with_flexmock.rb +0 -19
  230. data/rspec.gemspec +0 -32
  231. data/spec/spec/matchers/mock_constraint_matchers_spec.rb +0 -24
  232. data/spec/spec/runner/formatter/story/html_formatter_spec.rb +0 -135
  233. data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +0 -600
  234. data/spec/spec/runner/formatter/story/progress_bar_formatter_spec.rb +0 -82
  235. data/spec/spec/spec_spec.rb +0 -21
  236. data/spec/spec/story/builders.rb +0 -46
  237. data/spec/spec/story/extensions/main_spec.rb +0 -161
  238. data/spec/spec/story/extensions_spec.rb +0 -14
  239. data/spec/spec/story/given_scenario_spec.rb +0 -27
  240. data/spec/spec/story/runner/plain_text_story_runner_spec.rb +0 -90
  241. data/spec/spec/story/runner/scenario_collector_spec.rb +0 -27
  242. data/spec/spec/story/runner/scenario_runner_spec.rb +0 -214
  243. data/spec/spec/story/runner/story_mediator_spec.rb +0 -143
  244. data/spec/spec/story/runner/story_parser_spec.rb +0 -401
  245. data/spec/spec/story/runner/story_runner_spec.rb +0 -294
  246. data/spec/spec/story/runner_spec.rb +0 -93
  247. data/spec/spec/story/scenario_spec.rb +0 -18
  248. data/spec/spec/story/step_group_spec.rb +0 -157
  249. data/spec/spec/story/step_mother_spec.rb +0 -84
  250. data/spec/spec/story/step_spec.rb +0 -272
  251. data/spec/spec/story/story_helper.rb +0 -2
  252. data/spec/spec/story/story_spec.rb +0 -84
  253. data/spec/spec/story/world_spec.rb +0 -423
  254. data/story_server/prototype/javascripts/builder.js +0 -136
  255. data/story_server/prototype/javascripts/controls.js +0 -972
  256. data/story_server/prototype/javascripts/dragdrop.js +0 -976
  257. data/story_server/prototype/javascripts/effects.js +0 -1117
  258. data/story_server/prototype/javascripts/prototype.js +0 -4140
  259. data/story_server/prototype/javascripts/rspec.js +0 -149
  260. data/story_server/prototype/javascripts/scriptaculous.js +0 -58
  261. data/story_server/prototype/javascripts/slider.js +0 -276
  262. data/story_server/prototype/javascripts/sound.js +0 -55
  263. data/story_server/prototype/javascripts/unittest.js +0 -568
  264. data/story_server/prototype/lib/server.rb +0 -24
  265. data/story_server/prototype/stories.html +0 -176
  266. data/story_server/prototype/stylesheets/rspec.css +0 -136
  267. data/story_server/prototype/stylesheets/test.css +0 -90
@@ -1,3 +1,8 @@
1
+ if Spec::Ruby.version.to_f >= 1.9
2
+ gem 'test-unit','1.2.3'
3
+ end
4
+
5
+ require 'spec'
1
6
  require 'test/unit'
2
7
  require 'test/unit/testresult'
3
8
 
@@ -5,8 +5,7 @@ module Test
5
5
  # This extension of the standard Test::Unit::TestCase makes RSpec
6
6
  # available from within, so that you can do things like:
7
7
  #
8
- # require 'test/unit'
9
- # require 'spec'
8
+ # require 'spec/test/unit'
10
9
  #
11
10
  # class MyTest < Test::Unit::TestCase
12
11
  # it "should work with Test::Unit assertions" do
@@ -41,33 +40,17 @@ module Test
41
40
  before(:each) {setup}
42
41
  after(:each) {teardown}
43
42
 
44
- def initialize(defined_description, options={}, &implementation)
45
- @_defined_description = defined_description
46
-
47
- # TODO - examples fail in rspec-rails if we remove "|| pending_implementation"
48
- # - find a way to fail without it in rspec's code examples
49
- @_implementation = implementation || pending_implementation
50
-
51
- @_result = ::Test::Unit::TestResult.new
52
- # @method_name is important to set here because it complies with Test::Unit's interface.
43
+ def initialize(description, options={}, &implementation)
44
+ super
53
45
  # Some Test::Unit extensions depend on @method_name being present.
54
- @method_name = @_defined_description
55
-
56
- # TODO - this is necessary to run single examples in rspec-rails, but I haven't
57
- # found a good way to write a failing example just within rspec core
58
- @_backtrace = caller
46
+ @method_name = description
47
+ @_result = ::Test::Unit::TestResult.new
59
48
  end
60
49
 
61
50
  def run(ignore_this_argument=nil)
62
51
  super()
63
52
  end
64
53
 
65
- private
66
-
67
- def pending_implementation
68
- error = Spec::Example::NotYetImplementedError.new(caller)
69
- lambda { raise(error) }
70
- end
71
54
  end
72
55
  end
73
56
  end
@@ -1,24 +1,29 @@
1
+ require 'spec/matchers/extensions/instance_exec'
2
+ require 'spec/matchers/matcher'
1
3
  require 'spec/matchers/operator_matcher'
2
- require 'spec/matchers/generated_descriptions'
3
- require 'spec/matchers/errors'
4
- require 'spec/matchers/method_missing'
5
- require 'spec/matchers/simple_matcher'
6
4
  require 'spec/matchers/be'
7
5
  require 'spec/matchers/be_close'
6
+ require 'spec/matchers/be_instance_of'
7
+ require 'spec/matchers/be_kind_of'
8
8
  require 'spec/matchers/change'
9
- require 'spec/matchers/match_array'
10
9
  require 'spec/matchers/eql'
11
10
  require 'spec/matchers/equal'
11
+ require 'spec/matchers/errors'
12
12
  require 'spec/matchers/exist'
13
+ require 'spec/matchers/generated_descriptions'
13
14
  require 'spec/matchers/has'
14
15
  require 'spec/matchers/have'
15
16
  require 'spec/matchers/include'
16
17
  require 'spec/matchers/match'
18
+ require 'spec/matchers/match_array'
19
+ require 'spec/matchers/method_missing'
17
20
  require 'spec/matchers/raise_error'
18
21
  require 'spec/matchers/respond_to'
19
22
  require 'spec/matchers/satisfy'
23
+ require 'spec/matchers/simple_matcher'
20
24
  require 'spec/matchers/throw_symbol'
21
25
  require 'spec/matchers/wrap_expectation'
26
+ require 'spec/matchers/compatibility'
22
27
 
23
28
  module Spec
24
29
 
@@ -26,12 +31,21 @@ module Spec
26
31
  # is any object that responds to the following methods:
27
32
  #
28
33
  # matches?(actual)
29
- # failure_message
30
- # negative_failure_message #optional
34
+ # failure_message_for_should
35
+ #
36
+ # These methods are also part of the matcher protocol, but are optional:
37
+ #
38
+ # does_not_match?(actual)
39
+ # failure_message_for_should_not
31
40
  # description #optional
32
41
  #
42
+ # These methods are from older versions of the protocol. They are still supported,
43
+ # but are not recommended:
44
+ #
45
+ # failure_message (use failure_message_for_should instead)
46
+ # negative_failure_message (use failure_message_for_should_not instead)
47
+ #
33
48
  # See Spec::Expectations to learn how to use these as Expectation Matchers.
34
- # See Spec::Mocks to learn how to use them as Mock Argument Constraints.
35
49
  #
36
50
  # == Predicates
37
51
  #
@@ -26,13 +26,13 @@ module Spec
26
26
  end
27
27
  end
28
28
 
29
- def failure_message
29
+ def failure_message_for_should
30
30
  handling_predicate? ?
31
31
  "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}" :
32
32
  "expected #{@comparison_method} #{expected}, got #{@actual.inspect}".gsub(' ',' ')
33
33
  end
34
34
 
35
- def negative_failure_message
35
+ def failure_message_for_should_not
36
36
  if handling_predicate?
37
37
  "expected #{predicate}#{args_to_s} to return false, got #{@result.inspect}"
38
38
  else
@@ -60,12 +60,7 @@ it reads really poorly.
60
60
 
61
61
  private
62
62
  def match_or_compare(actual)
63
- case @expected
64
- when TrueClass
65
- @actual
66
- else
67
- @actual.__send__(comparison_method, @expected)
68
- end
63
+ TrueClass === @expected ? @actual : @actual.__send__(comparison_method, @expected)
69
64
  end
70
65
 
71
66
  def comparison_method
@@ -87,7 +82,7 @@ it reads really poorly.
87
82
  def parse_expected(expected)
88
83
  ["be_an_","be_a_","be_"].each do |prefix|
89
84
  handling_predicate!
90
- if expected.starts_with?(prefix)
85
+ if expected.to_s =~ /^#{prefix}/
91
86
  set_prefix(prefix)
92
87
  expected = expected.to_s.sub(prefix,"")
93
88
  [true, false, nil].each do |val|
@@ -1,5 +1,24 @@
1
1
  module Spec
2
2
  module Matchers
3
+
4
+ class BeClose
5
+ def initialize(expected, delta)
6
+ @expected, @delta = expected, delta
7
+ end
8
+
9
+ def matches?(actual)
10
+ @actual = actual
11
+ (@actual - @expected).abs < @delta
12
+ end
13
+
14
+ def failure_message_for_should
15
+ "expected #{@expected} +/- (< #{@delta}), got #{@actual}"
16
+ end
17
+
18
+ def description
19
+ "be close to #{@expected} (within +- #{@delta})"
20
+ end
21
+ end
3
22
 
4
23
  # :call-seq:
5
24
  # should be_close(expected, delta)
@@ -11,11 +30,7 @@ module Spec
11
30
  #
12
31
  # result.should be_close(3.0, 0.5)
13
32
  def be_close(expected, delta)
14
- simple_matcher do |actual, matcher|
15
- matcher.failure_message = "expected #{expected} +/- (< #{delta}), got #{actual}"
16
- matcher.description = "be close to #{expected} (within +- #{delta})"
17
- (actual - expected).abs < delta
18
- end
33
+ BeClose.new(expected, delta)
19
34
  end
20
35
  end
21
36
  end
@@ -0,0 +1,45 @@
1
+ module Spec
2
+ module Matchers
3
+ class BeInstanceOf
4
+ def initialize(expected)
5
+ @expected = expected
6
+ end
7
+
8
+ def matches?(actual)
9
+ @actual = actual
10
+ @actual.instance_of?(@expected)
11
+ end
12
+
13
+ def description
14
+ "be an instance of #{@expected}"
15
+ end
16
+
17
+ def failure_message_for_should
18
+ "expected instance of #{@expected}, got #{@actual.inspect}"
19
+ end
20
+
21
+ def failure_message_for_should_not
22
+ "expected #{@actual.inspect} not to be an instance of #{@expected}"
23
+ end
24
+ end
25
+
26
+ # :call-seq:
27
+ # should be_instance_of(expected)
28
+ # should be_an_instance_of(expected)
29
+ # should_not be_instance_of(expected)
30
+ # should_not be_an_instance_of(expected)
31
+ #
32
+ # Passes if actual.instance_of?(expected)
33
+ #
34
+ # == Examples
35
+ #
36
+ # 5.should be_instance_of(Fixnum)
37
+ # 5.should_not be_instance_of(Numeric)
38
+ # 5.should_not be_instance_of(Float)
39
+ def be_instance_of(expected)
40
+ BeInstanceOf.new(expected)
41
+ end
42
+
43
+ alias_method :be_an_instance_of, :be_instance_of
44
+ end
45
+ end
@@ -0,0 +1,45 @@
1
+ module Spec
2
+ module Matchers
3
+ class BeKindOf
4
+ def initialize(expected)
5
+ @expected = expected
6
+ end
7
+
8
+ def matches?(actual)
9
+ @actual = actual
10
+ @actual.kind_of?(@expected)
11
+ end
12
+
13
+ def description
14
+ "be a kind of #{@expected}"
15
+ end
16
+
17
+ def failure_message_for_should
18
+ "expected kind of #{@expected}, got #{@actual.inspect}"
19
+ end
20
+
21
+ def failure_message_for_should_not
22
+ "expected #{@actual.inspect} not to be a kind of #{@expected}"
23
+ end
24
+ end
25
+
26
+ # :call-seq:
27
+ # should be_kind_of(expected)
28
+ # should be_a_kind_of(expected)
29
+ # should_not be_kind_of(expected)
30
+ # should_not be_a_kind_of(expected)
31
+ #
32
+ # Passes if actual.kind_of?(expected)
33
+ #
34
+ # == Examples
35
+ #
36
+ # 5.should be_kind_of(Fixnum)
37
+ # 5.should be_kind_of(Numeric)
38
+ # 5.should_not be_kind_of(Float)
39
+ def be_kind_of(expected)
40
+ BeKindOf.new(expected)
41
+ end
42
+
43
+ alias_method :be_a_kind_of, :be_kind_of
44
+ end
45
+ end
@@ -5,9 +5,7 @@ module Spec
5
5
  class Change #:nodoc:
6
6
  def initialize(receiver=nil, message=nil, &block)
7
7
  @message = message || "result"
8
- @value_proc = block || lambda {
9
- receiver.__send__(message)
10
- }
8
+ @value_proc = block || lambda {receiver.__send__(message)}
11
9
  end
12
10
 
13
11
  def matches?(event_proc)
@@ -17,7 +15,7 @@ module Spec
17
15
  event_proc.call
18
16
  @after = evaluate_value_proc
19
17
 
20
- return false if @from unless @from == @before
18
+ return (@to = false) if @from unless @from == @before
21
19
  return false if @to unless @to == @after
22
20
  return (@before + @amount == @after) if @amount
23
21
  return ((@after - @before) >= @minimum) if @minimum
@@ -36,7 +34,7 @@ MESSAGE
36
34
  @value_proc.call
37
35
  end
38
36
 
39
- def failure_message
37
+ def failure_message_for_should
40
38
  if @to
41
39
  "#{@message} should have been changed to #{@to.inspect}, but is now #{@after.inspect}"
42
40
  elsif @from
@@ -56,7 +54,7 @@ MESSAGE
56
54
  @after - @before
57
55
  end
58
56
 
59
- def negative_failure_message
57
+ def failure_message_for_should_not
60
58
  "#{@message} should not have changed, but did change from #{@before.inspect} to #{@after.inspect}"
61
59
  end
62
60
 
@@ -84,6 +82,10 @@ MESSAGE
84
82
  @from = from
85
83
  self
86
84
  end
85
+
86
+ def description
87
+ "change ##{@message}"
88
+ end
87
89
  end
88
90
 
89
91
  # :call-seq:
@@ -0,0 +1,14 @@
1
+ Spec::Matchers.constants.each do |c|
2
+ if Class === (klass = Spec::Matchers.const_get(c))
3
+ if klass.public_instance_methods.include?('failure_message_for_should')
4
+ klass.class_eval do
5
+ alias_method :failure_message, :failure_message_for_should
6
+ end
7
+ end
8
+ if klass.public_instance_methods.include?('failure_message_for_should_not')
9
+ klass.class_eval do
10
+ alias_method :negative_failure_message, :failure_message_for_should_not
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,5 +1,28 @@
1
1
  module Spec
2
2
  module Matchers
3
+ class Eql
4
+ def initialize(expected)
5
+ @expected = expected
6
+ end
7
+
8
+ def matches?(actual)
9
+ @actual = actual
10
+ @actual.eql?(@expected)
11
+ end
12
+
13
+ def failure_message_for_should
14
+ return "expected #{@expected.inspect}, got #{@actual.inspect} (using .eql?)", @expected, @actual
15
+ end
16
+
17
+ def failure_message_for_should_not
18
+ return "expected #{@actual.inspect} not to equal #{@expected.inspect} (using .eql?)", @expected, @actual
19
+ end
20
+
21
+ def description
22
+ "eql #{@expected.inspect}"
23
+ end
24
+ end
25
+
3
26
 
4
27
  # :call-seq:
5
28
  # should eql(expected)
@@ -14,12 +37,7 @@ module Spec
14
37
  # 5.should eql(5)
15
38
  # 5.should_not eql(3)
16
39
  def eql(expected)
17
- simple_matcher do |actual, matcher|
18
- matcher.failure_message = "expected #{expected.inspect}, got #{actual.inspect} (using .eql?)", expected, actual
19
- matcher.negative_failure_message = "expected #{actual.inspect} not to equal #{expected.inspect} (using .eql?)", expected, actual
20
- matcher.description = "eql #{expected.inspect}"
21
- actual.eql?(expected)
22
- end
40
+ Eql.new(expected)
23
41
  end
24
42
  end
25
43
  end
@@ -1,5 +1,28 @@
1
1
  module Spec
2
2
  module Matchers
3
+
4
+ class Equal
5
+ def initialize(expected)
6
+ @expected = expected
7
+ end
8
+
9
+ def matches?(actual)
10
+ @actual = actual
11
+ @actual.equal?(@expected)
12
+ end
13
+
14
+ def failure_message_for_should
15
+ return "expected #{@expected.inspect}, got #{@actual.inspect} (using .equal?)", @expected, @actual
16
+ end
17
+
18
+ def failure_message_for_should_not
19
+ return "expected #{@actual.inspect} not to equal #{@expected.inspect} (using .equal?)", @expected, @actual
20
+ end
21
+
22
+ def description
23
+ "equal #{@expected.inspect}"
24
+ end
25
+ end
3
26
 
4
27
  # :call-seq:
5
28
  # should equal(expected)
@@ -14,12 +37,7 @@ module Spec
14
37
  # 5.should equal(5) #Fixnums are equal
15
38
  # "5".should_not equal("5") #Strings that look the same are not the same object
16
39
  def equal(expected)
17
- simple_matcher do |actual, matcher|
18
- matcher.failure_message = "expected #{expected.inspect}, got #{actual.inspect} (using .equal?)", expected, actual
19
- matcher.negative_failure_message = "expected #{actual.inspect} not to equal #{expected.inspect} (using .equal?)", expected, actual
20
- matcher.description = "equal #{expected.inspect}"
21
- actual.equal?(expected)
22
- end
40
+ Equal.new(expected)
23
41
  end
24
42
  end
25
43
  end
@@ -1,16 +1,32 @@
1
1
  module Spec
2
2
  module Matchers
3
+
4
+ class Exist
5
+ def matches?(actual)
6
+ @actual = actual
7
+ actual.exist?
8
+ end
9
+
10
+ def failure_message_for_should
11
+ "expected #{@actual.inspect} to exist, but it doesn't."
12
+ end
13
+
14
+ def failure_message_for_should_not
15
+ "expected #{@actual.inspect} to not exist, but it does."
16
+ end
17
+
18
+ def description
19
+ "exists"
20
+ end
21
+ end
22
+
3
23
  # :call-seq:
4
24
  # should exist
5
25
  # should_not exist
6
26
  #
7
27
  # Passes if actual.exist?
8
28
  def exist
9
- simple_matcher do |actual, matcher|
10
- matcher.failure_message = "expected #{actual.inspect} to exist, but it doesn't."
11
- matcher.negative_failure_message = "expected #{actual.inspect} to not exist, but it does."
12
- actual.exist?
13
- end
29
+ Exist.new
14
30
  end
15
31
  end
16
32
  end