rbehave 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|