rspec 1.1.11 → 1.1.12

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,11 +1,11 @@
1
- Story: autogenerated docstrings
1
+ Feature: autogenerated docstrings
2
2
 
3
3
  As an RSpec user
4
4
  I want examples to generate their own names
5
5
  So that I can reduce duplication between example names and example code
6
6
 
7
7
  Scenario: run passing examples with ruby
8
- Given the file ../../examples/pure/autogenerated_docstrings_example.rb
8
+ Given the file ../../examples/passing/autogenerated_docstrings_example.rb
9
9
 
10
10
  When I run it with the ruby interpreter -fs
11
11
 
@@ -15,7 +15,7 @@ Story: autogenerated docstrings
15
15
  And the stdout should match /should respond to #size/
16
16
 
17
17
  Scenario: run failing examples with ruby
18
- Given the file ../../failing_examples/failing_autogenerated_docstrings_example.rb
18
+ Given the file ../../examples/failing/failing_autogenerated_docstrings_example.rb
19
19
 
20
20
  When I run it with the ruby interpreter -fs
21
21
 
@@ -25,7 +25,7 @@ Story: autogenerated docstrings
25
25
  And the stdout should match /should not respond to #size/
26
26
 
27
27
  Scenario: run passing examples with spec
28
- Given the file ../../examples/pure/autogenerated_docstrings_example.rb
28
+ Given the file ../../examples/passing/autogenerated_docstrings_example.rb
29
29
 
30
30
  When I run it with the spec script -fs
31
31
 
@@ -35,7 +35,7 @@ Story: autogenerated docstrings
35
35
  And the stdout should match /should respond to #size/
36
36
 
37
37
  Scenario: run failing examples with spec
38
- Given the file ../../failing_examples/failing_autogenerated_docstrings_example.rb
38
+ Given the file ../../examples/failing/failing_autogenerated_docstrings_example.rb
39
39
 
40
40
  When I run it with the spec script -fs
41
41
 
@@ -1,17 +1,17 @@
1
- Story: Spec::ExampleGroup with should methods
1
+ Feature: Spec::ExampleGroup with should methods
2
2
 
3
3
  As an RSpec adopter accustomed to classes and methods
4
4
  I want to use should_* methods in an ExampleGroup
5
5
  So that I use RSpec with classes and methods that look more like RSpec examples
6
6
 
7
7
  Scenario: Run with ruby
8
- Given the file spec/example_group_with_should_methods.rb
8
+ Given the file ../../resources/spec/example_group_with_should_methods.rb
9
9
  When I run it with the ruby interpreter
10
10
  Then the exit code should be 256
11
11
  And the stdout should match "2 examples, 1 failure"
12
12
 
13
13
  Scenario: Run with spec
14
- Given the file spec/example_group_with_should_methods.rb
14
+ Given the file ../../resources/spec/example_group_with_should_methods.rb
15
15
  When I run it with the spec script
16
16
  Then the exit code should be 256
17
17
  And the stdout should match "2 examples, 1 failure"
@@ -1,17 +1,17 @@
1
- Story: Nested example groups
1
+ Feature: Nested example groups
2
2
 
3
3
  As an RSpec user
4
4
  I want to nest examples groups
5
5
  So that I can better organize my examples
6
6
 
7
7
  Scenario: Run with ruby
8
- Given the file ../../examples/pure/stack_spec_with_nested_example_groups.rb
8
+ Given the file ../../examples/passing/stack_spec_with_nested_example_groups.rb
9
9
  When I run it with the ruby interpreter -fs
10
10
  Then the stdout should match /Stack \(empty\)/
11
11
  And the stdout should match /Stack \(full\)/
12
12
 
13
- Scenario: Run with ruby
14
- Given the file ../../examples/pure/stack_spec_with_nested_example_groups.rb
13
+ Scenario: Run with spec
14
+ Given the file ../../examples/passing/stack_spec_with_nested_example_groups.rb
15
15
  When I run it with the spec script -fs
16
16
  Then the stdout should match /Stack \(empty\)/
17
17
  And the stdout should match /Stack \(full\)/
@@ -1,25 +1,20 @@
1
- Story: Getting correct output
1
+ Feature: Getting correct output
2
2
 
3
3
  As an RSpec user
4
4
  I want to see output only once
5
5
  So that I don't get confused
6
6
 
7
7
  Scenario: Run with ruby
8
- Given the file spec/simple_spec.rb
8
+ Given the file ../../resources/spec/simple_spec.rb
9
9
  When I run it with the ruby interpreter
10
10
  Then the exit code should be 0
11
11
  And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m
12
12
  And the stdout should match "1 example, 0 failures"
13
13
 
14
14
  Scenario: Run with CommandLine object
15
- Given the file spec/simple_spec.rb
15
+ Given the file ../../resources/spec/simple_spec.rb
16
16
  When I run it with the CommandLine object
17
17
  Then the exit code should be 0
18
18
  And the stdout should not match "Loaded suite"
19
19
  And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m
20
20
  And the stdout should match "1 example, 0 failures"
21
-
22
- Scenario: Tweak backtrace
23
- Given the file stories/failing_story.rb
24
- When I run it with the ruby interpreter
25
- Then the stdout should not match /\/lib\/spec\//
@@ -1,11 +1,11 @@
1
- Story: Spec and test together
1
+ Feature: Spec and test together
2
2
 
3
3
  As an RSpec adopter with existing Test::Unit tests
4
4
  I want to run a few specs alongside my existing Test::Unit tests
5
5
  So that I can experience a smooth, gradual migration path
6
6
 
7
7
  Scenario: Run with ruby
8
- Given the file test/spec_and_test_together.rb
8
+ Given the file ../../resources/test/spec_and_test_together.rb
9
9
 
10
10
  When I run it with the ruby interpreter -fs
11
11
 
@@ -16,13 +16,14 @@ Story: Spec and test together
16
16
  And the stdout should match "10 examples, 6 failures"
17
17
  And the stdout should match /expected: 40,\s*got: 4/m
18
18
  And the stdout should match /expected: 50,\s*got: 5/m
19
+
19
20
  Scenario: Run with spec
20
- Given the file test/spec_and_test_together.rb
21
+ Given the file ../../resources/test/spec_and_test_together.rb
21
22
 
22
23
  When I run it with the spec script -fs
23
24
 
24
25
  Then the exit code should be 256
25
- Ands the stdout should match "ATest"
26
+ And the stdout should match "ATest"
26
27
  And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'"
27
28
  And the stdout should match "'An Example should fail with should' FAILED"
28
29
  And the stdout should match "10 examples, 6 failures"
@@ -0,0 +1,14 @@
1
+ Story: Test is defined, but not Test::Unit
2
+
3
+ As an RSpec user who has my own library named Test (but not Test::Unit)
4
+ I want to run examples without getting Test::Unit NameErrors
5
+
6
+ Scenario: Run with ruby
7
+ Given the file ../../resources/test/spec_including_test_but_not_unit.rb
8
+ When I run it with the ruby interpreter
9
+ Then the stderr should not match "Test::Unit"
10
+
11
+ Scenario: Run with spec
12
+ Given the file ../../resources/test/spec_including_test_but_not_unit.rb
13
+ When I run it with the spec script
14
+ Then the stderr should not match "Test::Unit"
@@ -5,13 +5,13 @@ Story: Test::Unit::TestCase extended by rspec with should methods
5
5
  So that I use RSpec with classes and methods that look more like RSpec examples
6
6
 
7
7
  Scenario: Run with ruby
8
- Given the file test/test_case_with_should_methods.rb
8
+ Given the file ../../resources/test/test_case_with_should_methods.rb
9
9
  When I run it with the ruby interpreter
10
10
  Then the exit code should be 256
11
11
  And the stdout should match "5 examples, 3 failures"
12
12
 
13
13
  Scenario: Run with spec
14
- Given the file test/test_case_with_should_methods.rb
14
+ Given the file ../../resources/test/test_case_with_should_methods.rb
15
15
  When I run it with the spec script
16
16
  Then the exit code should be 256
17
17
  And the stdout should match "5 examples, 3 failures"
@@ -4,6 +4,6 @@ Story: Getting correct output with flexmock
4
4
  I want to be able to use flexmock without rspec mocks interfering
5
5
 
6
6
  Scenario: Mock with flexmock
7
- Given the file spec/spec_with_flexmock.rb
7
+ Given the file ../../resources/spec/spec_with_flexmock.rb
8
8
  When I run it with the ruby interpreter
9
9
  Then the exit code should be 0
@@ -0,0 +1,54 @@
1
+ Given /^the file (.*)$/ do |relative_path|
2
+ @path = File.expand_path(File.join(File.dirname(__FILE__), "..", "support", relative_path))
3
+ unless File.exist?(@path)
4
+ raise "could not find file at #{@path}"
5
+ end
6
+ end
7
+
8
+ Given /^the following spec:$/ do |spec|
9
+ @path = "/tmp/example_spec.rb"
10
+ File.open(@path, "w") do |f|
11
+ f.write spec
12
+ end
13
+ end
14
+
15
+ When /^I run it with the (.*)$/ do |interpreter|
16
+ stderr_file = Tempfile.new('rspec')
17
+ stderr_file.close
18
+ @stdout = case(interpreter)
19
+ when /^ruby interpreter/
20
+ args = interpreter.gsub('ruby interpreter','')
21
+ ruby("#{@path}#{args}", stderr_file.path)
22
+ when /^spec script/
23
+ args = interpreter.gsub('spec script','')
24
+ spec("#{@path}#{args}", stderr_file.path)
25
+ when 'CommandLine object' then cmdline(@path, stderr_file.path)
26
+ else raise "Unknown interpreter: #{interpreter}"
27
+ end
28
+ @stderr = IO.read(stderr_file.path)
29
+ @exit_code = $?.to_i
30
+ end
31
+
32
+ Then /^the (.*) should match (.*)$/ do |stream, string_or_regex|
33
+ written = case(stream)
34
+ when 'stdout' then @stdout
35
+ when 'stderr' then @stderr
36
+ else raise "Unknown stream: #{stream}"
37
+ end
38
+ written.should smart_match(string_or_regex)
39
+ end
40
+
41
+ Then /^the (.*) should not match (.*)$/ do |stream, string_or_regex|
42
+ written = case(stream)
43
+ when 'stdout' then @stdout
44
+ when 'stderr' then @stderr
45
+ else raise "Unknown stream: #{stream}"
46
+ end
47
+ written.should_not smart_match(string_or_regex)
48
+ end
49
+
50
+ Then /^the exit code should be (\d+)$/ do |exit_code|
51
+ if @exit_code != exit_code.to_i
52
+ raise "Did not exit with #{exit_code}, but with #{@exit_code}. Standard error:\n#{@stderr}"
53
+ end
54
+ end
@@ -0,0 +1,26 @@
1
+ require 'tempfile'
2
+ require File.dirname(__FILE__) + '/../../spec/ruby_forker'
3
+ require File.dirname(__FILE__) + '/matchers/smart_match'
4
+
5
+ $:.push File.join(File.dirname(__FILE__), "/../../lib")
6
+ require 'spec/expectations'
7
+ require 'spec/matchers'
8
+
9
+ module RspecWorld
10
+ include Spec::Expectations
11
+ include Spec::Matchers
12
+ include RubyForker
13
+
14
+ def spec(args, stderr)
15
+ ruby("#{File.dirname(__FILE__) + '/../../bin/spec'} #{args}", stderr)
16
+ end
17
+
18
+ def cmdline(args, stderr)
19
+ ruby("#{File.dirname(__FILE__) + '/helpers/cmdline.rb'} #{args}", stderr)
20
+ end
21
+ end
22
+
23
+ World do |world|
24
+ world.extend(RspecWorld)
25
+ world
26
+ end
@@ -12,5 +12,5 @@ module StoryHelper
12
12
  ruby("#{File.dirname(__FILE__) + '/../../resources/helpers/cmdline.rb'} #{args}", stderr)
13
13
  end
14
14
 
15
- Spec::Story::World.send :include, self
15
+ Spec::Story::World.__send__ :include, self
16
16
  end
@@ -6,7 +6,7 @@
6
6
  require 'flexmock/rspec'
7
7
 
8
8
  module Spec
9
- module Plugins
9
+ module Adapters
10
10
  module MockFramework
11
11
  include FlexMock::MockContainer
12
12
  def setup_mocks_for_rspec
@@ -2,7 +2,7 @@ require 'mocha/standalone'
2
2
  require 'mocha/object'
3
3
 
4
4
  module Spec
5
- module Plugins
5
+ module Adapters
6
6
  module MockFramework
7
7
  include Mocha::Standalone
8
8
  def setup_mocks_for_rspec
@@ -4,7 +4,7 @@ patterns = ::Spec::Runner::QuietBacktraceTweaker::IGNORE_PATTERNS
4
4
  patterns.push(RR::Errors::BACKTRACE_IDENTIFIER)
5
5
 
6
6
  module Spec
7
- module Plugins
7
+ module Adapters
8
8
  module MockFramework
9
9
  include RR::Extensions::InstanceMethods
10
10
  def setup_mocks_for_rspec
@@ -1,9 +1,9 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "lib", "spec", "mocks"))
1
+ require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec", "mocks"))
2
2
  require 'spec/mocks/framework'
3
3
  require 'spec/mocks/extensions'
4
4
 
5
5
  module Spec
6
- module Plugins
6
+ module Adapters
7
7
  module MockFramework
8
8
  include Spec::Mocks::ExampleMethods
9
9
  def setup_mocks_for_rspec
@@ -21,14 +21,14 @@ class Autotest::Rspec < Autotest
21
21
 
22
22
  def initialize
23
23
  super
24
- self.failed_results_re = /^\d+\)\n(?:\e\[\d*m)?(?:.*?Error in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m
24
+ self.failed_results_re = /^\d+\)\n(?:\e\[\d*m)?(?:.*?in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m
25
25
  self.completed_re = /\n(?:\e\[\d*m)?\d* examples?/m
26
26
  end
27
27
 
28
28
  def consolidate_failures(failed)
29
29
  filters = new_hash_of_arrays
30
30
  failed.each do |spec, trace|
31
- if trace =~ /\n(\.\/)?(.*spec\.rb):[\d]+:\Z?/
31
+ if trace =~ /\n(\.\/)?(.*spec\.rb):[\d]+:/
32
32
  filters[$2] << spec
33
33
  end
34
34
  end
@@ -37,7 +37,8 @@ class Autotest::Rspec < Autotest
37
37
 
38
38
  def make_test_cmd(files_to_test)
39
39
  return '' if files_to_test.empty?
40
- return "#{ruby} -S #{files_to_test.keys.flatten.join(' ')} #{add_options_if_present}"
40
+ spec_program = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'spec'))
41
+ return "#{ruby} #{spec_program} #{files_to_test.keys.flatten.join(' ')} #{add_options_if_present}"
41
42
  end
42
43
 
43
44
  def add_options_if_present # :nodoc:
@@ -1,32 +1,7 @@
1
1
  require 'spec/matchers'
2
2
  require 'spec/expectations'
3
3
  require 'spec/example'
4
- require 'spec/extensions'
5
4
  require 'spec/runner'
6
- require 'spec/adapters'
7
5
  require 'spec/version'
8
-
9
- if Object.const_defined?(:Test)
10
- require 'spec/interop/test'
11
- end
12
-
13
- module Spec
14
- class << self
15
- def run?
16
- Runner.options.examples_run?
17
- end
18
-
19
- def run
20
- return true if run?
21
- Runner.options.run_examples
22
- end
23
-
24
- def exit?
25
- !Object.const_defined?(:Test) || Test::Unit.run?
26
- end
27
-
28
- def spec_command?
29
- $0.split('/').last == 'spec'
30
- end
31
- end
32
- end
6
+ require 'spec/dsl'
7
+ require 'spec/ruby'
@@ -0,0 +1 @@
1
+ require 'spec/dsl/main'
@@ -1,5 +1,5 @@
1
1
  module Spec
2
- module Extensions
2
+ module DSL
3
3
  module Main
4
4
  # Creates and returns a class that includes the ExampleGroupMethods
5
5
  # module. Which ExampleGroup type is created depends on the directory of the file
@@ -20,10 +20,8 @@ module Spec
20
20
  # register special implementations.
21
21
  #
22
22
  def describe(*args, &block)
23
- raise ArgumentError if args.empty?
24
- raise ArgumentError unless block
25
- args << {} unless Hash === args.last
26
- args.last[:spec_path] = File.expand_path(caller(0)[1])
23
+ Spec::Example::add_spec_path_to(args)
24
+ Spec::Example::ExampleGroupFactory.assign_scope(self, args)
27
25
  Spec::Example::ExampleGroupFactory.create_example_group(*args, &block)
28
26
  end
29
27
  alias :context :describe
@@ -43,10 +41,10 @@ module Spec
43
41
  # ...
44
42
  # end
45
43
  # end
46
- def share_examples_for(name, &block)
47
- describe(name, :shared => true, &block)
44
+ def share_examples_for(*args, &block)
45
+ Spec::Example::add_spec_path_to(args)
46
+ Spec::Example::ExampleGroupFactory.create_shared_example_group(*args, &block)
48
47
  end
49
-
50
48
  alias :shared_examples_for :share_examples_for
51
49
 
52
50
  # Creates a Shared Example Group and assigns it to a constant
@@ -75,7 +73,9 @@ module Spec
75
73
  # end
76
74
  def share_as(name, &block)
77
75
  begin
78
- Object.const_set(name, share_examples_for(name, &block))
76
+ args = [name]
77
+ Spec::Example::add_spec_path_to(args)
78
+ Object.const_set(name, Spec::Example::ExampleGroupFactory.create_shared_example_group(*args, &block))
79
79
  rescue NameError => e
80
80
  raise NameError.new(e.message + "\nThe first argument to share_as must be a legal name for a constant\n")
81
81
  end
@@ -84,4 +84,4 @@ module Spec
84
84
  end
85
85
  end
86
86
 
87
- include Spec::Extensions::Main
87
+ include Spec::DSL::Main
@@ -1,3 +1,177 @@
1
+ module Spec
2
+ # == Example Groups and Code Examples
3
+ #
4
+ # A Code Example is an executable example of how a bit of code is expected
5
+ # to behave.
6
+ #
7
+ # An Example Group is a group of code examples.
8
+ #
9
+ # RSpec exposes a DSL to describe groups of examples.
10
+ #
11
+ # describe Account do
12
+ # it "should have a balance of $0" do
13
+ # account = Account.new
14
+ # account.balance.should == Money.new(0, :dollars)
15
+ # end
16
+ # end
17
+ #
18
+ # == Before and After
19
+ #
20
+ # You can use the <tt>before()</tt> and <tt>after()</tt> methods to extract
21
+ # common code within an Example Group. Both methods take an optional scope
22
+ # argument so you can run the block before :each example or before :all
23
+ # examples
24
+ #
25
+ # describe "..." do
26
+ # before :all do
27
+ # ...
28
+ # end
29
+ #
30
+ # before :each do
31
+ # ...
32
+ # end
33
+ #
34
+ # it "should do something" do
35
+ # ...
36
+ # end
37
+ #
38
+ # it "should do something else" do
39
+ # ...
40
+ # end
41
+ #
42
+ # after :each do
43
+ # ...
44
+ # end
45
+ #
46
+ # after :all do
47
+ # ...
48
+ # end
49
+ #
50
+ # end
51
+ #
52
+ # The <tt>before :each</tt> block will run before each of the examples, once
53
+ # for each example. Likewise, the <tt>after :each</tt> block will run after
54
+ # each of the examples.
55
+ #
56
+ # It is also possible to specify a <tt>before :all</tt> and <tt>after
57
+ # :all</tt> block that will run only once for each example group, before the
58
+ # first <code>before :each</code> and after the last <code>after
59
+ # :each</code> respectively. The use of these is generally discouraged,
60
+ # because it introduces dependencies between the examples. Still, it might
61
+ # prove useful for very expensive operations if you know what you are doing.
62
+ #
63
+ # == Local helper methods
64
+ #
65
+ # You can include local helper methods by simply expressing them within an
66
+ # example group:
67
+ #
68
+ # describe "..." do
69
+ #
70
+ # it "..." do
71
+ # helper_method
72
+ # end
73
+ #
74
+ # def helper_method
75
+ # ...
76
+ # end
77
+ #
78
+ # end
79
+ #
80
+ # == Included helper methods
81
+ #
82
+ # You can include helper methods in multiple example groups by expressing
83
+ # them within a module, and then including that module in your example
84
+ # groups:
85
+ #
86
+ # module AccountExampleHelperMethods
87
+ # def helper_method
88
+ # ...
89
+ # end
90
+ # end
91
+ #
92
+ # describe "A new account" do
93
+ # include AccountExampleHelperMethods
94
+ # before do
95
+ # @account = Account.new
96
+ # end
97
+ #
98
+ # it "should have a balance of $0" do
99
+ # helper_method
100
+ # @account.balance.should eql(Money.new(0, :dollars))
101
+ # end
102
+ # end
103
+ #
104
+ # == Shared Example Groups
105
+ #
106
+ # You can define a shared example group, that may be used on other groups
107
+ #
108
+ # share_examples_for "All Editions" do
109
+ # it "all editions behaviour" ...
110
+ # end
111
+ #
112
+ # describe SmallEdition do
113
+ # it_should_behave_like "All Editions"
114
+ #
115
+ # it "should do small edition stuff" do
116
+ # ...
117
+ # end
118
+ # end
119
+ #
120
+ # You can also assign the shared group to a module and include that
121
+ #
122
+ # share_as :AllEditions do
123
+ # it "should do all editions stuff" ...
124
+ # end
125
+ #
126
+ # describe SmallEdition do
127
+ # it_should_behave_like AllEditions
128
+ #
129
+ # it "should do small edition stuff" do
130
+ # ...
131
+ # end
132
+ # end
133
+ #
134
+ # And, for those of you who prefer to use something more like Ruby, you can
135
+ # just include the module directly
136
+ #
137
+ # describe SmallEdition do
138
+ # include AllEditions
139
+ #
140
+ # it "should do small edition stuff" do
141
+ # ...
142
+ # end
143
+ # end
144
+ module Example
145
+ class << self
146
+ def args_and_options(*args) # :nodoc:
147
+ with_options_from(args) do |options|
148
+ return args, options
149
+ end
150
+ end
151
+
152
+ def scope_from(*args) # :nodoc:
153
+ args[0] || :each
154
+ end
155
+
156
+ def scope_and_options(*args) # :nodoc:
157
+ args, options = args_and_options(*args)
158
+ return scope_from(*args), options
159
+ end
160
+
161
+ def add_spec_path_to(args) # :nodoc:
162
+ args << {} unless Hash === args.last
163
+ args.last[:spec_path] ||= caller(0)[2]
164
+ end
165
+
166
+ private
167
+
168
+ def with_options_from(args)
169
+ yield Hash === args.last ? args.pop : {} if block_given?
170
+ end
171
+ end
172
+ end
173
+ end
174
+
1
175
  require 'timeout'
2
176
  require 'spec/example/before_and_after_hooks'
3
177
  require 'spec/example/pending'
@@ -8,5 +182,5 @@ require 'spec/example/example_group'
8
182
  require 'spec/example/shared_example_group'
9
183
  require 'spec/example/example_group_factory'
10
184
  require 'spec/example/errors'
11
- require 'spec/example/configuration'
12
185
  require 'spec/example/example_matcher'
186
+