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
@@ -0,0 +1,711 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module Example
5
+ class ExampleModuleScopingSpec < ExampleGroup
6
+ describe ExampleGroup, "via a class definition"
7
+
8
+ module Foo
9
+ module Bar
10
+ def self.loaded?
11
+ true
12
+ end
13
+ end
14
+ end
15
+ include Foo
16
+
17
+ it "should understand module scoping" do
18
+ Bar.should be_loaded
19
+ end
20
+
21
+ @@foo = 1
22
+
23
+ it "should allow class variables to be defined" do
24
+ @@foo.should == 1
25
+ end
26
+ end
27
+
28
+ class ExampleClassVariablePollutionSpec < ExampleGroup
29
+ describe ExampleGroup, "via a class definition without a class variable"
30
+
31
+ it "should not retain class variables from other Example classes" do
32
+ proc do
33
+ @@foo
34
+ end.should raise_error
35
+ end
36
+ end
37
+
38
+ describe ExampleGroup, "#pending" do
39
+ it "should raise a Pending error when its block fails" do
40
+ block_ran = false
41
+ lambda {
42
+ pending("something") do
43
+ block_ran = true
44
+ raise "something wrong with my example"
45
+ end
46
+ }.should raise_error(Spec::Example::ExamplePendingError, "something")
47
+ block_ran.should == true
48
+ end
49
+
50
+ it "should raise Spec::Example::PendingExampleFixedError when its block does not fail" do
51
+ block_ran = false
52
+ lambda {
53
+ pending("something") do
54
+ block_ran = true
55
+ end
56
+ }.should raise_error(Spec::Example::PendingExampleFixedError, "Expected pending 'something' to fail. No Error was raised.")
57
+ block_ran.should == true
58
+ end
59
+ end
60
+
61
+ describe ExampleGroup, "#run with failure in example", :shared => true do
62
+ it "should add an example failure to the TestResult" do
63
+ example_group.run.should be_false
64
+ end
65
+ end
66
+
67
+ describe ExampleGroup, "#run" do
68
+ it_should_behave_like "sandboxed rspec_options"
69
+ attr_reader :example_group, :formatter, :reporter
70
+ before :each do
71
+ @formatter = mock("formatter", :null_object => true)
72
+ options.formatters << formatter
73
+ options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true)
74
+ @reporter = FakeReporter.new(options)
75
+ options.reporter = reporter
76
+ @example_group = Class.new(ExampleGroup) do
77
+ describe("example")
78
+ it "does nothing" do
79
+ end
80
+ end
81
+ class << example_group
82
+ public :include
83
+ end
84
+ end
85
+
86
+ after :each do
87
+ ExampleGroup.reset
88
+ end
89
+
90
+ it "should not run when there are no examples" do
91
+ example_group = Class.new(ExampleGroup) do
92
+ describe("Foobar")
93
+ end
94
+ example_group.examples.should be_empty
95
+
96
+ reporter = mock("Reporter")
97
+ reporter.should_not_receive(:add_example_group)
98
+ example_group.run
99
+ end
100
+
101
+ describe "when before_each fails" do
102
+ before(:each) do
103
+ $example_ran = $after_each_ran = false
104
+ @example_group = describe("Foobar") do
105
+ before(:each) {raise}
106
+ it "should not be run" do
107
+ $example_ran = true
108
+ end
109
+ after(:each) do
110
+ $after_each_ran = true
111
+ end
112
+ end
113
+ end
114
+
115
+ it "should not run example block" do
116
+ example_group.run
117
+ $example_ran.should be_false
118
+ end
119
+
120
+ it "should run after_each" do
121
+ example_group.run
122
+ $after_each_ran.should be_true
123
+ end
124
+
125
+ it "should report failure location when in before_each" do
126
+ reporter.should_receive(:example_finished) do |example_group, error|
127
+ error.message.should eql("in before_each")
128
+ end
129
+ example_group.run
130
+ end
131
+ end
132
+
133
+ describe ExampleGroup, "#run on dry run" do
134
+ before do
135
+ @options.dry_run = true
136
+ end
137
+
138
+ it "should not run before(:all) or after(:all)" do
139
+ before_all_ran = false
140
+ after_all_ran = false
141
+ ExampleGroup.before(:all) { before_all_ran = true }
142
+ ExampleGroup.after(:all) { after_all_ran = true }
143
+ example_group.it("should") {}
144
+ example_group.run
145
+ before_all_ran.should be_false
146
+ after_all_ran.should be_false
147
+ end
148
+
149
+ it "should not run example" do
150
+ example_ran = false
151
+ example_group.it("should") {example_ran = true}
152
+ example_group.run
153
+ example_ran.should be_false
154
+ end
155
+ end
156
+
157
+ describe ExampleGroup, "#run with specified examples" do
158
+ attr_reader :examples_that_were_run
159
+ before do
160
+ @examples_that_were_run = []
161
+ end
162
+
163
+ describe "when specified_examples matches entire ExampleGroup" do
164
+ before do
165
+ examples_that_were_run = @examples_that_were_run
166
+ @example_group = Class.new(ExampleGroup) do
167
+ describe("the ExampleGroup")
168
+ it("should be run") do
169
+ examples_that_were_run << 'should be run'
170
+ end
171
+
172
+ it("should also be run") do
173
+ examples_that_were_run << 'should also be run'
174
+ end
175
+ end
176
+ options.examples = ["the ExampleGroup"]
177
+ end
178
+
179
+ it "should not run the Examples in the ExampleGroup" do
180
+ example_group.run
181
+ examples_that_were_run.should == ['should be run', 'should also be run']
182
+ end
183
+ end
184
+
185
+ describe ExampleGroup, "#run when specified_examples matches only Example description" do
186
+ before do
187
+ examples_that_were_run = @examples_that_were_run
188
+ @example_group = Class.new(ExampleGroup) do
189
+ describe("example")
190
+ it("should be run") do
191
+ examples_that_were_run << 'should be run'
192
+ end
193
+ end
194
+ options.examples = ["should be run"]
195
+ end
196
+
197
+ it "should not run the example" do
198
+ example_group.run
199
+ examples_that_were_run.should == ['should be run']
200
+ end
201
+ end
202
+
203
+ describe ExampleGroup, "#run when specified_examples does not match an Example description" do
204
+ before do
205
+ examples_that_were_run = @examples_that_were_run
206
+ @example_group = Class.new(ExampleGroup) do
207
+ describe("example")
208
+ it("should be something else") do
209
+ examples_that_were_run << 'should be something else'
210
+ end
211
+ end
212
+ options.examples = ["does not match anything"]
213
+ end
214
+
215
+ it "should not run the example" do
216
+ example_group.run
217
+ examples_that_were_run.should == []
218
+ end
219
+ end
220
+
221
+ describe ExampleGroup, "#run when specified_examples matches an Example description" do
222
+ before do
223
+ examples_that_were_run = @examples_that_were_run
224
+ @example_group = Class.new(ExampleGroup) do
225
+ describe("example")
226
+ it("should be run") do
227
+ examples_that_were_run << 'should be run'
228
+ end
229
+ it("should not be run") do
230
+ examples_that_were_run << 'should not be run'
231
+ end
232
+ end
233
+ options.examples = ["should be run"]
234
+ end
235
+
236
+ it "should run only the example, when there in only one" do
237
+ example_group.run
238
+ examples_that_were_run.should == ["should be run"]
239
+ end
240
+
241
+ it "should run only the one example" do
242
+ example_group.run
243
+ examples_that_were_run.should == ["should be run"] end
244
+ end
245
+ end
246
+
247
+ describe ExampleGroup, "#run with success" do
248
+ before do
249
+ @special_example_group = Class.new(ExampleGroup)
250
+ ExampleGroupFactory.register(:special, @special_example_group)
251
+ @not_special_example_group = Class.new(ExampleGroup)
252
+ ExampleGroupFactory.register(:not_special, @not_special_example_group)
253
+ end
254
+
255
+ after do
256
+ ExampleGroupFactory.reset
257
+ end
258
+
259
+ it "should send reporter add_example_group" do
260
+ example_group.run
261
+ reporter.example_groups.should == [example_group]
262
+ end
263
+
264
+ it "should run example on run" do
265
+ example_ran = false
266
+ example_group.it("should") {example_ran = true}
267
+ example_group.run
268
+ example_ran.should be_true
269
+ end
270
+
271
+ it "should run before(:all) block only once" do
272
+ before_all_run_count_run_count = 0
273
+ example_group.before(:all) {before_all_run_count_run_count += 1}
274
+ example_group.it("test") {true}
275
+ example_group.it("test2") {true}
276
+ example_group.run
277
+ before_all_run_count_run_count.should == 1
278
+ end
279
+
280
+ it "should run after(:all) block only once" do
281
+ after_all_run_count = 0
282
+ example_group.after(:all) {after_all_run_count += 1}
283
+ example_group.it("test") {true}
284
+ example_group.it("test2") {true}
285
+ example_group.run
286
+ after_all_run_count.should == 1
287
+ @reporter.rspec_verify
288
+ end
289
+
290
+ it "after(:all) should have access to all instance variables defined in before(:all)" do
291
+ context_instance_value_in = "Hello there"
292
+ context_instance_value_out = ""
293
+ example_group.before(:all) { @instance_var = context_instance_value_in }
294
+ example_group.after(:all) { context_instance_value_out = @instance_var }
295
+ example_group.it("test") {true}
296
+ example_group.run
297
+ context_instance_value_in.should == context_instance_value_out
298
+ end
299
+
300
+ it "should copy instance variables from before(:all)'s execution context into spec's execution context" do
301
+ context_instance_value_in = "Hello there"
302
+ context_instance_value_out = ""
303
+ example_group.before(:all) { @instance_var = context_instance_value_in }
304
+ example_group.it("test") {context_instance_value_out = @instance_var}
305
+ example_group.run
306
+ context_instance_value_in.should == context_instance_value_out
307
+ end
308
+
309
+ it "should not add global before callbacks for untargetted example_group" do
310
+ fiddle = []
311
+
312
+ ExampleGroup.before(:all) { fiddle << "Example.before(:all)" }
313
+ ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" }
314
+ @special_example_group.before(:each) { fiddle << "Example.before(:each, :type => :special)" }
315
+ @special_example_group.prepend_before(:each) { fiddle << "Example.prepend_before(:each, :type => :special)" }
316
+ @special_example_group.before(:all) { fiddle << "Example.before(:all, :type => :special)" }
317
+ @special_example_group.prepend_before(:all) { fiddle << "Example.prepend_before(:all, :type => :special)" }
318
+
319
+ example_group = Class.new(ExampleGroup) do
320
+ describe("I'm not special", :type => :not_special)
321
+ it "does nothing"
322
+ end
323
+ example_group.run
324
+ fiddle.should == [
325
+ 'Example.prepend_before(:all)',
326
+ 'Example.before(:all)',
327
+ ]
328
+ end
329
+
330
+ it "should add global before callbacks for targetted example_groups" do
331
+ fiddle = []
332
+
333
+ ExampleGroup.before(:all) { fiddle << "Example.before(:all)" }
334
+ ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" }
335
+ @special_example_group.before(:each) { fiddle << "special.before(:each, :type => :special)" }
336
+ @special_example_group.prepend_before(:each) { fiddle << "special.prepend_before(:each, :type => :special)" }
337
+ @special_example_group.before(:all) { fiddle << "special.before(:all, :type => :special)" }
338
+ @special_example_group.prepend_before(:all) { fiddle << "special.prepend_before(:all, :type => :special)" }
339
+ @special_example_group.append_before(:each) { fiddle << "special.append_before(:each, :type => :special)" }
340
+
341
+ example_group = Class.new(@special_example_group).describe("I'm a special example_group") {}
342
+ example_group.it("test") {true}
343
+ example_group.run
344
+ fiddle.should == [
345
+ 'Example.prepend_before(:all)',
346
+ 'Example.before(:all)',
347
+ 'special.prepend_before(:all, :type => :special)',
348
+ 'special.before(:all, :type => :special)',
349
+ 'special.prepend_before(:each, :type => :special)',
350
+ 'special.before(:each, :type => :special)',
351
+ 'special.append_before(:each, :type => :special)',
352
+ ]
353
+ end
354
+
355
+ it "should order before callbacks from global to local" do
356
+ fiddle = []
357
+ ExampleGroup.prepend_before(:all) { fiddle << "Example.prepend_before(:all)" }
358
+ ExampleGroup.before(:all) { fiddle << "Example.before(:all)" }
359
+ example_group.prepend_before(:all) { fiddle << "prepend_before(:all)" }
360
+ example_group.before(:all) { fiddle << "before(:all)" }
361
+ example_group.prepend_before(:each) { fiddle << "prepend_before(:each)" }
362
+ example_group.before(:each) { fiddle << "before(:each)" }
363
+ example_group.run
364
+ fiddle.should == [
365
+ 'Example.prepend_before(:all)',
366
+ 'Example.before(:all)',
367
+ 'prepend_before(:all)',
368
+ 'before(:all)',
369
+ 'prepend_before(:each)',
370
+ 'before(:each)'
371
+ ]
372
+ end
373
+
374
+ it "should order after callbacks from local to global" do
375
+ fiddle = []
376
+ example_group.after(:each) { fiddle << "after(:each)" }
377
+ example_group.append_after(:each) { fiddle << "append_after(:each)" }
378
+ example_group.after(:all) { fiddle << "after(:all)" }
379
+ example_group.append_after(:all) { fiddle << "append_after(:all)" }
380
+ ExampleGroup.after(:all) { fiddle << "Example.after(:all)" }
381
+ ExampleGroup.append_after(:all) { fiddle << "Example.append_after(:all)" }
382
+ example_group.run
383
+ fiddle.should == [
384
+ 'after(:each)',
385
+ 'append_after(:each)',
386
+ 'after(:all)',
387
+ 'append_after(:all)',
388
+ 'Example.after(:all)',
389
+ 'Example.append_after(:all)'
390
+ ]
391
+ end
392
+
393
+ it "should have accessible instance methods from included module" do
394
+ mod1_method_called = false
395
+ mod1 = Module.new do
396
+ define_method :mod1_method do
397
+ mod1_method_called = true
398
+ end
399
+ end
400
+
401
+ mod2_method_called = false
402
+ mod2 = Module.new do
403
+ define_method :mod2_method do
404
+ mod2_method_called = true
405
+ end
406
+ end
407
+
408
+ example_group.include mod1, mod2
409
+
410
+ example_group.it("test") do
411
+ mod1_method
412
+ mod2_method
413
+ end
414
+ example_group.run
415
+ mod1_method_called.should be_true
416
+ mod2_method_called.should be_true
417
+ end
418
+
419
+ it "should include targetted modules included using configuration" do
420
+ mod1 = Module.new
421
+ mod2 = Module.new
422
+ mod3 = Module.new
423
+ Spec::Runner.configuration.include(mod1, mod2)
424
+ Spec::Runner.configuration.include(mod3, :type => :not_special)
425
+
426
+ example_group = Class.new(@special_example_group).describe("I'm special", :type => :special) do
427
+ it "does nothing"
428
+ end
429
+ example_group.run
430
+
431
+ example_group.included_modules.should include(mod1)
432
+ example_group.included_modules.should include(mod2)
433
+ example_group.included_modules.should_not include(mod3)
434
+ end
435
+
436
+ it "should include any predicate_matchers included using configuration" do
437
+ $included_predicate_matcher_found = false
438
+ Spec::Runner.configuration.predicate_matchers[:do_something] = :does_something?
439
+ example_group = Class.new(ExampleGroup) do
440
+ describe('example')
441
+ it "should respond to do_something" do
442
+ $included_predicate_matcher_found = respond_to?(:do_something)
443
+ end
444
+ end
445
+ example_group.run
446
+ $included_predicate_matcher_found.should be(true)
447
+ end
448
+
449
+ it "should use a mock framework set up in config" do
450
+ mod = Module.new do
451
+ class << self
452
+ def included(mod)
453
+ $included_module = mod
454
+ end
455
+ end
456
+
457
+ def teardown_mocks_for_rspec
458
+ $torn_down = true
459
+ end
460
+ end
461
+
462
+ begin
463
+ $included_module = nil
464
+ $torn_down = true
465
+ Spec::Runner.configuration.mock_with mod
466
+
467
+ example_group = Class.new(ExampleGroup) do
468
+ describe('example')
469
+ it "does nothing"
470
+ end
471
+ example_group.run
472
+
473
+ $included_module.should_not be_nil
474
+ $torn_down.should == true
475
+ ensure
476
+ Spec::Runner.configuration.mock_with :rspec
477
+ end
478
+ end
479
+ end
480
+
481
+ describe ExampleGroup, "#run with pending example that has a failing assertion" do
482
+ before do
483
+ example_group.it("should be pending") do
484
+ pending("Example fails") {false.should be_true}
485
+ end
486
+ end
487
+
488
+ it "should send example_pending to formatter" do
489
+ @formatter.should_receive(:example_pending).with("example", "should be pending", "Example fails")
490
+ example_group.run
491
+ end
492
+ end
493
+
494
+ describe ExampleGroup, "#run with pending example that does not have a failing assertion" do
495
+ it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
496
+
497
+ before do
498
+ example_group.it("should be pending") do
499
+ pending("Example passes") {true.should be_true}
500
+ end
501
+ end
502
+
503
+ it "should send example_pending to formatter" do
504
+ @formatter.should_receive(:example_pending).with("example", "should be pending", "Example passes")
505
+ example_group.run
506
+ end
507
+ end
508
+
509
+ describe ExampleGroup, "#run when before(:all) fails" do
510
+ it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
511
+
512
+ before do
513
+ ExampleGroup.before(:all) { raise NonStandardError, "before(:all) failure" }
514
+ end
515
+
516
+ it "should not run any example" do
517
+ spec_ran = false
518
+ example_group.it("test") {spec_ran = true}
519
+ example_group.run
520
+ spec_ran.should be_false
521
+ end
522
+
523
+ it "should run ExampleGroup after(:all)" do
524
+ after_all_ran = false
525
+ ExampleGroup.after(:all) { after_all_ran = true }
526
+ example_group.run
527
+ after_all_ran.should be_true
528
+ end
529
+
530
+ it "should run example_group after(:all)" do
531
+ after_all_ran = false
532
+ example_group.after(:all) { after_all_ran = true }
533
+ example_group.run
534
+ after_all_ran.should be_true
535
+ end
536
+
537
+ it "should supply before(:all) as description" do
538
+ @reporter.should_receive(:failure) do |example, error|
539
+ example.description.should eql("before(:all)")
540
+ error.message.should eql("before(:all) failure")
541
+ end
542
+
543
+ example_group.it("test") {true}
544
+ example_group.run
545
+ end
546
+ end
547
+
548
+ describe ExampleGroup, "#run when before(:each) fails" do
549
+ it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
550
+
551
+ before do
552
+ ExampleGroup.before(:each) { raise NonStandardError }
553
+ end
554
+
555
+ it "should run after(:all)" do
556
+ after_all_ran = false
557
+ ExampleGroup.after(:all) { after_all_ran = true }
558
+ example_group.run
559
+ after_all_ran.should be_true
560
+ end
561
+ end
562
+
563
+ describe ExampleGroup, "#run when any example fails" do
564
+ it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
565
+
566
+ before do
567
+ example_group.it("should") { raise NonStandardError }
568
+ end
569
+
570
+ it "should run after(:all)" do
571
+ after_all_ran = false
572
+ ExampleGroup.after(:all) { after_all_ran = true }
573
+ example_group.run
574
+ after_all_ran.should be_true
575
+ end
576
+ end
577
+
578
+ describe ExampleGroup, "#run when first after(:each) block fails" do
579
+ it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
580
+
581
+ before do
582
+ class << example_group
583
+ attr_accessor :first_after_ran, :second_after_ran
584
+ end
585
+ example_group.first_after_ran = false
586
+ example_group.second_after_ran = false
587
+
588
+ example_group.after(:each) do
589
+ self.class.second_after_ran = true
590
+ end
591
+ example_group.after(:each) do
592
+ self.class.first_after_ran = true
593
+ raise "first"
594
+ end
595
+ end
596
+
597
+ it "should run second after(:each) block" do
598
+ reporter.should_receive(:example_finished) do |example, error|
599
+ example.should equal(example)
600
+ error.message.should eql("first")
601
+ end
602
+ example_group.run
603
+ example_group.first_after_ran.should be_true
604
+ example_group.second_after_ran.should be_true
605
+ end
606
+ end
607
+
608
+ describe ExampleGroup, "#run when first before(:each) block fails" do
609
+ it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
610
+
611
+ before do
612
+ class << example_group
613
+ attr_accessor :first_before_ran, :second_before_ran
614
+ end
615
+ example_group.first_before_ran = false
616
+ example_group.second_before_ran = false
617
+
618
+ example_group.before(:each) do
619
+ self.class.first_before_ran = true
620
+ raise "first"
621
+ end
622
+ example_group.before(:each) do
623
+ self.class.second_before_ran = true
624
+ end
625
+ end
626
+
627
+ it "should not run second before(:each)" do
628
+ reporter.should_receive(:example_finished) do |name, error|
629
+ error.message.should eql("first")
630
+ end
631
+ example_group.run
632
+ example_group.first_before_ran.should be_true
633
+ example_group.second_before_ran.should be_false
634
+ end
635
+ end
636
+
637
+ describe ExampleGroup, "#run when failure in after(:all)" do
638
+ it_should_behave_like "Spec::Example::ExampleGroup#run with failure in example"
639
+
640
+ before do
641
+ ExampleGroup.after(:all) { raise NonStandardError, "in after(:all)" }
642
+ end
643
+
644
+ it "should return false" do
645
+ example_group.run.should be_false
646
+ end
647
+ end
648
+ end
649
+
650
+ class ExampleSubclass < ExampleGroup
651
+ end
652
+
653
+ describe ExampleGroup, "subclasses" do
654
+ after do
655
+ ExampleGroupFactory.reset
656
+ end
657
+
658
+ it "should have access to the described_type" do
659
+ example_group = Class.new(ExampleSubclass) do
660
+ describe(Array)
661
+ end
662
+ example_group.send(:described_type).should == Array
663
+ end
664
+
665
+ it "should concat descriptions when nested" do
666
+ example_group = Class.new(ExampleSubclass) do
667
+ describe(Array)
668
+ $nested_group = describe("when empty") do
669
+ end
670
+ end
671
+ $nested_group.description.to_s.should == "Array when empty"
672
+ end
673
+ end
674
+
675
+ describe Enumerable do
676
+ def each(&block)
677
+ ["4", "2", "1"].each(&block)
678
+ end
679
+
680
+ it "should be included in examples because it is a module" do
681
+ map{|e| e.to_i}.should == [4,2,1]
682
+ end
683
+ end
684
+
685
+ describe "An", Enumerable, "as a second argument" do
686
+ def each(&block)
687
+ ["4", "2", "1"].each(&block)
688
+ end
689
+
690
+ it "should be included in examples because it is a module" do
691
+ map{|e| e.to_i}.should == [4,2,1]
692
+ end
693
+ end
694
+
695
+ describe Enumerable do
696
+ describe "as the parent of nested example groups" do
697
+ it "should be included in examples because it is a module" do
698
+ pending("need to make sure nested groups know the described type") do
699
+ map{|e| e.to_i}.should == [4,2,1]
700
+ end
701
+ end
702
+ end
703
+ end
704
+
705
+ describe String do
706
+ it"should not be included in examples because it is not a module" do
707
+ lambda{self.map}.should raise_error(NoMethodError, /undefined method `map' for/)
708
+ end
709
+ end
710
+ end
711
+ end