rspec 1.1.12 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (267) hide show
  1. data/.autotest +2 -1
  2. data/.document +7 -0
  3. data/History.txt +58 -0
  4. data/License.txt +1 -1
  5. data/Manifest.txt +45 -82
  6. data/README.txt +3 -6
  7. data/Rakefile +33 -13
  8. data/Ruby1.9.markdown +32 -0
  9. data/TODO.txt +10 -4
  10. data/Upgrade.markdown +63 -0
  11. data/bin/spec +1 -1
  12. data/cucumber.yml +3 -0
  13. data/examples/failing/{failing_autogenerated_docstrings_example.rb → failing_implicit_docstrings_example.rb} +0 -0
  14. data/examples/failing/pending_example.rb +9 -0
  15. data/examples/failing/spec_helper.rb +1 -1
  16. data/examples/passing/{custom_expectation_matchers.rb → custom_matchers.rb} +0 -0
  17. data/examples/passing/filtered_formatter.rb +18 -0
  18. data/examples/passing/filtered_formatter_example.rb +31 -0
  19. data/examples/passing/implicit_docstrings_example.rb +18 -0
  20. data/examples/passing/spec_helper.rb +1 -1
  21. data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +17 -18
  22. data/features/before_and_after_blocks/before_and_after_blocks.feature +4 -4
  23. data/features/example_groups/example_group_with_should_methods.feature +1 -1
  24. data/features/example_groups/{autogenerated_docstrings.feature → implicit_docstrings.feature} +7 -9
  25. data/features/example_groups/nested_groups.feature +1 -1
  26. data/features/heckle/heckle.feature +56 -0
  27. data/features/interop/examples_and_tests_together.feature +1 -1
  28. data/features/interop/test_but_not_test_unit.feature +1 -1
  29. data/features/interop/test_case_with_should_methods.feature +1 -1
  30. data/features/matchers/create_matcher.feature +115 -0
  31. data/features/mock_framework_integration/use_flexmock.feature +22 -4
  32. data/features/mock_framework_integration/use_mocha.feature +27 -0
  33. data/features/mock_framework_integration/use_rr.feature +27 -0
  34. data/features/mocks/mix_stubs_and_mocks.feature +22 -0
  35. data/features/pending/pending_examples.feature +81 -0
  36. data/features/step_definitions/running_rspec.rb +5 -3
  37. data/features/support/env.rb +1 -1
  38. data/features/support/matchers/smart_match.rb +2 -2
  39. data/lib/autotest/rspec.rb +1 -1
  40. data/lib/spec.rb +1 -1
  41. data/lib/{adapters → spec/adapters}/mock_frameworks/flexmock.rb +0 -0
  42. data/lib/{adapters → spec/adapters}/mock_frameworks/mocha.rb +0 -0
  43. data/lib/{adapters → spec/adapters}/mock_frameworks/rr.rb +0 -0
  44. data/lib/{adapters → spec/adapters}/mock_frameworks/rspec.rb +0 -1
  45. data/lib/spec/autorun.rb +3 -0
  46. data/lib/spec/dsl.rb +3 -1
  47. data/lib/spec/dsl/matchers.rb +13 -0
  48. data/lib/spec/example.rb +4 -0
  49. data/lib/spec/example/before_and_after_hooks.rb +5 -20
  50. data/lib/spec/example/errors.rb +3 -3
  51. data/lib/spec/example/example_description.rb +15 -0
  52. data/lib/spec/example/example_group.rb +0 -15
  53. data/lib/spec/example/example_group_factory.rb +34 -46
  54. data/lib/spec/example/example_group_hierarchy.rb +53 -0
  55. data/lib/spec/example/example_group_methods.rb +101 -211
  56. data/lib/spec/example/example_methods.rb +61 -81
  57. data/lib/spec/example/module_reopening_fix.rb +23 -1
  58. data/lib/spec/example/pending.rb +3 -2
  59. data/lib/spec/example/predicate_matchers.rb +47 -0
  60. data/lib/spec/example/subject.rb +91 -0
  61. data/lib/spec/expectations.rb +1 -1
  62. data/lib/spec/expectations/differs/default.rb +0 -1
  63. data/lib/spec/expectations/extensions.rb +0 -1
  64. data/lib/spec/expectations/handler.rb +13 -6
  65. data/lib/spec/interop/test.rb +5 -0
  66. data/lib/spec/interop/test/unit/testcase.rb +5 -22
  67. data/lib/spec/matchers.rb +22 -8
  68. data/lib/spec/matchers/be.rb +4 -9
  69. data/lib/spec/matchers/be_close.rb +20 -5
  70. data/lib/spec/matchers/be_instance_of.rb +45 -0
  71. data/lib/spec/matchers/be_kind_of.rb +45 -0
  72. data/lib/spec/matchers/change.rb +8 -6
  73. data/lib/spec/matchers/compatibility.rb +14 -0
  74. data/lib/spec/matchers/eql.rb +24 -6
  75. data/lib/spec/matchers/equal.rb +24 -6
  76. data/lib/spec/matchers/exist.rb +21 -5
  77. data/lib/spec/matchers/extensions/instance_exec.rb +25 -0
  78. data/lib/spec/matchers/generated_descriptions.rb +2 -2
  79. data/lib/spec/matchers/has.rb +28 -11
  80. data/lib/spec/matchers/have.rb +2 -2
  81. data/lib/spec/matchers/include.rb +2 -2
  82. data/lib/spec/matchers/match.rb +25 -7
  83. data/lib/spec/matchers/match_array.rb +3 -3
  84. data/lib/spec/matchers/matcher.rb +51 -0
  85. data/lib/spec/matchers/method_missing.rb +2 -2
  86. data/lib/spec/matchers/operator_matcher.rb +12 -5
  87. data/lib/spec/matchers/raise_error.rb +3 -3
  88. data/lib/spec/matchers/respond_to.rb +3 -3
  89. data/lib/spec/matchers/satisfy.rb +7 -7
  90. data/lib/spec/matchers/throw_symbol.rb +3 -5
  91. data/lib/spec/mocks.rb +3 -3
  92. data/lib/spec/mocks/argument_expectation.rb +15 -15
  93. data/lib/spec/mocks/{argument_constraints.rb → argument_matchers.rb} +19 -23
  94. data/lib/spec/mocks/error_generator.rb +5 -8
  95. data/lib/spec/mocks/framework.rb +1 -1
  96. data/lib/spec/mocks/message_expectation.rb +5 -13
  97. data/lib/spec/mocks/mock.rb +4 -5
  98. data/lib/spec/mocks/proxy.rb +9 -5
  99. data/lib/spec/mocks/spec_methods.rb +10 -1
  100. data/lib/spec/rake/spectask.rb +0 -1
  101. data/lib/spec/runner.rb +6 -28
  102. data/lib/spec/runner/configuration.rb +3 -3
  103. data/lib/spec/runner/drb_command_line.rb +2 -1
  104. data/lib/spec/runner/example_group_runner.rb +3 -2
  105. data/lib/spec/runner/formatter/base_text_formatter.rb +34 -19
  106. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +3 -5
  107. data/lib/spec/runner/formatter/html_formatter.rb +2 -3
  108. data/lib/spec/runner/formatter/nested_text_formatter.rb +7 -25
  109. data/lib/spec/runner/formatter/progress_bar_formatter.rb +1 -1
  110. data/lib/spec/runner/formatter/snippet_extractor.rb +1 -1
  111. data/lib/spec/runner/formatter/specdoc_formatter.rb +1 -7
  112. data/lib/spec/runner/heckle_runner.rb +3 -6
  113. data/lib/spec/runner/heckle_runner_unsupported.rb +1 -1
  114. data/lib/spec/runner/option_parser.rb +19 -21
  115. data/lib/spec/runner/options.rb +32 -27
  116. data/lib/spec/runner/reporter.rb +8 -9
  117. data/lib/spec/test/unit.rb +10 -0
  118. data/lib/spec/version.rb +2 -2
  119. data/{features/support → resources}/helpers/cmdline.rb +2 -2
  120. data/resources/rake/verify_rcov.rake +1 -1
  121. data/resources/spec/example_group_with_should_methods.rb +1 -1
  122. data/resources/spec/simple_spec.rb +1 -1
  123. data/resources/test/spec_and_test_together.rb +2 -3
  124. data/resources/test/spec_including_test_but_not_unit.rb +1 -1
  125. data/resources/test/test_case_with_should_methods.rb +2 -3
  126. data/spec/autotest/autotest_helper.rb +0 -1
  127. data/spec/autotest/rspec_spec.rb +95 -98
  128. data/spec/spec/dsl/main_spec.rb +3 -3
  129. data/spec/spec/dsl/matchers_spec.rb +25 -0
  130. data/spec/spec/example/example_group_class_definition_spec.rb +14 -15
  131. data/spec/spec/example/example_group_factory_spec.rb +31 -44
  132. data/spec/spec/example/example_group_methods_spec.rb +86 -52
  133. data/spec/spec/example/example_group_spec.rb +32 -79
  134. data/spec/spec/example/example_matcher_spec.rb +10 -10
  135. data/spec/spec/example/example_methods_spec.rb +108 -242
  136. data/spec/spec/example/nested_example_group_spec.rb +2 -2
  137. data/spec/spec/example/pending_module_spec.rb +66 -41
  138. data/spec/spec/example/shared_example_group_spec.rb +4 -4
  139. data/spec/spec/{matchers → expectations}/handler_spec.rb +52 -4
  140. data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +2 -2
  141. data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +2 -2
  142. data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +2 -2
  143. data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +2 -2
  144. data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +2 -2
  145. data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +2 -2
  146. data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +2 -2
  147. data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +2 -2
  148. data/spec/spec/interop/test/unit/testcase_spec.rb +0 -4
  149. data/spec/spec/matchers/be_close_spec.rb +1 -1
  150. data/spec/spec/matchers/be_instance_of_spec.rb +29 -0
  151. data/spec/spec/matchers/be_kind_of_spec.rb +29 -0
  152. data/spec/spec/matchers/change_spec.rb +20 -0
  153. data/spec/spec/matchers/compatibility_spec.rb +34 -0
  154. data/spec/spec/matchers/description_generation_spec.rb +0 -12
  155. data/spec/spec/matchers/eql_spec.rb +2 -2
  156. data/spec/spec/matchers/equal_spec.rb +2 -2
  157. data/spec/spec/matchers/exist_spec.rb +8 -4
  158. data/spec/spec/matchers/have_spec.rb +4 -4
  159. data/spec/spec/matchers/match_spec.rb +2 -2
  160. data/spec/spec/matchers/matcher_methods_spec.rb +1 -1
  161. data/spec/spec/matchers/matcher_spec.rb +97 -0
  162. data/spec/spec/matchers/throw_symbol_spec.rb +8 -8
  163. data/spec/spec/mocks/{bug_report_496.rb → bug_report_496_spec.rb} +0 -0
  164. data/spec/spec/mocks/{failing_mock_argument_constraints_spec.rb → failing_argument_matchers_spec.rb} +2 -2
  165. data/spec/spec/mocks/hash_including_matcher_spec.rb +4 -4
  166. data/spec/spec/mocks/hash_not_including_matcher_spec.rb +3 -3
  167. data/spec/spec/mocks/mock_spec.rb +27 -2
  168. data/spec/spec/mocks/nil_expectation_warning_spec.rb +1 -1
  169. data/spec/spec/mocks/partial_mock_spec.rb +18 -3
  170. data/spec/spec/mocks/{passing_mock_argument_constraints_spec.rb → passing_argument_matchers_spec.rb} +6 -6
  171. data/spec/spec/mocks/stubbed_message_expectations_spec.rb +13 -1
  172. data/spec/spec/package/bin_spec_spec.rb +2 -2
  173. data/spec/spec/runner/configuration_spec.rb +12 -12
  174. data/spec/spec/runner/drb_command_line_spec.rb +71 -73
  175. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +82 -1
  176. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +8 -8
  177. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +4 -4
  178. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +8 -8
  179. data/spec/spec/runner/formatter/html_formatted-1.8.7.html +38 -26
  180. data/spec/spec/runner/formatter/html_formatted-1.9.1.html +61 -53
  181. data/spec/spec/runner/formatter/html_formatter_spec.rb +100 -48
  182. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +20 -34
  183. data/spec/spec/runner/formatter/profile_formatter_spec.rb +2 -1
  184. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +9 -6
  185. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +6 -6
  186. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +20 -20
  187. data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +38 -26
  188. data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +55 -47
  189. data/spec/spec/runner/formatter/{spec_mate_formatter_spec.rb → text_mate_formatter_spec.rb} +11 -9
  190. data/spec/spec/runner/heckle_runner_spec.rb +1 -1
  191. data/spec/spec/runner/heckler_spec.rb +1 -1
  192. data/spec/spec/runner/option_parser_spec.rb +28 -11
  193. data/spec/spec/runner/options_spec.rb +34 -0
  194. data/spec/spec/runner/reporter_spec.rb +66 -62
  195. data/spec/spec/runner/resources/utf8_encoded.rb +1 -0
  196. data/spec/spec/runner/spec_drb.opts +1 -0
  197. data/spec/spec/runner_spec.rb +7 -5
  198. data/spec/spec_helper.rb +24 -2
  199. metadata +49 -90
  200. data/examples/passing/autogenerated_docstrings_example.rb +0 -25
  201. data/examples/passing/before_and_after_example.rb +0 -40
  202. data/examples/passing/behave_as_example.rb +0 -45
  203. data/examples/passing/legacy_spec.rb +0 -11
  204. data/examples/passing/priority.txt +0 -1
  205. data/features/support/helpers/story_helper.rb +0 -16
  206. data/lib/spec/expectations/extensions/string_and_symbol.rb +0 -17
  207. data/lib/spec/runner/formatter/story/html_formatter.rb +0 -174
  208. data/lib/spec/runner/formatter/story/plain_text_formatter.rb +0 -194
  209. data/lib/spec/runner/formatter/story/progress_bar_formatter.rb +0 -42
  210. data/lib/spec/story.rb +0 -10
  211. data/lib/spec/story/extensions.rb +0 -3
  212. data/lib/spec/story/extensions/main.rb +0 -86
  213. data/lib/spec/story/extensions/regexp.rb +0 -9
  214. data/lib/spec/story/extensions/string.rb +0 -9
  215. data/lib/spec/story/given_scenario.rb +0 -14
  216. data/lib/spec/story/runner.rb +0 -57
  217. data/lib/spec/story/runner/plain_text_story_runner.rb +0 -48
  218. data/lib/spec/story/runner/scenario_collector.rb +0 -18
  219. data/lib/spec/story/runner/scenario_runner.rb +0 -54
  220. data/lib/spec/story/runner/story_mediator.rb +0 -137
  221. data/lib/spec/story/runner/story_parser.rb +0 -247
  222. data/lib/spec/story/runner/story_runner.rb +0 -74
  223. data/lib/spec/story/scenario.rb +0 -14
  224. data/lib/spec/story/step.rb +0 -70
  225. data/lib/spec/story/step_group.rb +0 -89
  226. data/lib/spec/story/step_mother.rb +0 -38
  227. data/lib/spec/story/story.rb +0 -39
  228. data/lib/spec/story/world.rb +0 -124
  229. data/resources/spec/spec_with_flexmock.rb +0 -19
  230. data/rspec.gemspec +0 -32
  231. data/spec/spec/matchers/mock_constraint_matchers_spec.rb +0 -24
  232. data/spec/spec/runner/formatter/story/html_formatter_spec.rb +0 -135
  233. data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +0 -600
  234. data/spec/spec/runner/formatter/story/progress_bar_formatter_spec.rb +0 -82
  235. data/spec/spec/spec_spec.rb +0 -21
  236. data/spec/spec/story/builders.rb +0 -46
  237. data/spec/spec/story/extensions/main_spec.rb +0 -161
  238. data/spec/spec/story/extensions_spec.rb +0 -14
  239. data/spec/spec/story/given_scenario_spec.rb +0 -27
  240. data/spec/spec/story/runner/plain_text_story_runner_spec.rb +0 -90
  241. data/spec/spec/story/runner/scenario_collector_spec.rb +0 -27
  242. data/spec/spec/story/runner/scenario_runner_spec.rb +0 -214
  243. data/spec/spec/story/runner/story_mediator_spec.rb +0 -143
  244. data/spec/spec/story/runner/story_parser_spec.rb +0 -401
  245. data/spec/spec/story/runner/story_runner_spec.rb +0 -294
  246. data/spec/spec/story/runner_spec.rb +0 -93
  247. data/spec/spec/story/scenario_spec.rb +0 -18
  248. data/spec/spec/story/step_group_spec.rb +0 -157
  249. data/spec/spec/story/step_mother_spec.rb +0 -84
  250. data/spec/spec/story/step_spec.rb +0 -272
  251. data/spec/spec/story/story_helper.rb +0 -2
  252. data/spec/spec/story/story_spec.rb +0 -84
  253. data/spec/spec/story/world_spec.rb +0 -423
  254. data/story_server/prototype/javascripts/builder.js +0 -136
  255. data/story_server/prototype/javascripts/controls.js +0 -972
  256. data/story_server/prototype/javascripts/dragdrop.js +0 -976
  257. data/story_server/prototype/javascripts/effects.js +0 -1117
  258. data/story_server/prototype/javascripts/prototype.js +0 -4140
  259. data/story_server/prototype/javascripts/rspec.js +0 -149
  260. data/story_server/prototype/javascripts/scriptaculous.js +0 -58
  261. data/story_server/prototype/javascripts/slider.js +0 -276
  262. data/story_server/prototype/javascripts/sound.js +0 -55
  263. data/story_server/prototype/javascripts/unittest.js +0 -568
  264. data/story_server/prototype/lib/server.rb +0 -24
  265. data/story_server/prototype/stories.html +0 -176
  266. data/story_server/prototype/stylesheets/rspec.css +0 -136
  267. data/story_server/prototype/stylesheets/test.css +0 -90
@@ -1,247 +0,0 @@
1
- module Spec
2
- module Story
3
- module Runner
4
-
5
- class IllegalStepError < StandardError
6
- def initialize(state, event)
7
- super("Illegal attempt to create a #{event} after a #{state}")
8
- end
9
- end
10
-
11
- class StoryParser
12
- def initialize(story_mediator)
13
- @story_mediator = story_mediator
14
- @current_story_lines = []
15
- transition_to(:starting_state)
16
- end
17
-
18
- def parse(lines)
19
- lines.reject! {|line| line == ""}
20
- until lines.empty?
21
- process_line(lines.shift)
22
- end
23
- @state.eof
24
- end
25
-
26
- def process_line(line)
27
- line.strip!
28
- case line
29
- when /^#/ then @state.comment(line)
30
- when /^Story: / then @state.story(line)
31
- when /^Scenario: / then @state.scenario(line)
32
- when /^Given:? / then @state.given(line)
33
- when /^GivenScenario:? / then @state.given_scenario(line)
34
- when /^When:? / then @state.event(line)
35
- when /^Then:? / then @state.outcome(line)
36
- when /^And:? / then @state.one_more_of_the_same(line)
37
- else @state.other(line)
38
- end
39
- end
40
-
41
- def init_story(title)
42
- @current_story_lines.clear
43
- add_story_line(title)
44
- end
45
-
46
- def add_story_line(line)
47
- @current_story_lines << line
48
- end
49
-
50
- def create_story()
51
- unless @current_story_lines.empty?
52
- @story_mediator.create_story(@current_story_lines[0].gsub("Story: ",""), @current_story_lines[1..-1].join("\n"))
53
- @current_story_lines.clear
54
- end
55
- end
56
-
57
- def create_scenario(title)
58
- @story_mediator.create_scenario(title.gsub("Scenario: ",""))
59
- end
60
-
61
- def create_given(name)
62
- @story_mediator.create_given(name)
63
- end
64
-
65
- def create_given_scenario(name)
66
- @story_mediator.create_given_scenario(name)
67
- end
68
-
69
- def create_when(name)
70
- @story_mediator.create_when(name)
71
- end
72
-
73
- def create_then(name)
74
- @story_mediator.create_then(name)
75
- end
76
-
77
- def add_to_last(line)
78
- @story_mediator.add_to_last("\n#{line}")
79
- end
80
-
81
- def transition_to(key)
82
- @state = states[key]
83
- end
84
-
85
- def states
86
- @states ||= {
87
- :starting_state => StartingState.new(self),
88
- :story_state => StoryState.new(self),
89
- :scenario_state => ScenarioState.new(self),
90
- :given_state => GivenState.new(self),
91
- :when_state => WhenState.new(self),
92
- :then_state => ThenState.new(self)
93
- }
94
- end
95
-
96
- class State
97
- def initialize(parser)
98
- @parser = parser
99
- end
100
-
101
- def story(line)
102
- @parser.init_story(line)
103
- @parser.transition_to(:story_state)
104
- end
105
-
106
- def scenario(line)
107
- @parser.create_scenario(line)
108
- @parser.transition_to(:scenario_state)
109
- end
110
-
111
- def given(line)
112
- @parser.create_given(remove_tag_from(:given, line))
113
- @parser.transition_to(:given_state)
114
- end
115
-
116
- def given_scenario(line)
117
- @parser.create_given_scenario(remove_tag_from(:givenscenario, line))
118
- @parser.transition_to(:given_state)
119
- end
120
-
121
- def event(line)
122
- @parser.create_when(remove_tag_from(:when, line))
123
- @parser.transition_to(:when_state)
124
- end
125
-
126
- def outcome(line)
127
- @parser.create_then(remove_tag_from(:then, line))
128
- @parser.transition_to(:then_state)
129
- end
130
-
131
- def remove_tag_from(tag, line)
132
- tokens = line.split
133
- # validation of tag can go here
134
- tokens[0].downcase.match(/#{tag.to_s}:?/) ?
135
- (tokens[1..-1].join(' ')) : line
136
- end
137
-
138
- def eof
139
- end
140
-
141
- def other(line)
142
- # no-op - supports header text before the first story in a file
143
- end
144
-
145
- def comment(line)
146
- end
147
- end
148
-
149
- class StartingState < State
150
- def initialize(parser)
151
- @parser = parser
152
- end
153
- end
154
-
155
- class StoryState < State
156
- def one_more_of_the_same(line)
157
- other(line)
158
- end
159
-
160
- def story(line)
161
- @parser.create_story
162
- @parser.add_story_line(line)
163
- end
164
-
165
- def scenario(line)
166
- @parser.create_story
167
- @parser.create_scenario(line)
168
- @parser.transition_to(:scenario_state)
169
- end
170
-
171
- def given(line)
172
- other(line)
173
- end
174
-
175
- def event(line)
176
- other(line)
177
- end
178
-
179
- def outcome(line)
180
- other(line)
181
- end
182
-
183
- def other(line)
184
- @parser.add_story_line(line)
185
- end
186
-
187
- def eof
188
- @parser.create_story
189
- end
190
- end
191
-
192
- class ScenarioState < State
193
- def one_more_of_the_same(line)
194
- raise IllegalStepError.new("Scenario", "And")
195
- end
196
-
197
- def scenario(line)
198
- @parser.create_scenario(line)
199
- end
200
- end
201
-
202
- class GivenState < State
203
- def one_more_of_the_same(line)
204
- @parser.create_given(remove_tag_from(:and, line))
205
- end
206
-
207
- def given(line)
208
- @parser.create_given(remove_tag_from(:given, line))
209
- end
210
-
211
- def other(line)
212
- @parser.add_to_last(line)
213
- end
214
- end
215
-
216
- class WhenState < State
217
- def one_more_of_the_same(line)
218
- @parser.create_when(remove_tag_from(:and ,line))
219
- end
220
-
221
- def event(line)
222
- @parser.create_when(remove_tag_from(:when ,line))
223
- end
224
-
225
- def other(line)
226
- @parser.add_to_last(line)
227
- end
228
- end
229
-
230
- class ThenState < State
231
- def one_more_of_the_same(line)
232
- @parser.create_then(remove_tag_from(:and ,line))
233
- end
234
-
235
- def outcome(line)
236
- @parser.create_then(remove_tag_from(:then ,line))
237
- end
238
-
239
- def other(line)
240
- @parser.add_to_last(line)
241
- end
242
- end
243
-
244
- end
245
- end
246
- end
247
- end
@@ -1,74 +0,0 @@
1
- module Spec
2
- module Story
3
- module Runner
4
- class StoryRunner
5
- def self.current_story_runner
6
- @current_story_runner
7
- end
8
-
9
- def self.current_story_runner=(current_story_runner)
10
- @current_story_runner = current_story_runner
11
- end
12
-
13
- def self.scenario_from_current_story(scenario_name)
14
- current_story_runner.scenario_from_current_story(scenario_name)
15
- end
16
-
17
- attr_accessor :stories, :scenarios, :current_story
18
-
19
- def initialize(scenario_runner, world_creator = World)
20
- StoryRunner.current_story_runner = self
21
- @scenario_runner = scenario_runner
22
- @world_creator = world_creator
23
- @stories = []
24
- @scenarios_by_story = {}
25
- @scenarios = []
26
- @listeners = []
27
- end
28
-
29
- def Story(title, narrative, params = {}, &body)
30
- story = Story.new(title, narrative, params, &body)
31
- @stories << story
32
-
33
- # collect scenarios
34
- collector = ScenarioCollector.new(story)
35
- story.run_in(collector)
36
- @scenarios += collector.scenarios
37
- @scenarios_by_story[story.title] = collector.scenarios
38
- end
39
-
40
- def run_stories
41
- return if @stories.empty?
42
- @listeners.each { |l| l.run_started(scenarios.size) }
43
- success = true
44
- @stories.each do |story|
45
- story.assign_steps_to(World)
46
- @current_story = story
47
- @listeners.each { |l| l.story_started(story.title, story.narrative) }
48
- scenarios = @scenarios_by_story[story.title]
49
- scenarios.each do |scenario|
50
- type = story[:type] || Object
51
- args = story[:args] || []
52
- world = @world_creator.create(type, *args)
53
- success = success & @scenario_runner.run(scenario, world)
54
- end
55
- @listeners.each { |l| l.story_ended(story.title, story.narrative) }
56
- World.step_mother.clear
57
- end
58
- unique_steps = (World.step_names.collect {|n| Regexp === n ? n.source : n.to_s}).uniq.sort
59
- @listeners.each { |l| l.collected_steps(unique_steps) }
60
- @listeners.each { |l| l.run_ended }
61
- return success
62
- end
63
-
64
- def add_listener(listener)
65
- @listeners << listener
66
- end
67
-
68
- def scenario_from_current_story(scenario_name)
69
- @scenarios_by_story[@current_story.title].find {|s| s.name == scenario_name }
70
- end
71
- end
72
- end
73
- end
74
- end
@@ -1,14 +0,0 @@
1
-
2
- module Spec
3
- module Story
4
- class Scenario
5
- attr_accessor :name, :body, :story
6
-
7
- def initialize(story, name, &body)
8
- @story = story
9
- @name = name
10
- @body = body
11
- end
12
- end
13
- end
14
- end
@@ -1,70 +0,0 @@
1
- module Spec
2
- module Story
3
- class Step
4
- PARAM_PATTERN = /([^\\]|^)(\$(?!\$)\w*)/
5
- PARAM_OR_GROUP_PATTERN = /(\$(?!\$)\w*)|\(.*?\)/
6
-
7
- attr_reader :name
8
-
9
- def initialize(name, &block)
10
- init_name(name)
11
- init_expression(name)
12
- block_given? ? init_module(name, &block) : set_pending
13
- end
14
-
15
- def perform(instance, *args)
16
- raise Spec::Example::ExamplePendingError.new("Not Yet Implemented") if pending?
17
- instance.extend(@mod)
18
- instance.__send__(sanitize(@name), *args)
19
- end
20
-
21
- def matches?(name)
22
- !(name.strip =~ @expression).nil?
23
- end
24
-
25
- def parse_args(name)
26
- name.strip.match(@expression)[1..-1]
27
- end
28
-
29
- private
30
-
31
- def sanitize(a_string_or_regexp)
32
- return a_string_or_regexp.source if Regexp == a_string_or_regexp
33
- a_string_or_regexp.to_s
34
- end
35
-
36
- def init_module(name, &block)
37
- sanitized_name = sanitize(name)
38
- @mod = Module.new do
39
- define_method(sanitized_name, &block)
40
- end
41
- end
42
-
43
- def set_pending
44
- @pending = true
45
- end
46
-
47
- def pending?
48
- @pending == true
49
- end
50
-
51
- def init_name(name)
52
- @name = name
53
- end
54
-
55
- def init_expression(string_or_regexp)
56
- if String === string_or_regexp
57
- expression = string_or_regexp.dup
58
- %w<? ( ) [ ] { } ^ !>.each {|c| expression.gsub! c, "\\#{c}"}
59
- elsif Regexp === string_or_regexp
60
- expression = string_or_regexp.source
61
- end
62
- while expression =~ PARAM_PATTERN
63
- expression.sub!($2, "(.*?)")
64
- end
65
- @expression = Regexp.new("\\A#{expression}\\Z", Regexp::MULTILINE)
66
- end
67
-
68
- end
69
- end
70
- end
@@ -1,89 +0,0 @@
1
- module Spec
2
- module Story
3
-
4
- class StepGroupHash < Hash
5
- def initialize
6
- super do |h,k|
7
- h[k] = Spec::Story::StepGroup.new
8
- end
9
- end
10
- end
11
-
12
- class StepGroup
13
- def self.steps(&block)
14
- @step_group ||= StepGroup.new(false)
15
- @step_group.instance_eval(&block) if block
16
- @step_group
17
- end
18
-
19
- def initialize(init_defaults=true, &block)
20
- @hash_of_lists_of_steps = Hash.new {|h, k| h[k] = []}
21
- if init_defaults
22
- self.class.steps.add_to(self)
23
- end
24
- instance_eval(&block) if block
25
- end
26
-
27
- def find(type, name)
28
- @hash_of_lists_of_steps[type].each do |step|
29
- return step if step.matches?(name)
30
- end
31
- return nil
32
- end
33
-
34
- def GivenScenario(name, &block)
35
- create_matcher(:given_scenario, name, &block)
36
- end
37
-
38
- def Given(name, &block)
39
- create_matcher(:given, name, &block)
40
- end
41
-
42
- def When(name, &block)
43
- create_matcher(:when, name, &block)
44
- end
45
-
46
- def Then(name, &block)
47
- create_matcher(:then, name, &block)
48
- end
49
-
50
- alias :given_scenario :GivenScenario
51
- alias :given :Given
52
- alias :when :When
53
- alias :then :Then
54
-
55
- def add(type, steps)
56
- (@hash_of_lists_of_steps[type] << steps).flatten!
57
- end
58
-
59
- def clear
60
- @hash_of_lists_of_steps.clear
61
- end
62
-
63
- def empty?
64
- [:given_scenario, :given, :when, :then].each do |type|
65
- return false unless @hash_of_lists_of_steps[type].empty?
66
- end
67
- return true
68
- end
69
-
70
- def add_to(other_step_matchers)
71
- [:given_scenario, :given, :when, :then].each do |type|
72
- other_step_matchers.add(type, @hash_of_lists_of_steps[type])
73
- end
74
- end
75
-
76
- def <<(other_step_matchers)
77
- other_step_matchers.add_to(self) if other_step_matchers.respond_to?(:add_to)
78
- end
79
-
80
- # TODO - make me private
81
- def create_matcher(type, name, &block)
82
- matcher = Step.new(name, &block)
83
- @hash_of_lists_of_steps[type] << matcher
84
- matcher
85
- end
86
-
87
- end
88
- end
89
- end