dchelimsky-rspec 1.1.11.7 → 1.1.12
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/History.txt +1 -1
- data/features/support/helpers/story_helper.rb +0 -3
- data/lib/spec/example/example_group_methods.rb +1 -1
- data/lib/spec/matchers.rb +1 -1
- data/lib/spec/mocks.rb +3 -3
- data/lib/spec/mocks/argument_expectation.rb +14 -14
- data/lib/spec/mocks/framework.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +1 -1
- data/lib/spec/mocks/mock.rb +3 -4
- data/lib/spec/mocks/spec_methods.rb +10 -1
- data/lib/spec/version.rb +2 -2
- data/rspec.gemspec +3 -3
- data/spec/spec/mocks/hash_including_matcher_spec.rb +4 -4
- data/spec/spec/mocks/hash_not_including_matcher_spec.rb +3 -3
- data/spec/spec/mocks/mock_spec.rb +25 -0
- data/spec/spec/runner/reporter_spec.rb +1 -1
- data/spec/spec_helper.rb +0 -1
- metadata +3 -3
- data/lib/spec/mocks/argument_constraints.rb +0 -237
- data/lib/spec/runner/formatter/story/html_formatter.rb +0 -174
- data/lib/spec/runner/formatter/story/plain_text_formatter.rb +0 -194
- data/lib/spec/runner/formatter/story/progress_bar_formatter.rb +0 -42
- data/lib/spec/story.rb +0 -10
- data/lib/spec/story/extensions.rb +0 -3
- data/lib/spec/story/extensions/main.rb +0 -86
- data/lib/spec/story/extensions/regexp.rb +0 -9
- data/lib/spec/story/extensions/string.rb +0 -9
- data/lib/spec/story/given_scenario.rb +0 -14
- data/lib/spec/story/runner.rb +0 -57
- data/lib/spec/story/runner/plain_text_story_runner.rb +0 -48
- data/lib/spec/story/runner/scenario_collector.rb +0 -18
- data/lib/spec/story/runner/scenario_runner.rb +0 -54
- data/lib/spec/story/runner/story_mediator.rb +0 -137
- data/lib/spec/story/runner/story_parser.rb +0 -247
- data/lib/spec/story/runner/story_runner.rb +0 -74
- data/lib/spec/story/scenario.rb +0 -14
- data/lib/spec/story/step.rb +0 -70
- data/lib/spec/story/step_group.rb +0 -89
- data/lib/spec/story/step_mother.rb +0 -38
- data/lib/spec/story/story.rb +0 -39
- data/lib/spec/story/world.rb +0 -124
- data/spec/spec/matchers/mock_constraint_matchers_spec.rb +0 -24
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +0 -95
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +0 -145
- data/spec/spec/runner/formatter/story/html_formatter_spec.rb +0 -135
- data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +0 -600
- data/spec/spec/runner/formatter/story/progress_bar_formatter_spec.rb +0 -82
- data/spec/spec/story/builders.rb +0 -46
- data/spec/spec/story/extensions/main_spec.rb +0 -161
- data/spec/spec/story/extensions_spec.rb +0 -14
- data/spec/spec/story/given_scenario_spec.rb +0 -27
- data/spec/spec/story/runner/plain_text_story_runner_spec.rb +0 -90
- data/spec/spec/story/runner/scenario_collector_spec.rb +0 -27
- data/spec/spec/story/runner/scenario_runner_spec.rb +0 -214
- data/spec/spec/story/runner/story_mediator_spec.rb +0 -143
- data/spec/spec/story/runner/story_parser_spec.rb +0 -401
- data/spec/spec/story/runner/story_runner_spec.rb +0 -294
- data/spec/spec/story/runner_spec.rb +0 -93
- data/spec/spec/story/scenario_spec.rb +0 -18
- data/spec/spec/story/step_group_spec.rb +0 -157
- data/spec/spec/story/step_mother_spec.rb +0 -84
- data/spec/spec/story/step_spec.rb +0 -272
- data/spec/spec/story/story_helper.rb +0 -2
- data/spec/spec/story/story_spec.rb +0 -84
- data/spec/spec/story/world_spec.rb +0 -423
- data/story_server/prototype/javascripts/builder.js +0 -136
- data/story_server/prototype/javascripts/controls.js +0 -972
- data/story_server/prototype/javascripts/dragdrop.js +0 -976
- data/story_server/prototype/javascripts/effects.js +0 -1117
- data/story_server/prototype/javascripts/prototype.js +0 -4140
- data/story_server/prototype/javascripts/rspec.js +0 -149
- data/story_server/prototype/javascripts/scriptaculous.js +0 -58
- data/story_server/prototype/javascripts/slider.js +0 -276
- data/story_server/prototype/javascripts/sound.js +0 -55
- data/story_server/prototype/javascripts/unittest.js +0 -568
- data/story_server/prototype/lib/server.rb +0 -24
- data/story_server/prototype/stories.html +0 -176
- data/story_server/prototype/stylesheets/rspec.css +0 -136
- data/story_server/prototype/stylesheets/test.css +0 -90
@@ -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
|
data/lib/spec/story/scenario.rb
DELETED
data/lib/spec/story/step.rb
DELETED
@@ -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
|
@@ -1,38 +0,0 @@
|
|
1
|
-
module Spec
|
2
|
-
module Story
|
3
|
-
class StepMother
|
4
|
-
def initialize
|
5
|
-
@steps = StepGroup.new
|
6
|
-
end
|
7
|
-
|
8
|
-
def use(new_step_group)
|
9
|
-
@steps << new_step_group
|
10
|
-
end
|
11
|
-
|
12
|
-
def store(type, step)
|
13
|
-
@steps.add(type, step)
|
14
|
-
end
|
15
|
-
|
16
|
-
def find(type, unstripped_name)
|
17
|
-
name = unstripped_name.strip
|
18
|
-
if @steps.find(type, name).nil?
|
19
|
-
@steps.add(type,
|
20
|
-
Step.new(name) do
|
21
|
-
raise Spec::Example::ExamplePendingError.new("Unimplemented step: #{name}")
|
22
|
-
end
|
23
|
-
)
|
24
|
-
end
|
25
|
-
@steps.find(type, name)
|
26
|
-
end
|
27
|
-
|
28
|
-
def clear
|
29
|
-
@steps.clear
|
30
|
-
end
|
31
|
-
|
32
|
-
def empty?
|
33
|
-
@steps.empty?
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
data/lib/spec/story/story.rb
DELETED
@@ -1,39 +0,0 @@
|
|
1
|
-
module Spec
|
2
|
-
module Story
|
3
|
-
class Story
|
4
|
-
attr_reader :title, :narrative
|
5
|
-
|
6
|
-
def initialize(title, narrative, params = {}, &body)
|
7
|
-
@body = body
|
8
|
-
@title = title
|
9
|
-
@narrative = narrative
|
10
|
-
@params = params
|
11
|
-
end
|
12
|
-
|
13
|
-
def [](key)
|
14
|
-
@params[key]
|
15
|
-
end
|
16
|
-
|
17
|
-
def run_in(obj)
|
18
|
-
obj.instance_eval(&@body)
|
19
|
-
end
|
20
|
-
|
21
|
-
def assign_steps_to(assignee)
|
22
|
-
if steps=@params[:steps_for]
|
23
|
-
steps = [steps] unless steps.is_a?(Array)
|
24
|
-
steps.each do |step|
|
25
|
-
if step.is_a?(StepGroup)
|
26
|
-
assignee.use(step)
|
27
|
-
else
|
28
|
-
assignee.use(steps_for(step))
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def steps_for(key)
|
35
|
-
$rspec_story_steps[key]
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
data/lib/spec/story/world.rb
DELETED
@@ -1,124 +0,0 @@
|
|
1
|
-
require 'spec/expectations'
|
2
|
-
require 'spec/matchers'
|
3
|
-
require 'spec/example/pending'
|
4
|
-
|
5
|
-
module Spec
|
6
|
-
module Story
|
7
|
-
=begin
|
8
|
-
A World represents the actual instance a scenario will run in.
|
9
|
-
|
10
|
-
The runner ensures any instance variables and methods defined anywhere
|
11
|
-
in a story block are available to all the scenarios. This includes
|
12
|
-
variables that are created or referenced inside Given, When and Then
|
13
|
-
blocks.
|
14
|
-
=end
|
15
|
-
module World
|
16
|
-
include ::Spec::Example::Pending
|
17
|
-
include ::Spec::Matchers
|
18
|
-
|
19
|
-
def self.create(cls = Object, *args)
|
20
|
-
cls.new(*args).extend(World)
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.listeners
|
24
|
-
@listeners ||= []
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.add_listener(listener)
|
28
|
-
listeners() << listener
|
29
|
-
end
|
30
|
-
|
31
|
-
def self.step_mother
|
32
|
-
@step_mother ||= StepMother.new
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.use(steps)
|
36
|
-
step_mother.use(steps)
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.step_names
|
40
|
-
@step_names ||= []
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.run_given_scenario_with_suspended_listeners(world, type, name, scenario)
|
44
|
-
current_listeners = Array.new(listeners)
|
45
|
-
begin
|
46
|
-
listeners.each { |l| l.found_scenario(type, name) }
|
47
|
-
@listeners.clear
|
48
|
-
scenario.perform(world, name) unless dry_run
|
49
|
-
ensure
|
50
|
-
@listeners.replace(current_listeners)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.store_and_call(world, type, name, *args, &block)
|
55
|
-
if block_given?
|
56
|
-
step_mother.store(type, Step.new(name, &block))
|
57
|
-
end
|
58
|
-
step = step_mother.find(type, name)
|
59
|
-
|
60
|
-
step_name = step.name
|
61
|
-
step_names << step_name
|
62
|
-
|
63
|
-
# It's important to have access to the parsed args here, so
|
64
|
-
# we can give them to the listeners. The HTML reporter needs
|
65
|
-
# the args so it can style them. See the generated output in
|
66
|
-
# story_server/prototype/rspec_stories.html (generated by rake stories)
|
67
|
-
args = step.parse_args(name) if args.empty?
|
68
|
-
begin
|
69
|
-
listeners.each { |l| l.step_upcoming(type, step_name, *args) }
|
70
|
-
step.perform(world, *args) unless dry_run
|
71
|
-
listeners.each { |l| l.step_succeeded(type, step_name, *args) }
|
72
|
-
rescue Exception => e
|
73
|
-
case e
|
74
|
-
when Spec::Example::ExamplePendingError
|
75
|
-
@listeners.each { |l| l.step_pending(type, step_name, *args) }
|
76
|
-
else
|
77
|
-
@listeners.each { |l| l.step_failed(type, step_name, *args) }
|
78
|
-
end
|
79
|
-
errors << e
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def self.errors
|
84
|
-
@errors ||= []
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.dry_run
|
88
|
-
::Spec::Story::Runner.dry_run
|
89
|
-
end
|
90
|
-
|
91
|
-
def start_collecting_errors
|
92
|
-
errors.clear
|
93
|
-
end
|
94
|
-
|
95
|
-
def errors
|
96
|
-
World.errors
|
97
|
-
end
|
98
|
-
|
99
|
-
def GivenScenario(name)
|
100
|
-
World.run_given_scenario_with_suspended_listeners(self, :'given scenario', name, GivenScenario.new(name))
|
101
|
-
@__previous_step = :given
|
102
|
-
end
|
103
|
-
|
104
|
-
def Given(name, *args, &block)
|
105
|
-
World.store_and_call self, :given, name, *args, &block
|
106
|
-
@__previous_step = :given
|
107
|
-
end
|
108
|
-
|
109
|
-
def When(name, *args, &block)
|
110
|
-
World.store_and_call self, :when, name, *args, &block
|
111
|
-
@__previous_step = :when
|
112
|
-
end
|
113
|
-
|
114
|
-
def Then(name, *args, &block)
|
115
|
-
World.store_and_call self, :then, name, *args, &block
|
116
|
-
@__previous_step = :then
|
117
|
-
end
|
118
|
-
|
119
|
-
def And(name, *args, &block)
|
120
|
-
World.store_and_call self, @__previous_step, name, *args, &block
|
121
|
-
end
|
122
|
-
end
|
123
|
-
end
|
124
|
-
end
|