rspec 1.1.11 → 1.1.12

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 (269) hide show
  1. data/.autotest +4 -0
  2. data/History.txt +55 -0
  3. data/Manifest.txt +102 -122
  4. data/README.txt +30 -12
  5. data/Rakefile +10 -10
  6. data/TODO.txt +10 -2
  7. data/{failing_examples → examples/failing}/README.txt +0 -0
  8. data/{failing_examples → examples/failing}/diffing_spec.rb +0 -0
  9. data/{failing_examples → examples/failing}/failing_autogenerated_docstrings_example.rb +0 -0
  10. data/{failing_examples/failure_in_teardown.rb → examples/failing/failure_in_after.rb} +1 -1
  11. data/{failing_examples/failure_in_setup.rb → examples/failing/failure_in_before.rb} +1 -1
  12. data/{failing_examples → examples/failing}/mocking_example.rb +0 -0
  13. data/{failing_examples → examples/failing}/mocking_with_flexmock.rb +0 -0
  14. data/{failing_examples → examples/failing}/mocking_with_mocha.rb +0 -0
  15. data/{failing_examples → examples/failing}/mocking_with_rr.rb +0 -0
  16. data/{failing_examples → examples/failing}/partial_mock_example.rb +0 -0
  17. data/{failing_examples → examples/failing}/predicate_example.rb +5 -0
  18. data/{failing_examples → examples/failing}/raising_example.rb +0 -0
  19. data/{failing_examples → examples/failing}/spec_helper.rb +1 -1
  20. data/{failing_examples → examples/failing}/syntax_error_example.rb +0 -0
  21. data/{failing_examples → examples/failing}/team_spec.rb +0 -0
  22. data/{failing_examples → examples/failing}/timeout_behaviour.rb +0 -0
  23. data/examples/{pure → passing}/autogenerated_docstrings_example.rb +6 -0
  24. data/examples/{pure → passing}/before_and_after_example.rb +0 -0
  25. data/examples/{pure → passing}/behave_as_example.rb +0 -0
  26. data/examples/{pure → passing}/custom_expectation_matchers.rb +0 -0
  27. data/examples/{pure → passing}/custom_formatter.rb +1 -1
  28. data/examples/{pure → passing}/dynamic_spec.rb +2 -2
  29. data/examples/{pure → passing}/file_accessor.rb +0 -0
  30. data/examples/{pure → passing}/file_accessor_spec.rb +0 -0
  31. data/examples/{pure → passing}/greeter_spec.rb +0 -0
  32. data/examples/{pure → passing}/helper_method_example.rb +0 -0
  33. data/examples/{pure → passing}/io_processor.rb +0 -0
  34. data/examples/{pure → passing}/io_processor_spec.rb +0 -0
  35. data/examples/{pure → passing}/legacy_spec.rb +0 -0
  36. data/examples/{pure → passing}/mocking_example.rb +0 -0
  37. data/examples/{pure/multi_threaded_behaviour_runner.rb → passing/multi_threaded_example_group_runner.rb} +1 -3
  38. data/examples/{pure → passing}/nested_classes_example.rb +0 -0
  39. data/examples/{pure → passing}/partial_mock_example.rb +0 -0
  40. data/examples/{pure → passing}/pending_example.rb +0 -0
  41. data/examples/{pure → passing}/predicate_example.rb +0 -0
  42. data/examples/{pure → passing}/priority.txt +0 -0
  43. data/examples/{pure → passing}/shared_example_group_example.rb +0 -0
  44. data/examples/{pure → passing}/shared_stack_examples.rb +1 -3
  45. data/examples/passing/simple_matcher_example.rb +31 -0
  46. data/examples/{pure → passing}/spec_helper.rb +0 -0
  47. data/examples/{pure → passing}/stack.rb +0 -0
  48. data/examples/{pure → passing}/stack_spec.rb +3 -2
  49. data/examples/{pure → passing}/stack_spec_with_nested_example_groups.rb +0 -0
  50. data/examples/{pure → passing}/stubbing_example.rb +0 -0
  51. data/examples/{pure → passing}/yielding_example.rb +0 -0
  52. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +86 -0
  53. data/features/before_and_after_blocks/before_and_after_blocks.feature +168 -0
  54. data/{stories/example_groups/autogenerated_docstrings → features/example_groups/autogenerated_docstrings.feature} +5 -5
  55. data/{stories/example_groups/example_group_with_should_methods → features/example_groups/example_group_with_should_methods.feature} +3 -3
  56. data/{stories/example_groups/nested_groups → features/example_groups/nested_groups.feature} +4 -4
  57. data/{stories/example_groups/output → features/example_groups/output.feature} +3 -8
  58. data/{stories/interop/examples_and_tests_together → features/interop/examples_and_tests_together.feature} +5 -4
  59. data/features/interop/test_but_not_test_unit.feature +14 -0
  60. data/{stories/interop/test_case_with_should_methods → features/interop/test_case_with_should_methods.feature} +2 -2
  61. data/{stories/mock_framework_integration/use_flexmock.story → features/mock_framework_integration/use_flexmock.feature} +1 -1
  62. data/features/step_definitions/running_rspec.rb +54 -0
  63. data/features/support/env.rb +26 -0
  64. data/{stories/resources → features/support}/helpers/cmdline.rb +0 -0
  65. data/{stories/resources → features/support}/helpers/story_helper.rb +1 -1
  66. data/{stories/resources → features/support}/matchers/smart_match.rb +0 -0
  67. data/{plugins → lib/adapters}/mock_frameworks/flexmock.rb +1 -1
  68. data/{plugins → lib/adapters}/mock_frameworks/mocha.rb +1 -1
  69. data/{plugins → lib/adapters}/mock_frameworks/rr.rb +1 -1
  70. data/{plugins → lib/adapters}/mock_frameworks/rspec.rb +2 -2
  71. data/lib/autotest/rspec.rb +4 -3
  72. data/lib/spec.rb +2 -27
  73. data/lib/spec/dsl.rb +1 -0
  74. data/lib/spec/{extensions → dsl}/main.rb +10 -10
  75. data/lib/spec/example.rb +175 -1
  76. data/lib/spec/example/before_and_after_hooks.rb +30 -24
  77. data/lib/spec/example/example_group.rb +1 -0
  78. data/lib/spec/example/example_group_factory.rb +26 -9
  79. data/lib/spec/example/example_group_methods.rb +138 -113
  80. data/lib/spec/example/example_methods.rb +88 -25
  81. data/lib/spec/example/shared_example_group.rb +28 -21
  82. data/lib/spec/expectations.rb +22 -18
  83. data/lib/spec/expectations/handler.rb +16 -36
  84. data/lib/spec/interop/test/unit/testcase.rb +19 -17
  85. data/lib/spec/interop/test/unit/testresult.rb +1 -1
  86. data/lib/spec/interop/test/unit/testsuite_adapter.rb +1 -1
  87. data/lib/spec/matchers.rb +7 -28
  88. data/lib/spec/matchers/be.rb +103 -116
  89. data/lib/spec/matchers/be_close.rb +6 -22
  90. data/lib/spec/matchers/eql.rb +7 -25
  91. data/lib/spec/matchers/equal.rb +7 -25
  92. data/lib/spec/matchers/errors.rb +5 -0
  93. data/lib/spec/matchers/exist.rb +8 -14
  94. data/lib/spec/matchers/generated_descriptions.rb +48 -0
  95. data/lib/spec/matchers/has.rb +12 -28
  96. data/lib/spec/matchers/include.rb +12 -9
  97. data/lib/spec/matchers/match.rb +8 -27
  98. data/lib/spec/matchers/match_array.rb +79 -0
  99. data/lib/spec/matchers/method_missing.rb +9 -0
  100. data/lib/spec/matchers/operator_matcher.rb +39 -48
  101. data/lib/spec/matchers/raise_error.rb +4 -8
  102. data/lib/spec/matchers/respond_to.rb +33 -8
  103. data/lib/spec/matchers/throw_symbol.rb +49 -17
  104. data/lib/spec/matchers/wrap_expectation.rb +55 -0
  105. data/lib/spec/mocks/argument_constraints.rb +77 -5
  106. data/lib/spec/mocks/message_expectation.rb +7 -7
  107. data/lib/spec/mocks/proxy.rb +14 -12
  108. data/lib/spec/rake/spectask.rb +4 -6
  109. data/lib/spec/ruby.rb +9 -0
  110. data/lib/spec/runner.rb +37 -162
  111. data/lib/spec/runner/backtrace_tweaker.rb +5 -3
  112. data/lib/spec/runner/class_and_arguments_parser.rb +7 -9
  113. data/lib/spec/runner/command_line.rb +6 -8
  114. data/lib/spec/{example → runner}/configuration.rb +46 -47
  115. data/lib/spec/runner/example_group_runner.rb +15 -4
  116. data/lib/spec/runner/formatter/base_text_formatter.rb +4 -3
  117. data/lib/spec/runner/formatter/html_formatter.rb +14 -11
  118. data/lib/spec/runner/formatter/nested_text_formatter.rb +2 -2
  119. data/lib/spec/runner/heckle_runner.rb +58 -56
  120. data/lib/spec/runner/option_parser.rb +8 -4
  121. data/lib/spec/runner/options.rb +29 -14
  122. data/lib/spec/runner/reporter.rb +1 -1
  123. data/lib/spec/runner/spec_parser.rb +11 -9
  124. data/lib/spec/story/runner.rb +40 -42
  125. data/lib/spec/story/runner/story_runner.rb +10 -6
  126. data/lib/spec/story/world.rb +66 -70
  127. data/lib/spec/version.rb +4 -2
  128. data/{rake_tasks → resources/rake}/examples.rake +0 -0
  129. data/{rake_tasks → resources/rake}/examples_with_rcov.rake +0 -0
  130. data/{rake_tasks → resources/rake}/failing_examples_with_html.rake +0 -0
  131. data/{rake_tasks → resources/rake}/verify_rcov.rake +0 -0
  132. data/{stories/resources → resources}/spec/example_group_with_should_methods.rb +1 -1
  133. data/{stories/resources → resources}/spec/simple_spec.rb +1 -1
  134. data/resources/spec/spec_with_flexmock.rb +19 -0
  135. data/{stories/resources → resources}/test/spec_and_test_together.rb +1 -1
  136. data/resources/test/spec_including_test_but_not_unit.rb +11 -0
  137. data/{stories/resources → resources}/test/test_case_with_should_methods.rb +2 -2
  138. data/rspec.gemspec +16 -6
  139. data/spec/autotest/autotest_helper.rb +2 -2
  140. data/spec/autotest/discover_spec.rb +4 -15
  141. data/spec/autotest/failed_results_re_spec.rb +24 -0
  142. data/spec/autotest/rspec_spec.rb +2 -38
  143. data/spec/spec/dsl/main_spec.rb +88 -0
  144. data/spec/spec/example/example_group_class_definition_spec.rb +6 -2
  145. data/spec/spec/example/example_group_factory_spec.rb +50 -10
  146. data/spec/spec/example/example_group_methods_spec.rb +210 -160
  147. data/spec/spec/example/example_group_spec.rb +44 -52
  148. data/spec/spec/example/example_matcher_spec.rb +6 -23
  149. data/spec/spec/example/example_methods_spec.rb +176 -54
  150. data/spec/spec/example/helper_method_spec.rb +24 -0
  151. data/spec/spec/example/pending_module_spec.rb +2 -8
  152. data/spec/spec/example/shared_example_group_spec.rb +56 -80
  153. data/spec/spec/expectations/extensions/object_spec.rb +0 -50
  154. data/spec/spec/expectations/wrap_expectation_spec.rb +30 -0
  155. data/spec/spec/interop/test/unit/spec_spec.rb +1 -5
  156. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +4 -0
  157. data/spec/spec/matchers/be_close_spec.rb +12 -10
  158. data/spec/spec/matchers/be_spec.rb +62 -7
  159. data/spec/spec/matchers/description_generation_spec.rb +19 -0
  160. data/spec/spec/matchers/eql_spec.rb +7 -6
  161. data/spec/spec/matchers/equal_spec.rb +7 -6
  162. data/spec/spec/matchers/handler_spec.rb +4 -43
  163. data/spec/spec/matchers/has_spec.rb +1 -1
  164. data/spec/spec/matchers/have_spec.rb +23 -18
  165. data/spec/spec/matchers/include_spec.rb +24 -0
  166. data/spec/spec/matchers/match_array_spec.rb +83 -0
  167. data/spec/spec/matchers/matcher_methods_spec.rb +1 -13
  168. data/spec/spec/matchers/raise_error_spec.rb +18 -0
  169. data/spec/spec/matchers/respond_to_spec.rb +71 -9
  170. data/spec/spec/matchers/throw_symbol_spec.rb +85 -43
  171. data/spec/spec/mocks/bug_report_11545_spec.rb +4 -5
  172. data/spec/spec/mocks/bug_report_496.rb +11 -9
  173. data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
  174. data/spec/spec/mocks/hash_including_matcher_spec.rb +39 -2
  175. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
  176. data/spec/spec/mocks/mock_spec.rb +5 -6
  177. data/spec/spec/mocks/nil_expectation_warning_spec.rb +2 -2
  178. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +18 -3
  179. data/spec/spec/mocks/stub_spec.rb +6 -0
  180. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +14 -0
  181. data/spec/spec/runner/command_line_spec.rb +4 -4
  182. data/spec/spec/runner/configuration_spec.rb +301 -0
  183. data/spec/spec/runner/drb_command_line_spec.rb +4 -4
  184. data/spec/spec/runner/example_group_runner_spec.rb +33 -0
  185. data/spec/spec/runner/formatter/base_formatter_spec.rb +13 -102
  186. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +23 -0
  187. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +5 -5
  188. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +3 -3
  189. data/spec/spec/runner/formatter/html_formatted-1.8.4.html +6 -6
  190. data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +9 -9
  191. data/spec/spec/runner/formatter/html_formatted-1.8.5.html +6 -6
  192. data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +10 -10
  193. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +39 -30
  194. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +379 -0
  195. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +379 -0
  196. data/spec/spec/runner/formatter/html_formatter_spec.rb +14 -13
  197. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +5 -5
  198. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +7 -17
  199. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +18 -17
  200. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +5 -5
  201. data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +6 -6
  202. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +33 -30
  203. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +373 -0
  204. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +373 -0
  205. data/spec/spec/runner/heckler_spec.rb +16 -9
  206. data/spec/spec/runner/option_parser_spec.rb +3 -18
  207. data/spec/spec/runner/options_spec.rb +27 -8
  208. data/spec/spec/runner/reporter_spec.rb +5 -5
  209. data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
  210. data/spec/spec/runner/resources/utf8_encoded.rb +7 -0
  211. data/spec/spec/runner/spec_parser_spec.rb +85 -79
  212. data/spec/spec/spec_spec.rb +21 -0
  213. data/spec/spec_helper.rb +9 -1
  214. data/story_server/prototype/javascripts/prototype.js +1 -1
  215. metadata +119 -131
  216. data/examples/stories/adder.rb +0 -13
  217. data/examples/stories/addition +0 -34
  218. data/examples/stories/addition.rb +0 -9
  219. data/examples/stories/calculator.rb +0 -65
  220. data/examples/stories/game-of-life/.loadpath +0 -5
  221. data/examples/stories/game-of-life/README.txt +0 -21
  222. data/examples/stories/game-of-life/behaviour/everything.rb +0 -6
  223. data/examples/stories/game-of-life/behaviour/examples/examples.rb +0 -3
  224. data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +0 -35
  225. data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +0 -66
  226. data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +0 -21
  227. data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +0 -21
  228. data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +0 -42
  229. data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +0 -42
  230. data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +0 -17
  231. data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +0 -53
  232. data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +0 -52
  233. data/examples/stories/game-of-life/behaviour/stories/helper.rb +0 -6
  234. data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +0 -26
  235. data/examples/stories/game-of-life/behaviour/stories/steps.rb +0 -5
  236. data/examples/stories/game-of-life/behaviour/stories/stories.rb +0 -3
  237. data/examples/stories/game-of-life/behaviour/stories/stories.txt +0 -22
  238. data/examples/stories/game-of-life/life.rb +0 -3
  239. data/examples/stories/game-of-life/life/game.rb +0 -23
  240. data/examples/stories/game-of-life/life/grid.rb +0 -43
  241. data/examples/stories/helper.rb +0 -9
  242. data/examples/stories/steps/addition_steps.rb +0 -18
  243. data/lib/spec/adapters.rb +0 -1
  244. data/lib/spec/adapters/ruby_engine.rb +0 -26
  245. data/lib/spec/adapters/ruby_engine/mri.rb +0 -8
  246. data/lib/spec/adapters/ruby_engine/rubinius.rb +0 -8
  247. data/lib/spec/extensions.rb +0 -4
  248. data/lib/spec/extensions/class.rb +0 -24
  249. data/lib/spec/extensions/metaclass.rb +0 -7
  250. data/lib/spec/extensions/object.rb +0 -6
  251. data/spec/spec/adapters/ruby_engine_spec.rb +0 -16
  252. data/spec/spec/example/configuration_spec.rb +0 -296
  253. data/spec/spec/example/example_runner_spec.rb +0 -194
  254. data/spec/spec/extensions/main_spec.rb +0 -71
  255. data/stories/all.rb +0 -5
  256. data/stories/configuration/before_blocks.story +0 -21
  257. data/stories/configuration/stories.rb +0 -7
  258. data/stories/example_groups/stories.rb +0 -7
  259. data/stories/helper.rb +0 -6
  260. data/stories/interop/stories.rb +0 -7
  261. data/stories/mock_framework_integration/stories.rb +0 -7
  262. data/stories/pending_stories/README +0 -3
  263. data/stories/resources/spec/before_blocks_example.rb +0 -32
  264. data/stories/resources/spec/spec_with_flexmock.rb +0 -18
  265. data/stories/resources/steps/running_rspec.rb +0 -50
  266. data/stories/resources/stories/failing_story.rb +0 -15
  267. data/stories/stories/multiline_steps.story +0 -23
  268. data/stories/stories/steps/multiline_steps.rb +0 -13
  269. data/stories/stories/stories.rb +0 -6
@@ -3,137 +3,115 @@ module Spec
3
3
 
4
4
  class Be #:nodoc:
5
5
  def initialize(*args)
6
- if args.empty?
7
- @expected = :satisfy_if
8
- else
9
- @expected = parse_expected(args.shift)
10
- end
6
+ @expected = args.empty? ? true : set_expected(args.shift)
11
7
  @args = args
12
- @comparison = ""
13
8
  end
14
9
 
15
- def matches?(given)
16
- @given = given
17
- if handling_predicate?
18
- begin
19
- return @result = given.__send__(predicate, *@args)
20
- rescue => predicate_error
21
- # This clause should be empty, but rcov will not report it as covered
22
- # unless something (anything) is executed within the clause
23
- rcov_error_report = "http://eigenclass.org/hiki.rb?rcov-0.8.0"
24
- end
10
+ def matches?(actual)
11
+ @actual = actual
12
+ handling_predicate? ? run_predicate_on(actual) : match_or_compare(actual)
13
+ end
14
+
15
+ def run_predicate_on(actual)
16
+ begin
17
+ return @result = actual.__send__(predicate, *@args)
18
+ rescue NameError => predicate_missing_error
19
+ "this needs to be here or rcov will not count this branch even though it's executed in a code example"
20
+ end
25
21
 
26
- begin
27
- return @result = given.__send__(present_tense_predicate, *@args)
28
- rescue
29
- raise predicate_error
30
- end
31
- else
32
- return match_or_compare
22
+ begin
23
+ return @result = actual.__send__(present_tense_predicate, *@args)
24
+ rescue NameError
25
+ raise predicate_missing_error
33
26
  end
34
27
  end
35
28
 
36
29
  def failure_message
37
- return "expected #{@comparison}#{expected}, got #{@given.inspect}" unless handling_predicate?
38
- return "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}"
30
+ handling_predicate? ?
31
+ "expected #{predicate}#{args_to_s} to return true, got #{@result.inspect}" :
32
+ "expected #{@comparison_method} #{expected}, got #{@actual.inspect}".gsub(' ',' ')
39
33
  end
40
34
 
41
35
  def negative_failure_message
42
- return "expected not #{expected}, got #{@given.inspect}" unless handling_predicate?
43
- return "expected #{predicate}#{args_to_s} to return false, got #{@result.inspect}"
44
- end
45
-
46
- def expected
47
- return "if to be satisfied" if @expected == :satisfy_if
48
- return true if @expected == :true
49
- return false if @expected == :false
50
- return "nil" if @expected == :nil
51
- return @expected.inspect
52
- end
53
-
54
- def match_or_compare
55
- return @given ? true : false if @expected == :satisfy_if
56
- return @given == true if @expected == :true
57
- return @given == false if @expected == :false
58
- return @given.nil? if @expected == :nil
59
- return @given < @expected if @less_than
60
- return @given <= @expected if @less_than_or_equal
61
- return @given >= @expected if @greater_than_or_equal
62
- return @given > @expected if @greater_than
63
- return @given == @expected if @double_equal
64
- return @given === @expected if @triple_equal
65
- return @given.equal?(@expected)
36
+ if handling_predicate?
37
+ "expected #{predicate}#{args_to_s} to return false, got #{@result.inspect}"
38
+ else
39
+ message = <<-MESSAGE
40
+ 'should_not be #{@comparison_method} #{expected}' not only FAILED,
41
+ it reads really poorly.
42
+ MESSAGE
43
+
44
+ raise message << ([:===,:==].include?(@comparison_method) ?
45
+ "Why don't you try expressing it without the \"be\"?" :
46
+ "Why don't you try expressing it in the positive?")
47
+ end
66
48
  end
67
49
 
68
- def ==(expected)
69
- @prefix = "be "
70
- @double_equal = true
71
- @comparison = "== "
72
- @expected = expected
73
- self
74
- end
75
-
76
- def ===(expected)
77
- @prefix = "be "
78
- @triple_equal = true
79
- @comparison = "=== "
80
- @expected = expected
81
- self
82
- end
83
-
84
- def <(expected)
85
- @prefix = "be "
86
- @less_than = true
87
- @comparison = "< "
88
- @expected = expected
89
- self
90
- end
91
-
92
- def <=(expected)
93
- @prefix = "be "
94
- @less_than_or_equal = true
95
- @comparison = "<= "
96
- @expected = expected
97
- self
50
+ def description
51
+ "#{prefix_to_sentence}#{comparison} #{expected_to_sentence}#{args_to_sentence}".gsub(/\s+/,' ')
98
52
  end
99
53
 
100
- def >=(expected)
101
- @prefix = "be "
102
- @greater_than_or_equal = true
103
- @comparison = ">= "
104
- @expected = expected
105
- self
54
+ [:==, :<, :<=, :>=, :>, :===].each do |method|
55
+ define_method method do |expected|
56
+ compare_to(expected, :using => method)
57
+ self
58
+ end
106
59
  end
107
60
 
108
- def >(expected)
109
- @prefix = "be "
110
- @greater_than = true
111
- @comparison = "> "
112
- @expected = expected
113
- self
114
- end
61
+ private
62
+ def match_or_compare(actual)
63
+ case @expected
64
+ when TrueClass
65
+ @actual
66
+ else
67
+ @actual.__send__(comparison_method, @expected)
68
+ end
69
+ end
115
70
 
116
- def description
117
- "#{prefix_to_sentence}#{comparison}#{expected_to_sentence}#{args_to_sentence}"
118
- end
71
+ def comparison_method
72
+ @comparison_method || :equal?
73
+ end
74
+
75
+ def expected
76
+ @expected
77
+ end
119
78
 
120
- private
79
+ def compare_to(expected, opts)
80
+ @expected, @comparison_method = expected, opts[:using]
81
+ end
82
+
83
+ def set_expected(expected)
84
+ Symbol === expected ? parse_expected(expected) : expected
85
+ end
86
+
121
87
  def parse_expected(expected)
122
- if Symbol === expected
123
- @handling_predicate = true
124
- ["be_an_","be_a_","be_"].each do |prefix|
125
- if expected.starts_with?(prefix)
126
- @prefix = prefix
127
- return "#{expected.to_s.sub(@prefix,"")}".to_sym
88
+ ["be_an_","be_a_","be_"].each do |prefix|
89
+ handling_predicate!
90
+ if expected.starts_with?(prefix)
91
+ set_prefix(prefix)
92
+ expected = expected.to_s.sub(prefix,"")
93
+ [true, false, nil].each do |val|
94
+ return val if val.to_s == expected
128
95
  end
96
+ return expected.to_sym
129
97
  end
130
98
  end
131
- @prefix = ""
132
- return expected
99
+ end
100
+
101
+ def set_prefix(prefix)
102
+ @prefix = prefix
103
+ end
104
+
105
+ def prefix
106
+ @prefix
107
+ end
108
+
109
+ def handling_predicate!
110
+ @handling_predicate = true
133
111
  end
134
112
 
135
113
  def handling_predicate?
136
- return false if [:true, :false, :nil].include?(@expected)
114
+ return false if [true, false, nil].include?(expected)
137
115
  return @handling_predicate
138
116
  end
139
117
 
@@ -146,21 +124,27 @@ module Spec
146
124
  end
147
125
 
148
126
  def args_to_s
149
- return "" if @args.empty?
150
- inspected_args = @args.collect{|a| a.inspect}
151
- return "(#{inspected_args.join(', ')})"
127
+ @args.empty? ? "" : parenthesize(inspected_args.join(', '))
128
+ end
129
+
130
+ def parenthesize(string)
131
+ return "(#{string})"
132
+ end
133
+
134
+ def inspected_args
135
+ @args.collect{|a| a.inspect}
152
136
  end
153
137
 
154
138
  def comparison
155
- @comparison
139
+ @comparison_method.nil? ? " " : "be #{@comparison_method.to_s} "
156
140
  end
157
141
 
158
142
  def expected_to_sentence
159
- split_words(@expected)
143
+ split_words(expected)
160
144
  end
161
145
 
162
146
  def prefix_to_sentence
163
- split_words(@prefix)
147
+ split_words(prefix)
164
148
  end
165
149
 
166
150
  def split_words(sym)
@@ -181,7 +165,6 @@ module Spec
181
165
  end
182
166
 
183
167
  # :call-seq:
184
- # should be
185
168
  # should be_true
186
169
  # should be_false
187
170
  # should be_nil
@@ -189,7 +172,7 @@ module Spec
189
172
  # should_not be_nil
190
173
  # should_not be_arbitrary_predicate(*args)
191
174
  #
192
- # Given true, false, or nil, will pass if given value is
175
+ # Given true, false, or nil, will pass if actual value is
193
176
  # true, false or nil (respectively). Given no args means
194
177
  # the caller should satisfy an if condition (to be or not to be).
195
178
  #
@@ -203,19 +186,23 @@ module Spec
203
186
  #
204
187
  # == Examples
205
188
  #
206
- # target.should be
207
189
  # target.should be_true
208
190
  # target.should be_false
209
191
  # target.should be_nil
210
192
  # target.should_not be_nil
211
193
  #
212
194
  # collection.should be_empty #passes if target.empty?
213
- # "this string".should be_an_intance_of(String)
214
- #
215
195
  # target.should_not be_empty #passes unless target.empty?
216
196
  # target.should_not be_old_enough(16) #passes unless target.old_enough?(16)
217
197
  def be(*args)
218
198
  Matchers::Be.new(*args)
219
199
  end
200
+
201
+ # passes if target.kind_of?(klass)
202
+ def be_a(klass)
203
+ be_a_kind_of(klass)
204
+ end
205
+
206
+ alias_method :be_an, :be_a
220
207
  end
221
208
  end
@@ -1,37 +1,21 @@
1
1
  module Spec
2
2
  module Matchers
3
3
 
4
- class BeClose #:nodoc:
5
- def initialize(expected, delta)
6
- @expected = expected
7
- @delta = delta
8
- end
9
-
10
- def matches?(given)
11
- @given = given
12
- (@given - @expected).abs < @delta
13
- end
14
-
15
- def failure_message
16
- "expected #{@expected} +/- (< #{@delta}), got #{@given}"
17
- end
18
-
19
- def description
20
- "be close to #{@expected} (within +- #{@delta})"
21
- end
22
- end
23
-
24
4
  # :call-seq:
25
5
  # should be_close(expected, delta)
26
6
  # should_not be_close(expected, delta)
27
7
  #
28
- # Passes if given == expected +/- delta
8
+ # Passes if actual == expected +/- delta
29
9
  #
30
10
  # == Example
31
11
  #
32
12
  # result.should be_close(3.0, 0.5)
33
13
  def be_close(expected, delta)
34
- Matchers::BeClose.new(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
35
19
  end
36
20
  end
37
21
  end
@@ -1,34 +1,11 @@
1
1
  module Spec
2
2
  module Matchers
3
3
 
4
- class Eql #:nodoc:
5
- def initialize(expected)
6
- @expected = expected
7
- end
8
-
9
- def matches?(given)
10
- @given = given
11
- @given.eql?(@expected)
12
- end
13
-
14
- def failure_message
15
- return "expected #{@expected.inspect}, got #{@given.inspect} (using .eql?)", @expected, @given
16
- end
17
-
18
- def negative_failure_message
19
- return "expected #{@given.inspect} not to equal #{@expected.inspect} (using .eql?)", @expected, @given
20
- end
21
-
22
- def description
23
- "eql #{@expected.inspect}"
24
- end
25
- end
26
-
27
4
  # :call-seq:
28
5
  # should eql(expected)
29
6
  # should_not eql(expected)
30
7
  #
31
- # Passes if given and expected are of equal value, but not necessarily the same object.
8
+ # Passes if actual and expected are of equal value, but not necessarily the same object.
32
9
  #
33
10
  # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more information about equality in Ruby.
34
11
  #
@@ -37,7 +14,12 @@ module Spec
37
14
  # 5.should eql(5)
38
15
  # 5.should_not eql(3)
39
16
  def eql(expected)
40
- Matchers::Eql.new(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
41
23
  end
42
24
  end
43
25
  end
@@ -1,34 +1,11 @@
1
1
  module Spec
2
2
  module Matchers
3
3
 
4
- class Equal #:nodoc:
5
- def initialize(expected)
6
- @expected = expected
7
- end
8
-
9
- def matches?(given)
10
- @given = given
11
- @given.equal?(@expected)
12
- end
13
-
14
- def failure_message
15
- return "expected #{@expected.inspect}, got #{@given.inspect} (using .equal?)", @expected, @given
16
- end
17
-
18
- def negative_failure_message
19
- return "expected #{@given.inspect} not to equal #{@expected.inspect} (using .equal?)", @expected, @given
20
- end
21
-
22
- def description
23
- "equal #{@expected.inspect}"
24
- end
25
- end
26
-
27
4
  # :call-seq:
28
5
  # should equal(expected)
29
6
  # should_not equal(expected)
30
7
  #
31
- # Passes if given and expected are the same object (object identity).
8
+ # Passes if actual and expected are the same object (object identity).
32
9
  #
33
10
  # See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more information about equality in Ruby.
34
11
  #
@@ -37,7 +14,12 @@ module Spec
37
14
  # 5.should equal(5) #Fixnums are equal
38
15
  # "5".should_not equal("5") #Strings that look the same are not the same object
39
16
  def equal(expected)
40
- Matchers::Equal.new(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
41
23
  end
42
24
  end
43
25
  end
@@ -0,0 +1,5 @@
1
+ module Spec
2
+ module Matchers
3
+ class MatcherError < StandardError; end
4
+ end
5
+ end
@@ -1,22 +1,16 @@
1
1
  module Spec
2
2
  module Matchers
3
- class Exist
4
- def matches?(given)
5
- @given = given
6
- @given.exist?
7
- end
8
- def failure_message
9
- "expected #{@given.inspect} to exist, but it doesn't."
10
- end
11
- def negative_failure_message
12
- "expected #{@given.inspect} to not exist, but it does."
13
- end
14
- end
15
3
  # :call-seq:
16
4
  # should exist
17
5
  # should_not exist
18
6
  #
19
- # Passes if given.exist?
20
- def exist; Exist.new; end
7
+ # Passes if actual.exist?
8
+ 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
14
+ end
21
15
  end
22
16
  end