rspec 1.1.8 → 1.1.9
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 +30 -3
- data/License.txt +22 -0
- data/Manifest.txt +3 -3
- data/README.txt +1 -25
- data/Rakefile +4 -2
- data/TODO.txt +5 -4
- data/bin/autospec +1 -1
- data/examples/pure/shared_example_group_example.rb +2 -2
- data/lib/autotest/rspec.rb +1 -1
- data/lib/spec.rb +5 -1
- data/lib/spec/example.rb +1 -1
- data/lib/spec/example/before_and_after_hooks.rb +93 -0
- data/lib/spec/example/configuration.rb +10 -1
- data/lib/spec/example/example_group.rb +2 -1
- data/lib/spec/example/example_group_factory.rb +18 -1
- data/lib/spec/example/example_group_methods.rb +45 -123
- data/lib/spec/example/example_methods.rb +9 -6
- data/lib/spec/example/shared_example_group.rb +6 -12
- data/lib/spec/extensions/main.rb +1 -1
- data/lib/spec/interop/test/unit/testcase.rb +1 -1
- data/lib/spec/mocks/error_generator.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +19 -4
- data/lib/spec/mocks/methods.rb +2 -2
- data/lib/spec/mocks/proxy.rb +4 -5
- data/lib/spec/runner.rb +3 -4
- data/lib/spec/runner/formatter/nested_text_formatter.rb +3 -3
- data/lib/spec/runner/option_parser.rb +23 -22
- data/lib/spec/version.rb +1 -1
- data/rspec.gemspec +19 -8
- data/spec/autotest/rspec_spec.rb +5 -1
- data/spec/spec/example/configuration_spec.rb +229 -215
- data/spec/spec/example/example_group_class_definition_spec.rb +9 -9
- data/spec/spec/example/example_group_factory_spec.rb +48 -27
- data/spec/spec/example/example_group_methods_spec.rb +436 -426
- data/spec/spec/example/example_group_spec.rb +459 -500
- data/spec/spec/example/example_methods_spec.rb +92 -86
- data/spec/spec/example/shared_example_group_spec.rb +219 -203
- data/spec/spec/extensions/main_spec.rb +23 -23
- data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
- data/spec/spec/interop/test/unit/spec_spec.rb +15 -8
- data/spec/spec/mocks/mock_spec.rb +12 -2
- data/spec/spec/mocks/nil_expectation_warning_spec.rb +0 -1
- data/spec/spec/mocks/partial_mock_spec.rb +10 -5
- data/spec/spec/package/bin_spec_spec.rb +8 -0
- data/spec/spec/runner/command_line_spec.rb +101 -100
- data/spec/spec/runner/drb_command_line_spec.rb +0 -2
- data/spec/spec/runner/formatter/html_formatter_spec.rb +1 -4
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +230 -245
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +2 -3
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +110 -109
- data/spec/spec/runner/option_parser_spec.rb +18 -6
- data/spec/spec_helper.rb +26 -5
- data/stories/mock_framework_integration/use_flexmock.story +1 -1
- metadata +38 -7
- data/lib/spec/example/module_inclusion_warnings.rb +0 -38
- data/spec/spec/example/example_group/described_module_spec.rb +0 -20
- data/spec/spec/example/example_group/warning_messages_spec.rb +0 -76
data/History.txt
CHANGED
@@ -1,3 +1,30 @@
|
|
1
|
+
=== Version 1.1.9 / 2008-10-20
|
2
|
+
|
3
|
+
WARNING: This release removes implicit inclusion of modules in example groups.
|
4
|
+
This means that if you have 'describe MyModule do', MyModule will not be
|
5
|
+
included in the group.
|
6
|
+
|
7
|
+
* 2 major enhancements
|
8
|
+
|
9
|
+
* Add extend to configuration (thanks to advice from Chad Fowler)
|
10
|
+
* Modules are no longer implicitly included in example groups
|
11
|
+
|
12
|
+
* 4 minor enhancements
|
13
|
+
|
14
|
+
* mingw indicates windows too (thanks to Luis Lavena for the tip)
|
15
|
+
* improved output for partial mock expecation failures
|
16
|
+
* it_should_behave_like now accepts n names of shared groups
|
17
|
+
* eliminated redundant inclusion/extension of ExampleGroupMethods
|
18
|
+
|
19
|
+
* 6 bug fixes
|
20
|
+
|
21
|
+
* spec command with no arguments prints help
|
22
|
+
* fixed typo in help. Fixes #73.
|
23
|
+
* fixed bug where should_receive..and_yield after similar stub added the args_to_yield to the stub's original args_to_yield (Pat Maddox)
|
24
|
+
* fixed bug where rspec-autotest (autospec) was loading non-spec files in spec directory. Fixes #559.
|
25
|
+
* fixed bug where should_not_receive was reporting twice
|
26
|
+
* fixed bug where rspec tries to run examples just because it is required (even if there are no examples loaded). Fixes #575.
|
27
|
+
|
1
28
|
=== Version 1.1.8 / 2008-10-03
|
2
29
|
|
3
30
|
* 2 bug fixes
|
@@ -13,12 +40,12 @@
|
|
13
40
|
|
14
41
|
* 2 bug fixes
|
15
42
|
|
16
|
-
|
17
|
-
|
43
|
+
* fixed bug where negative message expectations following stubs resulted in false (negative) positives (Mathias Meyer). Closes #548.
|
44
|
+
* fixed bug where Not Yet Implemented examples report incorrect caller (Scott Taylor). Closes #547.
|
18
45
|
|
19
46
|
* 1 minor enhancement
|
20
47
|
|
21
|
-
|
48
|
+
* removed deprecated mock argument constraint symbols
|
22
49
|
|
23
50
|
=== Version 1.1.5 / 2008-09-28
|
24
51
|
|
data/License.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
(The MIT License)
|
2
|
+
|
3
|
+
Copyright (c) 2005-2008 The RSpec Development Team
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Manifest.txt
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
History.txt
|
2
|
+
License.txt
|
2
3
|
Manifest.txt
|
3
4
|
README.txt
|
4
5
|
Rakefile
|
@@ -85,6 +86,7 @@ lib/spec/adapters/ruby_engine.rb
|
|
85
86
|
lib/spec/adapters/ruby_engine/mri.rb
|
86
87
|
lib/spec/adapters/ruby_engine/rubinius.rb
|
87
88
|
lib/spec/example.rb
|
89
|
+
lib/spec/example/before_and_after_hooks.rb
|
88
90
|
lib/spec/example/configuration.rb
|
89
91
|
lib/spec/example/errors.rb
|
90
92
|
lib/spec/example/example_group.rb
|
@@ -92,7 +94,6 @@ lib/spec/example/example_group_factory.rb
|
|
92
94
|
lib/spec/example/example_group_methods.rb
|
93
95
|
lib/spec/example/example_matcher.rb
|
94
96
|
lib/spec/example/example_methods.rb
|
95
|
-
lib/spec/example/module_inclusion_warnings.rb
|
96
97
|
lib/spec/example/module_reopening_fix.rb
|
97
98
|
lib/spec/example/pending.rb
|
98
99
|
lib/spec/example/shared_example_group.rb
|
@@ -213,8 +214,6 @@ spec/ruby_forker.rb
|
|
213
214
|
spec/spec.opts
|
214
215
|
spec/spec/adapters/ruby_engine_spec.rb
|
215
216
|
spec/spec/example/configuration_spec.rb
|
216
|
-
spec/spec/example/example_group/described_module_spec.rb
|
217
|
-
spec/spec/example/example_group/warning_messages_spec.rb
|
218
217
|
spec/spec/example/example_group_class_definition_spec.rb
|
219
218
|
spec/spec/example/example_group_factory_spec.rb
|
220
219
|
spec/spec/example/example_group_methods_spec.rb
|
@@ -234,6 +233,7 @@ spec/spec/extensions/main_spec.rb
|
|
234
233
|
spec/spec/interop/test/unit/resources/spec_that_fails.rb
|
235
234
|
spec/spec/interop/test/unit/resources/spec_that_passes.rb
|
236
235
|
spec/spec/interop/test/unit/resources/spec_with_errors.rb
|
236
|
+
spec/spec/interop/test/unit/resources/spec_with_options_hash.rb
|
237
237
|
spec/spec/interop/test/unit/resources/test_case_that_fails.rb
|
238
238
|
spec/spec/interop/test/unit/resources/test_case_that_passes.rb
|
239
239
|
spec/spec/interop/test/unit/resources/test_case_with_errors.rb
|
data/README.txt
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
* http://rspec.info
|
4
4
|
* http://rspec.info/rdoc/
|
5
|
+
* http://rubyforge.org/projects/rspec
|
5
6
|
* http://github.com/dchelimsky/rspec/wikis
|
6
7
|
* mailto:rspec-devel@rubyforge.org
|
7
8
|
|
@@ -36,28 +37,3 @@ behaviour to your existing objects.
|
|
36
37
|
cd rspec
|
37
38
|
rake gem
|
38
39
|
rake install_gem
|
39
|
-
|
40
|
-
== LICENSE:
|
41
|
-
|
42
|
-
(The MIT License)
|
43
|
-
|
44
|
-
Copyright (c) 2005-2008 The RSpec Development Team
|
45
|
-
|
46
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
47
|
-
a copy of this software and associated documentation files (the
|
48
|
-
"Software"), to deal in the Software without restriction, including
|
49
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
50
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
51
|
-
permit persons to whom the Software is furnished to do so, subject to
|
52
|
-
the following conditions:
|
53
|
-
|
54
|
-
The above copyright notice and this permission notice shall be
|
55
|
-
included in all copies or substantial portions of the Software.
|
56
|
-
|
57
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
58
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
59
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
60
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
61
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
62
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
63
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
CHANGED
@@ -18,10 +18,12 @@ Hoe.new('rspec', Spec::VERSION::STRING) do |p|
|
|
18
18
|
p.url = 'http://rspec.info/'
|
19
19
|
p.description = "Behaviour Driven Development for Ruby."
|
20
20
|
p.rubyforge_name = 'rspec'
|
21
|
+
p.extra_dev_deps = ['diff-lcs',['spicycode-rcov','>= 0.8.1.3'],'syntax']
|
21
22
|
p.developer('RSpec Development Team', 'rspec-devel@rubyforge.org')
|
23
|
+
p.remote_rdoc_dir = "rspec/#{Spec::VERSION::STRING}"
|
22
24
|
end
|
23
25
|
|
24
|
-
['audit','test','test_deps','default','
|
26
|
+
['audit','test','test_deps','default','post_blog'].each do |task|
|
25
27
|
Rake.application.instance_variable_get('@tasks').delete(task)
|
26
28
|
end
|
27
29
|
|
@@ -41,7 +43,7 @@ Spec::Rake::SpecTask.new do |t|
|
|
41
43
|
unless ENV['NO_RCOV']
|
42
44
|
t.rcov = true
|
43
45
|
t.rcov_dir = 'coverage'
|
44
|
-
t.rcov_opts = ['--exclude', "lib/spec.rb,lib/spec/runner.rb,spec\/spec,bin\/spec,examples,\/var\/lib\/gems,\/Library\/Ruby,\.autotest,#{ENV['GEM_HOME']}"]
|
46
|
+
t.rcov_opts = ['--text-report', '--exclude', "lib/spec.rb,lib/spec/runner.rb,spec\/spec,bin\/spec,examples,\/var\/lib\/gems,\/Library\/Ruby,\.autotest,#{ENV['GEM_HOME']}"]
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
data/TODO.txt
CHANGED
@@ -1,9 +1,10 @@
|
|
1
|
-
== 1.1.6
|
2
|
-
|
3
|
-
* resolve windows tty/colorization issue
|
4
|
-
|
5
1
|
== Future
|
6
2
|
|
7
3
|
* do SOMETHING with the website
|
8
4
|
* extract spec/story to rspec-stories (new gem)
|
9
5
|
* remove the ruby engine adapter unless Rubinius team plans to use it
|
6
|
+
* rename top level namespace to Rspec and commands to 'rspec' and 'autorspec'
|
7
|
+
* continue to support Spec 'spec' and 'autospec' as aliases for a reasonable time
|
8
|
+
* separate the underlying framework from the DSL
|
9
|
+
* be able to do everything with classes and methods
|
10
|
+
* tweak raise_error rdoc to show only one arg
|
data/bin/autospec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
ENV['RSPEC'] = 'true' # allows autotest to discover rspec
|
3
3
|
ENV['AUTOTEST'] = 'true' # allows autotest to run w/ color on linux
|
4
|
-
system (RUBY_PLATFORM =~ /mswin/ ? 'autotest.bat' : 'autotest'), *ARGV
|
4
|
+
system (RUBY_PLATFORM =~ /mswin|mingw/ ? 'autotest.bat' : 'autotest'), *ARGV
|
@@ -31,8 +31,8 @@ module SharedExampleGroupExample
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
# A SharedExampleGroup is also module. If you create one like this
|
35
|
-
#
|
34
|
+
# A SharedExampleGroup is also a module. If you create one like this it gets
|
35
|
+
# assigned to the constant MostThings
|
36
36
|
share_as :MostThings do
|
37
37
|
def helper_method
|
38
38
|
"helper method"
|
data/lib/autotest/rspec.rb
CHANGED
@@ -4,7 +4,7 @@ Autotest.add_hook :initialize do |at|
|
|
4
4
|
at.clear_mappings
|
5
5
|
# watch out: Ruby bug (1.8.6):
|
6
6
|
# %r(/) != /\//
|
7
|
-
at.add_mapping(%r%^spec
|
7
|
+
at.add_mapping(%r%^spec/.*_spec.rb$%) { |filename, _|
|
8
8
|
filename
|
9
9
|
}
|
10
10
|
at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m|
|
data/lib/spec.rb
CHANGED
data/lib/spec/example.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'timeout'
|
2
|
+
require 'spec/example/before_and_after_hooks'
|
2
3
|
require 'spec/example/pending'
|
3
4
|
require 'spec/example/module_reopening_fix'
|
4
|
-
require 'spec/example/module_inclusion_warnings'
|
5
5
|
require 'spec/example/example_group_methods'
|
6
6
|
require 'spec/example/example_methods'
|
7
7
|
require 'spec/example/example_group'
|
@@ -0,0 +1,93 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
module BeforeAndAfterHooks
|
4
|
+
# Registers a block to be executed before each example.
|
5
|
+
# This method prepends +block+ to existing before blocks.
|
6
|
+
def prepend_before(*args, &block)
|
7
|
+
scope, options = scope_and_options(*args)
|
8
|
+
parts = before_parts_from_scope(scope)
|
9
|
+
parts.unshift(block)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Registers a block to be executed before each example.
|
13
|
+
# This method appends +block+ to existing before blocks.
|
14
|
+
def append_before(*args, &block)
|
15
|
+
scope, options = scope_and_options(*args)
|
16
|
+
parts = before_parts_from_scope(scope)
|
17
|
+
parts << block
|
18
|
+
end
|
19
|
+
alias_method :before, :append_before
|
20
|
+
|
21
|
+
# Registers a block to be executed after each example.
|
22
|
+
# This method prepends +block+ to existing after blocks.
|
23
|
+
def prepend_after(*args, &block)
|
24
|
+
scope, options = scope_and_options(*args)
|
25
|
+
parts = after_parts_from_scope(scope)
|
26
|
+
parts.unshift(block)
|
27
|
+
end
|
28
|
+
alias_method :after, :prepend_after
|
29
|
+
|
30
|
+
# Registers a block to be executed after each example.
|
31
|
+
# This method appends +block+ to existing after blocks.
|
32
|
+
def append_after(*args, &block)
|
33
|
+
scope, options = scope_and_options(*args)
|
34
|
+
parts = after_parts_from_scope(scope)
|
35
|
+
parts << block
|
36
|
+
end
|
37
|
+
|
38
|
+
def remove_after(scope, &block)
|
39
|
+
after_each_parts.delete(block)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Deprecated. Use before(:each)
|
43
|
+
def setup(&block)
|
44
|
+
before(:each, &block)
|
45
|
+
end
|
46
|
+
|
47
|
+
# Deprecated. Use after(:each)
|
48
|
+
def teardown(&block)
|
49
|
+
after(:each, &block)
|
50
|
+
end
|
51
|
+
|
52
|
+
def before_all_parts # :nodoc:
|
53
|
+
@before_all_parts ||= []
|
54
|
+
end
|
55
|
+
|
56
|
+
def after_all_parts # :nodoc:
|
57
|
+
@after_all_parts ||= []
|
58
|
+
end
|
59
|
+
|
60
|
+
def before_each_parts # :nodoc:
|
61
|
+
@before_each_parts ||= []
|
62
|
+
end
|
63
|
+
|
64
|
+
def after_each_parts # :nodoc:
|
65
|
+
@after_each_parts ||= []
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def scope_and_options(*args)
|
71
|
+
args, options = args_and_options(*args)
|
72
|
+
scope = (args[0] || :each), options
|
73
|
+
end
|
74
|
+
|
75
|
+
def before_parts_from_scope(scope)
|
76
|
+
case scope
|
77
|
+
when :each; before_each_parts
|
78
|
+
when :all; before_all_parts
|
79
|
+
when :suite; Spec::Runner.options.before_suite_parts
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def after_parts_from_scope(scope)
|
84
|
+
case scope
|
85
|
+
when :each; after_each_parts
|
86
|
+
when :all; after_all_parts
|
87
|
+
when :suite; Spec::Runner.options.after_suite_parts
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -67,12 +67,21 @@ module Spec
|
|
67
67
|
# end
|
68
68
|
#
|
69
69
|
def include(*args)
|
70
|
+
include_or_extend(:include, *args)
|
71
|
+
end
|
72
|
+
|
73
|
+
def extend(*args)
|
74
|
+
include_or_extend(:extend, *args)
|
75
|
+
end
|
76
|
+
|
77
|
+
def include_or_extend(*args)
|
78
|
+
action = args.shift
|
70
79
|
args << {} unless Hash === args.last
|
71
80
|
modules, options = args_and_options(*args)
|
72
81
|
required_example_group = get_type_from_options(options)
|
73
82
|
required_example_group = required_example_group.to_sym if required_example_group
|
74
83
|
modules.each do |mod|
|
75
|
-
ExampleGroupFactory.get(required_example_group).send(
|
84
|
+
ExampleGroupFactory.get(required_example_group).send(action, mod)
|
76
85
|
end
|
77
86
|
end
|
78
87
|
|
@@ -6,7 +6,8 @@ module Spec
|
|
6
6
|
extend Spec::Example::ExampleGroupMethods
|
7
7
|
include Spec::Example::ExampleMethods
|
8
8
|
|
9
|
-
def initialize(defined_description, &implementation)
|
9
|
+
def initialize(defined_description, options={}, &implementation)
|
10
|
+
@_options = options
|
10
11
|
@_defined_description = defined_description
|
11
12
|
@_implementation = implementation || pending_implementation
|
12
13
|
end
|
@@ -7,6 +7,13 @@ module Spec
|
|
7
7
|
default(ExampleGroup)
|
8
8
|
end
|
9
9
|
|
10
|
+
def all_registered?(example_group_classes)
|
11
|
+
example_group_classes.each do |example_group_class|
|
12
|
+
return false unless registered_or_ancestor_of_registered? example_group_class
|
13
|
+
end
|
14
|
+
return true
|
15
|
+
end
|
16
|
+
|
10
17
|
# Registers an example group class +klass+ with the symbol +type+. For
|
11
18
|
# example:
|
12
19
|
#
|
@@ -46,7 +53,7 @@ module Spec
|
|
46
53
|
superclass.describe(*args, &block)
|
47
54
|
end
|
48
55
|
|
49
|
-
|
56
|
+
protected
|
50
57
|
|
51
58
|
def determine_superclass(opts)
|
52
59
|
key = if opts[:type]
|
@@ -56,6 +63,16 @@ module Spec
|
|
56
63
|
end
|
57
64
|
get(key)
|
58
65
|
end
|
66
|
+
|
67
|
+
private
|
68
|
+
|
69
|
+
def registered_or_ancestor_of_registered? example_group_class
|
70
|
+
registered_types.any? {|registered_type| registered_type.ancestors.include? example_group_class}
|
71
|
+
end
|
72
|
+
|
73
|
+
def registered_types
|
74
|
+
@example_group_types.values
|
75
|
+
end
|
59
76
|
|
60
77
|
end
|
61
78
|
self.reset
|
@@ -2,6 +2,8 @@ module Spec
|
|
2
2
|
module Example
|
3
3
|
|
4
4
|
module ExampleGroupMethods
|
5
|
+
include Spec::Example::BeforeAndAfterHooks
|
6
|
+
|
5
7
|
class << self
|
6
8
|
attr_accessor :matcher_class
|
7
9
|
|
@@ -13,7 +15,12 @@ module Spec
|
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
16
|
-
attr_reader :description_text, :
|
18
|
+
attr_reader :description_text, :description_options, :spec_path
|
19
|
+
alias :options :description_options
|
20
|
+
|
21
|
+
def description_args
|
22
|
+
@description_args ||= []
|
23
|
+
end
|
17
24
|
|
18
25
|
def inherited(klass)
|
19
26
|
super
|
@@ -64,19 +71,12 @@ module Spec
|
|
64
71
|
|
65
72
|
# Use this to pull in examples from shared example groups.
|
66
73
|
# See Spec::Runner for information about shared example groups.
|
67
|
-
def it_should_behave_like(
|
68
|
-
|
69
|
-
|
70
|
-
include shared_example_group
|
71
|
-
else
|
72
|
-
example_group = SharedExampleGroup.find_shared_example_group(shared_example_group)
|
73
|
-
unless example_group
|
74
|
-
raise RuntimeError.new("Shared Example Group '#{shared_example_group}' can not be found")
|
75
|
-
end
|
76
|
-
include(example_group)
|
74
|
+
def it_should_behave_like(*shared_example_groups)
|
75
|
+
shared_example_groups.each do |group|
|
76
|
+
include_shared_example_group(group)
|
77
77
|
end
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
# :call-seq:
|
81
81
|
# predicate_matchers[matcher_name] = method_on_object
|
82
82
|
# predicate_matchers[matcher_name] = [method1_on_object, method2_on_object]
|
@@ -111,8 +111,8 @@ module Spec
|
|
111
111
|
|
112
112
|
# Creates an instance of the current example group class and adds it to
|
113
113
|
# a collection of examples of the current example group.
|
114
|
-
def example(description=nil, &implementation)
|
115
|
-
e = new(description, &implementation)
|
114
|
+
def example(description=nil, options={}, &implementation)
|
115
|
+
e = new(description, options, &implementation)
|
116
116
|
example_objects << e
|
117
117
|
e
|
118
118
|
end
|
@@ -157,8 +157,8 @@ module Spec
|
|
157
157
|
|
158
158
|
def description_parts #:nodoc:
|
159
159
|
parts = []
|
160
|
-
|
161
|
-
parts <<
|
160
|
+
each_ancestor_example_group_class do |example_group_class|
|
161
|
+
parts << example_group_class.description_args
|
162
162
|
end
|
163
163
|
parts.flatten.compact
|
164
164
|
end
|
@@ -169,14 +169,9 @@ module Spec
|
|
169
169
|
@description_options = options
|
170
170
|
@description_text = ExampleGroupMethods.description_text(*args)
|
171
171
|
@spec_path = File.expand_path(options[:spec_path]) if options[:spec_path]
|
172
|
-
if described_type.class == Module
|
173
|
-
@described_module = described_type
|
174
|
-
end
|
175
172
|
self
|
176
173
|
end
|
177
174
|
|
178
|
-
attr_reader :described_module
|
179
|
-
|
180
175
|
def examples #:nodoc:
|
181
176
|
examples = example_objects.dup
|
182
177
|
add_method_examples(examples)
|
@@ -187,70 +182,6 @@ module Spec
|
|
187
182
|
examples.length
|
188
183
|
end
|
189
184
|
|
190
|
-
# Registers a block to be executed before each example.
|
191
|
-
# This method prepends +block+ to existing before blocks.
|
192
|
-
def prepend_before(*args, &block)
|
193
|
-
scope, options = scope_and_options(*args)
|
194
|
-
parts = before_parts_from_scope(scope)
|
195
|
-
parts.unshift(block)
|
196
|
-
end
|
197
|
-
|
198
|
-
# Registers a block to be executed before each example.
|
199
|
-
# This method appends +block+ to existing before blocks.
|
200
|
-
def append_before(*args, &block)
|
201
|
-
scope, options = scope_and_options(*args)
|
202
|
-
parts = before_parts_from_scope(scope)
|
203
|
-
parts << block
|
204
|
-
end
|
205
|
-
alias_method :before, :append_before
|
206
|
-
|
207
|
-
# Registers a block to be executed after each example.
|
208
|
-
# This method prepends +block+ to existing after blocks.
|
209
|
-
def prepend_after(*args, &block)
|
210
|
-
scope, options = scope_and_options(*args)
|
211
|
-
parts = after_parts_from_scope(scope)
|
212
|
-
parts.unshift(block)
|
213
|
-
end
|
214
|
-
alias_method :after, :prepend_after
|
215
|
-
|
216
|
-
# Registers a block to be executed after each example.
|
217
|
-
# This method appends +block+ to existing after blocks.
|
218
|
-
def append_after(*args, &block)
|
219
|
-
scope, options = scope_and_options(*args)
|
220
|
-
parts = after_parts_from_scope(scope)
|
221
|
-
parts << block
|
222
|
-
end
|
223
|
-
|
224
|
-
def remove_after(scope, &block)
|
225
|
-
after_each_parts.delete(block)
|
226
|
-
end
|
227
|
-
|
228
|
-
# Deprecated. Use before(:each)
|
229
|
-
def setup(&block)
|
230
|
-
before(:each, &block)
|
231
|
-
end
|
232
|
-
|
233
|
-
# Deprecated. Use after(:each)
|
234
|
-
def teardown(&block)
|
235
|
-
after(:each, &block)
|
236
|
-
end
|
237
|
-
|
238
|
-
def before_all_parts # :nodoc:
|
239
|
-
@before_all_parts ||= []
|
240
|
-
end
|
241
|
-
|
242
|
-
def after_all_parts # :nodoc:
|
243
|
-
@after_all_parts ||= []
|
244
|
-
end
|
245
|
-
|
246
|
-
def before_each_parts # :nodoc:
|
247
|
-
@before_each_parts ||= []
|
248
|
-
end
|
249
|
-
|
250
|
-
def after_each_parts # :nodoc:
|
251
|
-
@after_each_parts ||= []
|
252
|
-
end
|
253
|
-
|
254
185
|
# Only used from RSpec's own examples
|
255
186
|
def reset # :nodoc:
|
256
187
|
@before_all_parts = nil
|
@@ -269,18 +200,18 @@ module Spec
|
|
269
200
|
end
|
270
201
|
|
271
202
|
def registration_backtrace
|
272
|
-
eval("caller", registration_binding_block)
|
203
|
+
eval("caller", @registration_binding_block)
|
273
204
|
end
|
274
205
|
|
275
206
|
def run_before_each(example)
|
276
|
-
|
277
|
-
example.eval_each_fail_fast(
|
207
|
+
each_ancestor_example_group_class do |example_group_class|
|
208
|
+
example.eval_each_fail_fast(example_group_class.before_each_parts)
|
278
209
|
end
|
279
210
|
end
|
280
211
|
|
281
212
|
def run_after_each(example)
|
282
|
-
|
283
|
-
example.eval_each_fail_slow(
|
213
|
+
each_ancestor_example_group_class(:superclass_first) do |example_group_class|
|
214
|
+
example.eval_each_fail_slow(example_group_class.after_each_parts)
|
284
215
|
end
|
285
216
|
end
|
286
217
|
|
@@ -296,8 +227,8 @@ module Spec
|
|
296
227
|
def run_before_all
|
297
228
|
before_all = new("before(:all)")
|
298
229
|
begin
|
299
|
-
|
300
|
-
before_all.eval_each_fail_fast(
|
230
|
+
each_ancestor_example_group_class do |example_group_class|
|
231
|
+
before_all.eval_each_fail_fast(example_group_class.before_all_parts)
|
301
232
|
end
|
302
233
|
return [true, before_all.instance_variable_hash]
|
303
234
|
rescue Exception => e
|
@@ -320,8 +251,8 @@ module Spec
|
|
320
251
|
def run_after_all(success, instance_variables)
|
321
252
|
after_all = new("after(:all)")
|
322
253
|
after_all.set_instance_variables_from_hash(instance_variables)
|
323
|
-
|
324
|
-
after_all.eval_each_fail_slow(
|
254
|
+
each_ancestor_example_group_class(:superclass_first) do |example_group_class|
|
255
|
+
after_all.eval_each_fail_slow(example_group_class.after_all_parts)
|
325
256
|
end
|
326
257
|
return success
|
327
258
|
rescue Exception => e
|
@@ -359,22 +290,21 @@ module Spec
|
|
359
290
|
@example_objects ||= []
|
360
291
|
end
|
361
292
|
|
362
|
-
def
|
293
|
+
def each_ancestor_example_group_class(superclass_last=false)
|
363
294
|
classes = []
|
364
295
|
current_class = self
|
365
|
-
while
|
296
|
+
while is_example_group_class?(current_class)
|
366
297
|
superclass_last ? classes << current_class : classes.unshift(current_class)
|
367
298
|
current_class = current_class.superclass
|
368
299
|
end
|
369
|
-
|
370
|
-
|
300
|
+
|
371
301
|
classes.each do |example_group|
|
372
302
|
yield example_group
|
373
303
|
end
|
374
304
|
end
|
375
305
|
|
376
|
-
def
|
377
|
-
|
306
|
+
def is_example_group_class?(klass)
|
307
|
+
klass.kind_of?(ExampleGroupMethods) && klass.included_modules.include?(ExampleMethods)
|
378
308
|
end
|
379
309
|
|
380
310
|
def plugin_mock_framework
|
@@ -398,27 +328,6 @@ module Spec
|
|
398
328
|
end
|
399
329
|
end
|
400
330
|
|
401
|
-
def scope_and_options(*args)
|
402
|
-
args, options = args_and_options(*args)
|
403
|
-
scope = (args[0] || :each), options
|
404
|
-
end
|
405
|
-
|
406
|
-
def before_parts_from_scope(scope)
|
407
|
-
case scope
|
408
|
-
when :each; before_each_parts
|
409
|
-
when :all; before_all_parts
|
410
|
-
when :suite; Spec::Runner.options.before_suite_parts
|
411
|
-
end
|
412
|
-
end
|
413
|
-
|
414
|
-
def after_parts_from_scope(scope)
|
415
|
-
case scope
|
416
|
-
when :each; after_each_parts
|
417
|
-
when :all; after_all_parts
|
418
|
-
when :suite; Spec::Runner.options.after_suite_parts
|
419
|
-
end
|
420
|
-
end
|
421
|
-
|
422
331
|
def add_method_examples(examples)
|
423
332
|
instance_methods.sort.each do |method_name|
|
424
333
|
if example_method?(method_name)
|
@@ -436,10 +345,23 @@ module Spec
|
|
436
345
|
def should_method?(method_name)
|
437
346
|
!(method_name =~ /^should(_not)?$/) &&
|
438
347
|
method_name =~ /^should/ && (
|
439
|
-
instance_method(method_name).arity
|
440
|
-
instance_method(method_name).arity == -1
|
348
|
+
[-1,0].include?(instance_method(method_name).arity)
|
441
349
|
)
|
442
350
|
end
|
351
|
+
|
352
|
+
def include_shared_example_group(shared_example_group)
|
353
|
+
case shared_example_group
|
354
|
+
when SharedExampleGroup
|
355
|
+
include shared_example_group
|
356
|
+
else
|
357
|
+
example_group = SharedExampleGroup.find_shared_example_group(shared_example_group)
|
358
|
+
unless example_group
|
359
|
+
raise RuntimeError.new("Shared Example Group '#{shared_example_group}' can not be found")
|
360
|
+
end
|
361
|
+
include(example_group)
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
443
365
|
end
|
444
366
|
|
445
367
|
end
|