rspec 1.0.8 → 1.1.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/CHANGES +122 -2
- data/README +10 -9
- data/Rakefile +22 -49
- data/TODO +2 -0
- data/bin/spec +1 -1
- data/bin/spec_translator +8 -8
- data/examples/{auto_spec_description_example.rb → pure/autogenerated_docstrings_example.rb} +0 -0
- data/examples/{before_and_after_example.rb → pure/before_and_after_example.rb} +1 -0
- data/examples/{behave_as_example.rb → pure/behave_as_example.rb} +0 -0
- data/examples/{custom_expectation_matchers.rb → pure/custom_expectation_matchers.rb} +0 -0
- data/examples/{custom_formatter.rb → pure/custom_formatter.rb} +1 -0
- data/examples/{dynamic_spec.rb → pure/dynamic_spec.rb} +0 -0
- data/examples/{file_accessor.rb → pure/file_accessor.rb} +1 -0
- data/examples/{file_accessor_spec.rb → pure/file_accessor_spec.rb} +0 -0
- data/examples/{greeter_spec.rb → pure/greeter_spec.rb} +1 -0
- data/examples/{helper_method_example.rb → pure/helper_method_example.rb} +0 -0
- data/examples/{io_processor.rb → pure/io_processor.rb} +0 -0
- data/examples/{io_processor_spec.rb → pure/io_processor_spec.rb} +0 -0
- data/examples/{legacy_spec.rb → pure/legacy_spec.rb} +1 -0
- data/examples/{mocking_example.rb → pure/mocking_example.rb} +0 -0
- data/examples/pure/multi_threaded_behaviour_runner.rb +28 -0
- data/examples/pure/nested_classes_example.rb +36 -0
- data/examples/{partial_mock_example.rb → pure/partial_mock_example.rb} +0 -0
- data/examples/{pending_example.rb → pure/pending_example.rb} +0 -0
- data/examples/{predicate_example.rb → pure/predicate_example.rb} +0 -0
- data/examples/{priority.txt → pure/priority.txt} +0 -0
- data/examples/pure/shared_example_group_example.rb +66 -0
- data/examples/pure/shared_stack_examples.rb +38 -0
- data/examples/pure/spec_helper.rb +3 -0
- data/examples/{stack.rb → pure/stack.rb} +0 -0
- data/examples/{stack_spec.rb → pure/stack_spec.rb} +1 -35
- data/examples/pure/stack_spec_with_nested_example_groups.rb +67 -0
- data/examples/{stubbing_example.rb → pure/stubbing_example.rb} +0 -0
- data/examples/stories/adder.rb +13 -0
- data/examples/stories/addition +34 -0
- data/examples/stories/addition.rb +9 -0
- data/examples/stories/calculator.rb +65 -0
- data/examples/stories/game-of-life/README.txt +21 -0
- data/examples/stories/game-of-life/behaviour/everything.rb +6 -0
- data/examples/stories/game-of-life/behaviour/examples/examples.rb +3 -0
- data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +35 -0
- data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +66 -0
- data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +21 -0
- data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +21 -0
- data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +42 -0
- data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +42 -0
- data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +17 -0
- data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +53 -0
- data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +52 -0
- data/examples/stories/game-of-life/behaviour/stories/helper.rb +6 -0
- data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +26 -0
- data/examples/stories/game-of-life/behaviour/stories/steps.rb +5 -0
- data/examples/stories/game-of-life/behaviour/stories/stories.rb +3 -0
- data/examples/stories/game-of-life/behaviour/stories/stories.txt +22 -0
- data/examples/stories/game-of-life/life.rb +3 -0
- data/examples/stories/game-of-life/life/game.rb +23 -0
- data/examples/stories/game-of-life/life/grid.rb +43 -0
- data/examples/stories/helper.rb +9 -0
- data/examples/stories/steps/addition_steps.rb +18 -0
- data/lib/autotest/rspec.rb +1 -2
- data/lib/spec.rb +30 -6
- data/lib/spec/example.rb +12 -0
- data/lib/spec/{dsl → example}/configuration.rb +48 -39
- data/lib/spec/{dsl → example}/errors.rb +2 -2
- data/lib/spec/example/example_group.rb +16 -0
- data/lib/spec/example/example_group_factory.rb +62 -0
- data/lib/spec/example/example_group_methods.rb +412 -0
- data/lib/spec/example/example_matcher.rb +42 -0
- data/lib/spec/example/example_methods.rb +101 -0
- data/lib/spec/example/module_reopening_fix.rb +21 -0
- data/lib/spec/example/pending.rb +18 -0
- data/lib/spec/example/shared_example_group.rb +58 -0
- data/lib/spec/expectations/differs/default.rb +15 -10
- data/lib/spec/expectations/errors.rb +7 -1
- data/lib/spec/expectations/extensions/object.rb +12 -7
- data/lib/spec/expectations/handler.rb +13 -4
- data/lib/spec/extensions.rb +2 -0
- data/lib/spec/extensions/class.rb +24 -0
- data/lib/spec/extensions/main.rb +54 -0
- data/lib/spec/extensions/object.rb +5 -1
- data/lib/spec/interop/test.rb +10 -0
- data/lib/spec/interop/test/unit/autorunner.rb +6 -0
- data/lib/spec/interop/test/unit/testcase.rb +61 -0
- data/lib/spec/interop/test/unit/testresult.rb +6 -0
- data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
- data/lib/spec/interop/test/unit/ui/console/testrunner.rb +60 -0
- data/lib/spec/matchers.rb +11 -15
- data/lib/spec/matchers/be.rb +23 -6
- data/lib/spec/matchers/change.rb +25 -1
- data/lib/spec/matchers/exist.rb +17 -0
- data/lib/spec/matchers/operator_matcher.rb +1 -0
- data/lib/spec/matchers/simple_matcher.rb +29 -0
- data/lib/spec/matchers/throw_symbol.rb +2 -0
- data/lib/spec/mocks.rb +5 -2
- data/lib/spec/mocks/argument_expectation.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +62 -44
- data/lib/spec/mocks/methods.rb +2 -2
- data/lib/spec/mocks/mock.rb +24 -3
- data/lib/spec/mocks/proxy.rb +26 -23
- data/lib/spec/mocks/space.rb +1 -1
- data/lib/spec/mocks/spec_methods.rb +20 -12
- data/lib/spec/rake/spectask.rb +19 -1
- data/lib/spec/rake/verify_rcov.rb +1 -1
- data/lib/spec/runner.rb +33 -10
- data/lib/spec/runner/backtrace_tweaker.rb +3 -3
- data/lib/spec/runner/class_and_arguments_parser.rb +16 -0
- data/lib/spec/runner/command_line.rb +18 -12
- data/lib/spec/runner/drb_command_line.rb +4 -5
- data/lib/spec/runner/example_group_runner.rb +59 -0
- data/lib/spec/runner/formatter/base_formatter.rb +10 -8
- data/lib/spec/runner/formatter/base_text_formatter.rb +18 -18
- data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +31 -0
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +3 -5
- data/lib/spec/runner/formatter/html_formatter.rb +37 -27
- data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +3 -4
- data/lib/spec/runner/formatter/specdoc_formatter.rb +27 -13
- data/lib/spec/runner/formatter/story/html_formatter.rb +124 -0
- data/lib/spec/runner/formatter/story/plain_text_formatter.rb +123 -0
- data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
- data/lib/spec/runner/heckle_runner.rb +9 -9
- data/lib/spec/runner/option_parser.rb +140 -138
- data/lib/spec/runner/options.rb +168 -90
- data/lib/spec/runner/reporter.rb +58 -40
- data/lib/spec/runner/spec_parser.rb +11 -8
- data/lib/spec/story.rb +10 -0
- data/lib/spec/story/extensions.rb +1 -0
- data/lib/spec/story/extensions/main.rb +86 -0
- data/lib/spec/story/given_scenario.rb +14 -0
- data/lib/spec/story/runner.rb +58 -0
- data/lib/spec/story/runner/plain_text_story_runner.rb +48 -0
- data/lib/spec/story/runner/scenario_collector.rb +18 -0
- data/lib/spec/story/runner/scenario_runner.rb +46 -0
- data/lib/spec/story/runner/story_mediator.rb +123 -0
- data/lib/spec/story/runner/story_parser.rb +227 -0
- data/lib/spec/story/runner/story_runner.rb +67 -0
- data/lib/spec/story/scenario.rb +14 -0
- data/lib/spec/story/step.rb +48 -0
- data/lib/spec/story/step_group.rb +89 -0
- data/lib/spec/story/step_mother.rb +37 -0
- data/lib/spec/story/story.rb +42 -0
- data/lib/spec/story/world.rb +124 -0
- data/lib/spec/version.rb +4 -5
- data/plugins/mock_frameworks/rspec.rb +1 -1
- data/spec/autotest/rspec_spec.rb +13 -7
- data/spec/autotest_helper.rb +4 -3
- data/spec/rspec_suite.rb +7 -0
- data/spec/ruby_forker.rb +13 -0
- data/spec/spec/example/configuration_spec.rb +290 -0
- data/spec/spec/example/example_group_class_definition_spec.rb +48 -0
- data/spec/spec/example/example_group_factory_spec.rb +129 -0
- data/spec/spec/example/example_group_methods_spec.rb +465 -0
- data/spec/spec/example/example_group_spec.rb +711 -0
- data/spec/spec/{dsl → example}/example_matcher_spec.rb +23 -18
- data/spec/spec/example/example_methods_spec.rb +75 -0
- data/spec/spec/example/example_runner_spec.rb +194 -0
- data/spec/spec/example/example_spec.rb +53 -0
- data/spec/spec/example/nested_example_group_spec.rb +59 -0
- data/spec/spec/example/pending_module_spec.rb +31 -0
- data/spec/spec/{dsl → example}/predicate_matcher_spec.rb +1 -1
- data/spec/spec/example/shared_example_group_spec.rb +265 -0
- data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
- data/spec/spec/expectations/differs/default_spec.rb +5 -3
- data/spec/spec/expectations/extensions/object_spec.rb +63 -2
- data/spec/spec/extensions/main_spec.rb +50 -0
- data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +14 -0
- data/spec/spec/interop/test/unit/testcase_spec.rb +10 -0
- data/spec/spec/interop/test/unit/testcase_spec_with_test_unit.rb +20 -0
- data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
- data/spec/spec/interop/test/unit/testsuite_adapter_spec_with_test_unit.rb +34 -0
- data/spec/spec/matchers/be_spec.rb +15 -0
- data/spec/spec/matchers/change_spec.rb +87 -0
- data/spec/spec/matchers/description_generation_spec.rb +31 -37
- data/spec/spec/matchers/exist_spec.rb +31 -22
- data/spec/spec/matchers/handler_spec.rb +42 -1
- data/spec/spec/matchers/have_spec.rb +1 -1
- data/spec/spec/matchers/mock_constraint_matchers_spec.rb +1 -1
- data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
- data/spec/spec/matchers/simple_matcher_spec.rb +31 -0
- data/spec/spec/matchers/throw_symbol_spec.rb +4 -1
- data/spec/spec/mocks/bug_report_10263.rb +24 -0
- data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
- data/spec/spec/mocks/bug_report_8165_spec.rb +2 -2
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +1 -0
- data/spec/spec/mocks/mock_spec.rb +200 -102
- data/spec/spec/mocks/multiple_return_value_spec.rb +1 -1
- data/spec/spec/mocks/options_hash_spec.rb +19 -7
- data/spec/spec/mocks/partial_mock_spec.rb +31 -9
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +6 -0
- data/spec/spec/mocks/stub_spec.rb +120 -98
- data/spec/spec/package/bin_spec_spec.rb +7 -5
- data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
- data/spec/spec/runner/command_line_spec.rb +140 -27
- data/spec/spec/runner/drb_command_line_spec.rb +39 -31
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +44 -0
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +16 -11
- data/spec/spec/runner/formatter/html_formatter_spec.rb +60 -50
- data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +29 -13
- data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +103 -0
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +103 -39
- data/spec/spec/runner/formatter/story/html_formatter_spec.rb +56 -0
- data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +289 -0
- data/spec/spec/runner/heckle_runner_spec.rb +29 -14
- data/spec/spec/runner/heckler_spec.rb +4 -5
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +5 -5
- data/spec/spec/runner/option_parser_spec.rb +86 -58
- data/spec/spec/runner/options_spec.rb +239 -120
- data/spec/spec/runner/output_one_time_fixture.rb +7 -0
- data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
- data/spec/spec/runner/output_one_time_spec.rb +16 -0
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +6 -6
- data/spec/spec/runner/reporter_spec.rb +147 -163
- data/spec/spec/runner/spec_parser_spec.rb +31 -0
- data/spec/spec/runner_spec.rb +11 -0
- data/spec/spec/spec_classes.rb +12 -5
- data/spec/spec/story/builders.rb +46 -0
- data/spec/spec/story/extensions/main_spec.rb +161 -0
- data/spec/spec/story/extensions_spec.rb +14 -0
- data/spec/spec/story/given_scenario_spec.rb +27 -0
- data/spec/spec/story/runner/plain_text_story_runner_spec.rb +92 -0
- data/spec/spec/story/runner/scenario_collector_spec.rb +27 -0
- data/spec/spec/story/runner/scenario_runner_spec.rb +142 -0
- data/spec/spec/story/runner/story_mediator_spec.rb +133 -0
- data/spec/spec/story/runner/story_parser_spec.rb +384 -0
- data/spec/spec/story/runner/story_runner_spec.rb +219 -0
- data/spec/spec/story/runner_spec.rb +106 -0
- data/spec/spec/story/scenario_spec.rb +20 -0
- data/spec/spec/story/step_group_spec.rb +157 -0
- data/spec/spec/story/step_mother_spec.rb +72 -0
- data/spec/spec/story/step_spec.rb +147 -0
- data/spec/spec/story/story_helper.rb +2 -0
- data/spec/spec/story/story_spec.rb +86 -0
- data/spec/spec/story/world_spec.rb +416 -0
- data/spec/spec/translator_spec.rb +2 -1
- data/spec/spec_helper.rb +59 -2
- data/stories/all.rb +5 -0
- data/stories/example_groups/autogenerated_docstrings +26 -0
- data/stories/example_groups/example_group_with_should_methods +17 -0
- data/stories/example_groups/nested_groups +17 -0
- data/stories/example_groups/output +20 -0
- data/stories/example_groups/stories.rb +7 -0
- data/stories/helper.rb +6 -0
- data/stories/interop/examples_and_tests_together +30 -0
- data/stories/interop/stories.rb +7 -0
- data/stories/interop/test_case_with_should_methods +17 -0
- data/stories/pending_stories/README +3 -0
- data/stories/resources/helpers/cmdline.rb +9 -0
- data/stories/resources/helpers/story_helper.rb +16 -0
- data/stories/resources/matchers/smart_match.rb +37 -0
- data/stories/resources/spec/example_group_with_should_methods.rb +12 -0
- data/stories/resources/spec/simple_spec.rb +8 -0
- data/stories/resources/steps/running_rspec.rb +50 -0
- data/stories/resources/test/spec_and_test_together.rb +57 -0
- data/stories/resources/test/test_case_with_should_methods.rb +30 -0
- metadata +232 -106
- data/EXAMPLES.rd +0 -111
- data/examples/multi_threaded_behaviour_runner.rb +0 -25
- data/examples/shared_behaviours_example.rb +0 -39
- data/examples/spec_helper.rb +0 -1
- data/examples/test_case_adapter_example.rb +0 -26
- data/examples/test_case_spec.rb +0 -65
- data/lib/spec/dsl.rb +0 -11
- data/lib/spec/dsl/behaviour.rb +0 -220
- data/lib/spec/dsl/behaviour_callbacks.rb +0 -82
- data/lib/spec/dsl/behaviour_eval.rb +0 -231
- data/lib/spec/dsl/behaviour_factory.rb +0 -42
- data/lib/spec/dsl/composite_proc_builder.rb +0 -33
- data/lib/spec/dsl/description.rb +0 -76
- data/lib/spec/dsl/example.rb +0 -135
- data/lib/spec/dsl/example_matcher.rb +0 -40
- data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
- data/lib/spec/runner/behaviour_runner.rb +0 -123
- data/lib/spec/runner/extensions/kernel.rb +0 -50
- data/lib/spec/runner/extensions/object.rb +0 -32
- data/lib/spec/runner/formatter.rb +0 -9
- data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -29
- data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
- data/lib/spec/test_case_adapter.rb +0 -10
- data/spec/spec/dsl/behaviour_eval_spec.rb +0 -79
- data/spec/spec/dsl/behaviour_factory_spec.rb +0 -48
- data/spec/spec/dsl/behaviour_spec.rb +0 -661
- data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -44
- data/spec/spec/dsl/configuration_spec.rb +0 -55
- data/spec/spec/dsl/description_spec.rb +0 -89
- data/spec/spec/dsl/example_class_spec.rb +0 -24
- data/spec/spec/dsl/example_instance_spec.rb +0 -160
- data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
- data/spec/spec/dsl/shared_behaviour_spec.rb +0 -252
- data/spec/spec/runner/behaviour_runner_spec.rb +0 -229
- data/spec/spec/runner/context_matching_spec.rb +0 -27
- data/spec/spec/runner/extensions/bug_report_10577_spec.rb +0 -35
- data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
- data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -40
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -20
- data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +0 -36
- data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +0 -19
- data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +0 -46
- data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +0 -21
- data/spec/spec/runner/object_ext_spec.rb +0 -11
data/lib/spec.rb
CHANGED
@@ -1,13 +1,37 @@
|
|
1
|
-
require 'spec/extensions'
|
2
1
|
require 'spec/version'
|
3
2
|
require 'spec/matchers'
|
4
3
|
require 'spec/expectations'
|
5
|
-
require 'spec/
|
6
|
-
require 'spec/
|
4
|
+
require 'spec/example'
|
5
|
+
require 'spec/extensions'
|
7
6
|
require 'spec/runner'
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
if Object.const_defined?(:Test); \
|
9
|
+
require 'spec/interop/test'; \
|
10
|
+
end
|
11
|
+
|
12
|
+
module Spec
|
13
|
+
class << self
|
14
|
+
def run?
|
15
|
+
@run || rspec_options.examples_run?
|
16
|
+
end
|
17
|
+
|
18
|
+
def run; \
|
19
|
+
return true if run?; \
|
20
|
+
result = rspec_options.run_examples; \
|
21
|
+
@run = true; \
|
22
|
+
result; \
|
23
|
+
end
|
24
|
+
attr_writer :run
|
25
|
+
|
26
|
+
def exit?; \
|
27
|
+
!Object.const_defined?(:Test) || Test::Unit.run?; \
|
28
|
+
end
|
12
29
|
end
|
13
30
|
end
|
31
|
+
|
32
|
+
at_exit do \
|
33
|
+
unless $! || Spec.run?; \
|
34
|
+
success = Spec.run; \
|
35
|
+
exit success if Spec.exit?; \
|
36
|
+
end \
|
37
|
+
end
|
data/lib/spec/example.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
require 'forwardable'
|
3
|
+
require 'spec/example/pending'
|
4
|
+
require 'spec/example/module_reopening_fix'
|
5
|
+
require 'spec/example/example_group_methods'
|
6
|
+
require 'spec/example/example_methods'
|
7
|
+
require 'spec/example/example_group'
|
8
|
+
require 'spec/example/shared_example_group'
|
9
|
+
require 'spec/example/example_group_factory'
|
10
|
+
require 'spec/example/errors'
|
11
|
+
require 'spec/example/configuration'
|
12
|
+
require 'spec/example/example_matcher'
|
@@ -1,7 +1,6 @@
|
|
1
1
|
module Spec
|
2
|
-
module
|
2
|
+
module Example
|
3
3
|
class Configuration
|
4
|
-
|
5
4
|
# Chooses what mock framework to use. Example:
|
6
5
|
#
|
7
6
|
# Spec::Runner.configure do |config|
|
@@ -36,49 +35,35 @@ module Spec
|
|
36
35
|
@mock_framework ||= mock_framework_path("rspec")
|
37
36
|
end
|
38
37
|
|
39
|
-
# Declares modules to be included in all
|
38
|
+
# Declares modules to be included in all example groups (<tt>describe</tt> blocks).
|
40
39
|
#
|
41
40
|
# config.include(My::Bottle, My::Cup)
|
42
41
|
#
|
43
|
-
# If you want to restrict the inclusion to a subset of all the
|
42
|
+
# If you want to restrict the inclusion to a subset of all the example groups then
|
44
43
|
# specify this in a Hash as the last argument:
|
45
44
|
#
|
46
|
-
# config.include(My::Pony, My::Horse, :
|
45
|
+
# config.include(My::Pony, My::Horse, :type => :farm)
|
47
46
|
#
|
48
|
-
# Only
|
47
|
+
# Only example groups that have that type will get the modules included:
|
49
48
|
#
|
50
|
-
# describe "Downtown", :
|
49
|
+
# describe "Downtown", :type => :city do
|
51
50
|
# # Will *not* get My::Pony and My::Horse included
|
52
51
|
# end
|
53
52
|
#
|
54
|
-
# describe "Old Mac Donald", :
|
53
|
+
# describe "Old Mac Donald", :type => :farm do
|
55
54
|
# # *Will* get My::Pony and My::Horse included
|
56
55
|
# end
|
57
56
|
#
|
58
57
|
def include(*args)
|
59
58
|
args << {} unless Hash === args.last
|
60
59
|
modules, options = args_and_options(*args)
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
@modules[required_behaviour_type] += modules
|
66
|
-
end
|
67
|
-
|
68
|
-
def modules_for(required_behaviour_type) #:nodoc:
|
69
|
-
@modules ||= {}
|
70
|
-
modules = @modules[nil] || [] # general ones
|
71
|
-
modules << @modules[required_behaviour_type.to_sym] unless required_behaviour_type.nil?
|
72
|
-
modules.uniq.compact
|
73
|
-
end
|
74
|
-
|
75
|
-
# This is just for cleanup in RSpec's own examples
|
76
|
-
def exclude(*modules) #:nodoc:
|
77
|
-
@modules.each do |behaviour_type, mods|
|
78
|
-
modules.each{|m| mods.delete(m)}
|
60
|
+
required_example_group = get_type_from_options(options)
|
61
|
+
required_example_group = required_example_group.to_sym if required_example_group
|
62
|
+
modules.each do |mod|
|
63
|
+
ExampleGroupFactory.get(required_example_group).send(:include, mod)
|
79
64
|
end
|
80
65
|
end
|
81
|
-
|
66
|
+
|
82
67
|
# Defines global predicate matchers. Example:
|
83
68
|
#
|
84
69
|
# config.predicate_matchers[:swim] = :can_swim?
|
@@ -91,45 +76,69 @@ module Spec
|
|
91
76
|
@predicate_matchers ||= {}
|
92
77
|
end
|
93
78
|
|
94
|
-
# Prepends a global <tt>before</tt> block to all
|
79
|
+
# Prepends a global <tt>before</tt> block to all example groups.
|
95
80
|
# See #append_before for filtering semantics.
|
96
81
|
def prepend_before(*args, &proc)
|
97
|
-
|
82
|
+
scope, options = scope_and_options(*args)
|
83
|
+
example_group = ExampleGroupFactory.get(
|
84
|
+
get_type_from_options(options)
|
85
|
+
)
|
86
|
+
example_group.prepend_before(scope, &proc)
|
98
87
|
end
|
99
|
-
# Appends a global <tt>before</tt> block to all
|
88
|
+
# Appends a global <tt>before</tt> block to all example groups.
|
100
89
|
#
|
101
|
-
# If you want to restrict the block to a subset of all the
|
90
|
+
# If you want to restrict the block to a subset of all the example groups then
|
102
91
|
# specify this in a Hash as the last argument:
|
103
92
|
#
|
104
|
-
# config.prepend_before(:all, :
|
93
|
+
# config.prepend_before(:all, :type => :farm)
|
105
94
|
#
|
106
95
|
# or
|
107
96
|
#
|
108
|
-
# config.prepend_before(:
|
97
|
+
# config.prepend_before(:type => :farm)
|
109
98
|
#
|
110
99
|
def append_before(*args, &proc)
|
111
|
-
|
100
|
+
scope, options = scope_and_options(*args)
|
101
|
+
example_group = ExampleGroupFactory.get(
|
102
|
+
get_type_from_options(options)
|
103
|
+
)
|
104
|
+
example_group.append_before(scope, &proc)
|
112
105
|
end
|
113
106
|
alias_method :before, :append_before
|
114
107
|
|
115
|
-
# Prepends a global <tt>after</tt> block to all
|
108
|
+
# Prepends a global <tt>after</tt> block to all example groups.
|
116
109
|
# See #append_before for filtering semantics.
|
117
110
|
def prepend_after(*args, &proc)
|
118
|
-
|
111
|
+
scope, options = scope_and_options(*args)
|
112
|
+
example_group = ExampleGroupFactory.get(
|
113
|
+
get_type_from_options(options)
|
114
|
+
)
|
115
|
+
example_group.prepend_after(scope, &proc)
|
119
116
|
end
|
120
117
|
alias_method :after, :prepend_after
|
121
|
-
# Appends a global <tt>after</tt> block to all
|
118
|
+
# Appends a global <tt>after</tt> block to all example groups.
|
122
119
|
# See #append_before for filtering semantics.
|
123
120
|
def append_after(*args, &proc)
|
124
|
-
|
121
|
+
scope, options = scope_and_options(*args)
|
122
|
+
example_group = ExampleGroupFactory.get(
|
123
|
+
get_type_from_options(options)
|
124
|
+
)
|
125
|
+
example_group.append_after(scope, &proc)
|
125
126
|
end
|
126
127
|
|
127
128
|
private
|
129
|
+
|
130
|
+
def scope_and_options(*args)
|
131
|
+
args, options = args_and_options(*args)
|
132
|
+
scope = (args[0] || :each), options
|
133
|
+
end
|
134
|
+
|
135
|
+
def get_type_from_options(options)
|
136
|
+
options[:type] || options[:behaviour_type]
|
137
|
+
end
|
128
138
|
|
129
139
|
def mock_framework_path(framework_name)
|
130
140
|
File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "..", "plugins", "mock_frameworks", framework_name))
|
131
141
|
end
|
132
|
-
|
133
142
|
end
|
134
143
|
end
|
135
144
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
# The superclass for all regular RSpec examples.
|
4
|
+
class ExampleGroup
|
5
|
+
extend Spec::Example::ExampleGroupMethods
|
6
|
+
include Spec::Example::ExampleMethods
|
7
|
+
|
8
|
+
def initialize(defined_description, &implementation)
|
9
|
+
@_defined_description = defined_description
|
10
|
+
@_implementation = implementation
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
Spec::ExampleGroup = Spec::Example::ExampleGroup
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
class ExampleGroupFactory
|
4
|
+
class << self
|
5
|
+
def reset
|
6
|
+
@example_group_types = nil
|
7
|
+
default(ExampleGroup)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Registers an example group class +klass+ with the symbol
|
11
|
+
# +type+. For example:
|
12
|
+
#
|
13
|
+
# Spec::Example::ExampleGroupFactory.register(:farm, Spec::Farm::Example::FarmExampleGroup)
|
14
|
+
#
|
15
|
+
# This will cause Main#describe from a file living in
|
16
|
+
# <tt>spec/farm</tt> to create example group instances of type
|
17
|
+
# Spec::Farm::Example::FarmExampleGroup.
|
18
|
+
def register(id, example_group_class)
|
19
|
+
@example_group_types[id] = example_group_class
|
20
|
+
end
|
21
|
+
|
22
|
+
# Sets the default ExampleGroup class
|
23
|
+
def default(example_group_class)
|
24
|
+
old = @example_group_types
|
25
|
+
@example_group_types = Hash.new(example_group_class)
|
26
|
+
@example_group_types.merge(old) if old
|
27
|
+
end
|
28
|
+
|
29
|
+
def get(id=nil)
|
30
|
+
if @example_group_types.values.include?(id)
|
31
|
+
id
|
32
|
+
else
|
33
|
+
@example_group_types[id]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_example_group(*args, &block)
|
38
|
+
opts = Hash === args.last ? args.last : {}
|
39
|
+
if opts[:shared]
|
40
|
+
SharedExampleGroup.new(*args, &block)
|
41
|
+
else
|
42
|
+
superclass = determine_superclass(opts)
|
43
|
+
superclass.describe(*args, &block)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
protected
|
48
|
+
|
49
|
+
def determine_superclass(opts)
|
50
|
+
id = if opts[:type]
|
51
|
+
opts[:type]
|
52
|
+
elsif opts[:spec_path] =~ /spec(\\|\/)(#{@example_group_types.keys.join('|')})/
|
53
|
+
$2 == '' ? nil : $2.to_sym
|
54
|
+
end
|
55
|
+
get(id)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
self.reset
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,412 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
|
4
|
+
module ExampleGroupMethods
|
5
|
+
class << self
|
6
|
+
def description_text(*args)
|
7
|
+
args.inject("") do |result, arg|
|
8
|
+
result << " " unless (result == "" || arg.to_s =~ /^(\s|\.|#)/)
|
9
|
+
result << arg.to_s
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
attr_reader :description_text, :description_args, :spec_path
|
15
|
+
|
16
|
+
def inherited(klass)
|
17
|
+
super
|
18
|
+
klass.register
|
19
|
+
end
|
20
|
+
|
21
|
+
# Makes the describe/it syntax available from a class. For example:
|
22
|
+
#
|
23
|
+
# class StackSpec < Spec::ExampleGroup
|
24
|
+
# describe Stack, "with no elements"
|
25
|
+
#
|
26
|
+
# before
|
27
|
+
# @stack = Stack.new
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# it "should raise on pop" do
|
31
|
+
# lambda{ @stack.pop }.should raise_error
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
def describe(*args, &example_group_block)
|
36
|
+
if example_group_block
|
37
|
+
self.subclass("Subclass") do
|
38
|
+
describe(*args)
|
39
|
+
module_eval(&example_group_block)
|
40
|
+
end
|
41
|
+
else
|
42
|
+
set_description(*args)
|
43
|
+
before_eval
|
44
|
+
self
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Use this to pull in examples from shared example groups.
|
49
|
+
# See Spec::Runner for information about shared example groups.
|
50
|
+
def it_should_behave_like(shared_example_group)
|
51
|
+
case shared_example_group
|
52
|
+
when SharedExampleGroup
|
53
|
+
include shared_example_group
|
54
|
+
else
|
55
|
+
example_group = SharedExampleGroup.find_shared_example_group(shared_example_group)
|
56
|
+
unless example_group
|
57
|
+
raise RuntimeError.new("Shared Example Group '#{shared_example_group}' can not be found")
|
58
|
+
end
|
59
|
+
include(example_group)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# :call-seq:
|
64
|
+
# predicate_matchers[matcher_name] = method_on_object
|
65
|
+
# predicate_matchers[matcher_name] = [method1_on_object, method2_on_object]
|
66
|
+
#
|
67
|
+
# Dynamically generates a custom matcher that will match
|
68
|
+
# a predicate on your class. RSpec provides a couple of these
|
69
|
+
# out of the box:
|
70
|
+
#
|
71
|
+
# exist (or state expectations)
|
72
|
+
# File.should exist("path/to/file")
|
73
|
+
#
|
74
|
+
# an_instance_of (for mock argument constraints)
|
75
|
+
# mock.should_receive(:message).with(an_instance_of(String))
|
76
|
+
#
|
77
|
+
# == Examples
|
78
|
+
#
|
79
|
+
# class Fish
|
80
|
+
# def can_swim?
|
81
|
+
# true
|
82
|
+
# end
|
83
|
+
# end
|
84
|
+
#
|
85
|
+
# describe Fish do
|
86
|
+
# predicate_matchers[:swim] = :can_swim?
|
87
|
+
# it "should swim" do
|
88
|
+
# Fish.new.should swim
|
89
|
+
# end
|
90
|
+
# end
|
91
|
+
def predicate_matchers
|
92
|
+
@predicate_matchers ||= {:an_instance_of => :is_a?}
|
93
|
+
end
|
94
|
+
|
95
|
+
# Creates an instance of Spec::Example::Example and adds
|
96
|
+
# it to a collection of examples of the current example group.
|
97
|
+
def it(description=nil, &implementation)
|
98
|
+
e = new(description, &implementation)
|
99
|
+
example_objects << e
|
100
|
+
e
|
101
|
+
end
|
102
|
+
|
103
|
+
alias_method :specify, :it
|
104
|
+
|
105
|
+
# Use this to temporarily disable an example.
|
106
|
+
def xit(description=nil, opts={}, &block)
|
107
|
+
Kernel.warn("Example disabled: #{description}")
|
108
|
+
end
|
109
|
+
|
110
|
+
def run
|
111
|
+
examples = examples_to_run
|
112
|
+
return true if examples.empty?
|
113
|
+
reporter.add_example_group(self)
|
114
|
+
return dry_run(examples) if dry_run?
|
115
|
+
|
116
|
+
plugin_mock_framework
|
117
|
+
define_methods_from_predicate_matchers
|
118
|
+
|
119
|
+
success, before_all_instance_variables = run_before_all
|
120
|
+
success, after_all_instance_variables = execute_examples(success, before_all_instance_variables, examples)
|
121
|
+
success = run_after_all(success, after_all_instance_variables)
|
122
|
+
end
|
123
|
+
|
124
|
+
def description
|
125
|
+
ExampleGroupMethods.description_text(*description_parts)
|
126
|
+
end
|
127
|
+
|
128
|
+
def described_type
|
129
|
+
description_parts.find {|part| part.is_a?(Module)}
|
130
|
+
end
|
131
|
+
|
132
|
+
def description_parts #:nodoc:
|
133
|
+
parts = []
|
134
|
+
execute_in_class_hierarchy do |example_group|
|
135
|
+
parts << example_group.description_args
|
136
|
+
end
|
137
|
+
parts.flatten.compact
|
138
|
+
end
|
139
|
+
|
140
|
+
def set_description(*args)
|
141
|
+
args, options = args_and_options(*args)
|
142
|
+
@description_args = args
|
143
|
+
@description_text = ExampleGroupMethods.description_text(*args)
|
144
|
+
@spec_path = File.expand_path(options[:spec_path]) if options[:spec_path]
|
145
|
+
if described_type.class == Module
|
146
|
+
include described_type
|
147
|
+
end
|
148
|
+
self
|
149
|
+
end
|
150
|
+
|
151
|
+
def examples #:nodoc:
|
152
|
+
examples = example_objects.dup
|
153
|
+
add_method_examples(examples)
|
154
|
+
rspec_options.reverse ? examples.reverse : examples
|
155
|
+
end
|
156
|
+
|
157
|
+
def number_of_examples #:nodoc:
|
158
|
+
examples.length
|
159
|
+
end
|
160
|
+
|
161
|
+
# Registers a block to be executed before each example.
|
162
|
+
# This method prepends +block+ to existing before blocks.
|
163
|
+
def prepend_before(*args, &block)
|
164
|
+
scope, options = scope_and_options(*args)
|
165
|
+
parts = before_parts_from_scope(scope)
|
166
|
+
parts.unshift(block)
|
167
|
+
end
|
168
|
+
|
169
|
+
# Registers a block to be executed before each example.
|
170
|
+
# This method appends +block+ to existing before blocks.
|
171
|
+
def append_before(*args, &block)
|
172
|
+
scope, options = scope_and_options(*args)
|
173
|
+
parts = before_parts_from_scope(scope)
|
174
|
+
parts << block
|
175
|
+
end
|
176
|
+
alias_method :before, :append_before
|
177
|
+
|
178
|
+
# Registers a block to be executed after each example.
|
179
|
+
# This method prepends +block+ to existing after blocks.
|
180
|
+
def prepend_after(*args, &block)
|
181
|
+
scope, options = scope_and_options(*args)
|
182
|
+
parts = after_parts_from_scope(scope)
|
183
|
+
parts.unshift(block)
|
184
|
+
end
|
185
|
+
alias_method :after, :prepend_after
|
186
|
+
|
187
|
+
# Registers a block to be executed after each example.
|
188
|
+
# This method appends +block+ to existing after blocks.
|
189
|
+
def append_after(*args, &block)
|
190
|
+
scope, options = scope_and_options(*args)
|
191
|
+
parts = after_parts_from_scope(scope)
|
192
|
+
parts << block
|
193
|
+
end
|
194
|
+
|
195
|
+
def remove_after(scope, &block)
|
196
|
+
after_each_parts.delete(block)
|
197
|
+
end
|
198
|
+
|
199
|
+
# Deprecated. Use before(:each)
|
200
|
+
def setup(&block)
|
201
|
+
before(:each, &block)
|
202
|
+
end
|
203
|
+
|
204
|
+
# Deprecated. Use after(:each)
|
205
|
+
def teardown(&block)
|
206
|
+
after(:each, &block)
|
207
|
+
end
|
208
|
+
|
209
|
+
def before_all_parts # :nodoc:
|
210
|
+
@before_all_parts ||= []
|
211
|
+
end
|
212
|
+
|
213
|
+
def after_all_parts # :nodoc:
|
214
|
+
@after_all_parts ||= []
|
215
|
+
end
|
216
|
+
|
217
|
+
def before_each_parts # :nodoc:
|
218
|
+
@before_each_parts ||= []
|
219
|
+
end
|
220
|
+
|
221
|
+
def after_each_parts # :nodoc:
|
222
|
+
@after_each_parts ||= []
|
223
|
+
end
|
224
|
+
|
225
|
+
# Only used from RSpec's own examples
|
226
|
+
def reset # :nodoc:
|
227
|
+
@before_all_parts = nil
|
228
|
+
@after_all_parts = nil
|
229
|
+
@before_each_parts = nil
|
230
|
+
@after_each_parts = nil
|
231
|
+
end
|
232
|
+
|
233
|
+
def register
|
234
|
+
rspec_options.add_example_group self
|
235
|
+
end
|
236
|
+
|
237
|
+
def unregister #:nodoc:
|
238
|
+
rspec_options.remove_example_group self
|
239
|
+
end
|
240
|
+
|
241
|
+
def run_before_each(example)
|
242
|
+
execute_in_class_hierarchy do |example_group|
|
243
|
+
example.eval_each_fail_fast(example_group.before_each_parts)
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
def run_after_each(example)
|
248
|
+
execute_in_class_hierarchy(:superclass_first) do |example_group|
|
249
|
+
example.eval_each_fail_slow(example_group.after_each_parts)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
private
|
254
|
+
def dry_run(examples)
|
255
|
+
examples.each do |example|
|
256
|
+
rspec_options.reporter.example_started(example)
|
257
|
+
rspec_options.reporter.example_finished(example)
|
258
|
+
end
|
259
|
+
return true
|
260
|
+
end
|
261
|
+
|
262
|
+
def run_before_all
|
263
|
+
before_all = new("before(:all)")
|
264
|
+
begin
|
265
|
+
execute_in_class_hierarchy do |example_group|
|
266
|
+
before_all.eval_each_fail_fast(example_group.before_all_parts)
|
267
|
+
end
|
268
|
+
return [true, before_all.instance_variable_hash]
|
269
|
+
rescue Exception => e
|
270
|
+
reporter.failure(before_all, e)
|
271
|
+
return [false, before_all.instance_variable_hash]
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
def execute_examples(success, instance_variables, examples)
|
276
|
+
return [success, instance_variables] unless success
|
277
|
+
|
278
|
+
after_all_instance_variables = instance_variables
|
279
|
+
examples.each do |example_group_instance|
|
280
|
+
success &= example_group_instance.execute(rspec_options, instance_variables)
|
281
|
+
after_all_instance_variables = example_group_instance.instance_variable_hash
|
282
|
+
end
|
283
|
+
return [success, after_all_instance_variables]
|
284
|
+
end
|
285
|
+
|
286
|
+
def run_after_all(success, instance_variables)
|
287
|
+
after_all = new("after(:all)")
|
288
|
+
after_all.set_instance_variables_from_hash(instance_variables)
|
289
|
+
execute_in_class_hierarchy(:superclass_first) do |example_group|
|
290
|
+
after_all.eval_each_fail_slow(example_group.after_all_parts)
|
291
|
+
end
|
292
|
+
return success
|
293
|
+
rescue Exception => e
|
294
|
+
reporter.failure(after_all, e)
|
295
|
+
return false
|
296
|
+
end
|
297
|
+
|
298
|
+
def examples_to_run
|
299
|
+
all_examples = examples
|
300
|
+
return all_examples unless specified_examples?
|
301
|
+
all_examples.reject do |example|
|
302
|
+
matcher = ExampleMatcher.new(description.to_s, example.description)
|
303
|
+
!matcher.matches?(specified_examples)
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
307
|
+
def specified_examples?
|
308
|
+
specified_examples && !specified_examples.empty?
|
309
|
+
end
|
310
|
+
|
311
|
+
def specified_examples
|
312
|
+
rspec_options.examples
|
313
|
+
end
|
314
|
+
|
315
|
+
def reporter
|
316
|
+
rspec_options.reporter
|
317
|
+
end
|
318
|
+
|
319
|
+
def dry_run?
|
320
|
+
rspec_options.dry_run
|
321
|
+
end
|
322
|
+
|
323
|
+
def example_objects
|
324
|
+
@example_objects ||= []
|
325
|
+
end
|
326
|
+
|
327
|
+
def execute_in_class_hierarchy(superclass_last=false)
|
328
|
+
classes = []
|
329
|
+
current_class = self
|
330
|
+
while is_example_group?(current_class)
|
331
|
+
superclass_last ? classes << current_class : classes.unshift(current_class)
|
332
|
+
current_class = current_class.superclass
|
333
|
+
end
|
334
|
+
superclass_last ? classes << ExampleMethods : classes.unshift(ExampleMethods)
|
335
|
+
|
336
|
+
classes.each do |example_group|
|
337
|
+
yield example_group
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
def is_example_group?(klass)
|
342
|
+
Module === klass && klass.kind_of?(ExampleGroupMethods)
|
343
|
+
end
|
344
|
+
|
345
|
+
def plugin_mock_framework
|
346
|
+
case mock_framework = Spec::Runner.configuration.mock_framework
|
347
|
+
when Module
|
348
|
+
include mock_framework
|
349
|
+
else
|
350
|
+
require Spec::Runner.configuration.mock_framework
|
351
|
+
include Spec::Plugins::MockFramework
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
def define_methods_from_predicate_matchers # :nodoc:
|
356
|
+
all_predicate_matchers = predicate_matchers.merge(
|
357
|
+
Spec::Runner.configuration.predicate_matchers
|
358
|
+
)
|
359
|
+
all_predicate_matchers.each_pair do |matcher_method, method_on_object|
|
360
|
+
define_method matcher_method do |*args|
|
361
|
+
eval("be_#{method_on_object.to_s.gsub('?','')}(*args)")
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
def scope_and_options(*args)
|
367
|
+
args, options = args_and_options(*args)
|
368
|
+
scope = (args[0] || :each), options
|
369
|
+
end
|
370
|
+
|
371
|
+
def before_parts_from_scope(scope)
|
372
|
+
case scope
|
373
|
+
when :each; before_each_parts
|
374
|
+
when :all; before_all_parts
|
375
|
+
end
|
376
|
+
end
|
377
|
+
|
378
|
+
def after_parts_from_scope(scope)
|
379
|
+
case scope
|
380
|
+
when :each; after_each_parts
|
381
|
+
when :all; after_all_parts
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
385
|
+
def before_eval
|
386
|
+
end
|
387
|
+
|
388
|
+
def add_method_examples(examples)
|
389
|
+
instance_methods.sort.each do |method_name|
|
390
|
+
if example_method?(method_name)
|
391
|
+
examples << new(method_name) do
|
392
|
+
__send__(method_name)
|
393
|
+
end
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
def example_method?(method_name)
|
399
|
+
should_method?(method_name)
|
400
|
+
end
|
401
|
+
|
402
|
+
def should_method?(method_name)
|
403
|
+
!(method_name =~ /^should(_not)?$/) &&
|
404
|
+
method_name =~ /^should/ && (
|
405
|
+
instance_method(method_name).arity == 0 ||
|
406
|
+
instance_method(method_name).arity == -1
|
407
|
+
)
|
408
|
+
end
|
409
|
+
end
|
410
|
+
|
411
|
+
end
|
412
|
+
end
|