rbehave 0.1.0 → 0.2.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.
- data/CHANGELOG.txt +5 -0
- data/Manifest.txt +44 -17
- data/NOTES.txt +2 -7
- data/behaviour/everything.rb +1 -1
- data/behaviour/examples/{everything.rb → examples.rb} +0 -0
- data/behaviour/examples/rbehave/documenter/plain_text_documenter_behaviour.rb +1 -0
- data/behaviour/examples/rbehave/given_scenario_behaviour.rb +26 -0
- data/behaviour/examples/rbehave/runner/options_behaviour.rb +39 -0
- data/behaviour/examples/rbehave/runner/runner_behaviour.rb +39 -0
- data/behaviour/examples/rbehave/runner/story_runner_behaviour.rb +58 -2
- data/behaviour/examples/rbehave/simple_step_behaviour.rb +35 -0
- data/behaviour/examples/rbehave/step_mother_behaviour.rb +32 -0
- data/behaviour/examples/rbehave/world_behaviour.rb +44 -5
- data/behaviour/examples/rspec_adapter.rb +3 -1
- data/examples/game-of-life/.loadpath +5 -0
- data/examples/game-of-life/.project +18 -0
- data/examples/game-of-life/README.txt +21 -0
- data/examples/game-of-life/behaviour/everything.rb +2 -0
- data/examples/game-of-life/behaviour/examples/examples.rb +2 -0
- data/examples/game-of-life/behaviour/examples/game_behaviour.rb +17 -0
- data/examples/game-of-life/behaviour/examples/grid_behaviour.rb +68 -0
- data/examples/game-of-life/behaviour/examples/helper.rb +2 -0
- data/examples/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +21 -0
- data/examples/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +21 -0
- data/examples/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +42 -0
- data/examples/game-of-life/behaviour/stories/ICanCreateACell.story +42 -0
- data/examples/game-of-life/behaviour/stories/ICanKillACell.story +17 -0
- data/examples/game-of-life/behaviour/stories/TheGridWraps.story +53 -0
- data/examples/game-of-life/behaviour/stories/create_a_cell.rb +58 -0
- data/examples/game-of-life/behaviour/stories/stories.txt +22 -0
- data/examples/game-of-life/life.rb +2 -0
- data/examples/game-of-life/life/game.rb +6 -0
- data/examples/game-of-life/life/grid.rb +38 -0
- data/lib/rbehave.rb +6 -71
- data/lib/rbehave/documenter/plain_text_documenter.rb +2 -2
- data/lib/rbehave/exceptions.rb +3 -3
- data/lib/rbehave/given_scenario.rb +12 -0
- data/lib/rbehave/runner.rb +52 -0
- data/lib/rbehave/runner/options.rb +26 -0
- data/lib/rbehave/runner/story_runner.rb +26 -5
- data/lib/rbehave/simple_step.rb +14 -0
- data/lib/rbehave/step_mother.rb +19 -0
- data/lib/rbehave/story.rb +8 -3
- data/lib/rbehave/version.rb +1 -1
- data/lib/rbehave/world.rb +31 -23
- metadata +47 -19
- data/Rakefile +0 -54
data/CHANGELOG.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -1,31 +1,58 @@
|
|
1
|
-
lib/rbehave
|
1
|
+
lib/rbehave.rb
|
2
|
+
lib/rbehave/version.rb
|
3
|
+
lib/rbehave/runner/scenario_runner.rb
|
4
|
+
lib/rbehave/runner/story_runner.rb
|
5
|
+
lib/rbehave/runner/options.rb
|
6
|
+
lib/rbehave/runner/scenario_collector.rb
|
2
7
|
lib/rbehave/exceptions.rb
|
8
|
+
lib/rbehave/given_scenario.rb
|
9
|
+
lib/rbehave/runner.rb
|
10
|
+
lib/rbehave/scenario.rb
|
11
|
+
lib/rbehave/step_mother.rb
|
12
|
+
lib/rbehave/reporter/plain_text_reporter.rb
|
13
|
+
lib/rbehave/simple_step.rb
|
3
14
|
lib/rbehave/documenter/plain_text_documenter.rb
|
4
15
|
lib/rbehave/world.rb
|
5
|
-
lib/rbehave/runner/story_runner.rb
|
6
|
-
lib/rbehave/runner/scenario_collector.rb
|
7
|
-
lib/rbehave/runner/scenario_runner.rb
|
8
16
|
lib/rbehave/story.rb
|
9
|
-
lib/rbehave/version.rb
|
10
|
-
lib/rbehave/scenario.rb
|
11
|
-
lib/rbehave.rb
|
12
17
|
behaviour/everything.rb
|
13
|
-
behaviour/examples/
|
14
|
-
behaviour/examples/
|
15
|
-
behaviour/examples/
|
16
|
-
behaviour/examples/rbehave/story_behaviour.rb
|
17
|
-
behaviour/examples/rbehave/runner/scenario_runner_behaviour.rb
|
18
|
+
behaviour/examples/examples.rb
|
19
|
+
behaviour/examples/rspec_adapter.rb
|
20
|
+
behaviour/examples/helper.rb
|
18
21
|
behaviour/examples/rbehave/runner/story_runner_behaviour.rb
|
22
|
+
behaviour/examples/rbehave/runner/runner_behaviour.rb
|
23
|
+
behaviour/examples/rbehave/runner/scenario_runner_behaviour.rb
|
24
|
+
behaviour/examples/rbehave/runner/options_behaviour.rb
|
19
25
|
behaviour/examples/rbehave/runner/scenario_collector_behaviour.rb
|
26
|
+
behaviour/examples/rbehave/world_behaviour.rb
|
20
27
|
behaviour/examples/rbehave/exception_behaviour.rb
|
21
|
-
behaviour/examples/
|
22
|
-
behaviour/examples/
|
23
|
-
behaviour/examples/
|
24
|
-
|
28
|
+
behaviour/examples/rbehave/story_behaviour.rb
|
29
|
+
behaviour/examples/rbehave/given_scenario_behaviour.rb
|
30
|
+
behaviour/examples/rbehave/reporter/plain_text_reporter_behaviour.rb
|
31
|
+
behaviour/examples/rbehave/step_mother_behaviour.rb
|
32
|
+
behaviour/examples/rbehave/documenter/plain_text_documenter_behaviour.rb
|
33
|
+
behaviour/examples/rbehave/simple_step_behaviour.rb
|
34
|
+
examples/game-of-life/life/game.rb
|
35
|
+
examples/game-of-life/life/grid.rb
|
36
|
+
examples/game-of-life/.loadpath
|
37
|
+
examples/game-of-life/behaviour/everything.rb
|
38
|
+
examples/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story
|
39
|
+
examples/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story
|
40
|
+
examples/game-of-life/behaviour/stories/TheGridWraps.story
|
41
|
+
examples/game-of-life/behaviour/stories/stories.txt
|
42
|
+
examples/game-of-life/behaviour/stories/ICanKillACell.story
|
43
|
+
examples/game-of-life/behaviour/stories/ICanCreateACell.story
|
44
|
+
examples/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story
|
45
|
+
examples/game-of-life/behaviour/stories/create_a_cell.rb
|
46
|
+
examples/game-of-life/behaviour/examples/examples.rb
|
47
|
+
examples/game-of-life/behaviour/examples/grid_behaviour.rb
|
48
|
+
examples/game-of-life/behaviour/examples/game_behaviour.rb
|
49
|
+
examples/game-of-life/behaviour/examples/helper.rb
|
50
|
+
examples/game-of-life/.project
|
51
|
+
examples/game-of-life/life.rb
|
52
|
+
examples/game-of-life/README.txt
|
25
53
|
CHANGELOG.txt
|
26
54
|
History.txt
|
27
55
|
Manifest.txt
|
28
56
|
NOTES.txt
|
29
|
-
Rakefile
|
30
57
|
README.txt
|
31
58
|
setup.rb
|
data/NOTES.txt
CHANGED
@@ -1,11 +1,6 @@
|
|
1
|
-
|
2
|
-
* should collect all the stories
|
3
|
-
* should count all the scenarios in the stories
|
4
|
-
* should execute the scenarios
|
5
|
-
|
6
|
-
ScenarioRunner
|
7
|
-
- should run scenarios in a World
|
1
|
+
- Run a single story - define steps outside of a scenario.
|
8
2
|
|
9
3
|
Additions for rspec:
|
10
4
|
pending(msg)
|
11
5
|
|
6
|
+
# :1,$!find lib behaviour examples *.txt setup.rb -type f | grep -v svn
|
data/behaviour/everything.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require 'behaviour/examples/
|
1
|
+
require 'behaviour/examples/examples'
|
File without changes
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'behaviour/examples/helper'
|
2
|
+
|
3
|
+
module RBehave
|
4
|
+
describe GivenScenario do
|
5
|
+
it 'should execute a scenario from the current story in its world' do
|
6
|
+
# given
|
7
|
+
class MyWorld
|
8
|
+
attr :scenario_ran
|
9
|
+
end
|
10
|
+
instance = MyWorld.new
|
11
|
+
story = Story.new 'title', 'narrative' do end
|
12
|
+
scenario = Scenario.new story, 'scenario name' do
|
13
|
+
@scenario_ran = true
|
14
|
+
end
|
15
|
+
Runner::StoryRunner.expects(:scenario_from_current_story).with('scenario name').returns(scenario)
|
16
|
+
|
17
|
+
step = GivenScenario.new 'scenario name'
|
18
|
+
|
19
|
+
# when
|
20
|
+
step.perform(instance)
|
21
|
+
|
22
|
+
# then
|
23
|
+
ensure_that instance.scenario_ran, is(true)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'behaviour/examples/helper'
|
2
|
+
|
3
|
+
module RBehave
|
4
|
+
module Runner
|
5
|
+
describe Options do
|
6
|
+
setup do
|
7
|
+
@options = Options.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should parse -n as dry run' do
|
11
|
+
# when
|
12
|
+
@options.parse %w[ -n ]
|
13
|
+
# then
|
14
|
+
ensure_that @options.dry_run, is(true)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should parse --dry-run as dry run' do
|
18
|
+
# when
|
19
|
+
@options.parse %w[ --dry-run ]
|
20
|
+
# then
|
21
|
+
ensure_that @options.dry_run, is(true)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should parse "-f fmt as format' do
|
25
|
+
# when
|
26
|
+
@options.parse %w[ -f s ]
|
27
|
+
# then
|
28
|
+
ensure_that @options.format, is(:simple)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should parse "--format fmt as format' do
|
32
|
+
# when
|
33
|
+
@options.parse %w[ --format h ]
|
34
|
+
# then
|
35
|
+
ensure_that @options.format, is(:html)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'behaviour/examples/helper'
|
2
|
+
|
3
|
+
module RBehave
|
4
|
+
describe Runner do
|
5
|
+
def dev_null
|
6
|
+
io = $stdout.dup
|
7
|
+
def io.write(str)
|
8
|
+
str.to_s.size
|
9
|
+
end
|
10
|
+
return io
|
11
|
+
end
|
12
|
+
|
13
|
+
setup do
|
14
|
+
@stdout, $stdout = $stdout, dev_null
|
15
|
+
@argv = Array.new(ARGV)
|
16
|
+
end
|
17
|
+
|
18
|
+
teardown do
|
19
|
+
$stdout = @stdout
|
20
|
+
ARGV.clear; ARGV << @argv
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should wire up a singleton StoryRunner' do
|
24
|
+
Runner::story_runner.should_not be_nil
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should set its options based on ARGV' do
|
28
|
+
# given
|
29
|
+
Runner.module_eval { @options = nil }
|
30
|
+
ARGV << '--dry-run'
|
31
|
+
|
32
|
+
# when
|
33
|
+
options = Runner.options
|
34
|
+
|
35
|
+
# then
|
36
|
+
ensure_that options.dry_run, is(true)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -42,7 +42,7 @@ module RBehave
|
|
42
42
|
end
|
43
43
|
|
44
44
|
# captures worlds passed into a ScenarioRunner
|
45
|
-
class
|
45
|
+
class ScenarioWorldCatcher
|
46
46
|
attr_accessor :worlds
|
47
47
|
def run(scenario, world)
|
48
48
|
(@worlds ||= []) << world
|
@@ -51,7 +51,7 @@ module RBehave
|
|
51
51
|
|
52
52
|
it 'should run each scenario in a separate object' do
|
53
53
|
# given
|
54
|
-
scenario_world_catcher =
|
54
|
+
scenario_world_catcher = ScenarioWorldCatcher.new
|
55
55
|
story_runner = StoryRunner.new(scenario_world_catcher)
|
56
56
|
story_runner.Story 'story', 'narrative' do
|
57
57
|
Scenario 'scenario1' do end
|
@@ -164,6 +164,62 @@ module RBehave
|
|
164
164
|
# then
|
165
165
|
verify_mocks
|
166
166
|
end
|
167
|
+
|
168
|
+
it 'should run a story in an instance of a specified class' do
|
169
|
+
# given
|
170
|
+
scenario_world_catcher = ScenarioWorldCatcher.new
|
171
|
+
story_runner = StoryRunner.new(scenario_world_catcher)
|
172
|
+
story_runner.Story 'title', 'narrative', :type => String do
|
173
|
+
Scenario 'scenario' do end
|
174
|
+
end
|
175
|
+
|
176
|
+
# when
|
177
|
+
story_runner.run_stories
|
178
|
+
|
179
|
+
# then
|
180
|
+
scenario_world_catcher.worlds[0].should be_kind_of(String)
|
181
|
+
scenario_world_catcher.worlds[0].should be_kind_of(World)
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'should pass initialization params through to the constructed instance' do
|
185
|
+
# given
|
186
|
+
scenario_world_catcher = ScenarioWorldCatcher.new
|
187
|
+
story_runner = StoryRunner.new(scenario_world_catcher)
|
188
|
+
story_runner.Story 'title', 'narrative', :type => Array, :args => [3] do
|
189
|
+
Scenario 'scenario' do end
|
190
|
+
end
|
191
|
+
|
192
|
+
# when
|
193
|
+
story_runner.run_stories
|
194
|
+
|
195
|
+
# then
|
196
|
+
scenario_world_catcher.worlds[0].should be_kind_of(Array)
|
197
|
+
scenario_world_catcher.worlds[0].size.should == 3
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'should store the current running story' do
|
201
|
+
# given
|
202
|
+
$stories = []
|
203
|
+
story_runner = StoryRunner.new(ScenarioRunner.new)
|
204
|
+
story_runner.Story 'title1', 'narrative1' do
|
205
|
+
Scenario 'scenario1' do
|
206
|
+
$stories << StoryRunner.current_story
|
207
|
+
end
|
208
|
+
end
|
209
|
+
story_runner.Story 'title2', 'narrative2' do
|
210
|
+
Scenario 'scenario2' do
|
211
|
+
$stories << StoryRunner.current_story
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
# when
|
216
|
+
story_runner.run_stories
|
217
|
+
|
218
|
+
# then
|
219
|
+
$stories.size.should == 2
|
220
|
+
ensure_that $stories[0].title, is('title1')
|
221
|
+
ensure_that $stories[1].title, is('title2')
|
222
|
+
end
|
167
223
|
end
|
168
224
|
end
|
169
225
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'behaviour/examples/helper'
|
2
|
+
|
3
|
+
module RBehave
|
4
|
+
describe SimpleStep do
|
5
|
+
it 'should perform itself on an object' do
|
6
|
+
# given
|
7
|
+
$instance = nil
|
8
|
+
step = SimpleStep.new 'step' do
|
9
|
+
$instance = self
|
10
|
+
end
|
11
|
+
instance = Object.new
|
12
|
+
|
13
|
+
# when
|
14
|
+
step.perform(instance)
|
15
|
+
|
16
|
+
# then
|
17
|
+
$instance.should == instance
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should perform itself with parameters' do
|
21
|
+
# given
|
22
|
+
$result = nil
|
23
|
+
step = SimpleStep.new 'step' do |value|
|
24
|
+
$result = value
|
25
|
+
end
|
26
|
+
instance = Object.new
|
27
|
+
|
28
|
+
# when
|
29
|
+
step.perform(instance, 3)
|
30
|
+
|
31
|
+
# then
|
32
|
+
$result.should == 3
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'behaviour/examples/helper'
|
2
|
+
|
3
|
+
module RBehave
|
4
|
+
describe StepMother do
|
5
|
+
it 'should store a step by name and type' do
|
6
|
+
# given
|
7
|
+
step_mother = StepMother.new
|
8
|
+
step = SimpleStep.new("a given", &lambda {})
|
9
|
+
step_mother.store(:given, "a given", step)
|
10
|
+
|
11
|
+
# when
|
12
|
+
found = step_mother.find(:given, "a given")
|
13
|
+
|
14
|
+
# then
|
15
|
+
found.should == step
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should raise an error if a step is missing' do
|
19
|
+
# given
|
20
|
+
step_mother = StepMother.new
|
21
|
+
|
22
|
+
# when
|
23
|
+
ex = exception_from do
|
24
|
+
step_mother.find(:given, "doesn't exist")
|
25
|
+
end
|
26
|
+
|
27
|
+
# then
|
28
|
+
ensure_that ex, is_an(UnknownStepException)
|
29
|
+
ensure_that ex.message, is("doesn't exist")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -29,6 +29,25 @@ module RBehave
|
|
29
29
|
obj.should be_kind_of(World)
|
30
30
|
end
|
31
31
|
|
32
|
+
it 'should pass arguments to #new when creating an object of a specified type that mixes in a world' do
|
33
|
+
# given
|
34
|
+
class Thing
|
35
|
+
attr_reader :name, :age
|
36
|
+
def initialize(name, age)
|
37
|
+
@name, @age = name, age
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# when
|
42
|
+
obj = World::create Thing, "David", "I'm not telling"
|
43
|
+
|
44
|
+
# then
|
45
|
+
obj.should be_an_instance_of(Thing)
|
46
|
+
obj.name.should == "David"
|
47
|
+
obj.age.should == "I'm not telling"
|
48
|
+
obj.should be_kind_of(World)
|
49
|
+
end
|
50
|
+
|
32
51
|
def ensure_world_executes_step(&block)
|
33
52
|
# given
|
34
53
|
obj = World::create
|
@@ -148,13 +167,13 @@ module RBehave
|
|
148
167
|
ensure_that $second, is('first')
|
149
168
|
end
|
150
169
|
|
151
|
-
it 'should invoke
|
170
|
+
it 'should invoke a reused step in the new object instance' do
|
152
171
|
# given
|
153
172
|
$instances = []
|
154
173
|
world1 = World.create
|
155
174
|
world1.instance_eval do
|
156
175
|
Given 'a given' do
|
157
|
-
$instances << self
|
176
|
+
$instances << self.__id__
|
158
177
|
end
|
159
178
|
end
|
160
179
|
world2 = World.create
|
@@ -163,12 +182,12 @@ module RBehave
|
|
163
182
|
world2.instance_eval do
|
164
183
|
Given 'a given' # reused
|
165
184
|
Then 'an outcome' do
|
166
|
-
$instances << self
|
185
|
+
$instances << self.__id__
|
167
186
|
end
|
168
187
|
end
|
169
188
|
|
170
189
|
# then
|
171
|
-
$instances.should == [ world1, world2, world2 ]
|
190
|
+
$instances.should == [ world1.__id__, world2.__id__, world2.__id__ ]
|
172
191
|
end
|
173
192
|
|
174
193
|
def ensure_world_propagates_error(expected_error, &block)
|
@@ -233,7 +252,7 @@ module RBehave
|
|
233
252
|
verify_mocks
|
234
253
|
end
|
235
254
|
|
236
|
-
it 'should tell listeners but not execute the step
|
255
|
+
it 'should tell listeners but not execute the step in dry-run mode' do
|
237
256
|
# given
|
238
257
|
RBehave::Runner.dry_run = true
|
239
258
|
mock_listener = mock('listener')
|
@@ -255,5 +274,25 @@ module RBehave
|
|
255
274
|
verify_mocks
|
256
275
|
$step_invoked.should be(false)
|
257
276
|
end
|
277
|
+
|
278
|
+
it 'should ignore pending() calls in dry-run mode' do
|
279
|
+
begin
|
280
|
+
# given
|
281
|
+
world = World.create
|
282
|
+
RBehave::Runner::dry_run = true
|
283
|
+
|
284
|
+
# when
|
285
|
+
ex = exception_from do
|
286
|
+
world.instance_eval do
|
287
|
+
pending 'todo'
|
288
|
+
end
|
289
|
+
end
|
290
|
+
|
291
|
+
# then
|
292
|
+
ex.should be_nil
|
293
|
+
ensure
|
294
|
+
RBehave::Runner::dry_run = false
|
295
|
+
end
|
296
|
+
end
|
258
297
|
end
|
259
298
|
end
|