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
@@ -0,0 +1,11 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
describe Runner, ".configure" do
|
5
|
+
it "should yield global configuration" do
|
6
|
+
Spec::Runner.configure do |config|
|
7
|
+
config.should equal(Spec::Runner.configuration)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/spec/spec/spec_classes.rb
CHANGED
@@ -96,10 +96,12 @@ module Spec
|
|
96
96
|
end
|
97
97
|
|
98
98
|
module Custom
|
99
|
+
require 'spec/runner/formatter/base_text_formatter'
|
99
100
|
class Formatter < Spec::Runner::Formatter::BaseTextFormatter
|
100
|
-
attr_reader :where
|
101
|
+
attr_reader :options, :where
|
101
102
|
|
102
|
-
def initialize(where)
|
103
|
+
def initialize(options, where)
|
104
|
+
@options = options
|
103
105
|
@where = where
|
104
106
|
end
|
105
107
|
end
|
@@ -107,13 +109,18 @@ module Custom
|
|
107
109
|
class BadFormatter < Spec::Runner::Formatter::BaseTextFormatter
|
108
110
|
attr_reader :where
|
109
111
|
|
110
|
-
def initialize(where)
|
112
|
+
def initialize(options, where)
|
111
113
|
bad_method
|
112
114
|
end
|
113
115
|
end
|
114
116
|
|
115
|
-
class
|
116
|
-
|
117
|
+
class Differ
|
118
|
+
attr_reader :options
|
119
|
+
def initialize(options)
|
120
|
+
@options = options
|
121
|
+
end
|
117
122
|
end
|
118
123
|
end
|
119
124
|
|
125
|
+
class FakeReporter < Spec::Runner::Reporter
|
126
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Spec
|
2
|
+
module Story
|
3
|
+
class StoryBuilder
|
4
|
+
def initialize
|
5
|
+
@title = 'a story'
|
6
|
+
@narrative = 'narrative'
|
7
|
+
end
|
8
|
+
|
9
|
+
def title(value)
|
10
|
+
@title = value
|
11
|
+
self
|
12
|
+
end
|
13
|
+
|
14
|
+
def narrative(value)
|
15
|
+
@narrative = value
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_story(&block)
|
20
|
+
block = lambda {} unless block_given?
|
21
|
+
Story.new @title, @narrative, &block
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class ScenarioBuilder
|
26
|
+
def initialize
|
27
|
+
@name = 'a scenario'
|
28
|
+
@story = StoryBuilder.new.to_story
|
29
|
+
end
|
30
|
+
|
31
|
+
def name(value)
|
32
|
+
@name = value
|
33
|
+
self
|
34
|
+
end
|
35
|
+
|
36
|
+
def story(value)
|
37
|
+
@story = value
|
38
|
+
self
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_scenario(&block)
|
42
|
+
Scenario.new @story, @name, &block
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,161 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Story
|
5
|
+
module Extensions
|
6
|
+
describe "the main object extended with Main", :shared => true do
|
7
|
+
before(:each) do
|
8
|
+
@main = Class.new do; include Main; end
|
9
|
+
@original_rspec_story_steps, $rspec_story_steps = $rspec_story_steps, nil
|
10
|
+
end
|
11
|
+
|
12
|
+
after(:each) do
|
13
|
+
$rspec_story_steps = @original_rspec_story_steps
|
14
|
+
end
|
15
|
+
|
16
|
+
def have_step(type, name)
|
17
|
+
return simple_matcher(%[step group containing a #{type} named #{name.inspect}]) do |actual|
|
18
|
+
Spec::Story::Step === actual.find(type, name)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe Main, "#run_story" do
|
24
|
+
it_should_behave_like "the main object extended with Main"
|
25
|
+
|
26
|
+
it "should create a PlainTextStoryRunner with run_story" do
|
27
|
+
Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(mock("runner", :null_object => true))
|
28
|
+
@main.run_story
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should yield the runner if arity == 1" do
|
32
|
+
File.should_receive(:read).with("some/path").and_return("Story: foo")
|
33
|
+
$main_spec_runner = nil
|
34
|
+
@main.run_story("some/path") do |runner|
|
35
|
+
$main_spec_runner = runner
|
36
|
+
end
|
37
|
+
$main_spec_runner.should be_an_instance_of(Spec::Story::Runner::PlainTextStoryRunner)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should run in the runner if arity == 0" do
|
41
|
+
File.should_receive(:read).with("some/path").and_return("Story: foo")
|
42
|
+
$main_spec_runner = nil
|
43
|
+
@main.run_story("some/path") do
|
44
|
+
$main_spec_runner = self
|
45
|
+
end
|
46
|
+
$main_spec_runner.should be_an_instance_of(Spec::Story::Runner::PlainTextStoryRunner)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should tell the PlainTextStoryRunner to run with run_story" do
|
50
|
+
runner = mock("runner")
|
51
|
+
Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(runner)
|
52
|
+
runner.should_receive(:run)
|
53
|
+
@main.run_story
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe Main, "#steps_for" do
|
58
|
+
it_should_behave_like "the main object extended with Main"
|
59
|
+
|
60
|
+
it "should have no steps for a non existent key" do
|
61
|
+
@main.steps_for(:key).find(:given, "foo").should be_nil
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should create steps for a key" do
|
65
|
+
$main_spec_invoked = false
|
66
|
+
@main.steps_for(:key) do
|
67
|
+
Given("foo") {
|
68
|
+
$main_spec_invoked = true
|
69
|
+
}
|
70
|
+
end
|
71
|
+
@main.steps_for(:key).find(:given, "foo").perform(Object.new, "foo")
|
72
|
+
$main_spec_invoked.should be_true
|
73
|
+
end
|
74
|
+
|
75
|
+
it "should append steps to steps_for a given key" do
|
76
|
+
@main.steps_for(:key) do
|
77
|
+
Given("first") {}
|
78
|
+
end
|
79
|
+
@main.steps_for(:key) do
|
80
|
+
Given("second") {}
|
81
|
+
end
|
82
|
+
@main.steps_for(:key).should have_step(:given, "first")
|
83
|
+
@main.steps_for(:key).should have_step(:given, "second")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe Main, "#with_steps_for adding new steps" do
|
88
|
+
it_should_behave_like "the main object extended with Main"
|
89
|
+
|
90
|
+
it "should result in a group containing pre-existing steps and newly defined steps" do
|
91
|
+
first_group = @main.steps_for(:key) do
|
92
|
+
Given("first") {}
|
93
|
+
end
|
94
|
+
second_group = @main.with_steps_for(:key) do
|
95
|
+
Given("second") {}
|
96
|
+
end
|
97
|
+
|
98
|
+
second_group.should have_step(:given, "first")
|
99
|
+
second_group.should have_step(:given, "second")
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should not add its steps to the existing group" do
|
103
|
+
first_group = @main.steps_for(:key) do
|
104
|
+
Given("first") {}
|
105
|
+
end
|
106
|
+
second_group = @main.with_steps_for(:key) do
|
107
|
+
Given("second") {}
|
108
|
+
end
|
109
|
+
|
110
|
+
first_group.should have_step(:given, "first")
|
111
|
+
first_group.should_not have_step(:given, "second")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe Main, "#with_steps_for running a story" do
|
116
|
+
it_should_behave_like "the main object extended with Main"
|
117
|
+
|
118
|
+
before(:each) do
|
119
|
+
@runner = mock("runner")
|
120
|
+
@runner_step_group = StepGroup.new
|
121
|
+
@runner.stub!(:steps).and_return(@runner_step_group)
|
122
|
+
@runner.stub!(:run)
|
123
|
+
Spec::Story::Runner::PlainTextStoryRunner.stub!(:new).and_return(@runner)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should create a PlainTextStoryRunner with a path" do
|
127
|
+
Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).with('path/to/file',{}).and_return(@runner)
|
128
|
+
@main.with_steps_for(:foo) do
|
129
|
+
run 'path/to/file'
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should create a PlainTextStoryRunner with a path and options" do
|
134
|
+
Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).with(anything,{:bar => :baz}).and_return(@runner)
|
135
|
+
@main.with_steps_for(:foo) do
|
136
|
+
run 'path/to/file', :bar => :baz
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should pass the group it creates to the runner's steps" do
|
141
|
+
steps = @main.steps_for(:ice_cream) do
|
142
|
+
Given("vanilla") {}
|
143
|
+
end
|
144
|
+
@main.with_steps_for(:ice_cream) do
|
145
|
+
run 'foo'
|
146
|
+
end
|
147
|
+
@runner_step_group.should have_step(:given, "vanilla")
|
148
|
+
end
|
149
|
+
|
150
|
+
it "should run a story" do
|
151
|
+
@runner.should_receive(:run)
|
152
|
+
Spec::Story::Runner::PlainTextStoryRunner.should_receive(:new).and_return(@runner)
|
153
|
+
@main.with_steps_for(:foo) do
|
154
|
+
run 'path/to/file'
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/story_helper'
|
2
|
+
|
3
|
+
require 'spec/story'
|
4
|
+
|
5
|
+
describe Kernel, "#Story" do
|
6
|
+
before(:each) do
|
7
|
+
Kernel.stub!(:at_exit)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should delegate to ::Spec::Story::Runner.story_runner" do
|
11
|
+
::Spec::Story::Runner.story_runner.should_receive(:Story)
|
12
|
+
story = Story("title","narrative"){}
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/story_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Story
|
5
|
+
describe GivenScenario do
|
6
|
+
it 'should execute a scenario from the current story in its world' do
|
7
|
+
# given
|
8
|
+
class MyWorld
|
9
|
+
attr :scenario_ran
|
10
|
+
end
|
11
|
+
instance = World.create(MyWorld)
|
12
|
+
scenario = ScenarioBuilder.new.to_scenario do
|
13
|
+
@scenario_ran = true
|
14
|
+
end
|
15
|
+
Runner::StoryRunner.should_receive(:scenario_from_current_story).with('scenario name').and_return(scenario)
|
16
|
+
|
17
|
+
step = GivenScenario.new 'scenario name'
|
18
|
+
|
19
|
+
# when
|
20
|
+
step.perform(instance, nil)
|
21
|
+
|
22
|
+
# then
|
23
|
+
instance.scenario_ran.should be_true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../story_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Story
|
5
|
+
module Runner
|
6
|
+
describe PlainTextStoryRunner do
|
7
|
+
before(:each) do
|
8
|
+
StoryParser.stub!(:new).and_return(@parser = mock("parser"))
|
9
|
+
@parser.stub!(:parse).and_return([])
|
10
|
+
File.stub!(:read).with("path").and_return("this\nand that")
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should provide access to steps" do
|
14
|
+
runner = PlainTextStoryRunner.new("path")
|
15
|
+
|
16
|
+
runner.steps do |add|
|
17
|
+
add.given("baz") {}
|
18
|
+
end
|
19
|
+
|
20
|
+
runner.steps.find(:given, "baz").should_not be_nil
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should parse a story file" do
|
24
|
+
runner = PlainTextStoryRunner.new("path")
|
25
|
+
|
26
|
+
during {
|
27
|
+
runner.run
|
28
|
+
}.expect {
|
29
|
+
@parser.should_receive(:parse).with(["this", "and that"])
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should build up a mediator with its own steps and the singleton story_runner" do
|
34
|
+
runner = PlainTextStoryRunner.new("path")
|
35
|
+
Spec::Story::Runner.should_receive(:story_runner).and_return(story_runner = mock("story runner"))
|
36
|
+
Spec::Story::Runner::StoryMediator.should_receive(:new).with(runner.steps, story_runner, {}).
|
37
|
+
and_return(mediator = stub("mediator", :run_stories => nil))
|
38
|
+
runner.run
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should build up a parser with the mediator" do
|
42
|
+
runner = PlainTextStoryRunner.new("path")
|
43
|
+
Spec::Story::Runner.should_receive(:story_runner).and_return(story_runner = mock("story runner"))
|
44
|
+
Spec::Story::Runner::StoryMediator.should_receive(:new).and_return(mediator = stub("mediator", :run_stories => nil))
|
45
|
+
Spec::Story::Runner::StoryParser.should_receive(:new).with(mediator).and_return(@parser)
|
46
|
+
runner.run
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should tell the mediator to run the stories" do
|
50
|
+
runner = PlainTextStoryRunner.new("path")
|
51
|
+
mediator = mock("mediator")
|
52
|
+
Spec::Story::Runner::StoryMediator.should_receive(:new).and_return(mediator)
|
53
|
+
mediator.should_receive(:run_stories)
|
54
|
+
runner.run
|
55
|
+
end
|
56
|
+
|
57
|
+
it "should accept a block instead of a path" do
|
58
|
+
runner = PlainTextStoryRunner.new do |runner|
|
59
|
+
runner.load("path/to/story")
|
60
|
+
end
|
61
|
+
File.should_receive(:read).with("path/to/story").and_return("this\nand that")
|
62
|
+
runner.run
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should tell you if you try to run with no path set" do
|
66
|
+
runner = PlainTextStoryRunner.new
|
67
|
+
lambda {
|
68
|
+
runner.run
|
69
|
+
}.should raise_error(RuntimeError, "You must set a path to the file with the story. See the RDoc.")
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should pass options to the mediator" do
|
73
|
+
runner = PlainTextStoryRunner.new("path", :foo => :bar)
|
74
|
+
Spec::Story::Runner::StoryMediator.should_receive(:new).
|
75
|
+
with(anything, anything, :foo => :bar).
|
76
|
+
and_return(mediator = stub("mediator", :run_stories => nil))
|
77
|
+
runner.run
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should provide access to its options" do
|
81
|
+
runner = PlainTextStoryRunner.new("path")
|
82
|
+
runner[:foo] = :bar
|
83
|
+
Spec::Story::Runner::StoryMediator.should_receive(:new).
|
84
|
+
with(anything, anything, :foo => :bar).
|
85
|
+
and_return(mediator = stub("mediator", :run_stories => nil))
|
86
|
+
runner.run
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../story_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Story
|
5
|
+
module Runner
|
6
|
+
describe ScenarioCollector do
|
7
|
+
it 'should construct scenarios with the supplied story' do
|
8
|
+
# given
|
9
|
+
story = stub_everything('story')
|
10
|
+
scenario_collector = ScenarioCollector.new(story)
|
11
|
+
|
12
|
+
# when
|
13
|
+
scenario_collector.Scenario 'scenario1' do end
|
14
|
+
scenario_collector.Scenario 'scenario2' do end
|
15
|
+
scenarios = scenario_collector.scenarios
|
16
|
+
|
17
|
+
# then
|
18
|
+
scenario_collector.should have(2).scenarios
|
19
|
+
scenarios.first.name.should == 'scenario1'
|
20
|
+
scenarios.first.story.should equal(story)
|
21
|
+
scenarios.last.name.should == 'scenario2'
|
22
|
+
scenarios.last.story.should equal(story)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../story_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Story
|
5
|
+
module Runner
|
6
|
+
describe ScenarioRunner do
|
7
|
+
it 'should run a scenario in its story' do
|
8
|
+
# given
|
9
|
+
world = stub_everything
|
10
|
+
scenario_runner = ScenarioRunner.new
|
11
|
+
$answer = nil
|
12
|
+
story = Story.new 'story', 'narrative' do
|
13
|
+
@answer = 42 # this should be available to the scenario
|
14
|
+
end
|
15
|
+
scenario = Scenario.new story, 'scenario' do
|
16
|
+
$answer = @answer
|
17
|
+
end
|
18
|
+
|
19
|
+
# when
|
20
|
+
scenario_runner.run(scenario, world)
|
21
|
+
|
22
|
+
# then
|
23
|
+
$answer.should == 42
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should allow scenarios to share methods' do
|
27
|
+
# given
|
28
|
+
world = stub_everything
|
29
|
+
$shared_invoked = 0
|
30
|
+
story = Story.new 'story', 'narrative' do
|
31
|
+
def shared
|
32
|
+
$shared_invoked += 1
|
33
|
+
end
|
34
|
+
end
|
35
|
+
scenario1 = Scenario.new story, 'scenario1' do
|
36
|
+
shared()
|
37
|
+
end
|
38
|
+
scenario2 = Scenario.new story, 'scenario2' do
|
39
|
+
shared()
|
40
|
+
end
|
41
|
+
scenario_runner = ScenarioRunner.new
|
42
|
+
|
43
|
+
# when
|
44
|
+
scenario_runner.run(scenario1, world)
|
45
|
+
scenario_runner.run(scenario2, world)
|
46
|
+
|
47
|
+
# then
|
48
|
+
$shared_invoked.should == 2
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'should notify listeners when a scenario starts' do
|
52
|
+
# given
|
53
|
+
world = stub_everything
|
54
|
+
story = Story.new 'story', 'narrative' do end
|
55
|
+
scenario = Scenario.new story, 'scenario1' do
|
56
|
+
# succeeds
|
57
|
+
end
|
58
|
+
scenario_runner = ScenarioRunner.new
|
59
|
+
mock_listener1 = stub_everything('listener1')
|
60
|
+
mock_listener2 = stub_everything('listener2')
|
61
|
+
scenario_runner.add_listener(mock_listener1)
|
62
|
+
scenario_runner.add_listener(mock_listener2)
|
63
|
+
|
64
|
+
# expect
|
65
|
+
mock_listener1.should_receive(:scenario_started).with('story', 'scenario1')
|
66
|
+
mock_listener2.should_receive(:scenario_started).with('story', 'scenario1')
|
67
|
+
|
68
|
+
# when
|
69
|
+
scenario_runner.run(scenario, world)
|
70
|
+
|
71
|
+
# then
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should notify listeners when a scenario succeeds' do
|
75
|
+
# given
|
76
|
+
world = stub_everything('world')
|
77
|
+
story = Story.new 'story', 'narrative' do end
|
78
|
+
scenario = Scenario.new story, 'scenario1' do
|
79
|
+
# succeeds
|
80
|
+
end
|
81
|
+
scenario_runner = ScenarioRunner.new
|
82
|
+
mock_listener1 = stub_everything('listener1')
|
83
|
+
mock_listener2 = stub_everything('listener2')
|
84
|
+
scenario_runner.add_listener(mock_listener1)
|
85
|
+
scenario_runner.add_listener(mock_listener2)
|
86
|
+
|
87
|
+
# expect
|
88
|
+
mock_listener1.should_receive(:scenario_succeeded).with('story', 'scenario1')
|
89
|
+
mock_listener2.should_receive(:scenario_succeeded).with('story', 'scenario1')
|
90
|
+
|
91
|
+
# when
|
92
|
+
scenario_runner.run(scenario, world)
|
93
|
+
|
94
|
+
# then
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should notify listeners ONCE when a scenario raises an error' do
|
98
|
+
# given
|
99
|
+
error = RuntimeError.new('oops')
|
100
|
+
story = Story.new 'title', 'narrative' do end
|
101
|
+
scenario = Scenario.new story, 'scenario1' do
|
102
|
+
end
|
103
|
+
scenario_runner = ScenarioRunner.new
|
104
|
+
mock_listener = stub_everything('listener')
|
105
|
+
scenario_runner.add_listener(mock_listener)
|
106
|
+
world = stub_everything
|
107
|
+
|
108
|
+
# expect
|
109
|
+
world.should_receive(:errors).twice.and_return([error, error])
|
110
|
+
mock_listener.should_receive(:scenario_failed).with('title', 'scenario1', error).once
|
111
|
+
|
112
|
+
# when
|
113
|
+
scenario_runner.run scenario, world
|
114
|
+
|
115
|
+
# then
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should notify listeners when a scenario is pending' do
|
119
|
+
# given
|
120
|
+
pending_error = Spec::Example::ExamplePendingError.new('todo')
|
121
|
+
story = Story.new 'title', 'narrative' do end
|
122
|
+
scenario = Scenario.new story, 'scenario1' do
|
123
|
+
end
|
124
|
+
scenario_runner = ScenarioRunner.new
|
125
|
+
mock_listener = mock('listener')
|
126
|
+
scenario_runner.add_listener(mock_listener)
|
127
|
+
world = stub_everything
|
128
|
+
|
129
|
+
# expect
|
130
|
+
world.should_receive(:errors).twice.and_return([pending_error, pending_error])
|
131
|
+
mock_listener.should_receive(:scenario_started).with('title', 'scenario1')
|
132
|
+
mock_listener.should_receive(:scenario_pending).with('title', 'scenario1', 'todo').once
|
133
|
+
|
134
|
+
# when
|
135
|
+
scenario_runner.run scenario, world
|
136
|
+
|
137
|
+
# then
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|