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,48 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module Example
5
+ class ExampleGroupSubclass < ExampleGroup
6
+ class << self
7
+ attr_accessor :examples_ran
8
+ end
9
+
10
+ @@klass_variable_set = true
11
+ CONSTANT = :foobar
12
+
13
+ before do
14
+ @instance_variable = :hello
15
+ end
16
+
17
+ it "should run" do
18
+ self.class.examples_ran = true
19
+ end
20
+
21
+ it "should have access to instance variables" do
22
+ @instance_variable.should == :hello
23
+ end
24
+
25
+ it "should have access to class variables" do
26
+ @@klass_variable_set.should == true
27
+ end
28
+
29
+ it "should have access to constants" do
30
+ CONSTANT.should == :foobar
31
+ end
32
+
33
+ it "should have access to methods defined in the Example Group" do
34
+ a_method.should == 22
35
+ end
36
+
37
+ def a_method
38
+ 22
39
+ end
40
+ end
41
+
42
+ describe ExampleGroupSubclass do
43
+ it "should run" do
44
+ ExampleGroupSubclass.examples_ran.should be_true
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,129 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module Example
5
+ describe ExampleGroupFactory, "with :foobar registered as custom type" do
6
+
7
+ before do
8
+ @example_group = Class.new(ExampleGroup)
9
+ ExampleGroupFactory.register(:foobar, @example_group)
10
+ end
11
+
12
+ after do
13
+ ExampleGroupFactory.reset
14
+ end
15
+
16
+ it "should #get the default ExampleGroup type when passed nil" do
17
+ ExampleGroupFactory.get(nil).should == ExampleGroup
18
+ end
19
+
20
+ it "should #get the default ExampleGroup for unregistered non-nil values" do
21
+ ExampleGroupFactory.get(:does_not_exist).should == ExampleGroup
22
+ end
23
+
24
+ it "should #get custom type for :foobar" do
25
+ ExampleGroupFactory.get(:foobar).should == @example_group
26
+ end
27
+
28
+ it "should #get the actual type when that is passed in" do
29
+ ExampleGroupFactory.get(@example_group).should == @example_group
30
+ end
31
+
32
+ end
33
+
34
+ describe ExampleGroupFactory, "#create_example_group" do
35
+ it "should create a uniquely named class" do
36
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group("example_group") {}
37
+ example_group.name.should =~ /Spec::Example::ExampleGroup::Subclass_\d+/
38
+ end
39
+
40
+ it "should create a Spec::Example::Example subclass by default" do
41
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group("example_group") {}
42
+ example_group.superclass.should == Spec::Example::ExampleGroup
43
+ end
44
+
45
+ it "should create a Spec::Example::Example when :type => :default" do
46
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
47
+ "example_group", :type => :default
48
+ ) {}
49
+ example_group.superclass.should == Spec::Example::ExampleGroup
50
+ end
51
+
52
+ it "should create a Spec::Example::Example when :type => :default" do
53
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
54
+ "example_group", :type => :default
55
+ ) {}
56
+ example_group.superclass.should == Spec::Example::ExampleGroup
57
+ end
58
+
59
+ it "should create specified type when :type => :something_other_than_default" do
60
+ klass = Class.new(ExampleGroup) do
61
+ def initialize(*args, &block); end
62
+ end
63
+ Spec::Example::ExampleGroupFactory.register(:something_other_than_default, klass)
64
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
65
+ "example_group", :type => :something_other_than_default
66
+ ) {}
67
+ example_group.superclass.should == klass
68
+ end
69
+
70
+ it "should create a type indicated by :spec_path" do
71
+ klass = Class.new(ExampleGroup) do
72
+ def initialize(*args, &block); end
73
+ end
74
+ Spec::Example::ExampleGroupFactory.register(:something_other_than_default, klass)
75
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
76
+ "example_group", :spec_path => "./spec/something_other_than_default/some_spec.rb"
77
+ ) {}
78
+ example_group.superclass.should == klass
79
+ end
80
+
81
+ it "should create a type indicated by :spec_path (with spec_path generated by caller on windows)" do
82
+ klass = Class.new(ExampleGroup) do
83
+ def initialize(*args, &block); end
84
+ end
85
+ Spec::Example::ExampleGroupFactory.register(:something_other_than_default, klass)
86
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
87
+ "example_group", :spec_path => "./spec\\something_other_than_default\\some_spec.rb"
88
+ ) {}
89
+ example_group.superclass.should == klass
90
+ end
91
+
92
+ it "should create and register a Spec::Example::Example if :shared => true" do
93
+ shared_example_group = Spec::Example::ExampleGroupFactory.create_example_group(
94
+ "name", :spec_path => '/blah/spec/models/blah.rb', :type => :controller, :shared => true
95
+ ) {}
96
+ shared_example_group.should be_an_instance_of(Spec::Example::SharedExampleGroup)
97
+ SharedExampleGroup.shared_example_groups.should include(shared_example_group)
98
+ end
99
+
100
+ it "should favor the :type over the :spec_path" do
101
+ klass = Class.new(ExampleGroup) do
102
+ def initialize(*args, &block); end
103
+ end
104
+ Spec::Example::ExampleGroupFactory.register(:something_other_than_default, klass)
105
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group(
106
+ "name", :spec_path => '/blah/spec/models/blah.rb', :type => :something_other_than_default
107
+ ) {}
108
+ example_group.superclass.should == klass
109
+ end
110
+
111
+ it "should register ExampleGroup by default" do
112
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group("The ExampleGroup") do
113
+ end
114
+ rspec_options.example_groups.should include(example_group)
115
+ end
116
+
117
+ it "should enable unregistering of ExampleGroups" do
118
+ example_group = Spec::Example::ExampleGroupFactory.create_example_group("The ExampleGroup") do
119
+ unregister
120
+ end
121
+ rspec_options.example_groups.should_not include(example_group)
122
+ end
123
+
124
+ after(:each) do
125
+ Spec::Example::ExampleGroupFactory.reset
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,465 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ module Spec
4
+ module Example
5
+ describe ExampleGroupMethods do
6
+ it_should_behave_like "sandboxed rspec_options"
7
+ attr_reader :example_group, :result, :reporter
8
+ before(:each) do
9
+ options.formatters << mock("formatter", :null_object => true)
10
+ options.backtrace_tweaker = mock("backtrace_tweaker", :null_object => true)
11
+ @reporter = FakeReporter.new(@options)
12
+ options.reporter = reporter
13
+ @example_group = Class.new(ExampleGroup) do
14
+ describe("ExampleGroup")
15
+ it "does nothing"
16
+ end
17
+ class << example_group
18
+ public :include
19
+ end
20
+ @result = nil
21
+ end
22
+
23
+ after(:each) do
24
+ ExampleGroup.reset
25
+ end
26
+
27
+ describe "#describe" do
28
+ attr_reader :child_example_group
29
+ before do
30
+ @child_example_group = @example_group.describe("Another ExampleGroup") do
31
+ it "should pass" do
32
+ true.should be_true
33
+ end
34
+ end
35
+ end
36
+
37
+ it "should create a subclass of the ExampleGroup when passed a block" do
38
+ child_example_group.superclass.should == @example_group
39
+ @options.example_groups.should include(child_example_group)
40
+ end
41
+
42
+ it "should not inherit examples" do
43
+ child_example_group.examples.length.should == 1
44
+ end
45
+ end
46
+
47
+ describe "#it" do
48
+ it "should should create an example instance" do
49
+ lambda {
50
+ @example_group.it("")
51
+ }.should change { @example_group.examples.length }.by(1)
52
+ end
53
+ end
54
+
55
+ describe "#xit" do
56
+ before(:each) do
57
+ Kernel.stub!(:warn)
58
+ end
59
+
60
+ it "should NOT should create an example instance" do
61
+ lambda {
62
+ @example_group.xit("")
63
+ }.should_not change(@example_group.examples, :length)
64
+ end
65
+
66
+ it "should warn that it is disabled" do
67
+ Kernel.should_receive(:warn).with("Example disabled: foo")
68
+ @example_group.xit("foo")
69
+ end
70
+ end
71
+
72
+ describe "#examples" do
73
+ it "should have Examples" do
74
+ example_group = Class.new(ExampleGroup) do
75
+ describe('example')
76
+ it "should pass" do
77
+ 1.should == 1
78
+ end
79
+ end
80
+ example_group.examples.length.should == 1
81
+ example_group.examples.first.description.should == "should pass"
82
+ end
83
+
84
+ it "should not include methods that begin with test (only when TU interop is loaded)" do
85
+ example_group = Class.new(ExampleGroup) do
86
+ describe('example')
87
+ def test_any_args(*args)
88
+ true.should be_true
89
+ end
90
+ def test_something
91
+ 1.should == 1
92
+ end
93
+ def test
94
+ raise "This is not a real test"
95
+ end
96
+ def testify
97
+ raise "This is not a real test"
98
+ end
99
+ end
100
+ example_group.examples.length.should == 0
101
+ example_group.run.should be_true
102
+ end
103
+
104
+ it "should include methods that begin with should and has an arity of 0 in suite" do
105
+ example_group = Class.new(ExampleGroup) do
106
+ describe('example')
107
+ def shouldCamelCase
108
+ true.should be_true
109
+ end
110
+ def should_any_args(*args)
111
+ true.should be_true
112
+ end
113
+ def should_something
114
+ 1.should == 1
115
+ end
116
+ def should_not_something
117
+ 1.should_not == 2
118
+ end
119
+ def should
120
+ raise "This is not a real example"
121
+ end
122
+ def should_not
123
+ raise "This is not a real example"
124
+ end
125
+ end
126
+ example_group = example_group.dup
127
+ example_group.examples.length.should == 4
128
+ descriptions = example_group.examples.collect {|example| example.description}.sort
129
+ descriptions.should include("shouldCamelCase")
130
+ descriptions.should include("should_any_args")
131
+ descriptions.should include("should_something")
132
+ descriptions.should include("should_not_something")
133
+ end
134
+
135
+ it "should not include methods that begin with test_ and has an arity > 0 in suite" do
136
+ example_group = Class.new(ExampleGroup) do
137
+ describe('example')
138
+ def test_invalid(foo)
139
+ 1.should == 1
140
+ end
141
+ def testInvalidCamelCase(foo)
142
+ 1.should == 1
143
+ end
144
+ end
145
+ example_group.examples.length.should == 0
146
+ end
147
+
148
+ it "should not include methods that begin with should_ and has an arity > 0 in suite" do
149
+ example_group = Class.new(ExampleGroup) do
150
+ describe('example')
151
+ def should_invalid(foo)
152
+ 1.should == 2
153
+ end
154
+ def shouldInvalidCamelCase(foo)
155
+ 1.should == 3
156
+ end
157
+ def should_not_invalid(foo)
158
+ 1.should == 4
159
+ end
160
+ def should_valid
161
+ 1.should == 1
162
+ end
163
+ end
164
+ example_group.examples.length.should == 1
165
+ example_group.run.should be_true
166
+ end
167
+
168
+ it "should run should_methods" do
169
+ example_group = Class.new(ExampleGroup) do
170
+ def should_valid
171
+ 1.should == 2
172
+ end
173
+ end
174
+ example_group.examples.length.should == 1
175
+ example_group.run.should be_false
176
+ end
177
+ end
178
+
179
+ describe "#set_description" do
180
+ attr_reader :example_group
181
+ before do
182
+ class << example_group
183
+ public :set_description
184
+ end
185
+ end
186
+
187
+ describe "#set_description(String)" do
188
+ before(:each) do
189
+ example_group.set_description("abc")
190
+ end
191
+
192
+ specify ".description should return the String passed into .set_description" do
193
+ example_group.description.should == "abc"
194
+ end
195
+
196
+ specify ".described_type should provide nil as its type" do
197
+ example_group.described_type.should be_nil
198
+ end
199
+ end
200
+
201
+ describe "#set_description(Type)" do
202
+ before(:each) do
203
+ example_group.set_description(ExampleGroup)
204
+ end
205
+
206
+ specify ".description should return a String representation of that type (fully qualified) as its name" do
207
+ example_group.description.should == "Spec::Example::ExampleGroup"
208
+ end
209
+
210
+ specify ".described_type should return the passed in type" do
211
+ example_group.described_type.should == Spec::Example::ExampleGroup
212
+ end
213
+ end
214
+
215
+ describe "#set_description(String, Type)" do
216
+ before(:each) do
217
+ example_group.set_description("behaving", ExampleGroup)
218
+ end
219
+
220
+ specify ".description should return String then space then Type" do
221
+ example_group.description.should == "behaving Spec::Example::ExampleGroup"
222
+ end
223
+
224
+ specify ".described_type should return the passed in type" do
225
+ example_group.described_type.should == Spec::Example::ExampleGroup
226
+ end
227
+ end
228
+
229
+ describe "#set_description(Type, String not starting with a space)" do
230
+ before(:each) do
231
+ example_group.set_description(ExampleGroup, "behaving")
232
+ end
233
+
234
+ specify ".description should return the Type then space then String" do
235
+ example_group.description.should == "Spec::Example::ExampleGroup behaving"
236
+ end
237
+ end
238
+
239
+ describe "#set_description(Type, String starting with .)" do
240
+ before(:each) do
241
+ example_group.set_description(ExampleGroup, ".behaving")
242
+ end
243
+
244
+ specify ".description should return the Type then String" do
245
+ example_group.description.should == "Spec::Example::ExampleGroup.behaving"
246
+ end
247
+ end
248
+
249
+ describe "#set_description(Type, String containing .)" do
250
+ before(:each) do
251
+ example_group.set_description(ExampleGroup, "calling a.b")
252
+ end
253
+
254
+ specify ".description should return the Type then space then String" do
255
+ example_group.description.should == "Spec::Example::ExampleGroup calling a.b"
256
+ end
257
+ end
258
+
259
+ describe "#set_description(Type, String starting with .)" do
260
+ before(:each) do
261
+ example_group.set_description(ExampleGroup, ".behaving")
262
+ end
263
+
264
+ specify "should return the Type then String" do
265
+ example_group.description.should == "Spec::Example::ExampleGroup.behaving"
266
+ end
267
+ end
268
+
269
+ describe "#set_description(Type, String containing .)" do
270
+ before(:each) do
271
+ example_group.set_description(ExampleGroup, "is #1")
272
+ end
273
+
274
+ specify ".description should return the Type then space then String" do
275
+ example_group.description.should == "Spec::Example::ExampleGroup is #1"
276
+ end
277
+ end
278
+
279
+ describe "#set_description(String, Type, String)" do
280
+ before(:each) do
281
+ example_group.set_description("A", Hash, "with one entry")
282
+ end
283
+
284
+ specify ".description should return the first String then space then Type then second String" do
285
+ example_group.description.should == "A Hash with one entry"
286
+ end
287
+ end
288
+
289
+ describe "#set_description(Hash representing options)" do
290
+ before(:each) do
291
+ example_group.set_description(:a => "b", :spec_path => "blah")
292
+ end
293
+
294
+ it ".spec_path should expand the passed in :spec_path option passed into the constructor" do
295
+ example_group.spec_path.should == File.expand_path("blah")
296
+ end
297
+ end
298
+ end
299
+
300
+ describe "#description" do
301
+ it "should return the same description instance for each call" do
302
+ example_group.description.should eql(example_group.description)
303
+ end
304
+
305
+ it "should not add a space when description_text begins with #" do
306
+ child_example_group = Class.new(example_group) do
307
+ describe("#foobar", "Does something")
308
+ end
309
+ child_example_group.description.should == "ExampleGroup#foobar Does something"
310
+ end
311
+
312
+ it "should not add a space when description_text begins with ." do
313
+ child_example_group = Class.new(example_group) do
314
+ describe(".foobar", "Does something")
315
+ end
316
+ child_example_group.description.should == "ExampleGroup.foobar Does something"
317
+ end
318
+ end
319
+
320
+ describe "#description_parts" do
321
+ it "should return an Array of the current class description args" do
322
+ example_group.description_parts.should == [example_group.description]
323
+ end
324
+
325
+ it "should return an Array of the description args from each class in the hierarchy" do
326
+ child_example_group = Class.new(example_group)
327
+ child_example_group.describe("Child", ExampleGroup)
328
+ child_example_group.description.should_not be_empty
329
+
330
+ grand_child_example_group = Class.new(child_example_group)
331
+ grand_child_example_group.describe("GrandChild", ExampleGroup)
332
+ grand_child_example_group.description.should_not be_empty
333
+
334
+ grand_child_example_group.description_parts.should == [
335
+ "ExampleGroup",
336
+ "Child",
337
+ Spec::Example::ExampleGroup,
338
+ "GrandChild",
339
+ Spec::Example::ExampleGroup
340
+ ]
341
+ end
342
+ end
343
+
344
+ describe "#described_type" do
345
+ it "should return passed in type" do
346
+ child_example_group = Class.new(example_group) do
347
+ describe Object
348
+ end
349
+ child_example_group.described_type.should == Object
350
+ end
351
+
352
+ it "should return #described_type of superclass when no passed in type" do
353
+ parent_example_group = Class.new(ExampleGroup) do
354
+ describe Object, "#foobar"
355
+ end
356
+ child_example_group = Class.new(parent_example_group) do
357
+ describe "not a type"
358
+ end
359
+ child_example_group.described_type.should == Object
360
+ end
361
+ end
362
+
363
+ describe "#remove_after" do
364
+ it "should unregister a given after(:each) block" do
365
+ after_all_ran = false
366
+ @example_group.it("example") {}
367
+ proc = Proc.new { after_all_ran = true }
368
+ ExampleGroup.after(:each, &proc)
369
+ @example_group.run
370
+ after_all_ran.should be_true
371
+
372
+ after_all_ran = false
373
+ ExampleGroup.remove_after(:each, &proc)
374
+ @example_group.run
375
+ after_all_ran.should be_false
376
+ end
377
+ end
378
+
379
+ describe "#include" do
380
+ it "should have accessible class methods from included module" do
381
+ mod1_method_called = false
382
+ mod1 = Module.new do
383
+ class_methods = Module.new do
384
+ define_method :mod1_method do
385
+ mod1_method_called = true
386
+ end
387
+ end
388
+
389
+ metaclass.class_eval do
390
+ define_method(:included) do |receiver|
391
+ receiver.extend class_methods
392
+ end
393
+ end
394
+ end
395
+
396
+ mod2_method_called = false
397
+ mod2 = Module.new do
398
+ class_methods = Module.new do
399
+ define_method :mod2_method do
400
+ mod2_method_called = true
401
+ end
402
+ end
403
+
404
+ metaclass.class_eval do
405
+ define_method(:included) do |receiver|
406
+ receiver.extend class_methods
407
+ end
408
+ end
409
+ end
410
+
411
+ @example_group.include mod1, mod2
412
+
413
+ @example_group.mod1_method
414
+ @example_group.mod2_method
415
+ mod1_method_called.should be_true
416
+ mod2_method_called.should be_true
417
+ end
418
+ end
419
+
420
+ describe "#number_of_examples" do
421
+ it "should count number of specs" do
422
+ proc do
423
+ @example_group.it("one") {}
424
+ @example_group.it("two") {}
425
+ @example_group.it("three") {}
426
+ @example_group.it("four") {}
427
+ end.should change {@example_group.number_of_examples}.by(4)
428
+ end
429
+ end
430
+
431
+ describe "#class_eval" do
432
+ it "should allow constants to be defined" do
433
+ example_group = Class.new(ExampleGroup) do
434
+ describe('example')
435
+ FOO = 1
436
+ it "should reference FOO" do
437
+ FOO.should == 1
438
+ end
439
+ end
440
+ example_group.run
441
+ Object.const_defined?(:FOO).should == false
442
+ end
443
+ end
444
+
445
+ describe '#register' do
446
+ it "should add ExampleGroup to set of ExampleGroups to be run" do
447
+ example_group.register
448
+ options.example_groups.should include(example_group)
449
+ end
450
+ end
451
+
452
+ describe '#unregister' do
453
+ before do
454
+ example_group.register
455
+ options.example_groups.should include(example_group)
456
+ end
457
+
458
+ it "should remove ExampleGroup from set of ExampleGroups to be run" do
459
+ example_group.unregister
460
+ options.example_groups.should_not include(example_group)
461
+ end
462
+ end
463
+ end
464
+ end
465
+ end