rspec 1.0.8 → 1.1.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 (301) hide show
  1. data/CHANGES +122 -2
  2. data/README +10 -9
  3. data/Rakefile +22 -49
  4. data/TODO +2 -0
  5. data/bin/spec +1 -1
  6. data/bin/spec_translator +8 -8
  7. data/examples/{auto_spec_description_example.rb → pure/autogenerated_docstrings_example.rb} +0 -0
  8. data/examples/{before_and_after_example.rb → pure/before_and_after_example.rb} +1 -0
  9. data/examples/{behave_as_example.rb → pure/behave_as_example.rb} +0 -0
  10. data/examples/{custom_expectation_matchers.rb → pure/custom_expectation_matchers.rb} +0 -0
  11. data/examples/{custom_formatter.rb → pure/custom_formatter.rb} +1 -0
  12. data/examples/{dynamic_spec.rb → pure/dynamic_spec.rb} +0 -0
  13. data/examples/{file_accessor.rb → pure/file_accessor.rb} +1 -0
  14. data/examples/{file_accessor_spec.rb → pure/file_accessor_spec.rb} +0 -0
  15. data/examples/{greeter_spec.rb → pure/greeter_spec.rb} +1 -0
  16. data/examples/{helper_method_example.rb → pure/helper_method_example.rb} +0 -0
  17. data/examples/{io_processor.rb → pure/io_processor.rb} +0 -0
  18. data/examples/{io_processor_spec.rb → pure/io_processor_spec.rb} +0 -0
  19. data/examples/{legacy_spec.rb → pure/legacy_spec.rb} +1 -0
  20. data/examples/{mocking_example.rb → pure/mocking_example.rb} +0 -0
  21. data/examples/pure/multi_threaded_behaviour_runner.rb +28 -0
  22. data/examples/pure/nested_classes_example.rb +36 -0
  23. data/examples/{partial_mock_example.rb → pure/partial_mock_example.rb} +0 -0
  24. data/examples/{pending_example.rb → pure/pending_example.rb} +0 -0
  25. data/examples/{predicate_example.rb → pure/predicate_example.rb} +0 -0
  26. data/examples/{priority.txt → pure/priority.txt} +0 -0
  27. data/examples/pure/shared_example_group_example.rb +66 -0
  28. data/examples/pure/shared_stack_examples.rb +38 -0
  29. data/examples/pure/spec_helper.rb +3 -0
  30. data/examples/{stack.rb → pure/stack.rb} +0 -0
  31. data/examples/{stack_spec.rb → pure/stack_spec.rb} +1 -35
  32. data/examples/pure/stack_spec_with_nested_example_groups.rb +67 -0
  33. data/examples/{stubbing_example.rb → pure/stubbing_example.rb} +0 -0
  34. data/examples/stories/adder.rb +13 -0
  35. data/examples/stories/addition +34 -0
  36. data/examples/stories/addition.rb +9 -0
  37. data/examples/stories/calculator.rb +65 -0
  38. data/examples/stories/game-of-life/README.txt +21 -0
  39. data/examples/stories/game-of-life/behaviour/everything.rb +6 -0
  40. data/examples/stories/game-of-life/behaviour/examples/examples.rb +3 -0
  41. data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +35 -0
  42. data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +66 -0
  43. data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +21 -0
  44. data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +21 -0
  45. data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +42 -0
  46. data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +42 -0
  47. data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +17 -0
  48. data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +53 -0
  49. data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +52 -0
  50. data/examples/stories/game-of-life/behaviour/stories/helper.rb +6 -0
  51. data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +26 -0
  52. data/examples/stories/game-of-life/behaviour/stories/steps.rb +5 -0
  53. data/examples/stories/game-of-life/behaviour/stories/stories.rb +3 -0
  54. data/examples/stories/game-of-life/behaviour/stories/stories.txt +22 -0
  55. data/examples/stories/game-of-life/life.rb +3 -0
  56. data/examples/stories/game-of-life/life/game.rb +23 -0
  57. data/examples/stories/game-of-life/life/grid.rb +43 -0
  58. data/examples/stories/helper.rb +9 -0
  59. data/examples/stories/steps/addition_steps.rb +18 -0
  60. data/lib/autotest/rspec.rb +1 -2
  61. data/lib/spec.rb +30 -6
  62. data/lib/spec/example.rb +12 -0
  63. data/lib/spec/{dsl → example}/configuration.rb +48 -39
  64. data/lib/spec/{dsl → example}/errors.rb +2 -2
  65. data/lib/spec/example/example_group.rb +16 -0
  66. data/lib/spec/example/example_group_factory.rb +62 -0
  67. data/lib/spec/example/example_group_methods.rb +412 -0
  68. data/lib/spec/example/example_matcher.rb +42 -0
  69. data/lib/spec/example/example_methods.rb +101 -0
  70. data/lib/spec/example/module_reopening_fix.rb +21 -0
  71. data/lib/spec/example/pending.rb +18 -0
  72. data/lib/spec/example/shared_example_group.rb +58 -0
  73. data/lib/spec/expectations/differs/default.rb +15 -10
  74. data/lib/spec/expectations/errors.rb +7 -1
  75. data/lib/spec/expectations/extensions/object.rb +12 -7
  76. data/lib/spec/expectations/handler.rb +13 -4
  77. data/lib/spec/extensions.rb +2 -0
  78. data/lib/spec/extensions/class.rb +24 -0
  79. data/lib/spec/extensions/main.rb +54 -0
  80. data/lib/spec/extensions/object.rb +5 -1
  81. data/lib/spec/interop/test.rb +10 -0
  82. data/lib/spec/interop/test/unit/autorunner.rb +6 -0
  83. data/lib/spec/interop/test/unit/testcase.rb +61 -0
  84. data/lib/spec/interop/test/unit/testresult.rb +6 -0
  85. data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
  86. data/lib/spec/interop/test/unit/ui/console/testrunner.rb +60 -0
  87. data/lib/spec/matchers.rb +11 -15
  88. data/lib/spec/matchers/be.rb +23 -6
  89. data/lib/spec/matchers/change.rb +25 -1
  90. data/lib/spec/matchers/exist.rb +17 -0
  91. data/lib/spec/matchers/operator_matcher.rb +1 -0
  92. data/lib/spec/matchers/simple_matcher.rb +29 -0
  93. data/lib/spec/matchers/throw_symbol.rb +2 -0
  94. data/lib/spec/mocks.rb +5 -2
  95. data/lib/spec/mocks/argument_expectation.rb +1 -1
  96. data/lib/spec/mocks/message_expectation.rb +62 -44
  97. data/lib/spec/mocks/methods.rb +2 -2
  98. data/lib/spec/mocks/mock.rb +24 -3
  99. data/lib/spec/mocks/proxy.rb +26 -23
  100. data/lib/spec/mocks/space.rb +1 -1
  101. data/lib/spec/mocks/spec_methods.rb +20 -12
  102. data/lib/spec/rake/spectask.rb +19 -1
  103. data/lib/spec/rake/verify_rcov.rb +1 -1
  104. data/lib/spec/runner.rb +33 -10
  105. data/lib/spec/runner/backtrace_tweaker.rb +3 -3
  106. data/lib/spec/runner/class_and_arguments_parser.rb +16 -0
  107. data/lib/spec/runner/command_line.rb +18 -12
  108. data/lib/spec/runner/drb_command_line.rb +4 -5
  109. data/lib/spec/runner/example_group_runner.rb +59 -0
  110. data/lib/spec/runner/formatter/base_formatter.rb +10 -8
  111. data/lib/spec/runner/formatter/base_text_formatter.rb +18 -18
  112. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +31 -0
  113. data/lib/spec/runner/formatter/failing_examples_formatter.rb +3 -5
  114. data/lib/spec/runner/formatter/html_formatter.rb +37 -27
  115. data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
  116. data/lib/spec/runner/formatter/progress_bar_formatter.rb +3 -4
  117. data/lib/spec/runner/formatter/specdoc_formatter.rb +27 -13
  118. data/lib/spec/runner/formatter/story/html_formatter.rb +124 -0
  119. data/lib/spec/runner/formatter/story/plain_text_formatter.rb +123 -0
  120. data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
  121. data/lib/spec/runner/heckle_runner.rb +9 -9
  122. data/lib/spec/runner/option_parser.rb +140 -138
  123. data/lib/spec/runner/options.rb +168 -90
  124. data/lib/spec/runner/reporter.rb +58 -40
  125. data/lib/spec/runner/spec_parser.rb +11 -8
  126. data/lib/spec/story.rb +10 -0
  127. data/lib/spec/story/extensions.rb +1 -0
  128. data/lib/spec/story/extensions/main.rb +86 -0
  129. data/lib/spec/story/given_scenario.rb +14 -0
  130. data/lib/spec/story/runner.rb +58 -0
  131. data/lib/spec/story/runner/plain_text_story_runner.rb +48 -0
  132. data/lib/spec/story/runner/scenario_collector.rb +18 -0
  133. data/lib/spec/story/runner/scenario_runner.rb +46 -0
  134. data/lib/spec/story/runner/story_mediator.rb +123 -0
  135. data/lib/spec/story/runner/story_parser.rb +227 -0
  136. data/lib/spec/story/runner/story_runner.rb +67 -0
  137. data/lib/spec/story/scenario.rb +14 -0
  138. data/lib/spec/story/step.rb +48 -0
  139. data/lib/spec/story/step_group.rb +89 -0
  140. data/lib/spec/story/step_mother.rb +37 -0
  141. data/lib/spec/story/story.rb +42 -0
  142. data/lib/spec/story/world.rb +124 -0
  143. data/lib/spec/version.rb +4 -5
  144. data/plugins/mock_frameworks/rspec.rb +1 -1
  145. data/spec/autotest/rspec_spec.rb +13 -7
  146. data/spec/autotest_helper.rb +4 -3
  147. data/spec/rspec_suite.rb +7 -0
  148. data/spec/ruby_forker.rb +13 -0
  149. data/spec/spec/example/configuration_spec.rb +290 -0
  150. data/spec/spec/example/example_group_class_definition_spec.rb +48 -0
  151. data/spec/spec/example/example_group_factory_spec.rb +129 -0
  152. data/spec/spec/example/example_group_methods_spec.rb +465 -0
  153. data/spec/spec/example/example_group_spec.rb +711 -0
  154. data/spec/spec/{dsl → example}/example_matcher_spec.rb +23 -18
  155. data/spec/spec/example/example_methods_spec.rb +75 -0
  156. data/spec/spec/example/example_runner_spec.rb +194 -0
  157. data/spec/spec/example/example_spec.rb +53 -0
  158. data/spec/spec/example/nested_example_group_spec.rb +59 -0
  159. data/spec/spec/example/pending_module_spec.rb +31 -0
  160. data/spec/spec/{dsl → example}/predicate_matcher_spec.rb +1 -1
  161. data/spec/spec/example/shared_example_group_spec.rb +265 -0
  162. data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
  163. data/spec/spec/expectations/differs/default_spec.rb +5 -3
  164. data/spec/spec/expectations/extensions/object_spec.rb +63 -2
  165. data/spec/spec/extensions/main_spec.rb +50 -0
  166. data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +14 -0
  167. data/spec/spec/interop/test/unit/testcase_spec.rb +10 -0
  168. data/spec/spec/interop/test/unit/testcase_spec_with_test_unit.rb +20 -0
  169. data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
  170. data/spec/spec/interop/test/unit/testsuite_adapter_spec_with_test_unit.rb +34 -0
  171. data/spec/spec/matchers/be_spec.rb +15 -0
  172. data/spec/spec/matchers/change_spec.rb +87 -0
  173. data/spec/spec/matchers/description_generation_spec.rb +31 -37
  174. data/spec/spec/matchers/exist_spec.rb +31 -22
  175. data/spec/spec/matchers/handler_spec.rb +42 -1
  176. data/spec/spec/matchers/have_spec.rb +1 -1
  177. data/spec/spec/matchers/mock_constraint_matchers_spec.rb +1 -1
  178. data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
  179. data/spec/spec/matchers/simple_matcher_spec.rb +31 -0
  180. data/spec/spec/matchers/throw_symbol_spec.rb +4 -1
  181. data/spec/spec/mocks/bug_report_10263.rb +24 -0
  182. data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
  183. data/spec/spec/mocks/bug_report_8165_spec.rb +2 -2
  184. data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +1 -0
  185. data/spec/spec/mocks/mock_spec.rb +200 -102
  186. data/spec/spec/mocks/multiple_return_value_spec.rb +1 -1
  187. data/spec/spec/mocks/options_hash_spec.rb +19 -7
  188. data/spec/spec/mocks/partial_mock_spec.rb +31 -9
  189. data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +6 -0
  190. data/spec/spec/mocks/stub_spec.rb +120 -98
  191. data/spec/spec/package/bin_spec_spec.rb +7 -5
  192. data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
  193. data/spec/spec/runner/command_line_spec.rb +140 -27
  194. data/spec/spec/runner/drb_command_line_spec.rb +39 -31
  195. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +44 -0
  196. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +16 -11
  197. data/spec/spec/runner/formatter/html_formatter_spec.rb +60 -50
  198. data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
  199. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +29 -13
  200. data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
  201. data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +103 -0
  202. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +103 -39
  203. data/spec/spec/runner/formatter/story/html_formatter_spec.rb +56 -0
  204. data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +289 -0
  205. data/spec/spec/runner/heckle_runner_spec.rb +29 -14
  206. data/spec/spec/runner/heckler_spec.rb +4 -5
  207. data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +5 -5
  208. data/spec/spec/runner/option_parser_spec.rb +86 -58
  209. data/spec/spec/runner/options_spec.rb +239 -120
  210. data/spec/spec/runner/output_one_time_fixture.rb +7 -0
  211. data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
  212. data/spec/spec/runner/output_one_time_spec.rb +16 -0
  213. data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +6 -6
  214. data/spec/spec/runner/reporter_spec.rb +147 -163
  215. data/spec/spec/runner/spec_parser_spec.rb +31 -0
  216. data/spec/spec/runner_spec.rb +11 -0
  217. data/spec/spec/spec_classes.rb +12 -5
  218. data/spec/spec/story/builders.rb +46 -0
  219. data/spec/spec/story/extensions/main_spec.rb +161 -0
  220. data/spec/spec/story/extensions_spec.rb +14 -0
  221. data/spec/spec/story/given_scenario_spec.rb +27 -0
  222. data/spec/spec/story/runner/plain_text_story_runner_spec.rb +92 -0
  223. data/spec/spec/story/runner/scenario_collector_spec.rb +27 -0
  224. data/spec/spec/story/runner/scenario_runner_spec.rb +142 -0
  225. data/spec/spec/story/runner/story_mediator_spec.rb +133 -0
  226. data/spec/spec/story/runner/story_parser_spec.rb +384 -0
  227. data/spec/spec/story/runner/story_runner_spec.rb +219 -0
  228. data/spec/spec/story/runner_spec.rb +106 -0
  229. data/spec/spec/story/scenario_spec.rb +20 -0
  230. data/spec/spec/story/step_group_spec.rb +157 -0
  231. data/spec/spec/story/step_mother_spec.rb +72 -0
  232. data/spec/spec/story/step_spec.rb +147 -0
  233. data/spec/spec/story/story_helper.rb +2 -0
  234. data/spec/spec/story/story_spec.rb +86 -0
  235. data/spec/spec/story/world_spec.rb +416 -0
  236. data/spec/spec/translator_spec.rb +2 -1
  237. data/spec/spec_helper.rb +59 -2
  238. data/stories/all.rb +5 -0
  239. data/stories/example_groups/autogenerated_docstrings +26 -0
  240. data/stories/example_groups/example_group_with_should_methods +17 -0
  241. data/stories/example_groups/nested_groups +17 -0
  242. data/stories/example_groups/output +20 -0
  243. data/stories/example_groups/stories.rb +7 -0
  244. data/stories/helper.rb +6 -0
  245. data/stories/interop/examples_and_tests_together +30 -0
  246. data/stories/interop/stories.rb +7 -0
  247. data/stories/interop/test_case_with_should_methods +17 -0
  248. data/stories/pending_stories/README +3 -0
  249. data/stories/resources/helpers/cmdline.rb +9 -0
  250. data/stories/resources/helpers/story_helper.rb +16 -0
  251. data/stories/resources/matchers/smart_match.rb +37 -0
  252. data/stories/resources/spec/example_group_with_should_methods.rb +12 -0
  253. data/stories/resources/spec/simple_spec.rb +8 -0
  254. data/stories/resources/steps/running_rspec.rb +50 -0
  255. data/stories/resources/test/spec_and_test_together.rb +57 -0
  256. data/stories/resources/test/test_case_with_should_methods.rb +30 -0
  257. metadata +232 -106
  258. data/EXAMPLES.rd +0 -111
  259. data/examples/multi_threaded_behaviour_runner.rb +0 -25
  260. data/examples/shared_behaviours_example.rb +0 -39
  261. data/examples/spec_helper.rb +0 -1
  262. data/examples/test_case_adapter_example.rb +0 -26
  263. data/examples/test_case_spec.rb +0 -65
  264. data/lib/spec/dsl.rb +0 -11
  265. data/lib/spec/dsl/behaviour.rb +0 -220
  266. data/lib/spec/dsl/behaviour_callbacks.rb +0 -82
  267. data/lib/spec/dsl/behaviour_eval.rb +0 -231
  268. data/lib/spec/dsl/behaviour_factory.rb +0 -42
  269. data/lib/spec/dsl/composite_proc_builder.rb +0 -33
  270. data/lib/spec/dsl/description.rb +0 -76
  271. data/lib/spec/dsl/example.rb +0 -135
  272. data/lib/spec/dsl/example_matcher.rb +0 -40
  273. data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
  274. data/lib/spec/runner/behaviour_runner.rb +0 -123
  275. data/lib/spec/runner/extensions/kernel.rb +0 -50
  276. data/lib/spec/runner/extensions/object.rb +0 -32
  277. data/lib/spec/runner/formatter.rb +0 -9
  278. data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -29
  279. data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
  280. data/lib/spec/test_case_adapter.rb +0 -10
  281. data/spec/spec/dsl/behaviour_eval_spec.rb +0 -79
  282. data/spec/spec/dsl/behaviour_factory_spec.rb +0 -48
  283. data/spec/spec/dsl/behaviour_spec.rb +0 -661
  284. data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -44
  285. data/spec/spec/dsl/configuration_spec.rb +0 -55
  286. data/spec/spec/dsl/description_spec.rb +0 -89
  287. data/spec/spec/dsl/example_class_spec.rb +0 -24
  288. data/spec/spec/dsl/example_instance_spec.rb +0 -160
  289. data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
  290. data/spec/spec/dsl/shared_behaviour_spec.rb +0 -252
  291. data/spec/spec/runner/behaviour_runner_spec.rb +0 -229
  292. data/spec/spec/runner/context_matching_spec.rb +0 -27
  293. data/spec/spec/runner/extensions/bug_report_10577_spec.rb +0 -35
  294. data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
  295. data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -40
  296. data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -20
  297. data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +0 -36
  298. data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +0 -19
  299. data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +0 -46
  300. data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +0 -21
  301. data/spec/spec/runner/object_ext_spec.rb +0 -11
@@ -1,4 +1,5 @@
1
1
  require File.dirname(__FILE__) + '/../spec_helper.rb'
2
+ require 'spec/translator'
2
3
 
3
4
  describe "Translator" do
4
5
  before do
@@ -7,7 +8,7 @@ describe "Translator" do
7
8
 
8
9
  it "should translate files" do
9
10
  from = File.dirname(__FILE__) + '/..'
10
- to = File.dirname(__FILE__) + '/../../translated_specs'
11
+ to = "#{Dir.tmpdir}/translated_specs"
11
12
  @t.translate_dir(from, to)
12
13
  end
13
14
 
@@ -1,5 +1,4 @@
1
1
  require 'stringio'
2
- require 'rbconfig'
3
2
 
4
3
  dir = File.dirname(__FILE__)
5
4
  lib_path = File.expand_path("#{dir}/../lib")
@@ -8,9 +7,10 @@ $_spec_spec = true # Prevents Kernel.exit in various places
8
7
 
9
8
  require 'spec'
10
9
  require 'spec/mocks'
11
- require 'hpricot' # Needed to compare generated with wanted HTML
10
+ require 'spec/story'
12
11
  spec_classes_path = File.expand_path("#{dir}/../spec/spec/spec_classes")
13
12
  require spec_classes_path unless $LOAD_PATH.include?(spec_classes_path)
13
+ require File.dirname(__FILE__) + '/../lib/spec/expectations/differs/default'
14
14
 
15
15
  module Spec
16
16
  module Matchers
@@ -40,7 +40,64 @@ module Spec
40
40
  def pass
41
41
  Pass.new
42
42
  end
43
+
44
+ class CorrectlyOrderedMockExpectation
45
+ def initialize(&event)
46
+ @event = event
47
+ end
48
+
49
+ def expect(&expectations)
50
+ expectations.call
51
+ @event.call
52
+ end
53
+ end
54
+
55
+ def during(&block)
56
+ CorrectlyOrderedMockExpectation.new(&block)
57
+ end
43
58
  end
44
59
  end
45
60
 
46
61
  class NonStandardError < Exception; end
62
+
63
+ module Custom
64
+ class ExampleGroupRunner
65
+ attr_reader :options, :arg
66
+ def initialize(options, arg)
67
+ @options, @arg = options, arg
68
+ end
69
+
70
+ def load_files(files)
71
+ end
72
+
73
+ def run
74
+ end
75
+ end
76
+ end
77
+
78
+ def exception_from(&block)
79
+ exception = nil
80
+ begin
81
+ yield
82
+ rescue StandardError => e
83
+ exception = e
84
+ end
85
+ exception
86
+ end
87
+
88
+ describe "sandboxed rspec_options", :shared => true do
89
+ attr_reader :options
90
+
91
+ before(:all) do
92
+ @original_rspec_options = $rspec_options
93
+ end
94
+
95
+ before(:each) do
96
+ @options = ::Spec::Runner::Options.new(StringIO.new, StringIO.new)
97
+ $rspec_options = options
98
+ end
99
+
100
+ after do
101
+ $rspec_options = @original_rspec_options
102
+ end
103
+ end
@@ -0,0 +1,5 @@
1
+ require File.join(File.dirname(__FILE__), *%w[helper])
2
+
3
+ ["example_groups","interop"].each do |dir|
4
+ require File.join(File.dirname(__FILE__), "#{dir}/stories")
5
+ end
@@ -0,0 +1,26 @@
1
+ Story: autogenerated docstrings
2
+
3
+ As an RSpec user
4
+ I want examples to generate their own names
5
+ So that I can reduce duplication between example names and example code
6
+
7
+ Scenario: run with ruby
8
+ Given the file ../../examples/pure/autogenerated_docstrings_example.rb
9
+
10
+ When I run it with the ruby interpreter -fs
11
+
12
+ Then the stdout should match /should equal 5/
13
+ And the stdout should match /should be < 5/
14
+ And the stdout should match /should include "a"/
15
+ And the stdout should match /should respond to #size/
16
+
17
+ Scenario: run with spec
18
+ Given the file ../../examples/pure/autogenerated_docstrings_example.rb
19
+
20
+ When I run it with the spec script -fs
21
+
22
+ Then the stdout should match /should equal 5/
23
+ And the stdout should match /should be < 5/
24
+ And the stdout should match /should include "a"/
25
+ And the stdout should match /should respond to #size/
26
+
@@ -0,0 +1,17 @@
1
+ Story: Spec::ExampleGroup with should methods
2
+
3
+ As an RSpec adopter accustomed to classes and methods
4
+ I want to use should_* methods in an ExampleGroup
5
+ So that I use RSpec with classes and methods that look more like RSpec examples
6
+
7
+ Scenario: Run with ruby
8
+ Given the file spec/example_group_with_should_methods.rb
9
+ When I run it with the ruby interpreter
10
+ Then the exit code should be 256
11
+ And the stdout should match "2 examples, 1 failure"
12
+
13
+ Scenario: Run with spec
14
+ Given the file spec/example_group_with_should_methods.rb
15
+ When I run it with the spec script
16
+ Then the exit code should be 256
17
+ And the stdout should match "2 examples, 1 failure"
@@ -0,0 +1,17 @@
1
+ Story: Nested example groups
2
+
3
+ As an RSpec user
4
+ I want to nest examples groups
5
+ So that I can better organize my examples
6
+
7
+ Scenario: Run with ruby
8
+ Given the file ../../examples/pure/stack_spec_with_nested_example_groups.rb
9
+ When I run it with the ruby interpreter -fs
10
+ Then the stdout should match /Stack \(empty\)/
11
+ And the stdout should match /Stack \(full\)/
12
+
13
+ Scenario: Run with ruby
14
+ Given the file ../../examples/pure/stack_spec_with_nested_example_groups.rb
15
+ When I run it with the spec script -fs
16
+ Then the stdout should match /Stack \(empty\)/
17
+ And the stdout should match /Stack \(full\)/
@@ -0,0 +1,20 @@
1
+ Story: Getting correct output
2
+
3
+ As an RSpec user
4
+ I want to see output only once
5
+ So that I don't get confused
6
+
7
+ Scenario: Run with ruby
8
+ Given the file spec/simple_spec.rb
9
+ When I run it with the ruby interpreter
10
+ Then the exit code should be 0
11
+ And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m
12
+ And the stdout should match "1 example, 0 failures"
13
+
14
+ Scenario: Run with CommandLine object
15
+ Given the file spec/simple_spec.rb
16
+ When I run it with the CommandLine object
17
+ Then the exit code should be 0
18
+ And the stdout should not match "Loaded suite"
19
+ And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m
20
+ And the stdout should match "1 example, 0 failures"
@@ -0,0 +1,7 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. helper])
2
+
3
+ with_steps_for :running_rspec do
4
+ Dir["#{File.dirname(__FILE__)}/*"].each do |file|
5
+ run file if File.file?(file) && !(file =~ /\.rb$/)
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ $LOAD_PATH.unshift File.expand_path("#{File.dirname(__FILE__)}/../lib")
2
+ require 'spec'
3
+ require 'tempfile'
4
+ require File.join(File.dirname(__FILE__), *%w[resources matchers smart_match])
5
+ require File.join(File.dirname(__FILE__), *%w[resources helpers story_helper])
6
+ require File.join(File.dirname(__FILE__), *%w[resources steps running_rspec])
@@ -0,0 +1,30 @@
1
+ Story: Spec and test together
2
+
3
+ As an RSpec adopter with existing Test::Unit tests
4
+ I want to run a few specs alongside my existing Test::Unit tests
5
+ So that I can experience a smooth, gradual migration path
6
+
7
+ Scenario: Run with ruby
8
+ Given the file test/spec_and_test_together.rb
9
+
10
+ When I run it with the ruby interpreter -fs
11
+
12
+ Then the exit code should be 256
13
+ And the stdout should match "ATest"
14
+ And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'"
15
+ And the stdout should match "'An Example should fail with should' FAILED"
16
+ And the stdout should match "10 examples, 6 failures"
17
+ And the stdout should match /expected: 40,\s*got: 4/m
18
+ And the stdout should match /expected: 50,\s*got: 5/m
19
+ Scenario: Run with spec
20
+ Given the file test/spec_and_test_together.rb
21
+
22
+ When I run it with the spec script -fs
23
+
24
+ Then the exit code should be 256
25
+ Ands the stdout should match "ATest"
26
+ And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'"
27
+ And the stdout should match "'An Example should fail with should' FAILED"
28
+ And the stdout should match "10 examples, 6 failures"
29
+ And the stdout should match /expected: 40,\s*got: 4/m
30
+ And the stdout should match /expected: 50,\s*got: 5/m
@@ -0,0 +1,7 @@
1
+ require File.join(File.dirname(__FILE__), *%w[.. helper])
2
+
3
+ with_steps_for :running_rspec do
4
+ Dir["#{File.dirname(__FILE__)}/*"].each do |file|
5
+ run file if File.file?(file) && !(file =~ /\.rb$/)
6
+ end
7
+ end
@@ -0,0 +1,17 @@
1
+ Story: Test::Unit::TestCase extended by rspec with should methods
2
+
3
+ As an RSpec adopter with existing Test::Unit tests
4
+ I want to use should_* methods in a Test::Unit::TestCase
5
+ So that I use RSpec with classes and methods that look more like RSpec examples
6
+
7
+ Scenario: Run with ruby
8
+ Given the file test/test_case_with_should_methods.rb
9
+ When I run it with the ruby interpreter
10
+ Then PENDING the exit code should be 256
11
+ And the stdout should match "5 examples, 3 failures"
12
+
13
+ Scenario: Run with spec
14
+ Given the file test/test_case_with_should_methods.rb
15
+ When I run it with the spec script
16
+ Then the exit code should be 256
17
+ And the stdout should match "5 examples, 3 failures"
@@ -0,0 +1,3 @@
1
+ This directory contains stories that are currently not passing
2
+ because they are new or they represent regressions.
3
+
@@ -0,0 +1,9 @@
1
+ $:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib])
2
+ require 'spec'
3
+
4
+ # Uncommenting next line will break the output story (no output!!)
5
+ # rspec_options
6
+ options = Spec::Runner::OptionParser.parse(
7
+ ARGV, $stderr, $stdout
8
+ )
9
+ Spec::Runner::CommandLine.run(options)
@@ -0,0 +1,16 @@
1
+ require 'spec/story'
2
+ require File.dirname(__FILE__) + '/../../../spec/ruby_forker'
3
+
4
+ module StoryHelper
5
+ include RubyForker
6
+
7
+ def spec(args, stderr)
8
+ ruby("#{File.dirname(__FILE__) + '/../../../bin/spec'} #{args}", stderr)
9
+ end
10
+
11
+ def cmdline(args, stderr)
12
+ ruby("#{File.dirname(__FILE__) + '/../../resources/helpers/cmdline.rb'} #{args}", stderr)
13
+ end
14
+
15
+ Spec::Story::World.send :include, self
16
+ end
@@ -0,0 +1,37 @@
1
+ module Spec
2
+ module Matchers
3
+ class SmartMatch
4
+ def initialize(expected)
5
+ @expected = expected
6
+ end
7
+
8
+ def matches?(actual)
9
+ @actual = actual
10
+ # Satisfy expectation here. Return false or raise an error if it's not met.
11
+
12
+ if @expected =~ /^\/.*\/?$/ || @expected =~ /^".*"$/
13
+ regex_or_string = eval(@expected)
14
+ if Regexp === regex_or_string
15
+ (@actual =~ regex_or_string) ? true : false
16
+ else
17
+ @actual.index(regex_or_string) != nil
18
+ end
19
+ else
20
+ false
21
+ end
22
+ end
23
+
24
+ def failure_message
25
+ "expected #{@actual.inspect} to smart_match #{@expected.inspect}, but it didn't"
26
+ end
27
+
28
+ def negative_failure_message
29
+ "expected #{@actual.inspect} not to smart_match #{@expected.inspect}, but it did"
30
+ end
31
+ end
32
+
33
+ def smart_match(expected)
34
+ SmartMatch.new(expected)
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,12 @@
1
+ $:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib])
2
+ require 'spec'
3
+
4
+ class MySpec < Spec::ExampleGroup
5
+ def should_pass_with_should
6
+ 1.should == 1
7
+ end
8
+
9
+ def should_fail_with_should
10
+ 1.should == 2
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ $:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib])
2
+ require 'spec'
3
+
4
+ describe "Running an Example" do
5
+ it "should not output twice" do
6
+ true.should be_true
7
+ end
8
+ end
@@ -0,0 +1,50 @@
1
+ steps_for :running_rspec do
2
+
3
+ Given("the file $relative_path") do |relative_path|
4
+ @path = File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "resources", relative_path))
5
+ unless File.exist?(@path)
6
+ raise "could not find file at #{@path}"
7
+ end
8
+ end
9
+
10
+ When("I run it with the $interpreter") do |interpreter|
11
+ stderr_file = Tempfile.new('rspec')
12
+ stderr_file.close
13
+ @stdout = case(interpreter)
14
+ when /^ruby interpreter/
15
+ args = interpreter.gsub('ruby interpreter','')
16
+ ruby("#{@path}#{args}", stderr_file.path)
17
+ when /^spec script/
18
+ args = interpreter.gsub('spec script','')
19
+ spec("#{@path}#{args}", stderr_file.path)
20
+ when 'CommandLine object' then cmdline(@path, stderr_file.path)
21
+ else raise "Unknown interpreter: #{interpreter}"
22
+ end
23
+ @stderr = IO.read(stderr_file.path)
24
+ @exit_code = $?.to_i
25
+ end
26
+
27
+ Then("the exit code should be $exit_code") do |exit_code|
28
+ if @exit_code != exit_code.to_i
29
+ raise "Did not exit with #{exit_code}, but with #{@exit_code}. Standard error:\n#{@stderr}"
30
+ end
31
+ end
32
+
33
+ Then("the $stream should match $regex") do |stream, string_or_regex|
34
+ written = case(stream)
35
+ when 'stdout' then @stdout
36
+ when 'stderr' then @stderr
37
+ else raise "Unknown stream: #{stream}"
38
+ end
39
+ written.should smart_match(string_or_regex)
40
+ end
41
+
42
+ Then("the $stream should not match $regex") do |stream, string_or_regex|
43
+ written = case(stream)
44
+ when 'stdout' then @stdout
45
+ when 'stderr' then @stderr
46
+ else raise "Unknown stream: #{stream}"
47
+ end
48
+ written.should_not smart_match(string_or_regex)
49
+ end
50
+ end
@@ -0,0 +1,57 @@
1
+ $:.push File.join(File.dirname(__FILE__), *%w[.. .. .. lib])
2
+ require 'spec'
3
+ # TODO - this should not be necessary, ay?
4
+ require 'spec/interop/test'
5
+
6
+ describe "An Example" do
7
+ it "should pass with assert" do
8
+ assert true
9
+ end
10
+
11
+ it "should fail with assert" do
12
+ assert false
13
+ end
14
+
15
+ it "should pass with should" do
16
+ 1.should == 1
17
+ end
18
+
19
+ it "should fail with should" do
20
+ 1.should == 2
21
+ end
22
+ end
23
+
24
+ class ATest < Test::Unit::TestCase
25
+ def test_should_pass_with_assert
26
+ assert true
27
+ end
28
+
29
+ def test_should_fail_with_assert
30
+ assert false
31
+ end
32
+
33
+ def test_should_pass_with_should
34
+ 1.should == 1
35
+ end
36
+
37
+ def test_should_fail_with_should
38
+ 1.should == 2
39
+ end
40
+
41
+ def setup
42
+ @from_setup ||= 3
43
+ @from_setup += 1
44
+ end
45
+
46
+ def test_should_fail_with_setup_method_variable
47
+ @from_setup.should == 40
48
+ end
49
+
50
+ before do
51
+ @from_before = @from_setup + 1
52
+ end
53
+
54
+ def test_should_fail_with_before_block_variable
55
+ @from_before.should == 50
56
+ end
57
+ end