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
@@ -10,6 +10,10 @@ module Spec
10
10
  parser.parse(args)
11
11
  parser.options
12
12
  end
13
+
14
+ def spec_command?
15
+ $0.split('/').last == 'spec'
16
+ end
13
17
  end
14
18
 
15
19
  attr_reader :options
@@ -34,8 +38,8 @@ module Spec
34
38
  "an example name directly, causing RSpec to run just the example",
35
39
  "matching that name"],
36
40
  :specification => ["-s", "--specification [NAME]", "DEPRECATED - use -e instead", "(This will be removed when autotest works with -e)"],
37
- :line => ["-l", "--line LINE_NUMBER", Integer, "Execute behaviour or specification at given line.",
38
- "(does not work for dynamically generated specs)"],
41
+ :line => ["-l", "--line LINE_NUMBER", Integer, "Execute example group or example at given line.",
42
+ "(does not work for dynamically generated examples)"],
39
43
  :format => ["-f", "--format FORMAT[:WHERE]","Specifies what format to use for output. Specify WHERE to tell",
40
44
  "the formatter where to write the output. All built-in formats",
41
45
  "expect WHERE to be a file name, and will write to $stdout if it's",
@@ -115,10 +119,10 @@ module Spec
115
119
  on(*OPTIONS[:version]) {parse_version}
116
120
  on_tail(*OPTIONS[:help]) {parse_help}
117
121
  end
118
-
122
+
119
123
  def order!(argv, &blk)
120
124
  @argv = argv.dup
121
- @argv = (@argv.empty? && Spec.spec_command?) ? ['--help'] : @argv
125
+ @argv = (@argv.empty? && self.class.spec_command?) ? ['--help'] : @argv
122
126
  @options.argv = @argv.dup
123
127
  return if parse_generate_options
124
128
  return if parse_drb
@@ -40,7 +40,6 @@ module Spec
40
40
  :diff_format,
41
41
  :dry_run,
42
42
  :profile,
43
- :examples,
44
43
  :heckle_runner,
45
44
  :line_number,
46
45
  :loadby,
@@ -51,12 +50,10 @@ module Spec
51
50
  :user_input_for_runner,
52
51
  :error_stream,
53
52
  :output_stream,
54
- :before_suite_parts,
55
- :after_suite_parts,
56
53
  # TODO: BT - Figure out a better name
57
54
  :argv
58
55
  )
59
- attr_reader :colour, :differ_class, :files, :example_groups
56
+ attr_reader :colour, :differ_class, :files, :examples, :example_groups
60
57
 
61
58
  def initialize(error_stream, output_stream)
62
59
  @error_stream = error_stream
@@ -76,7 +73,6 @@ module Spec
76
73
  @examples_run = false
77
74
  @examples_should_be_run = nil
78
75
  @user_input_for_runner = nil
79
- @before_suite_parts = []
80
76
  @after_suite_parts = []
81
77
  end
82
78
 
@@ -123,6 +119,14 @@ module Spec
123
119
  end
124
120
  end
125
121
  end
122
+
123
+ def before_suite_parts
124
+ Spec::Example::BeforeAndAfterHooks.before_suite_parts
125
+ end
126
+
127
+ def after_suite_parts
128
+ Spec::Example::BeforeAndAfterHooks.after_suite_parts
129
+ end
126
130
 
127
131
  def examples_run?
128
132
  @examples_run
@@ -130,7 +134,17 @@ module Spec
130
134
 
131
135
  def examples_should_not_be_run
132
136
  @examples_should_be_run = false
133
- end
137
+ end
138
+
139
+ def predicate_matchers
140
+ # TODO - don't like this dependency - perhaps store these in here instead?
141
+ Spec::Runner.configuration.predicate_matchers
142
+ end
143
+
144
+ def mock_framework
145
+ # TODO - don't like this dependency - perhaps store this in here instead?
146
+ Spec::Runner.configuration.mock_framework
147
+ end
134
148
 
135
149
  def colour=(colour)
136
150
  @colour = colour
@@ -163,7 +177,7 @@ module Spec
163
177
 
164
178
  def parse_example(example)
165
179
  if(File.file?(example))
166
- @examples = File.open(example).read.split("\n")
180
+ @examples = [File.open(example).read.split("\n")].flatten
167
181
  else
168
182
  @examples = [example]
169
183
  end
@@ -209,11 +223,8 @@ module Spec
209
223
  end
210
224
 
211
225
  def number_of_examples
212
- total = 0
213
- @example_groups.each do |example_group|
214
- total += example_group.number_of_examples
215
- end
216
- total
226
+ return examples.size unless examples.empty?
227
+ @example_groups.inject(0) {|sum, group| sum + group.number_of_examples}
217
228
  end
218
229
 
219
230
  def files_to_load
@@ -232,6 +243,10 @@ module Spec
232
243
  result
233
244
  end
234
245
 
246
+ def dry_run?
247
+ @dry_run == true
248
+ end
249
+
235
250
  protected
236
251
  def examples_should_be_run?
237
252
  return @examples_should_be_run unless @examples_should_be_run.nil?
@@ -265,7 +280,7 @@ module Spec
265
280
  def custom_runner
266
281
  return nil unless custom_runner?
267
282
  klass_name, arg = ClassAndArgumentsParser.parse(user_input_for_runner)
268
- runner_type = load_class(klass_name, 'behaviour runner', '--runner')
283
+ runner_type = load_class(klass_name, 'example group runner', '--runner')
269
284
  return runner_type.new(self, arg)
270
285
  end
271
286
 
@@ -299,7 +314,7 @@ module Spec
299
314
  error_stream.puts "You must specify one file, not a directory when using the --line option"
300
315
  exit(1) if stderr?
301
316
  else
302
- example = SpecParser.new.spec_name_for(files[0], line_number)
317
+ example = SpecParser.new(self).spec_name_for(files[0], line_number)
303
318
  @examples = [example]
304
319
  end
305
320
  else
@@ -159,7 +159,7 @@ module Spec
159
159
 
160
160
  protected
161
161
  def example_name
162
- @example.__full_description
162
+ @example.full_description
163
163
  end
164
164
  end
165
165
  end
@@ -4,15 +4,16 @@ module Spec
4
4
  class SpecParser
5
5
  attr_reader :best_match
6
6
 
7
- def initialize
7
+ def initialize(run_options)
8
8
  @best_match = {}
9
+ @run_options = run_options
9
10
  end
10
11
 
11
12
  def spec_name_for(file, line_number)
12
13
  best_match.clear
13
14
  file = File.expand_path(file)
14
- Spec::Runner.options.example_groups.each do |example_group|
15
- consider_example_groups_for_best_match example_group, file, line_number
15
+ @run_options.example_groups.each do |example_group|
16
+ consider_example_group_for_best_match example_group, file, line_number
16
17
 
17
18
  example_group.examples.each do |example|
18
19
  consider_example_for_best_match example, example_group, file, line_number
@@ -31,8 +32,8 @@ module Spec
31
32
 
32
33
  protected
33
34
 
34
- def consider_example_groups_for_best_match(example_group, file, line_number)
35
- parsed_backtrace = parse_backtrace(example_group.registration_backtrace)
35
+ def consider_example_group_for_best_match(example_group, file, line_number)
36
+ parsed_backtrace = parse_backtrace(example_group.backtrace)
36
37
  parsed_backtrace.each do |example_file, example_line|
37
38
  if is_best_match?(file, line_number, example_file, example_line)
38
39
  best_match.clear
@@ -43,7 +44,7 @@ module Spec
43
44
  end
44
45
 
45
46
  def consider_example_for_best_match(example, example_group, file, line_number)
46
- parsed_backtrace = parse_backtrace(example.implementation_backtrace)
47
+ parsed_backtrace = parse_backtrace(example.backtrace)
47
48
  parsed_backtrace.each do |example_file, example_line|
48
49
  if is_best_match?(file, line_number, example_file, example_line)
49
50
  best_match.clear
@@ -61,9 +62,10 @@ module Spec
61
62
  end
62
63
 
63
64
  def parse_backtrace(backtrace)
64
- backtrace.collect do |trace_line|
65
- split_line = trace_line.split(':')
66
- [split_line[0], Integer(split_line[1])]
65
+ Array(backtrace).collect do |trace_line|
66
+ trace_line =~ /(.*)\:(\d*)(\:|$)/
67
+ file, number = $1, $2
68
+ [file, Integer(number)]
67
69
  end
68
70
  end
69
71
  end
@@ -8,52 +8,50 @@ require 'spec/story/runner/plain_text_story_runner.rb'
8
8
  module Spec
9
9
  module Story
10
10
  module Runner
11
- class << self
12
- def run_options # :nodoc:
13
- Spec::Runner.options
14
- end
15
-
16
- def story_runner # :nodoc:
17
- unless @story_runner
18
- @story_runner = create_story_runner
19
- run_options.story_formatters.each do |formatter|
20
- register_listener(formatter)
21
- end
22
- self.register_exit_hook
23
- end
24
- @story_runner
25
- end
26
-
27
- def scenario_runner # :nodoc:
28
- @scenario_runner ||= ScenarioRunner.new
29
- end
30
-
31
- def world_creator # :nodoc:
32
- @world_creator ||= World
33
- end
34
-
35
- def create_story_runner
36
- Runner::StoryRunner.new(scenario_runner, world_creator)
37
- end
38
-
39
- # Use this to register a customer output formatter.
40
- def register_listener(listener)
41
- story_runner.add_listener(listener) # run_started, story_started, story_ended, #run_ended
42
- world_creator.add_listener(listener) # found_scenario, step_succeeded, step_failed, step_failed
43
- scenario_runner.add_listener(listener) # scenario_started, scenario_succeeded, scenario_pending, scenario_failed
44
- end
45
-
46
- def register_exit_hook # :nodoc:
47
- at_exit do
48
- exit Runner.story_runner.run_stories unless $!
11
+ def self.run_options # :nodoc:
12
+ Spec::Runner.options
13
+ end
14
+
15
+ def self.story_runner # :nodoc:
16
+ unless @story_runner
17
+ @story_runner = create_story_runner
18
+ run_options.story_formatters.each do |formatter|
19
+ register_listener(formatter)
49
20
  end
21
+ self.register_exit_hook
50
22
  end
51
-
52
- def dry_run
53
- run_options.dry_run
23
+ @story_runner
24
+ end
25
+
26
+ def self.scenario_runner # :nodoc:
27
+ @scenario_runner ||= ScenarioRunner.new
28
+ end
29
+
30
+ def self.world_creator # :nodoc:
31
+ @world_creator ||= World
32
+ end
33
+
34
+ def self.create_story_runner
35
+ Runner::StoryRunner.new(scenario_runner, world_creator)
36
+ end
37
+
38
+ # Use this to register a customer output formatter.
39
+ def self.register_listener(listener)
40
+ story_runner.add_listener(listener) # run_started, story_started, story_ended, #run_ended
41
+ world_creator.add_listener(listener) # found_scenario, step_succeeded, step_failed, step_failed
42
+ scenario_runner.add_listener(listener) # scenario_started, scenario_succeeded, scenario_pending, scenario_failed
43
+ end
44
+
45
+ def self.register_exit_hook # :nodoc:
46
+ at_exit do
47
+ exit Runner.story_runner.run_stories unless $!
54
48
  end
55
-
56
49
  end
50
+
51
+ def self.dry_run
52
+ run_options.dry_run
53
+ end
54
+
57
55
  end
58
56
  end
59
57
  end
@@ -2,12 +2,16 @@ module Spec
2
2
  module Story
3
3
  module Runner
4
4
  class StoryRunner
5
- class << self
6
- attr_accessor :current_story_runner
7
-
8
- def scenario_from_current_story(scenario_name)
9
- current_story_runner.scenario_from_current_story(scenario_name)
10
- end
5
+ def self.current_story_runner
6
+ @current_story_runner
7
+ end
8
+
9
+ def self.current_story_runner=(current_story_runner)
10
+ @current_story_runner = current_story_runner
11
+ end
12
+
13
+ def self.scenario_from_current_story(scenario_name)
14
+ current_story_runner.scenario_from_current_story(scenario_name)
11
15
  end
12
16
 
13
17
  attr_accessor :stories, :scenarios, :current_story
@@ -15,82 +15,78 @@ module Spec
15
15
  module World
16
16
  include ::Spec::Example::Pending
17
17
  include ::Spec::Matchers
18
- # store steps and listeners in the singleton metaclass.
19
- # This serves both to keep them out of the way of runtime Worlds
20
- # and to make them available to all instances.
21
- class << self
22
- def create(cls = Object, *args)
23
- cls.new(*args).extend(World)
24
- end
25
-
26
- def listeners
27
- @listeners ||= []
28
- end
29
-
30
- def add_listener(listener)
31
- listeners() << listener
32
- end
33
-
34
- def step_mother
35
- @step_mother ||= StepMother.new
36
- end
37
-
38
- def use(steps)
39
- step_mother.use(steps)
40
- end
41
-
42
- def step_names
43
- @step_names ||= []
44
- end
45
18
 
46
- def run_given_scenario_with_suspended_listeners(world, type, name, scenario)
47
- current_listeners = Array.new(listeners)
48
- begin
49
- listeners.each { |l| l.found_scenario(type, name) }
50
- @listeners.clear
51
- scenario.perform(world, name) unless dry_run
52
- ensure
53
- @listeners.replace(current_listeners)
54
- end
55
- end
56
-
57
- def store_and_call(world, type, name, *args, &block)
58
- if block_given?
59
- step_mother.store(type, Step.new(name, &block))
60
- end
61
- step = step_mother.find(type, name)
19
+ def self.create(cls = Object, *args)
20
+ cls.new(*args).extend(World)
21
+ end
22
+
23
+ def self.listeners
24
+ @listeners ||= []
25
+ end
26
+
27
+ def self.add_listener(listener)
28
+ listeners() << listener
29
+ end
30
+
31
+ def self.step_mother
32
+ @step_mother ||= StepMother.new
33
+ end
34
+
35
+ def self.use(steps)
36
+ step_mother.use(steps)
37
+ end
38
+
39
+ def self.step_names
40
+ @step_names ||= []
41
+ end
62
42
 
63
- step_name = step.name
64
- step_names << step_name
65
-
66
- # It's important to have access to the parsed args here, so
67
- # we can give them to the listeners. The HTML reporter needs
68
- # the args so it can style them. See the generated output in
69
- # story_server/prototype/rspec_stories.html (generated by rake stories)
70
- args = step.parse_args(name) if args.empty?
71
- begin
72
- listeners.each { |l| l.step_upcoming(type, step_name, *args) }
73
- step.perform(world, *args) unless dry_run
74
- listeners.each { |l| l.step_succeeded(type, step_name, *args) }
75
- rescue Exception => e
76
- case e
77
- when Spec::Example::ExamplePendingError
78
- @listeners.each { |l| l.step_pending(type, step_name, *args) }
79
- else
80
- @listeners.each { |l| l.step_failed(type, step_name, *args) }
81
- end
82
- errors << e
83
- end
43
+ def self.run_given_scenario_with_suspended_listeners(world, type, name, scenario)
44
+ current_listeners = Array.new(listeners)
45
+ begin
46
+ listeners.each { |l| l.found_scenario(type, name) }
47
+ @listeners.clear
48
+ scenario.perform(world, name) unless dry_run
49
+ ensure
50
+ @listeners.replace(current_listeners)
84
51
  end
85
-
86
- def errors
87
- @errors ||= []
52
+ end
53
+
54
+ def self.store_and_call(world, type, name, *args, &block)
55
+ if block_given?
56
+ step_mother.store(type, Step.new(name, &block))
88
57
  end
58
+ step = step_mother.find(type, name)
59
+
60
+ step_name = step.name
61
+ step_names << step_name
89
62
 
90
- def dry_run
91
- ::Spec::Story::Runner.dry_run
63
+ # It's important to have access to the parsed args here, so
64
+ # we can give them to the listeners. The HTML reporter needs
65
+ # the args so it can style them. See the generated output in
66
+ # story_server/prototype/rspec_stories.html (generated by rake stories)
67
+ args = step.parse_args(name) if args.empty?
68
+ begin
69
+ listeners.each { |l| l.step_upcoming(type, step_name, *args) }
70
+ step.perform(world, *args) unless dry_run
71
+ listeners.each { |l| l.step_succeeded(type, step_name, *args) }
72
+ rescue Exception => e
73
+ case e
74
+ when Spec::Example::ExamplePendingError
75
+ @listeners.each { |l| l.step_pending(type, step_name, *args) }
76
+ else
77
+ @listeners.each { |l| l.step_failed(type, step_name, *args) }
78
+ end
79
+ errors << e
92
80
  end
93
- end # end of class << self
81
+ end
82
+
83
+ def self.errors
84
+ @errors ||= []
85
+ end
86
+
87
+ def self.dry_run
88
+ ::Spec::Story::Runner.dry_run
89
+ end
94
90
 
95
91
  def start_collecting_errors
96
92
  errors.clear