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,66 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ module SharedExampleGroupExample
4
+ class OneThing
5
+ def what_things_do
6
+ "stuff"
7
+ end
8
+ end
9
+
10
+ class AnotherThing
11
+ def what_things_do
12
+ "stuff"
13
+ end
14
+ end
15
+
16
+ class YetAnotherThing
17
+ def what_things_do
18
+ "stuff"
19
+ end
20
+ end
21
+
22
+ # A SharedExampleGroup is a module, so you can assign
23
+ # it to a constant if you want ....
24
+ AllThings = shared_examples_for "All Things" do
25
+ def helper_method
26
+ "helper method"
27
+ end
28
+
29
+ it "should do what things do" do
30
+ @thing.what_things_do.should == "stuff"
31
+ end
32
+ end
33
+
34
+ # TODO - it would be nice to be able to say this instead of the above:
35
+
36
+ # class AllThings < Spec::SharedExampleGroup
37
+ # ...
38
+ # end
39
+
40
+ describe OneThing do
41
+ # ... then you can include the example group like this, which
42
+ # feels more like what you might say ...
43
+ it_should_behave_like "All Things"
44
+ before(:each) { @thing = OneThing.new }
45
+
46
+ it "should have access to helper methods defined in the shared example group" do
47
+ helper_method.should == "helper method"
48
+ end
49
+ end
50
+
51
+ describe AnotherThing do
52
+ # ... or you can include the example group like this, which
53
+ # feels more like the programming language we love.
54
+ it_should_behave_like AllThings
55
+
56
+ before(:each) { @thing = AnotherThing.new }
57
+ end
58
+
59
+ describe YetAnotherThing do
60
+ # ... or you can include the example group like this, which
61
+ # feels more like the programming language we love.
62
+ include AllThings
63
+
64
+ before(:each) { @thing = AnotherThing.new }
65
+ end
66
+ end
@@ -0,0 +1,38 @@
1
+ require File.join(File.dirname(__FILE__), *%w[spec_helper])
2
+
3
+ shared_examples_for "non-empty Stack" do
4
+
5
+ it { @stack.should_not be_empty }
6
+
7
+ it "should return the top item when sent #peek" do
8
+ @stack.peek.should == @last_item_added
9
+ end
10
+
11
+ it "should NOT remove the top item when sent #peek" do
12
+ @stack.peek.should == @last_item_added
13
+ @stack.peek.should == @last_item_added
14
+ end
15
+
16
+ it "should return the top item when sent #pop" do
17
+ @stack.pop.should == @last_item_added
18
+ end
19
+
20
+ it "should remove the top item when sent #pop" do
21
+ @stack.pop.should == @last_item_added
22
+ unless @stack.empty?
23
+ @stack.pop.should_not == @last_item_added
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+ shared_examples_for "non-full Stack" do
30
+
31
+ it { @stack.should_not be_full }
32
+
33
+ it "should add to the top when sent #push" do
34
+ @stack.push "newly added top item"
35
+ @stack.peek.should == "newly added top item"
36
+ end
37
+
38
+ end
@@ -0,0 +1,3 @@
1
+ lib_path = File.expand_path("#{File.dirname(__FILE__)}/../../lib")
2
+ $LOAD_PATH.unshift lib_path unless $LOAD_PATH.include?(lib_path)
3
+ require 'spec'
File without changes
@@ -1,40 +1,6 @@
1
1
  require File.dirname(__FILE__) + '/spec_helper'
2
2
  require File.dirname(__FILE__) + "/stack"
3
-
4
- describe "non-empty Stack", :shared => true do
5
- # NOTE that this one auto-generates the description "should not be empty"
6
- it { @stack.should_not be_empty }
7
-
8
- it "should return the top item when sent #peek" do
9
- @stack.peek.should == @last_item_added
10
- end
11
-
12
- it "should NOT remove the top item when sent #peek" do
13
- @stack.peek.should == @last_item_added
14
- @stack.peek.should == @last_item_added
15
- end
16
-
17
- it "should return the top item when sent #pop" do
18
- @stack.pop.should == @last_item_added
19
- end
20
-
21
- it "should remove the top item when sent #pop" do
22
- @stack.pop.should == @last_item_added
23
- unless @stack.empty?
24
- @stack.pop.should_not == @last_item_added
25
- end
26
- end
27
- end
28
-
29
- describe "non-full Stack", :shared => true do
30
- # NOTE that this one auto-generates the description "should not be full"
31
- it { @stack.should_not be_full }
32
-
33
- it "should add to the top when sent #push" do
34
- @stack.push "newly added top item"
35
- @stack.peek.should == "newly added top item"
36
- end
37
- end
3
+ require File.dirname(__FILE__) + '/shared_stack_examples'
38
4
 
39
5
  describe Stack, " (empty)" do
40
6
  before(:each) do
@@ -0,0 +1,67 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+ require File.dirname(__FILE__) + '/stack'
3
+ require File.dirname(__FILE__) + '/shared_stack_examples'
4
+
5
+ describe Stack do
6
+
7
+ before(:each) do
8
+ @stack = Stack.new
9
+ end
10
+
11
+ describe "(empty)" do
12
+
13
+ it { @stack.should be_empty }
14
+
15
+ it_should_behave_like "non-full Stack"
16
+
17
+ it "should complain when sent #peek" do
18
+ lambda { @stack.peek }.should raise_error(StackUnderflowError)
19
+ end
20
+
21
+ it "should complain when sent #pop" do
22
+ lambda { @stack.pop }.should raise_error(StackUnderflowError)
23
+ end
24
+
25
+ end
26
+
27
+ describe "(with one item)" do
28
+
29
+ before(:each) do
30
+ @stack.push 3
31
+ @last_item_added = 3
32
+ end
33
+
34
+ it_should_behave_like "non-empty Stack"
35
+ it_should_behave_like "non-full Stack"
36
+
37
+ end
38
+
39
+ describe "(with one item less than capacity)" do
40
+
41
+ before(:each) do
42
+ (1..9).each { |i| @stack.push i }
43
+ @last_item_added = 9
44
+ end
45
+
46
+ it_should_behave_like "non-empty Stack"
47
+ it_should_behave_like "non-full Stack"
48
+ end
49
+
50
+ describe "(full)" do
51
+
52
+ before(:each) do
53
+ (1..10).each { |i| @stack.push i }
54
+ @last_item_added = 10
55
+ end
56
+
57
+ it { @stack.should be_full }
58
+
59
+ it_should_behave_like "non-empty Stack"
60
+
61
+ it "should complain on #push" do
62
+ lambda { @stack.push Object.new }.should raise_error(StackOverflowError)
63
+ end
64
+
65
+ end
66
+
67
+ end
@@ -0,0 +1,13 @@
1
+ class Adder
2
+ def initialize
3
+ @addends = []
4
+ end
5
+
6
+ def <<(val)
7
+ @addends << val
8
+ end
9
+
10
+ def sum
11
+ @addends.inject(0) { |sum_so_far, val| sum_so_far + val }
12
+ end
13
+ end
@@ -0,0 +1,34 @@
1
+ This is a story about a calculator. The text up here above the Story: declaration
2
+ won't be processed, so you can write whatever you wish!
3
+
4
+ Story: simple addition
5
+
6
+ As an accountant
7
+ I want to add numbers
8
+ So that I can count beans
9
+
10
+ Scenario: add one plus one
11
+ Given an addend of 1
12
+ And an addend of 1
13
+
14
+ When the addends are addeds
15
+
16
+ Then the sum should be 3
17
+ And the corks should be popped
18
+
19
+ Scenario: add two plus five
20
+ Given an addend of 2
21
+ And an addend of 5
22
+
23
+ When the addends are added
24
+
25
+ Then the sum should be 7
26
+ Then it should snow
27
+
28
+ Scenario: add three more
29
+ GivenScenario add two plus five
30
+ And an addend of 3
31
+
32
+ When the addends are added
33
+
34
+ Then the sum should be 10
@@ -0,0 +1,9 @@
1
+ require File.join(File.dirname(__FILE__), "helper")
2
+ require File.join(File.dirname(__FILE__), "adder")
3
+
4
+ # with_steps_for :addition, :more_addition do
5
+ with_steps_for :addition, :more_addition do
6
+ # Then("the corks should be popped") { }
7
+ run File.expand_path(__FILE__).gsub(".rb","")
8
+ end
9
+
@@ -0,0 +1,65 @@
1
+ $:.push File.join(File.dirname(__FILE__), *%w[.. .. lib])
2
+ require 'spec'
3
+
4
+ class AdditionMatchers < Spec::Story::StepGroup
5
+ steps do |add|
6
+ add.given("an addend of $addend") do |addend|
7
+ @adder ||= Adder.new
8
+ @adder << addend.to_i
9
+ end
10
+ end
11
+ end
12
+
13
+ steps = AdditionMatchers.new do |add|
14
+ add.then("the sum should be $sum") do |sum|
15
+ @sum.should == sum.to_i
16
+ end
17
+ end
18
+
19
+ steps.when("they are added") do
20
+ @sum = @adder.sum
21
+ end
22
+
23
+ # This Story uses steps (see above) instead of blocks
24
+ # passed to Given, When and Then
25
+
26
+ Story "addition", %{
27
+ As an accountant
28
+ I want to add numbers
29
+ So that I can count some beans
30
+ }, :steps => steps do
31
+ Scenario "2 + 3" do
32
+ Given "an addend of 2"
33
+ And "an addend of 3"
34
+ When "they are added"
35
+ Then "the sum should be 5"
36
+ end
37
+
38
+ # This scenario uses GivenScenario, which silently runs
39
+ # all the steps in a previous scenario.
40
+
41
+ Scenario "add 4 more" do
42
+ GivenScenario "2 + 3"
43
+ Given "an addend of 4"
44
+ When "they are added"
45
+ Then "the sum should be 9"
46
+ end
47
+ end
48
+
49
+ # And the class that makes the story pass
50
+
51
+ class Adder
52
+ def << addend
53
+ addends << addend
54
+ end
55
+
56
+ def sum
57
+ @addends.inject(0) do |result, addend|
58
+ result + addend.to_i
59
+ end
60
+ end
61
+
62
+ def addends
63
+ @addends ||= []
64
+ end
65
+ end
@@ -0,0 +1,21 @@
1
+ John Conway's Game of Life
2
+
3
+ The Rules
4
+ ---------
5
+ The Game of Life was invented by John Conway (as you might have gathered).
6
+ The game is played on a field of cells, each of which has eight neighbors (adjacent cells).
7
+ A cell is either occupied (by an organism) or not.
8
+ The rules for deriving a generation from the previous one are these:
9
+
10
+ Survival
11
+ --------
12
+ If an occupied cell has 2 or 3 neighbors, the organism survives to the next generation.
13
+
14
+ Death
15
+ -----
16
+ If an occupied cell has 0, 1, 4, 5, 6, 7, or 8 occupied neighbors, the organism dies
17
+ (0, 1: of loneliness; 4 thru 8: of overcrowding).
18
+
19
+ Birth
20
+ -----
21
+ If an unoccupied cell has 3 occupied neighbors, it becomes occupied.
@@ -0,0 +1,6 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'lib')
2
+ $:.unshift File.join(File.dirname(__FILE__), '..')
3
+
4
+ require 'spec'
5
+ require 'behaviour/examples/examples'
6
+ require 'behaviour/stories/stories'
@@ -0,0 +1,3 @@
1
+ require 'spec'
2
+ require 'behaviour/examples/game_behaviour'
3
+ require 'behaviour/examples/grid_behaviour'
@@ -0,0 +1,35 @@
1
+ require 'life'
2
+
3
+ describe Game do
4
+ it 'should have a grid' do
5
+ # given
6
+ game = Game.new(5, 5)
7
+
8
+ # then
9
+ game.grid.should be_kind_of(Grid)
10
+ end
11
+
12
+ it 'should create a cell' do
13
+ # given
14
+ game = Game.new(2, 2)
15
+ expected_grid = Grid.from_string( 'X. ..' )
16
+
17
+ # when
18
+ game.create_at(0, 0)
19
+
20
+ # then
21
+ game.grid.should == expected_grid
22
+ end
23
+
24
+ it 'should destroy a cell' do
25
+ # given
26
+ game = Game.new(2,2)
27
+ game.grid = Grid.from_string('X. ..')
28
+
29
+ # when
30
+ game.destroy_at(0,0)
31
+
32
+ # then
33
+ game.grid.should == Grid.from_string('.. ..')
34
+ end
35
+ end
@@ -0,0 +1,66 @@
1
+ describe Grid do
2
+ it 'should be empty when created' do
3
+ # given
4
+ expected_contents = [
5
+ [0, 0, 0],
6
+ [0, 0, 0]
7
+ ]
8
+ grid = Grid.new(2, 3)
9
+
10
+ # when
11
+ contents = grid.contents
12
+
13
+ # then
14
+ contents.should == expected_contents
15
+ end
16
+
17
+ it 'should compare equal based on its contents' do
18
+ # given
19
+ grid1 = Grid.new(2, 3)
20
+ grid2 = Grid.new(2, 3)
21
+
22
+ # then
23
+ grid1.should == grid2
24
+ end
25
+
26
+ it 'should be able to replace its contents' do
27
+ # given
28
+ grid = Grid.new(2,2)
29
+ new_contents = [[0,1,0], [1,0,1]]
30
+
31
+ # when
32
+ grid.contents = new_contents
33
+
34
+ # then
35
+ grid.contents.should == new_contents
36
+ grid.rows.should == 2
37
+ grid.columns.should == 3
38
+ end
39
+
40
+ it 'should add an organism' do
41
+ # given
42
+ grid = Grid.new(2, 2)
43
+ expected = Grid.new(2, 2)
44
+ expected.contents = [[1,0],[0,0]]
45
+
46
+ # when
47
+ grid.create_at(0,0)
48
+
49
+ # then
50
+ grid.should == expected
51
+ end
52
+
53
+ it 'should create itself from a string' do
54
+ # given
55
+ expected = Grid.new 3, 3
56
+ expected.create_at(0,0)
57
+ expected.create_at(1,0)
58
+ expected.create_at(2,2)
59
+
60
+ # when
61
+ actual = Grid.from_string "X.. X.. ..X"
62
+
63
+ # then
64
+ actual.should == expected
65
+ end
66
+ end