dchelimsky-rspec 1.1.10
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 +1192 -0
- data/License.txt +22 -0
- data/Manifest.txt +403 -0
- data/README.txt +39 -0
- data/Rakefile +90 -0
- data/TODO.txt +10 -0
- data/bin/autospec +4 -0
- data/bin/spec +4 -0
- data/examples/pure/autogenerated_docstrings_example.rb +19 -0
- data/examples/pure/before_and_after_example.rb +40 -0
- data/examples/pure/behave_as_example.rb +45 -0
- data/examples/pure/custom_expectation_matchers.rb +54 -0
- data/examples/pure/custom_formatter.rb +12 -0
- data/examples/pure/dynamic_spec.rb +9 -0
- data/examples/pure/file_accessor.rb +19 -0
- data/examples/pure/file_accessor_spec.rb +38 -0
- data/examples/pure/greeter_spec.rb +31 -0
- data/examples/pure/helper_method_example.rb +14 -0
- data/examples/pure/io_processor.rb +8 -0
- data/examples/pure/io_processor_spec.rb +21 -0
- data/examples/pure/legacy_spec.rb +11 -0
- data/examples/pure/mocking_example.rb +27 -0
- data/examples/pure/multi_threaded_behaviour_runner.rb +28 -0
- data/examples/pure/nested_classes_example.rb +36 -0
- data/examples/pure/partial_mock_example.rb +29 -0
- data/examples/pure/pending_example.rb +20 -0
- data/examples/pure/predicate_example.rb +27 -0
- data/examples/pure/priority.txt +1 -0
- data/examples/pure/shared_example_group_example.rb +81 -0
- data/examples/pure/shared_stack_examples.rb +38 -0
- data/examples/pure/spec_helper.rb +3 -0
- data/examples/pure/stack.rb +36 -0
- data/examples/pure/stack_spec.rb +63 -0
- data/examples/pure/stack_spec_with_nested_example_groups.rb +67 -0
- data/examples/pure/stubbing_example.rb +69 -0
- data/examples/pure/yielding_example.rb +33 -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/.loadpath +5 -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/game.rb +23 -0
- data/examples/stories/game-of-life/life/grid.rb +43 -0
- data/examples/stories/game-of-life/life.rb +3 -0
- data/examples/stories/helper.rb +9 -0
- data/examples/stories/steps/addition_steps.rb +18 -0
- data/failing_examples/README.txt +7 -0
- data/failing_examples/diffing_spec.rb +36 -0
- data/failing_examples/failing_autogenerated_docstrings_example.rb +19 -0
- data/failing_examples/failure_in_setup.rb +10 -0
- data/failing_examples/failure_in_teardown.rb +10 -0
- data/failing_examples/mocking_example.rb +40 -0
- data/failing_examples/mocking_with_flexmock.rb +26 -0
- data/failing_examples/mocking_with_mocha.rb +25 -0
- data/failing_examples/mocking_with_rr.rb +27 -0
- data/failing_examples/partial_mock_example.rb +20 -0
- data/failing_examples/predicate_example.rb +29 -0
- data/failing_examples/raising_example.rb +47 -0
- data/failing_examples/spec_helper.rb +3 -0
- data/failing_examples/syntax_error_example.rb +7 -0
- data/failing_examples/team_spec.rb +44 -0
- data/failing_examples/timeout_behaviour.rb +7 -0
- data/init.rb +9 -0
- data/lib/autotest/discover.rb +3 -0
- data/lib/autotest/rspec.rb +46 -0
- data/lib/spec/adapters/ruby_engine/mri.rb +8 -0
- data/lib/spec/adapters/ruby_engine/rubinius.rb +8 -0
- data/lib/spec/adapters/ruby_engine.rb +26 -0
- data/lib/spec/adapters.rb +1 -0
- data/lib/spec/example/before_and_after_hooks.rb +93 -0
- data/lib/spec/example/configuration.rb +167 -0
- data/lib/spec/example/errors.rb +30 -0
- data/lib/spec/example/example_group.rb +25 -0
- data/lib/spec/example/example_group_factory.rb +81 -0
- data/lib/spec/example/example_group_methods.rb +368 -0
- data/lib/spec/example/example_matcher.rb +44 -0
- data/lib/spec/example/example_methods.rb +105 -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 +52 -0
- data/lib/spec/example.rb +12 -0
- data/lib/spec/expectations/differs/default.rb +66 -0
- data/lib/spec/expectations/errors.rb +12 -0
- data/lib/spec/expectations/extensions/object.rb +63 -0
- data/lib/spec/expectations/extensions/string_and_symbol.rb +17 -0
- data/lib/spec/expectations/extensions.rb +2 -0
- data/lib/spec/expectations/handler.rb +52 -0
- data/lib/spec/expectations.rb +56 -0
- data/lib/spec/extensions/class.rb +24 -0
- data/lib/spec/extensions/main.rb +87 -0
- data/lib/spec/extensions/metaclass.rb +7 -0
- data/lib/spec/extensions/object.rb +6 -0
- data/lib/spec/extensions.rb +4 -0
- data/lib/spec/interop/test/unit/autorunner.rb +6 -0
- data/lib/spec/interop/test/unit/testcase.rb +71 -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 +61 -0
- data/lib/spec/interop/test.rb +12 -0
- data/lib/spec/matchers/be.rb +221 -0
- data/lib/spec/matchers/be_close.rb +37 -0
- data/lib/spec/matchers/change.rb +148 -0
- data/lib/spec/matchers/eql.rb +43 -0
- data/lib/spec/matchers/equal.rb +43 -0
- data/lib/spec/matchers/exist.rb +22 -0
- data/lib/spec/matchers/has.rb +34 -0
- data/lib/spec/matchers/have.rb +150 -0
- data/lib/spec/matchers/include.rb +77 -0
- data/lib/spec/matchers/match.rb +41 -0
- data/lib/spec/matchers/operator_matcher.rb +79 -0
- data/lib/spec/matchers/raise_error.rb +132 -0
- data/lib/spec/matchers/respond_to.rb +46 -0
- data/lib/spec/matchers/satisfy.rb +47 -0
- data/lib/spec/matchers/simple_matcher.rb +132 -0
- data/lib/spec/matchers/throw_symbol.rb +74 -0
- data/lib/spec/matchers.rb +162 -0
- data/lib/spec/mocks/argument_constraints.rb +165 -0
- data/lib/spec/mocks/argument_expectation.rb +49 -0
- data/lib/spec/mocks/error_generator.rb +84 -0
- data/lib/spec/mocks/errors.rb +10 -0
- data/lib/spec/mocks/extensions/object.rb +3 -0
- data/lib/spec/mocks/extensions.rb +1 -0
- data/lib/spec/mocks/framework.rb +15 -0
- data/lib/spec/mocks/message_expectation.rb +331 -0
- data/lib/spec/mocks/methods.rb +51 -0
- data/lib/spec/mocks/mock.rb +56 -0
- data/lib/spec/mocks/order_group.rb +29 -0
- data/lib/spec/mocks/proxy.rb +224 -0
- data/lib/spec/mocks/space.rb +28 -0
- data/lib/spec/mocks/spec_methods.rb +46 -0
- data/lib/spec/mocks.rb +200 -0
- data/lib/spec/rake/spectask.rb +227 -0
- data/lib/spec/rake/verify_rcov.rb +52 -0
- data/lib/spec/runner/backtrace_tweaker.rb +56 -0
- data/lib/spec/runner/class_and_arguments_parser.rb +16 -0
- data/lib/spec/runner/command_line.rb +17 -0
- data/lib/spec/runner/drb_command_line.rb +20 -0
- data/lib/spec/runner/example_group_runner.rb +59 -0
- data/lib/spec/runner/formatter/base_formatter.rb +79 -0
- data/lib/spec/runner/formatter/base_text_formatter.rb +126 -0
- data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +27 -0
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +20 -0
- data/lib/spec/runner/formatter/html_formatter.rb +337 -0
- data/lib/spec/runner/formatter/nested_text_formatter.rb +65 -0
- data/lib/spec/runner/formatter/profile_formatter.rb +51 -0
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +34 -0
- data/lib/spec/runner/formatter/snippet_extractor.rb +52 -0
- data/lib/spec/runner/formatter/specdoc_formatter.rb +39 -0
- data/lib/spec/runner/formatter/story/html_formatter.rb +174 -0
- data/lib/spec/runner/formatter/story/plain_text_formatter.rb +194 -0
- data/lib/spec/runner/formatter/story/progress_bar_formatter.rb +42 -0
- data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
- data/lib/spec/runner/heckle_runner.rb +72 -0
- data/lib/spec/runner/heckle_runner_unsupported.rb +10 -0
- data/lib/spec/runner/option_parser.rb +205 -0
- data/lib/spec/runner/options.rb +320 -0
- data/lib/spec/runner/reporter.rb +167 -0
- data/lib/spec/runner/spec_parser.rb +71 -0
- data/lib/spec/runner.rb +213 -0
- data/lib/spec/story/extensions/main.rb +86 -0
- data/lib/spec/story/extensions/regexp.rb +9 -0
- data/lib/spec/story/extensions/string.rb +9 -0
- data/lib/spec/story/extensions.rb +3 -0
- data/lib/spec/story/given_scenario.rb +14 -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 +54 -0
- data/lib/spec/story/runner/story_mediator.rb +137 -0
- data/lib/spec/story/runner/story_parser.rb +247 -0
- data/lib/spec/story/runner/story_runner.rb +70 -0
- data/lib/spec/story/runner.rb +59 -0
- data/lib/spec/story/scenario.rb +14 -0
- data/lib/spec/story/step.rb +70 -0
- data/lib/spec/story/step_group.rb +89 -0
- data/lib/spec/story/step_mother.rb +38 -0
- data/lib/spec/story/story.rb +39 -0
- data/lib/spec/story/world.rb +128 -0
- data/lib/spec/story.rb +10 -0
- data/lib/spec/version.rb +13 -0
- data/lib/spec.rb +32 -0
- data/plugins/mock_frameworks/flexmock.rb +23 -0
- data/plugins/mock_frameworks/mocha.rb +19 -0
- data/plugins/mock_frameworks/rr.rb +21 -0
- data/plugins/mock_frameworks/rspec.rb +20 -0
- data/rake_tasks/examples.rake +7 -0
- data/rake_tasks/examples_with_rcov.rake +9 -0
- data/rake_tasks/failing_examples_with_html.rake +9 -0
- data/rake_tasks/verify_rcov.rake +7 -0
- data/rspec.gemspec +42 -0
- data/spec/README.jruby +15 -0
- data/spec/autotest/autotest_helper.rb +6 -0
- data/spec/autotest/autotest_matchers.rb +47 -0
- data/spec/autotest/discover_spec.rb +19 -0
- data/spec/autotest/rspec_spec.rb +150 -0
- data/spec/rspec_suite.rb +6 -0
- data/spec/ruby_forker.rb +13 -0
- data/spec/spec/adapters/ruby_engine_spec.rb +16 -0
- data/spec/spec/example/configuration_spec.rb +296 -0
- data/spec/spec/example/example_group_class_definition_spec.rb +48 -0
- data/spec/spec/example/example_group_factory_spec.rb +165 -0
- data/spec/spec/example/example_group_methods_spec.rb +584 -0
- data/spec/spec/example/example_group_spec.rb +683 -0
- data/spec/spec/example/example_matcher_spec.rb +96 -0
- data/spec/spec/example/example_methods_spec.rb +169 -0
- data/spec/spec/example/example_runner_spec.rb +194 -0
- data/spec/spec/example/nested_example_group_spec.rb +71 -0
- data/spec/spec/example/pending_module_spec.rb +145 -0
- data/spec/spec/example/predicate_matcher_spec.rb +21 -0
- data/spec/spec/example/shared_example_group_spec.rb +281 -0
- data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
- data/spec/spec/expectations/differs/default_spec.rb +127 -0
- data/spec/spec/expectations/extensions/object_spec.rb +95 -0
- data/spec/spec/expectations/fail_with_spec.rb +71 -0
- data/spec/spec/extensions/main_spec.rb +71 -0
- data/spec/spec/interop/test/unit/resources/spec_that_fails.rb +10 -0
- data/spec/spec/interop/test/unit/resources/spec_that_passes.rb +10 -0
- data/spec/spec/interop/test/unit/resources/spec_with_errors.rb +10 -0
- data/spec/spec/interop/test/unit/resources/spec_with_options_hash.rb +13 -0
- data/spec/spec/interop/test/unit/resources/test_case_that_fails.rb +10 -0
- data/spec/spec/interop/test/unit/resources/test_case_that_passes.rb +10 -0
- data/spec/spec/interop/test/unit/resources/test_case_with_errors.rb +10 -0
- data/spec/spec/interop/test/unit/resources/testsuite_adapter_spec_with_test_unit.rb +38 -0
- data/spec/spec/interop/test/unit/spec_spec.rb +52 -0
- data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +14 -0
- data/spec/spec/interop/test/unit/testcase_spec.rb +49 -0
- data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
- data/spec/spec/matchers/be_close_spec.rb +39 -0
- data/spec/spec/matchers/be_spec.rb +248 -0
- data/spec/spec/matchers/change_spec.rb +329 -0
- data/spec/spec/matchers/description_generation_spec.rb +153 -0
- data/spec/spec/matchers/eql_spec.rb +28 -0
- data/spec/spec/matchers/equal_spec.rb +28 -0
- data/spec/spec/matchers/exist_spec.rb +57 -0
- data/spec/spec/matchers/handler_spec.rb +150 -0
- data/spec/spec/matchers/has_spec.rb +63 -0
- data/spec/spec/matchers/have_spec.rb +394 -0
- data/spec/spec/matchers/include_spec.rb +64 -0
- data/spec/spec/matchers/match_spec.rb +37 -0
- data/spec/spec/matchers/matcher_methods_spec.rb +78 -0
- data/spec/spec/matchers/mock_constraint_matchers_spec.rb +24 -0
- data/spec/spec/matchers/operator_matcher_spec.rb +191 -0
- data/spec/spec/matchers/raise_error_spec.rb +315 -0
- data/spec/spec/matchers/respond_to_spec.rb +54 -0
- data/spec/spec/matchers/satisfy_spec.rb +36 -0
- data/spec/spec/matchers/simple_matcher_spec.rb +93 -0
- data/spec/spec/matchers/throw_symbol_spec.rb +54 -0
- data/spec/spec/mocks/any_number_of_times_spec.rb +36 -0
- data/spec/spec/mocks/argument_expectation_spec.rb +23 -0
- data/spec/spec/mocks/at_least_spec.rb +97 -0
- data/spec/spec/mocks/at_most_spec.rb +93 -0
- data/spec/spec/mocks/bug_report_10260_spec.rb +8 -0
- data/spec/spec/mocks/bug_report_10263_spec.rb +24 -0
- data/spec/spec/mocks/bug_report_11545_spec.rb +33 -0
- data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
- data/spec/spec/mocks/bug_report_496.rb +17 -0
- data/spec/spec/mocks/bug_report_7611_spec.rb +19 -0
- data/spec/spec/mocks/bug_report_7805_spec.rb +22 -0
- data/spec/spec/mocks/bug_report_8165_spec.rb +31 -0
- data/spec/spec/mocks/bug_report_8302_spec.rb +26 -0
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +95 -0
- data/spec/spec/mocks/hash_including_matcher_spec.rb +53 -0
- data/spec/spec/mocks/mock_ordering_spec.rb +84 -0
- data/spec/spec/mocks/mock_space_spec.rb +54 -0
- data/spec/spec/mocks/mock_spec.rb +555 -0
- data/spec/spec/mocks/multiple_return_value_spec.rb +113 -0
- data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
- data/spec/spec/mocks/null_object_mock_spec.rb +54 -0
- data/spec/spec/mocks/once_counts_spec.rb +53 -0
- data/spec/spec/mocks/options_hash_spec.rb +35 -0
- data/spec/spec/mocks/partial_mock_spec.rb +149 -0
- data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +66 -0
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +130 -0
- data/spec/spec/mocks/precise_counts_spec.rb +52 -0
- data/spec/spec/mocks/record_messages_spec.rb +26 -0
- data/spec/spec/mocks/stub_spec.rb +188 -0
- data/spec/spec/mocks/twice_counts_spec.rb +67 -0
- data/spec/spec/package/bin_spec_spec.rb +22 -0
- data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
- data/spec/spec/runner/command_line_spec.rb +141 -0
- data/spec/spec/runner/drb_command_line_spec.rb +97 -0
- data/spec/spec/runner/empty_file.txt +0 -0
- data/spec/spec/runner/examples.txt +2 -0
- data/spec/spec/runner/failed.txt +3 -0
- data/spec/spec/runner/formatter/base_formatter_spec.rb +112 -0
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +33 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.4.html +365 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +387 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.5.html +371 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +381 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.6.html +370 -0
- data/spec/spec/runner/formatter/html_formatter_spec.rb +61 -0
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +318 -0
- data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +155 -0
- data/spec/spec/runner/formatter/snippet_extractor_spec.rb +18 -0
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +103 -0
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +159 -0
- data/spec/spec/runner/formatter/story/html_formatter_spec.rb +135 -0
- data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +600 -0
- data/spec/spec/runner/formatter/story/progress_bar_formatter_spec.rb +82 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +365 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +370 -0
- data/spec/spec/runner/heckle_runner_spec.rb +78 -0
- data/spec/spec/runner/heckler_spec.rb +13 -0
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +45 -0
- data/spec/spec/runner/option_parser_spec.rb +421 -0
- data/spec/spec/runner/options_spec.rb +450 -0
- 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 +62 -0
- data/spec/spec/runner/reporter_spec.rb +238 -0
- data/spec/spec/runner/resources/a_bar.rb +0 -0
- data/spec/spec/runner/resources/a_foo.rb +0 -0
- data/spec/spec/runner/resources/a_spec.rb +1 -0
- data/spec/spec/runner/spec.opts +2 -0
- data/spec/spec/runner/spec_drb.opts +1 -0
- data/spec/spec/runner/spec_parser/spec_parser_fixture.rb +70 -0
- data/spec/spec/runner/spec_parser_spec.rb +85 -0
- data/spec/spec/runner/spec_spaced.opts +2 -0
- data/spec/spec/runner_spec.rb +11 -0
- data/spec/spec/spec_classes.rb +133 -0
- 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 +90 -0
- data/spec/spec/story/runner/scenario_collector_spec.rb +27 -0
- data/spec/spec/story/runner/scenario_runner_spec.rb +214 -0
- data/spec/spec/story/runner/story_mediator_spec.rb +143 -0
- data/spec/spec/story/runner/story_parser_spec.rb +401 -0
- data/spec/spec/story/runner/story_runner_spec.rb +294 -0
- data/spec/spec/story/runner_spec.rb +93 -0
- data/spec/spec/story/scenario_spec.rb +18 -0
- data/spec/spec/story/step_group_spec.rb +157 -0
- data/spec/spec/story/step_mother_spec.rb +84 -0
- data/spec/spec/story/step_spec.rb +272 -0
- data/spec/spec/story/story_helper.rb +2 -0
- data/spec/spec/story/story_spec.rb +84 -0
- data/spec/spec/story/world_spec.rb +423 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +77 -0
- data/stories/all.rb +5 -0
- data/stories/configuration/before_blocks.story +21 -0
- data/stories/configuration/stories.rb +7 -0
- data/stories/example_groups/autogenerated_docstrings +45 -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 +25 -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/mock_framework_integration/stories.rb +7 -0
- data/stories/mock_framework_integration/use_flexmock.story +9 -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/before_blocks_example.rb +32 -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/spec/spec_with_flexmock.rb +18 -0
- data/stories/resources/steps/running_rspec.rb +50 -0
- data/stories/resources/stories/failing_story.rb +15 -0
- data/stories/resources/test/spec_and_test_together.rb +57 -0
- data/stories/resources/test/test_case_with_should_methods.rb +30 -0
- data/stories/stories/multiline_steps.story +23 -0
- data/stories/stories/steps/multiline_steps.rb +13 -0
- data/stories/stories/stories.rb +6 -0
- data/story_server/prototype/javascripts/builder.js +136 -0
- data/story_server/prototype/javascripts/controls.js +972 -0
- data/story_server/prototype/javascripts/dragdrop.js +976 -0
- data/story_server/prototype/javascripts/effects.js +1117 -0
- data/story_server/prototype/javascripts/prototype.js +4140 -0
- data/story_server/prototype/javascripts/rspec.js +149 -0
- data/story_server/prototype/javascripts/scriptaculous.js +58 -0
- data/story_server/prototype/javascripts/slider.js +276 -0
- data/story_server/prototype/javascripts/sound.js +55 -0
- data/story_server/prototype/javascripts/unittest.js +568 -0
- data/story_server/prototype/lib/server.rb +24 -0
- data/story_server/prototype/stories.html +176 -0
- data/story_server/prototype/stylesheets/rspec.css +136 -0
- data/story_server/prototype/stylesheets/test.css +90 -0
- metadata +495 -0
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/story_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Story
|
5
|
+
describe StepMother do
|
6
|
+
it 'should store a step by name and type' do
|
7
|
+
# given
|
8
|
+
step_mother = StepMother.new
|
9
|
+
step = Step.new("a given", &lambda {})
|
10
|
+
step_mother.store(:given, step)
|
11
|
+
|
12
|
+
# when
|
13
|
+
found = step_mother.find(:given, "a given")
|
14
|
+
|
15
|
+
# then
|
16
|
+
found.should == step
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should NOT raise an error if a step is missing' do
|
20
|
+
# given
|
21
|
+
step_mother = StepMother.new
|
22
|
+
|
23
|
+
# then
|
24
|
+
lambda do
|
25
|
+
# when
|
26
|
+
step_mother.find(:given, "doesn't exist")
|
27
|
+
end.should_not raise_error
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should create a default step which raises a pending error" do
|
31
|
+
# given
|
32
|
+
step_mother = StepMother.new
|
33
|
+
|
34
|
+
# when
|
35
|
+
step = step_mother.find(:given, "doesn't exist")
|
36
|
+
|
37
|
+
# then
|
38
|
+
step.should be_an_instance_of(Step)
|
39
|
+
|
40
|
+
lambda do
|
41
|
+
step.perform(Object.new, "doesn't exist")
|
42
|
+
end.should raise_error(Spec::Example::ExamplePendingError, /Unimplemented/)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should create a default step with it's name stripped" do
|
46
|
+
# given
|
47
|
+
step_mother = StepMother.new
|
48
|
+
|
49
|
+
# when
|
50
|
+
step = step_mother.find(:given, "doesn't exist\n\n")
|
51
|
+
|
52
|
+
# then
|
53
|
+
step.should be_an_instance_of(Step)
|
54
|
+
step.name.should == "doesn't exist"
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should clear itself' do
|
58
|
+
# given
|
59
|
+
step_mother = StepMother.new
|
60
|
+
step = Step.new("a given") do end
|
61
|
+
step_mother.store(:given, step)
|
62
|
+
|
63
|
+
# when
|
64
|
+
step_mother.clear
|
65
|
+
|
66
|
+
# then
|
67
|
+
step_mother.should be_empty
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should use assigned steps" do
|
71
|
+
step_mother = StepMother.new
|
72
|
+
|
73
|
+
step = Step.new('step') {}
|
74
|
+
step_group = StepGroup.new
|
75
|
+
step_group.add(:given, step)
|
76
|
+
|
77
|
+
step_mother.use(step_group)
|
78
|
+
|
79
|
+
step_mother.find(:given, "step").should equal(step)
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,272 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/story_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Story
|
5
|
+
describe Step, "#matching" do
|
6
|
+
it "should match a text string" do
|
7
|
+
step = Step.new("this text") {}
|
8
|
+
step.matches?("this text").should be_true
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should match a text string that has additional line returns" do
|
12
|
+
step = Step.new("this text") {}
|
13
|
+
step.matches?("this text\n\n").should be_true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should not match a text string that does not start the same" do
|
17
|
+
step = Step.new("this text") {}
|
18
|
+
step.matches?("Xthis text").should be_false
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should not match a text string that does not end the same" do
|
22
|
+
step = Step.new("this text") {}
|
23
|
+
step.matches?("this textX").should be_false
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should match a text string with a param" do
|
27
|
+
step = Step.new("this $param text") {}
|
28
|
+
step.matches?("this anything text").should be_true
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should not be greedy" do
|
32
|
+
step = Step.new("enter $value for $key") {}
|
33
|
+
step.parse_args("enter 3 for keys for a piano").should == ['3','keys for a piano']
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should match a text string with 3 params" do
|
37
|
+
step = Step.new("1 $one 2 $two 3 $three 4") {}
|
38
|
+
step.matches?("1 a 2 b 3 c 4").should be_true
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should match a text string with two params sharing a prefix" do
|
42
|
+
step = Step.new("I am cool $n times out of $n_total")
|
43
|
+
step.matches?("I am cool 3 times out of 7").should be_true
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should match a text string with a param at the beginning" do
|
47
|
+
step = Step.new("$one 2 3") {}
|
48
|
+
step.matches?("a 2 3").should be_true
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should match a text string with a param at the end" do
|
52
|
+
step = Step.new("1 2 $three") {}
|
53
|
+
step.matches?("1 2 c").should be_true
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should match a text string with a dollar sign ($)" do
|
57
|
+
step = Step.new("show me the $$money") {}
|
58
|
+
step.matches?("show me the $kwan").should be_true
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should match a string with an escaped dollar sign" do
|
62
|
+
step = Step.new("show me the \$money") {}
|
63
|
+
step.matches?("show me the $kwan").should be_true
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should not match a different string" do
|
67
|
+
step = Step.new("this text") {}
|
68
|
+
step.matches?("other text").should be_false
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should match a regexp" do
|
72
|
+
step = Step.new(/this text/) {}
|
73
|
+
step.matches?("this text").should be_true
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should match a regexp with a match group" do
|
77
|
+
step = Step.new(/this (.*) text/) {}
|
78
|
+
step.matches?("this anything text").should be_true
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should match a regexp with a named variable" do
|
82
|
+
step = Step.new(/this $variable text/) {}
|
83
|
+
step.matches?("this anything text").should be_true
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should not match a non matching regexp" do
|
87
|
+
step = Step.new(/this (.*) text/) {}
|
88
|
+
step.matches?("other anything text").should be_false
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should not match a non matching regexp with a named variable" do
|
92
|
+
step = Step.new(/this $variable text/) {}
|
93
|
+
step.matches?("other anything text").should be_false
|
94
|
+
end
|
95
|
+
|
96
|
+
it "should not get bogged down by parens in strings" do
|
97
|
+
step = Step.new("before () after") {}
|
98
|
+
step.matches?("before () after").should be_true
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should not get bogged down by regular expression special characters in strings" do
|
102
|
+
step = Step.new("These characters should work ? ( ) [ ] { } ^ !") {}
|
103
|
+
step.matches?("These characters should work ? ( ) [ ] { } ^ !").should be_true
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should match any option of an alteration" do
|
107
|
+
step = Step.new(/(he|she) is cool/) {}
|
108
|
+
step.matches?("he is cool").should be_true
|
109
|
+
step.matches?("she is cool").should be_true
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should match alteration as well as a variable" do
|
113
|
+
step = Step.new(/(he|she) is (.*)/) {}
|
114
|
+
step.matches?("he is cool").should be_true
|
115
|
+
step.parse_args("he is cool").should == ['he', 'cool']
|
116
|
+
end
|
117
|
+
|
118
|
+
it "should match alteration as well as a named variable" do
|
119
|
+
step = Step.new(/(he|she) is $adjective/) {}
|
120
|
+
step.matches?("he is cool").should be_true
|
121
|
+
step.parse_args("he is cool").should == ['he', 'cool']
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should match alteration as well as a anonymous and named variable" do
|
125
|
+
step = Step.new(/(he|she) is (.*?) $adjective/) {}
|
126
|
+
step.matches?("he is very cool").should be_true
|
127
|
+
step.parse_args("he is very cool").should == ['he', 'very', 'cool']
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should match a regex with a dollar sign ($)" do
|
131
|
+
step = Step.new(/show me the \$\d+/) {}
|
132
|
+
step.matches?("show me the $123").should be_true
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should match a regex with a dollar sign and named variable" do
|
136
|
+
step = Step.new(/show me the \$$money/) {}
|
137
|
+
step.matches?("show me the $123").should be_true
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should match a multiline regex" do
|
141
|
+
step = Step.new(/.*should have text.$text/) {}
|
142
|
+
step.matches?(<<TEXT).should be_true
|
143
|
+
should have text
|
144
|
+
this is the text
|
145
|
+
and so is this
|
146
|
+
TEXT
|
147
|
+
end
|
148
|
+
|
149
|
+
it "should match the beginning of the string, not the line" do
|
150
|
+
step = Step.new(/should have text/) {}
|
151
|
+
step.matches?(<<TEXT).should be_false
|
152
|
+
whatever
|
153
|
+
should have text
|
154
|
+
TEXT
|
155
|
+
end
|
156
|
+
|
157
|
+
it "should match the end of the string, not the line" do
|
158
|
+
step = Step.new(/should have text/) {}
|
159
|
+
step.matches?(<<TEXT).should be_false
|
160
|
+
should have text
|
161
|
+
whatever
|
162
|
+
TEXT
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe Step, "#parse_args" do
|
167
|
+
it "should return an empty array for a text string with no parameters" do
|
168
|
+
step = Step.new("this text") {}
|
169
|
+
step.parse_args("this text").should == []
|
170
|
+
end
|
171
|
+
|
172
|
+
it "should return an empty array for a text string with additional line returns and no parameters" do
|
173
|
+
step = Step.new("this text") {}
|
174
|
+
step.parse_args("this text\n\n").should == []
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe Step do
|
179
|
+
it "should be pending with no block" do
|
180
|
+
step = Step.new("foo")
|
181
|
+
lambda {
|
182
|
+
step.perform(Object.new)
|
183
|
+
}.should raise_error(Spec::Example::ExamplePendingError, "Not Yet Implemented")
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should perform itself on an object" do
|
187
|
+
# given
|
188
|
+
$instance = nil
|
189
|
+
step = Step.new 'step' do
|
190
|
+
$instance = self
|
191
|
+
end
|
192
|
+
instance = Object.new
|
193
|
+
|
194
|
+
# when
|
195
|
+
step.perform(instance, "step")
|
196
|
+
|
197
|
+
# then
|
198
|
+
$instance.should == instance
|
199
|
+
end
|
200
|
+
|
201
|
+
it "should perform itself with one parameter with match expression" do
|
202
|
+
# given
|
203
|
+
$result = nil
|
204
|
+
step = Step.new 'an account with $count dollars' do |count|
|
205
|
+
$result = count
|
206
|
+
end
|
207
|
+
instance = Object.new
|
208
|
+
|
209
|
+
# when
|
210
|
+
args = step.parse_args("an account with 3 dollars")
|
211
|
+
step.perform(instance, *args)
|
212
|
+
|
213
|
+
# then
|
214
|
+
$result.should == "3"
|
215
|
+
end
|
216
|
+
|
217
|
+
it "should perform itself with one parameter without a match expression" do
|
218
|
+
# given
|
219
|
+
$result = nil
|
220
|
+
step = Step.new 'an account with a balance of' do |amount|
|
221
|
+
$result = amount
|
222
|
+
end
|
223
|
+
instance = Object.new
|
224
|
+
|
225
|
+
# when
|
226
|
+
step.perform(instance, 20)
|
227
|
+
|
228
|
+
# then
|
229
|
+
$result.should == 20
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should perform itself with 2 parameters" do
|
233
|
+
# given
|
234
|
+
$account_type = nil
|
235
|
+
$amount = nil
|
236
|
+
step = Step.new 'a $account_type account with $amount dollars' do |account_type, amount|
|
237
|
+
$account_type = account_type
|
238
|
+
$amount = amount
|
239
|
+
end
|
240
|
+
instance = Object.new
|
241
|
+
|
242
|
+
# when
|
243
|
+
args = step.parse_args("a savings account with 3 dollars")
|
244
|
+
step.perform(instance, *args)
|
245
|
+
|
246
|
+
# then
|
247
|
+
$account_type.should == "savings"
|
248
|
+
$amount.should == "3"
|
249
|
+
end
|
250
|
+
|
251
|
+
it "should perform itself when defined with a regexp with 2 parameters" do
|
252
|
+
# given
|
253
|
+
$pronoun = nil
|
254
|
+
$adjective = nil
|
255
|
+
step = Step.new /(he|she) is (.*)/ do |pronoun, adjective|
|
256
|
+
$pronoun = pronoun
|
257
|
+
$adjective = adjective
|
258
|
+
end
|
259
|
+
instance = Object.new
|
260
|
+
|
261
|
+
# when
|
262
|
+
args = step.parse_args("he is cool")
|
263
|
+
step.perform(instance, *args)
|
264
|
+
|
265
|
+
# then
|
266
|
+
$pronoun.should == "he"
|
267
|
+
$adjective.should == "cool"
|
268
|
+
end
|
269
|
+
|
270
|
+
end
|
271
|
+
end
|
272
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/story_helper'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Story
|
5
|
+
describe Story do
|
6
|
+
it 'should run itself in a given object' do
|
7
|
+
# given
|
8
|
+
$instance = nil
|
9
|
+
story = Story.new 'title', 'narrative' do
|
10
|
+
$instance = self
|
11
|
+
end
|
12
|
+
object = Object.new
|
13
|
+
|
14
|
+
# when
|
15
|
+
story.run_in(object)
|
16
|
+
|
17
|
+
# then
|
18
|
+
$instance.should be(object)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should not raise an error if no block is supplied' do
|
22
|
+
# when
|
23
|
+
error = exception_from { Story.new 'title', 'narrative' }
|
24
|
+
|
25
|
+
# then
|
26
|
+
error.should be_nil
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should raise an error when an error is raised running in another object" do
|
30
|
+
#given
|
31
|
+
story = Story.new 'title', 'narrative' do
|
32
|
+
raise "this is raised in the story"
|
33
|
+
end
|
34
|
+
object = Object.new
|
35
|
+
|
36
|
+
# when/then
|
37
|
+
lambda do
|
38
|
+
story.run_in(object)
|
39
|
+
end.should raise_error
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should use the steps it is told to using a StepGroup" do
|
43
|
+
story = Story.new("title", "narrative", :steps_for => steps = StepGroup.new) do end
|
44
|
+
assignee = mock("assignee")
|
45
|
+
assignee.should_receive(:use).with(steps)
|
46
|
+
story.assign_steps_to(assignee)
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should use the steps it is told to using a key" do
|
50
|
+
begin
|
51
|
+
orig_rspec_story_steps = $rspec_story_steps
|
52
|
+
$rspec_story_steps = StepGroupHash.new
|
53
|
+
$rspec_story_steps[:foo] = steps = Object.new
|
54
|
+
|
55
|
+
story = Story.new("title", "narrative", :steps_for => :foo) do end
|
56
|
+
assignee = mock("assignee")
|
57
|
+
|
58
|
+
assignee.should_receive(:use).with(steps)
|
59
|
+
story.assign_steps_to(assignee)
|
60
|
+
ensure
|
61
|
+
$rspec_story_steps = orig_rspec_story_steps
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
it "should use the steps it is told to using multiple keys" do
|
66
|
+
begin
|
67
|
+
orig_rspec_story_steps = $rspec_story_steps
|
68
|
+
$rspec_story_steps = StepGroupHash.new
|
69
|
+
$rspec_story_steps[:foo] = foo_steps = Object.new
|
70
|
+
$rspec_story_steps[:bar] = bar_steps = Object.new
|
71
|
+
|
72
|
+
story = Story.new("title", "narrative", :steps_for => [:foo, :bar]) do end
|
73
|
+
assignee = mock("assignee")
|
74
|
+
|
75
|
+
assignee.should_receive(:use).with(foo_steps)
|
76
|
+
assignee.should_receive(:use).with(bar_steps)
|
77
|
+
story.assign_steps_to(assignee)
|
78
|
+
ensure
|
79
|
+
$rspec_story_steps = orig_rspec_story_steps
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,423 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/story_helper'
|
2
|
+
|
3
|
+
require 'spec/story'
|
4
|
+
|
5
|
+
module Spec
|
6
|
+
module Story
|
7
|
+
describe World do
|
8
|
+
before :each do
|
9
|
+
World.listeners.clear
|
10
|
+
end
|
11
|
+
|
12
|
+
after :each do
|
13
|
+
World.listeners.clear
|
14
|
+
World.step_mother.clear
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should create an object that mixes in a World' do
|
18
|
+
# when
|
19
|
+
obj = World::create
|
20
|
+
|
21
|
+
# then
|
22
|
+
obj.should be_kind_of(World)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should create a World from any object type' do
|
26
|
+
# when
|
27
|
+
obj = World::create String
|
28
|
+
|
29
|
+
# then
|
30
|
+
obj.should be_kind_of(String)
|
31
|
+
obj.should be_kind_of(World)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should pass arguments to #new when creating an object of a specified type that mixes in a world' do
|
35
|
+
# given
|
36
|
+
Thing = Struct.new(:name, :age)
|
37
|
+
|
38
|
+
# when
|
39
|
+
obj = World::create Thing, "David", "I'm not telling"
|
40
|
+
|
41
|
+
# then
|
42
|
+
obj.should be_an_instance_of(Thing)
|
43
|
+
obj.name.should == "David"
|
44
|
+
obj.age.should == "I'm not telling"
|
45
|
+
obj.should be_kind_of(World)
|
46
|
+
end
|
47
|
+
|
48
|
+
def ensure_world_executes_step(&block)
|
49
|
+
# given
|
50
|
+
obj = World::create
|
51
|
+
$step_ran = false
|
52
|
+
|
53
|
+
# when
|
54
|
+
obj.instance_eval(&block)
|
55
|
+
|
56
|
+
# then
|
57
|
+
$step_ran.should be_true
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should execute a Given, When or Then step' do
|
61
|
+
ensure_world_executes_step do
|
62
|
+
Given 'a given' do
|
63
|
+
$step_ran = true
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
ensure_world_executes_step do
|
68
|
+
When 'an event' do
|
69
|
+
$step_ran = true
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
ensure_world_executes_step do
|
74
|
+
Then 'an outcome' do
|
75
|
+
$step_ran = true
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'should interpret Given... And... as multiple givens' do
|
81
|
+
# given
|
82
|
+
world = World.create
|
83
|
+
$steps = []
|
84
|
+
|
85
|
+
# when
|
86
|
+
world.instance_eval do
|
87
|
+
Given 'step 1' do
|
88
|
+
$steps << 1
|
89
|
+
end
|
90
|
+
And 'step 2' do
|
91
|
+
$steps << 2
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# then
|
96
|
+
$steps.should == [1,2]
|
97
|
+
World.step_mother.find(:given, 'step 1').should_not be_nil
|
98
|
+
World.step_mother.find(:given, 'step 2').should_not be_nil
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'should interpret When... And... as multiple events' do
|
102
|
+
# given
|
103
|
+
world = World.create
|
104
|
+
$steps = []
|
105
|
+
|
106
|
+
# when
|
107
|
+
world.instance_eval do
|
108
|
+
When 'step 1' do
|
109
|
+
$steps << 1
|
110
|
+
end
|
111
|
+
And 'step 2' do
|
112
|
+
$steps << 2
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# then
|
117
|
+
$steps.should == [1,2]
|
118
|
+
World.step_mother.find(:when, 'step 1').should_not be_nil
|
119
|
+
World.step_mother.find(:when, 'step 2').should_not be_nil
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'should interpret Then... And... as multiple outcomes' do
|
123
|
+
# given
|
124
|
+
world = World.create
|
125
|
+
$steps = []
|
126
|
+
|
127
|
+
# when
|
128
|
+
world.instance_eval do
|
129
|
+
Then 'step 1' do
|
130
|
+
$steps << 1
|
131
|
+
end
|
132
|
+
And 'step 2' do
|
133
|
+
$steps << 2
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# then
|
138
|
+
$steps.should == [1,2]
|
139
|
+
World.step_mother.find(:then, 'step 1').should_not be_nil
|
140
|
+
World.step_mother.find(:then, 'step 2').should_not be_nil
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'should reuse a given across scenarios' do
|
144
|
+
# given
|
145
|
+
$num_invoked = 0
|
146
|
+
a_world = World::create
|
147
|
+
a_world.instance_eval do
|
148
|
+
Given 'a given' do
|
149
|
+
$num_invoked += 1
|
150
|
+
end
|
151
|
+
end
|
152
|
+
another_world = World::create
|
153
|
+
|
154
|
+
# when
|
155
|
+
another_world.instance_eval do
|
156
|
+
Given 'a given' # without a body
|
157
|
+
end
|
158
|
+
|
159
|
+
# then
|
160
|
+
$num_invoked.should == 2
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'should reuse an event across scenarios' do
|
164
|
+
# given
|
165
|
+
$num_invoked = 0
|
166
|
+
a_world = World::create
|
167
|
+
a_world.instance_eval do
|
168
|
+
When 'an event' do
|
169
|
+
$num_invoked += 1
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
another_world = World::create
|
174
|
+
|
175
|
+
# when
|
176
|
+
another_world.instance_eval do
|
177
|
+
When 'an event' # without a body
|
178
|
+
end
|
179
|
+
|
180
|
+
# then
|
181
|
+
$num_invoked.should == 2
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'should reuse an outcome across scenarios' do
|
185
|
+
# given
|
186
|
+
$num_invoked = 0
|
187
|
+
a_world = World::create
|
188
|
+
a_world.instance_eval do
|
189
|
+
Then 'an outcome' do
|
190
|
+
$num_invoked += 1
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
another_world = World::create
|
195
|
+
|
196
|
+
# when
|
197
|
+
another_world.instance_eval do
|
198
|
+
Then 'an outcome' # without a body
|
199
|
+
end
|
200
|
+
|
201
|
+
# then
|
202
|
+
$num_invoked.should == 2
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'should preserve instance variables between steps within a scenario' do
|
206
|
+
# given
|
207
|
+
world = World::create
|
208
|
+
$first = nil
|
209
|
+
$second = nil
|
210
|
+
|
211
|
+
# when
|
212
|
+
world.instance_eval do
|
213
|
+
Given 'given' do
|
214
|
+
@first = 'first'
|
215
|
+
end
|
216
|
+
When 'event' do
|
217
|
+
@second = @first # from given
|
218
|
+
end
|
219
|
+
Then 'outcome' do
|
220
|
+
$first = @first # from given
|
221
|
+
$second = @second # from event
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
# then
|
226
|
+
$first.should == 'first'
|
227
|
+
$second.should == 'first'
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'should invoke a reused step in the new object instance' do
|
231
|
+
# given
|
232
|
+
$instances = []
|
233
|
+
$debug = true
|
234
|
+
world1 = World.create
|
235
|
+
world1.instance_eval do
|
236
|
+
Given 'a given' do
|
237
|
+
$instances << self.__id__
|
238
|
+
end
|
239
|
+
end
|
240
|
+
world2 = World.create
|
241
|
+
|
242
|
+
# when
|
243
|
+
world2.instance_eval do
|
244
|
+
Given 'a given' # reused
|
245
|
+
Then 'an outcome' do
|
246
|
+
$instances << __id__
|
247
|
+
end
|
248
|
+
end
|
249
|
+
$debug = false
|
250
|
+
# then
|
251
|
+
$instances.should == [ world1.__id__, world2.__id__, world2.__id__ ]
|
252
|
+
end
|
253
|
+
|
254
|
+
def ensure_world_collects_error(expected_error, &block)
|
255
|
+
# given
|
256
|
+
world = World.create
|
257
|
+
# $error = nil
|
258
|
+
|
259
|
+
# when
|
260
|
+
world.start_collecting_errors
|
261
|
+
world.instance_eval(&block)
|
262
|
+
|
263
|
+
# then
|
264
|
+
world.should have(1).errors
|
265
|
+
world.errors[0].should be_kind_of(expected_error)
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'should collect a failure from a Given step' do
|
269
|
+
ensure_world_collects_error RuntimeError do
|
270
|
+
Given 'a given' do
|
271
|
+
raise RuntimeError, "oops"
|
272
|
+
end
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
it 'should collect a failure from a When step' do
|
277
|
+
ensure_world_collects_error RuntimeError do
|
278
|
+
When 'an event' do
|
279
|
+
raise RuntimeError, "oops"
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
it 'should collect a failure from a Then step' do
|
285
|
+
ensure_world_collects_error RuntimeError do
|
286
|
+
Then 'an outcome' do
|
287
|
+
raise RuntimeError, "oops"
|
288
|
+
end
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
it 'should inform listeners when it runs a Given, When or Then step' do
|
293
|
+
# given
|
294
|
+
world = World.create
|
295
|
+
mock_listener1 = mock('listener1')
|
296
|
+
mock_listener2 = mock('listener2')
|
297
|
+
World.add_listener(mock_listener1)
|
298
|
+
World.add_listener(mock_listener2)
|
299
|
+
|
300
|
+
# expect
|
301
|
+
mock_listener1.should_receive(:step_upcoming).with(:given, 'a context')
|
302
|
+
mock_listener1.should_receive(:step_succeeded).with(:given, 'a context')
|
303
|
+
mock_listener1.should_receive(:step_upcoming).with(:when, 'an event')
|
304
|
+
mock_listener1.should_receive(:step_succeeded).with(:when, 'an event')
|
305
|
+
mock_listener1.should_receive(:step_upcoming).with(:then, 'an outcome')
|
306
|
+
mock_listener1.should_receive(:step_succeeded).with(:then, 'an outcome')
|
307
|
+
|
308
|
+
mock_listener2.should_receive(:step_upcoming).with(:given, 'a context')
|
309
|
+
mock_listener2.should_receive(:step_succeeded).with(:given, 'a context')
|
310
|
+
mock_listener2.should_receive(:step_upcoming).with(:when, 'an event')
|
311
|
+
mock_listener2.should_receive(:step_succeeded).with(:when, 'an event')
|
312
|
+
mock_listener2.should_receive(:step_upcoming).with(:then, 'an outcome')
|
313
|
+
mock_listener2.should_receive(:step_succeeded).with(:then, 'an outcome')
|
314
|
+
|
315
|
+
# when
|
316
|
+
world.instance_eval do
|
317
|
+
Given 'a context' do end
|
318
|
+
When 'an event' do end
|
319
|
+
Then 'an outcome' do end
|
320
|
+
end
|
321
|
+
|
322
|
+
# then
|
323
|
+
end
|
324
|
+
|
325
|
+
it 'should tell listeners but not execute the step in dry-run mode' do
|
326
|
+
# given
|
327
|
+
World.stub!(:dry_run).and_return(true)
|
328
|
+
mock_listener = mock('listener')
|
329
|
+
World.add_listener(mock_listener)
|
330
|
+
$step_invoked = false
|
331
|
+
world = World.create
|
332
|
+
|
333
|
+
# expect
|
334
|
+
mock_listener.should_receive(:step_upcoming).with(:given, 'a context')
|
335
|
+
mock_listener.should_receive(:step_succeeded).with(:given, 'a context')
|
336
|
+
|
337
|
+
# when
|
338
|
+
world.instance_eval do
|
339
|
+
Given 'a context' do
|
340
|
+
$step_invoked = true
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
# then
|
345
|
+
$step_invoked.should be(false)
|
346
|
+
end
|
347
|
+
|
348
|
+
it 'should suppress listeners while it runs a GivenScenario' do
|
349
|
+
# given
|
350
|
+
scenario_ran = false
|
351
|
+
|
352
|
+
scenario = ScenarioBuilder.new.name('a scenario').to_scenario do
|
353
|
+
scenario_ran = true
|
354
|
+
Given 'given' do end
|
355
|
+
When 'event' do end
|
356
|
+
Then 'outcome' do end
|
357
|
+
end
|
358
|
+
|
359
|
+
given_scenario = GivenScenario.new('a scenario')
|
360
|
+
Runner::StoryRunner.should_receive(:scenario_from_current_story).
|
361
|
+
with('a scenario').and_return(scenario)
|
362
|
+
|
363
|
+
world = World.create
|
364
|
+
listener = mock('listener')
|
365
|
+
World.add_listener(listener)
|
366
|
+
|
367
|
+
# expect
|
368
|
+
listener.should_receive(:found_scenario).with(:'given scenario', 'a scenario')
|
369
|
+
listener.should_receive(:step_succeeded).never.with(:given, 'given')
|
370
|
+
listener.should_receive(:step_succeeded).never.with(:when, 'event')
|
371
|
+
listener.should_receive(:step_succeeded).never.with(:then, 'outcome')
|
372
|
+
|
373
|
+
# when
|
374
|
+
world.GivenScenario 'a scenario'
|
375
|
+
|
376
|
+
# then
|
377
|
+
scenario_ran.should be_true
|
378
|
+
end
|
379
|
+
|
380
|
+
it 'should interpret GivenScenario... And... as multiple givens' do
|
381
|
+
# given
|
382
|
+
world = World.create
|
383
|
+
steps = []
|
384
|
+
|
385
|
+
scenario = ScenarioBuilder.new.name('a scenario').to_scenario do
|
386
|
+
steps << 1
|
387
|
+
end
|
388
|
+
Runner::StoryRunner.should_receive(:scenario_from_current_story).
|
389
|
+
with('a scenario').and_return(scenario)
|
390
|
+
|
391
|
+
# when
|
392
|
+
world.instance_eval do
|
393
|
+
GivenScenario 'a scenario'
|
394
|
+
And 'step 2' do
|
395
|
+
steps << 2
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
399
|
+
# then
|
400
|
+
steps.should == [1,2]
|
401
|
+
World.step_mother.find(:given, 'step 2').should_not be_nil
|
402
|
+
end
|
403
|
+
|
404
|
+
it 'should provide rspec matchers' do
|
405
|
+
# given
|
406
|
+
world = World.create
|
407
|
+
|
408
|
+
# then
|
409
|
+
world.instance_eval do
|
410
|
+
'hello'.should match(/^hello$/)
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
it "should use assigned matchers" do
|
415
|
+
world = World.create
|
416
|
+
|
417
|
+
World.should_receive(:use).with(steps = Object.new)
|
418
|
+
|
419
|
+
World.use(steps)
|
420
|
+
end
|
421
|
+
end
|
422
|
+
end
|
423
|
+
end
|