rspec 1.0.0 → 1.3.1
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/.document +7 -0
- data/History.rdoc +1546 -0
- data/{MIT-LICENSE → License.txt} +3 -1
- data/Manifest.txt +384 -0
- data/README.rdoc +41 -0
- data/Rakefile +94 -229
- data/Ruby1.9.rdoc +31 -0
- data/TODO.txt +17 -0
- data/Upgrade.rdoc +260 -0
- data/bin/autospec +4 -0
- data/bin/spec +5 -3
- data/cucumber.yml +5 -0
- data/examples/failing/README.txt +11 -0
- data/examples/failing/diffing_spec.rb +36 -0
- data/examples/failing/failing_implicit_docstrings_example.rb +17 -0
- data/examples/failing/failure_in_after.rb +10 -0
- data/examples/failing/failure_in_before.rb +10 -0
- data/examples/failing/mocking_example.rb +38 -0
- data/examples/failing/mocking_with_flexmock.rb +26 -0
- data/examples/failing/mocking_with_mocha.rb +25 -0
- data/examples/failing/mocking_with_rr.rb +27 -0
- data/examples/failing/partial_mock_example.rb +18 -0
- data/examples/failing/pending_example.rb +7 -0
- data/examples/failing/predicate_example.rb +32 -0
- data/examples/failing/raising_example.rb +47 -0
- data/examples/failing/syntax_error_example.rb +7 -0
- data/examples/failing/team_spec.rb +41 -0
- data/examples/failing/timeout_behaviour.rb +5 -0
- data/examples/{custom_formatter.rb → passing/custom_formatter.rb} +1 -1
- data/examples/passing/dynamic_spec.rb +7 -0
- data/examples/{file_accessor.rb → passing/file_accessor.rb} +18 -18
- data/examples/{file_accessor_spec.rb → passing/file_accessor_spec.rb} +37 -38
- data/examples/passing/filtered_formatter.rb +17 -0
- data/examples/passing/filtered_formatter_example.rb +31 -0
- data/examples/{greeter_spec.rb → passing/greeter_spec.rb} +1 -1
- data/examples/passing/helper_method_example.rb +12 -0
- data/examples/passing/implicit_docstrings_example.rb +16 -0
- data/examples/{io_processor.rb → passing/io_processor.rb} +8 -8
- data/examples/{io_processor_spec.rb → passing/io_processor_spec.rb} +2 -3
- data/examples/{mocking_example.rb → passing/mocking_example.rb} +0 -2
- data/examples/{multi_threaded_behaviour_runner.rb → passing/multi_threaded_example_group_runner.rb} +10 -9
- data/examples/passing/nested_classes_example.rb +35 -0
- data/examples/passing/options_example.rb +29 -0
- data/examples/passing/options_formatter.rb +20 -0
- data/examples/{partial_mock_example.rb → passing/partial_mock_example.rb} +2 -3
- data/examples/passing/pending_example.rb +18 -0
- data/examples/{predicate_example.rb → passing/predicate_example.rb} +1 -3
- data/examples/{shared_behaviours_example.rb → passing/shared_example_group_example.rb} +15 -11
- data/examples/passing/shared_stack_examples.rb +36 -0
- data/examples/passing/simple_matcher_example.rb +29 -0
- data/examples/{stack.rb → passing/stack.rb} +1 -1
- data/examples/{stack_spec.rb → passing/stack_spec.rb} +6 -40
- data/examples/passing/stack_spec_with_nested_example_groups.rb +66 -0
- data/examples/{stubbing_example.rb → passing/stubbing_example.rb} +1 -3
- data/examples/passing/yielding_example.rb +31 -0
- data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +85 -0
- data/features/before_and_after_blocks/before_and_after_blocks.feature +167 -0
- data/features/command_line/line_number_option.feature +56 -0
- data/features/command_line/line_number_option_with_example_with_no_name.feature +22 -0
- data/features/example_groups/define_example_attribute.feature +41 -0
- data/features/example_groups/example_group_with_should_methods.feature +29 -0
- data/features/example_groups/implicit_docstrings.feature +59 -0
- data/features/example_groups/nested_groups.feature +32 -0
- data/features/expectations/customized_message.feature +54 -0
- data/features/expectations/expect_change.feature +65 -0
- data/features/expectations/expect_error.feature +44 -0
- data/features/extensions/custom_example_group.feature +19 -0
- data/features/formatters/custom_formatter.feature +30 -0
- data/features/formatters/nested_formatter.feature +32 -0
- data/features/interop/cucumber_stubs_dont_leak.feature +11 -0
- data/features/interop/examples_and_tests_together.feature +84 -0
- data/features/interop/rspec_output.feature +25 -0
- data/features/interop/test_but_not_test_unit.feature +26 -0
- data/features/interop/test_case_with_should_methods.feature +46 -0
- data/features/load_paths/add_lib_to_load_path.feature +20 -0
- data/features/load_paths/add_spec_to_load_path.feature +20 -0
- data/features/matchers/define_diffable_matcher.feature +26 -0
- data/features/matchers/define_matcher.feature +179 -0
- data/features/matchers/define_matcher_outside_rspec.feature +38 -0
- data/features/matchers/define_matcher_with_fluent_interface.feature +48 -0
- data/features/matchers/define_wrapped_matcher.feature +56 -0
- data/features/matchers/match_unless_raises.feature +60 -0
- data/features/matchers/match_unless_raises_unexpected_error.feature +39 -0
- data/features/mock_framework_integration/use_flexmock.feature +27 -0
- data/features/mock_framework_integration/use_mocha.feature +27 -0
- data/features/mock_framework_integration/use_rr.feature +27 -0
- data/features/mocks/block_local_expectations.feature +62 -0
- data/features/mocks/mix_stubs_and_mocks.feature +22 -0
- data/features/mocks/stub_implementation.feature +26 -0
- data/features/pending/pending_examples.feature +81 -0
- data/features/runner/specify_line_number.feature +32 -0
- data/features/spec_helper/spec_helper.feature +25 -0
- data/features/step_definitions/running_rspec_steps.rb +52 -0
- data/features/step_definitions/stubbing_steps.rb +16 -0
- data/features/subject/explicit_subject.feature +31 -0
- data/features/subject/implicit_subject.feature +43 -0
- data/features/support/env.rb +83 -0
- data/features/support/matchers/smart_match.rb +31 -0
- data/geminstaller.yml +29 -0
- data/init.rb +9 -0
- data/lib/autotest/discover.rb +3 -0
- data/lib/autotest/rspec.rb +54 -0
- data/lib/spec/adapters/mock_frameworks/flexmock.rb +24 -0
- data/{plugins → lib/spec/adapters}/mock_frameworks/mocha.rb +8 -4
- data/lib/spec/adapters/mock_frameworks/rr.rb +22 -0
- data/lib/spec/adapters/mock_frameworks/rspec.rb +21 -0
- data/lib/spec/autorun.rb +3 -0
- data/lib/spec/deprecation.rb +41 -0
- data/lib/spec/dsl/main.rb +93 -0
- data/lib/spec/dsl.rb +1 -10
- data/lib/spec/example/args_and_options.rb +27 -0
- data/lib/spec/example/before_and_after_hooks.rb +93 -0
- data/lib/spec/example/errors.rb +25 -0
- data/lib/spec/example/example_group.rb +10 -0
- data/lib/spec/example/example_group_factory.rb +82 -0
- data/lib/spec/example/example_group_hierarchy.rb +53 -0
- data/lib/spec/example/example_group_methods.rb +287 -0
- data/lib/spec/example/example_group_proxy.rb +61 -0
- data/lib/spec/example/example_matcher.rb +43 -0
- data/lib/spec/example/example_methods.rb +152 -0
- data/lib/spec/example/example_proxy.rb +41 -0
- data/lib/spec/example/module_reopening_fix.rb +43 -0
- data/lib/spec/example/pending.rb +18 -0
- data/lib/spec/example/predicate_matchers.rb +46 -0
- data/lib/spec/example/shared_example_group.rb +59 -0
- data/lib/spec/example/subject.rb +114 -0
- data/lib/spec/example.rb +164 -0
- data/lib/spec/expectations/errors.rb +7 -1
- data/lib/spec/expectations/extensions/kernel.rb +52 -0
- data/lib/spec/expectations/extensions.rb +1 -2
- data/lib/spec/expectations/fail_with.rb +45 -0
- data/lib/spec/expectations/handler.rb +37 -30
- data/lib/spec/expectations.rb +2 -23
- data/lib/spec/extensions/instance_exec.rb +31 -0
- data/lib/spec/interop/test/unit/autorunner.rb +6 -0
- data/lib/spec/interop/test/unit/testcase.rb +56 -0
- data/lib/spec/interop/test/unit/testresult.rb +6 -0
- data/lib/spec/interop/test/unit/testsuite_adapter.rb +36 -0
- data/lib/spec/interop/test/unit/ui/console/testrunner.rb +61 -0
- data/lib/spec/interop/test.rb +44 -0
- data/lib/spec/matchers/be.rb +183 -140
- data/lib/spec/matchers/be_close.rb +18 -23
- data/lib/spec/matchers/be_instance_of.rb +26 -0
- data/lib/spec/matchers/be_kind_of.rb +26 -0
- data/lib/spec/matchers/change.rb +72 -41
- data/lib/spec/matchers/compatibility.rb +14 -0
- data/lib/spec/matchers/dsl.rb +20 -0
- data/lib/spec/matchers/eql.rb +25 -26
- data/lib/spec/matchers/equal.rb +35 -25
- data/lib/spec/matchers/errors.rb +5 -0
- data/lib/spec/matchers/exist.rb +16 -0
- data/lib/spec/matchers/generated_descriptions.rb +36 -0
- data/lib/spec/matchers/has.rb +17 -26
- data/lib/spec/matchers/have.rb +36 -24
- data/lib/spec/matchers/include.rb +22 -48
- data/lib/spec/matchers/match.rb +11 -31
- data/lib/spec/matchers/match_array.rb +71 -0
- data/lib/spec/matchers/matcher.rb +132 -0
- data/lib/spec/matchers/method_missing.rb +9 -0
- data/lib/spec/matchers/operator_matcher.rb +55 -44
- data/lib/spec/matchers/pretty.rb +37 -0
- data/lib/spec/matchers/raise_exception.rb +131 -0
- data/lib/spec/matchers/respond_to.rb +35 -9
- data/lib/spec/matchers/satisfy.rb +2 -2
- data/lib/spec/matchers/simple_matcher.rb +134 -0
- data/lib/spec/matchers/throw_symbol.rb +56 -31
- data/lib/spec/matchers/wrap_expectation.rb +55 -0
- data/lib/spec/matchers.rb +104 -48
- data/lib/spec/mocks/argument_expectation.rb +28 -112
- data/lib/spec/mocks/argument_matchers.rb +237 -0
- data/lib/spec/mocks/error_generator.rb +20 -13
- data/lib/spec/mocks/errors.rb +1 -1
- data/lib/spec/mocks/example_methods.rb +69 -0
- data/lib/spec/mocks/extensions.rb +1 -0
- data/lib/spec/mocks/framework.rb +15 -0
- data/lib/spec/mocks/message_expectation.rb +206 -93
- data/lib/spec/mocks/methods.rb +66 -7
- data/lib/spec/mocks/mock.rb +53 -11
- data/lib/spec/mocks/proxy.rb +160 -55
- data/lib/spec/mocks/space.rb +2 -2
- data/lib/spec/mocks.rb +14 -23
- data/lib/spec/rake/spectask.rb +108 -53
- data/lib/spec/rake/verify_rcov.rb +4 -4
- data/lib/spec/ruby.rb +9 -0
- data/lib/spec/runner/backtrace_tweaker.rb +45 -23
- data/lib/spec/runner/class_and_arguments_parser.rb +14 -0
- data/lib/spec/runner/command_line.rb +7 -14
- data/lib/spec/runner/configuration.rb +202 -0
- data/lib/spec/runner/differs/default.rb +93 -0
- data/lib/spec/runner/differs/load-diff-lcs.rb +12 -0
- data/lib/spec/runner/drb_command_line.rb +18 -7
- data/lib/spec/runner/example_group_runner.rb +58 -0
- data/lib/spec/runner/extensions/kernel.rb +5 -46
- data/lib/spec/runner/formatter/base_formatter.rb +97 -26
- data/lib/spec/runner/formatter/base_text_formatter.rb +79 -39
- data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +25 -0
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +6 -8
- data/lib/spec/runner/formatter/html_formatter.rb +101 -75
- data/lib/spec/runner/formatter/nested_text_formatter.rb +50 -0
- data/lib/spec/runner/formatter/no_op_method_missing.rb +21 -0
- data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +11 -8
- data/lib/spec/runner/formatter/silent_formatter.rb +10 -0
- data/lib/spec/runner/formatter/snippet_extractor.rb +2 -2
- data/lib/spec/runner/formatter/specdoc_formatter.rb +20 -15
- data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
- data/lib/spec/runner/heckle_runner.rb +56 -56
- data/lib/spec/runner/{heckle_runner_win.rb → heckle_runner_unsupported.rb} +10 -10
- data/lib/spec/runner/line_number_query.rb +78 -0
- data/lib/spec/runner/option_parser.rb +147 -148
- data/lib/spec/runner/options.rb +343 -95
- data/lib/spec/runner/reporter.rb +117 -60
- data/lib/spec/runner.rb +39 -138
- data/lib/spec/stubs/cucumber.rb +5 -0
- data/lib/spec/test/unit.rb +10 -0
- data/lib/spec/version.rb +14 -22
- data/lib/spec.rb +5 -10
- data/resources/helpers/cmdline.rb +8 -0
- data/resources/rake/examples.rake +7 -0
- data/resources/rake/examples_with_rcov.rake +9 -0
- data/resources/rake/failing_examples_with_html.rake +9 -0
- data/resources/rake/verify_rcov.rake +7 -0
- data/spec/README.jruby +15 -0
- data/spec/autotest/autotest_helper.rb +8 -0
- data/spec/autotest/autotest_matchers.rb +38 -0
- data/spec/autotest/discover_spec.rb +8 -0
- data/spec/autotest/failed_results_re_spec.rb +31 -0
- data/spec/autotest/rspec_spec.rb +126 -0
- data/spec/ruby_forker.rb +13 -0
- data/spec/spec/dsl/main_spec.rb +103 -0
- data/spec/spec/example/example_group_class_definition_spec.rb +51 -0
- data/spec/spec/example/example_group_factory_spec.rb +180 -0
- data/spec/spec/example/example_group_methods_spec.rb +778 -0
- data/spec/spec/example/example_group_proxy_spec.rb +107 -0
- data/spec/spec/example/example_group_spec.rb +632 -0
- data/spec/spec/example/example_matcher_spec.rb +85 -0
- data/spec/spec/example/example_methods_spec.rb +162 -0
- data/spec/spec/example/example_proxy_spec.rb +57 -0
- data/spec/spec/example/helper_method_spec.rb +24 -0
- data/spec/spec/{dsl/behaviour_eval_spec.rb → example/nested_example_group_spec.rb} +25 -3
- data/spec/spec/example/pending_module_spec.rb +58 -0
- data/spec/spec/example/predicate_matcher_spec.rb +41 -0
- data/spec/spec/example/shared_example_group_spec.rb +257 -0
- data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
- data/spec/spec/example/subject_spec.rb +110 -0
- data/spec/spec/expectations/differs/default_spec.rb +100 -13
- data/spec/spec/expectations/extensions/{object_spec.rb → kernel_spec.rb} +13 -14
- data/spec/spec/expectations/fail_with_spec.rb +42 -17
- data/spec/spec/expectations/handler_spec.rb +206 -0
- data/spec/spec/expectations/wrap_expectation_spec.rb +31 -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/test_case_with_various_names.rb +22 -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 +48 -0
- data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +18 -0
- data/spec/spec/interop/test/unit/testcase_spec.rb +50 -0
- data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
- data/spec/spec/matchers/be_close_spec.rb +32 -21
- data/spec/spec/matchers/be_instance_of_spec.rb +36 -0
- data/spec/spec/matchers/be_kind_of_spec.rb +33 -0
- data/spec/spec/matchers/be_spec.rb +261 -10
- data/spec/spec/matchers/change_spec.rb +178 -61
- data/spec/spec/matchers/compatibility_spec.rb +28 -0
- data/spec/spec/matchers/description_generation_spec.rb +47 -46
- data/spec/spec/matchers/dsl_spec.rb +34 -0
- data/spec/spec/matchers/eql_spec.rb +14 -9
- data/spec/spec/matchers/equal_spec.rb +43 -14
- data/spec/spec/matchers/exist_spec.rb +41 -24
- data/spec/spec/matchers/has_spec.rb +154 -1
- data/spec/spec/matchers/have_spec.rb +311 -189
- data/spec/spec/matchers/include_spec.rb +45 -2
- data/spec/spec/matchers/match_array_spec.rb +115 -0
- data/spec/spec/matchers/match_spec.rb +25 -5
- data/spec/spec/matchers/matcher_spec.rb +289 -0
- data/spec/spec/matchers/matchers_spec.rb +2 -0
- data/spec/spec/matchers/operator_matcher_spec.rb +48 -15
- data/spec/spec/matchers/raise_exception_spec.rb +345 -0
- data/spec/spec/matchers/respond_to_spec.rb +78 -16
- data/spec/spec/matchers/satisfy_spec.rb +1 -1
- data/spec/spec/matchers/simple_matcher_spec.rb +100 -0
- data/spec/spec/matchers/throw_symbol_spec.rb +111 -41
- data/spec/spec/mocks/and_yield_spec.rb +117 -0
- data/spec/spec/mocks/any_number_of_times_spec.rb +9 -2
- data/spec/spec/mocks/argument_expectation_spec.rb +19 -15
- data/spec/spec/mocks/argument_matchers_spec.rb +19 -0
- data/spec/spec/mocks/at_least_spec.rb +2 -2
- data/spec/spec/mocks/at_most_spec.rb +3 -3
- data/spec/spec/mocks/bug_report_10260_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_10263_spec.rb +27 -0
- data/spec/spec/mocks/bug_report_11545_spec.rb +32 -0
- data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
- data/spec/spec/mocks/bug_report_496_spec.rb +17 -0
- data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
- data/spec/spec/mocks/bug_report_7611_spec.rb +2 -2
- data/spec/spec/mocks/bug_report_7805_spec.rb +2 -2
- data/spec/spec/mocks/bug_report_8165_spec.rb +4 -4
- data/spec/spec/mocks/bug_report_8302_spec.rb +2 -2
- data/spec/spec/mocks/bug_report_830_spec.rb +21 -0
- data/spec/spec/mocks/double_spec.rb +12 -0
- data/spec/spec/mocks/failing_argument_matchers_spec.rb +95 -0
- data/spec/spec/mocks/hash_including_matcher_spec.rb +90 -0
- data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
- data/spec/spec/mocks/mock_ordering_spec.rb +15 -5
- data/spec/spec/mocks/mock_space_spec.rb +1 -1
- data/spec/spec/mocks/mock_spec.rb +346 -129
- data/spec/spec/mocks/multiple_return_value_spec.rb +9 -9
- data/spec/spec/mocks/nil_expectation_warning_spec.rb +53 -0
- data/spec/spec/mocks/null_object_mock_spec.rb +15 -1
- data/spec/spec/mocks/once_counts_spec.rb +2 -2
- data/spec/spec/mocks/options_hash_spec.rb +19 -17
- data/spec/spec/mocks/partial_mock_spec.rb +124 -12
- data/spec/spec/mocks/partial_mock_using_mocks_directly_spec.rb +2 -2
- data/spec/spec/mocks/passing_argument_matchers_spec.rb +145 -0
- data/spec/spec/mocks/precise_counts_spec.rb +2 -2
- data/spec/spec/mocks/record_messages_spec.rb +2 -2
- data/spec/spec/mocks/stub_chain_spec.rb +42 -0
- data/spec/spec/mocks/stub_implementation_spec.rb +31 -0
- data/spec/spec/mocks/stub_spec.rb +147 -103
- data/spec/spec/mocks/stubbed_message_expectations_spec.rb +26 -0
- data/spec/spec/mocks/twice_counts_spec.rb +2 -2
- data/spec/spec/mocks/unstub_spec.rb +127 -0
- data/spec/spec/package/bin_spec_spec.rb +11 -7
- data/spec/spec/rake/spectask_spec.rb +150 -0
- data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
- data/spec/spec/runner/command_line_spec.rb +158 -29
- data/spec/spec/runner/configuration_spec.rb +320 -0
- data/spec/spec/runner/drb_command_line_spec.rb +137 -72
- data/spec/spec/runner/empty_file.txt +0 -0
- data/spec/spec/runner/example_group_runner_spec.rb +26 -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 +30 -0
- data/spec/spec/runner/formatter/base_text_formatter_spec.rb +113 -0
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +45 -0
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +17 -12
- data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +377 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.6.html +377 -0
- data/spec/spec/runner/formatter/html_formatted-1.8.7.html +377 -0
- data/spec/spec/runner/formatter/html_formatted-1.9.1.html +377 -0
- data/spec/spec/runner/formatter/html_formatter_spec.rb +112 -52
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +329 -0
- data/spec/spec/runner/formatter/profile_formatter_spec.rb +70 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +87 -16
- data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +153 -50
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.6-jruby.html +371 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +371 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +371 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +371 -0
- data/spec/spec/runner/formatter/text_mate_formatter_spec.rb +106 -0
- data/spec/spec/runner/heckle_runner_spec.rb +32 -17
- data/spec/spec/runner/heckler_spec.rb +17 -11
- data/spec/spec/runner/line_number_query/line_number_query_fixture.rb +70 -0
- data/spec/spec/runner/line_number_query_spec.rb +129 -0
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +27 -21
- data/spec/spec/runner/option_parser_spec.rb +367 -164
- data/spec/spec/runner/options_spec.rb +506 -94
- data/spec/spec/runner/output_one_time_fixture.rb +7 -0
- data/spec/spec/runner/output_one_time_fixture_runner.rb +7 -0
- data/spec/spec/runner/output_one_time_spec.rb +15 -0
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +94 -27
- data/spec/spec/runner/reporter_spec.rb +212 -121
- 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/resources/custom_example_group_runner.rb +14 -0
- data/spec/spec/runner/resources/utf8_encoded.rb +8 -0
- data/spec/spec/runner/spec.opts +2 -0
- data/spec/spec/runner/spec_drb.opts +2 -0
- data/spec/spec/runner/spec_spaced.opts +2 -0
- data/spec/spec/runner_spec.rb +13 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +87 -45
- data/spec/support/macros.rb +29 -0
- data/spec/{spec → support}/spec_classes.rb +26 -4
- metadata +461 -141
- data/CHANGES +0 -748
- data/EXAMPLES.rd +0 -108
- data/README +0 -70
- data/UPGRADE +0 -31
- data/bin/spec_translator +0 -8
- data/examples/auto_spec_description_example.rb +0 -19
- data/examples/before_and_after_example.rb +0 -39
- data/examples/behave_as_example.rb +0 -45
- data/examples/dynamic_spec.rb +0 -9
- data/examples/helper_method_example.rb +0 -11
- data/examples/legacy_spec.rb +0 -10
- data/examples/not_yet_implemented_spec.rb +0 -12
- data/examples/priority.txt +0 -1
- 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/behaviour.rb +0 -204
- data/lib/spec/dsl/behaviour_callbacks.rb +0 -77
- data/lib/spec/dsl/behaviour_eval.rb +0 -177
- data/lib/spec/dsl/behaviour_factory.rb +0 -42
- data/lib/spec/dsl/composite_proc_builder.rb +0 -28
- data/lib/spec/dsl/configuration.rb +0 -119
- data/lib/spec/dsl/description.rb +0 -46
- data/lib/spec/dsl/example.rb +0 -127
- data/lib/spec/dsl/example_matcher.rb +0 -28
- data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
- data/lib/spec/expectations/differs/default.rb +0 -61
- data/lib/spec/expectations/extensions/object.rb +0 -66
- data/lib/spec/expectations/extensions/string_and_symbol.rb +0 -17
- data/lib/spec/extensions/object.rb +0 -6
- data/lib/spec/extensions.rb +0 -1
- data/lib/spec/matchers/raise_error.rb +0 -100
- data/lib/spec/mocks/argument_constraint_matchers.rb +0 -12
- data/lib/spec/mocks/spec_methods.rb +0 -30
- data/lib/spec/runner/behaviour_runner.rb +0 -102
- data/lib/spec/runner/extensions/object.rb +0 -32
- data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -25
- data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
- data/lib/spec/runner/formatter.rb +0 -9
- data/lib/spec/runner/spec_parser.rb +0 -50
- data/lib/spec/test_case_adapter.rb +0 -10
- data/lib/spec/translator.rb +0 -106
- data/plugins/mock_frameworks/flexmock.rb +0 -27
- data/plugins/mock_frameworks/rspec.rb +0 -18
- data/spec/spec/dsl/behaviour_factory_spec.rb +0 -30
- data/spec/spec/dsl/behaviour_spec.rb +0 -604
- data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -57
- data/spec/spec/dsl/configuration_spec.rb +0 -50
- data/spec/spec/dsl/description_spec.rb +0 -81
- data/spec/spec/dsl/example_class_spec.rb +0 -24
- data/spec/spec/dsl/example_instance_spec.rb +0 -162
- data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
- data/spec/spec/dsl/predicate_matcher_spec.rb +0 -21
- data/spec/spec/dsl/shared_behaviour_spec.rb +0 -208
- data/spec/spec/matchers/handler_spec.rb +0 -88
- data/spec/spec/matchers/matcher_methods_spec.rb +0 -78
- data/spec/spec/matchers/raise_error_spec.rb +0 -147
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +0 -73
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +0 -92
- data/spec/spec/runner/behaviour_runner_spec.rb +0 -118
- data/spec/spec/runner/context_matching_spec.rb +0 -27
- data/spec/spec/runner/execution_context_spec.rb +0 -31
- data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
- data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -27
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -21
- 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/spec/spec/runner/spec_matcher_spec.rb +0 -102
- data/spec/spec/runner/spec_parser_spec.rb +0 -93
- data/spec/spec/translator_spec.rb +0 -216
- /data/examples/{custom_expectation_matchers.rb → passing/custom_matchers.rb} +0 -0
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Matchers
|
|
3
|
+
class SimpleMatcher
|
|
4
|
+
attr_writer :failure_message, :negative_failure_message, :description
|
|
5
|
+
|
|
6
|
+
def initialize(description, &match_block)
|
|
7
|
+
@description = description
|
|
8
|
+
@match_block = match_block
|
|
9
|
+
@failure_message = @negative_failure_message = nil
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def matches?(given)
|
|
13
|
+
@given = given
|
|
14
|
+
case @match_block.arity
|
|
15
|
+
when 2
|
|
16
|
+
@match_block.call(@given, self)
|
|
17
|
+
else
|
|
18
|
+
@match_block.call(@given)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def description
|
|
23
|
+
@description || explanation
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def failure_message_for_should
|
|
27
|
+
@failure_message || (@description.nil? ? explanation : %[expected #{@description.inspect} but got #{@given.inspect}])
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def failure_message_for_should_not
|
|
31
|
+
@negative_failure_message || (@description.nil? ? explanation : %[expected not to get #{@description.inspect}, but got #{@given.inspect}])
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def explanation
|
|
35
|
+
"No description provided. See RDoc for simple_matcher()"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# simple_matcher makes it easy for you to create your own custom matchers
|
|
40
|
+
# in just a few lines of code when you don't need all the power of a
|
|
41
|
+
# completely custom matcher object.
|
|
42
|
+
#
|
|
43
|
+
# The <tt>description</tt> argument will appear as part of any failure
|
|
44
|
+
# message, and is also the source for auto-generated descriptions.
|
|
45
|
+
#
|
|
46
|
+
# The <tt>match_block</tt> can have an arity of 1 or 2. The first block
|
|
47
|
+
# argument will be the given value. The second, if the block accepts it
|
|
48
|
+
# will be the matcher itself, giving you access to set custom failure
|
|
49
|
+
# messages in favor of the defaults.
|
|
50
|
+
#
|
|
51
|
+
# The <tt>match_block</tt> should return a boolean: <tt>true</tt>
|
|
52
|
+
# indicates a match, which will pass if you use <tt>should</tt> and fail
|
|
53
|
+
# if you use <tt>should_not</tt>. false (or nil) indicates no match,
|
|
54
|
+
# which will do the reverse: fail if you use <tt>should</tt> and pass if
|
|
55
|
+
# you use <tt>should_not</tt>.
|
|
56
|
+
#
|
|
57
|
+
# An error in the <tt>match_block</tt> will bubble up, resulting in a
|
|
58
|
+
# failure.
|
|
59
|
+
#
|
|
60
|
+
# == Example with default messages
|
|
61
|
+
#
|
|
62
|
+
# def be_even
|
|
63
|
+
# simple_matcher("an even number") { |given| given % 2 == 0 }
|
|
64
|
+
# end
|
|
65
|
+
#
|
|
66
|
+
# describe 2 do
|
|
67
|
+
# it "should be even" do
|
|
68
|
+
# 2.should be_even
|
|
69
|
+
# end
|
|
70
|
+
# end
|
|
71
|
+
#
|
|
72
|
+
# Given an odd number, this example would produce an error message stating:
|
|
73
|
+
# expected "an even number", got 3.
|
|
74
|
+
#
|
|
75
|
+
# Unfortunately, if you're a fan of auto-generated descriptions, this will
|
|
76
|
+
# produce "should an even number." Not the most desirable result. You can
|
|
77
|
+
# control that using custom messages:
|
|
78
|
+
#
|
|
79
|
+
# == Example with custom messages
|
|
80
|
+
#
|
|
81
|
+
# def rhyme_with(expected)
|
|
82
|
+
# simple_matcher("rhyme with #{expected.inspect}") do |given, matcher|
|
|
83
|
+
# matcher.failure_message = "expected #{given.inspect} to rhyme with #{expected.inspect}"
|
|
84
|
+
# matcher.negative_failure_message = "expected #{given.inspect} not to rhyme with #{expected.inspect}"
|
|
85
|
+
# given.rhymes_with? expected
|
|
86
|
+
# end
|
|
87
|
+
# end
|
|
88
|
+
#
|
|
89
|
+
# # OR
|
|
90
|
+
#
|
|
91
|
+
# def rhyme_with(expected)
|
|
92
|
+
# simple_matcher do |given, matcher|
|
|
93
|
+
# matcher.description = "rhyme with #{expected.inspect}"
|
|
94
|
+
# matcher.failure_message = "expected #{given.inspect} to rhyme with #{expected.inspect}"
|
|
95
|
+
# matcher.negative_failure_message = "expected #{given.inspect} not to rhyme with #{expected.inspect}"
|
|
96
|
+
# given.rhymes_with? expected
|
|
97
|
+
# end
|
|
98
|
+
# end
|
|
99
|
+
#
|
|
100
|
+
# describe "pecan" do
|
|
101
|
+
# it "should rhyme with 'be gone'" do
|
|
102
|
+
# nut = "pecan"
|
|
103
|
+
# nut.extend Rhymer
|
|
104
|
+
# nut.should rhyme_with("be gone")
|
|
105
|
+
# end
|
|
106
|
+
# end
|
|
107
|
+
#
|
|
108
|
+
# The resulting messages would be:
|
|
109
|
+
# description: rhyme with "be gone"
|
|
110
|
+
# failure_message: expected "pecan" to rhyme with "be gone"
|
|
111
|
+
# negative failure_message: expected "pecan" not to rhyme with "be gone"
|
|
112
|
+
#
|
|
113
|
+
# == Wrapped Expectations
|
|
114
|
+
#
|
|
115
|
+
# Because errors will bubble up, it is possible to wrap other expectations
|
|
116
|
+
# in a SimpleMatcher.
|
|
117
|
+
#
|
|
118
|
+
# def be_even
|
|
119
|
+
# simple_matcher("an even number") { |given| (given % 2).should == 0 }
|
|
120
|
+
# end
|
|
121
|
+
#
|
|
122
|
+
# BE VERY CAREFUL when you do this. Only use wrapped expectations for
|
|
123
|
+
# matchers that will always be used in only the positive
|
|
124
|
+
# (<tt>should</tt>) or negative (<tt>should_not</tt>), but not both.
|
|
125
|
+
# The reason is that is you wrap a <tt>should</tt> and call the wrapper
|
|
126
|
+
# with <tt>should_not</tt>, the correct result (the <tt>should</tt>
|
|
127
|
+
# failing), will fail when you want it to pass.
|
|
128
|
+
#
|
|
129
|
+
def simple_matcher(description=nil, &match_block)
|
|
130
|
+
Spec.deprecate("simple_matcher", "Matcher DSL (http://rspec.rubyforge.org/rspec/1.3.0/classes/Spec/Matchers.html)")
|
|
131
|
+
SimpleMatcher.new(description, &match_block)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
@@ -1,75 +1,100 @@
|
|
|
1
1
|
module Spec
|
|
2
2
|
module Matchers
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
class ThrowSymbol #:nodoc:
|
|
5
|
-
def initialize(
|
|
6
|
-
@
|
|
5
|
+
def initialize(expected_symbol = nil, expected_arg=nil)
|
|
6
|
+
@expected_symbol = expected_symbol
|
|
7
|
+
@expected_arg = expected_arg
|
|
8
|
+
@caught_symbol = @caught_arg = nil
|
|
7
9
|
end
|
|
8
|
-
|
|
9
|
-
def matches?(
|
|
10
|
+
|
|
11
|
+
def matches?(given_proc)
|
|
10
12
|
begin
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
@actual = extract_sym_from_name_error(e)
|
|
14
|
-
ensure
|
|
15
|
-
if @expected.nil?
|
|
16
|
-
return @actual.nil? ? false : true
|
|
13
|
+
if @expected_symbol.nil?
|
|
14
|
+
given_proc.call
|
|
17
15
|
else
|
|
18
|
-
|
|
16
|
+
@caught_arg = catch :proc_did_not_throw_anything do
|
|
17
|
+
catch @expected_symbol do
|
|
18
|
+
given_proc.call
|
|
19
|
+
throw :proc_did_not_throw_anything, :nothing_thrown
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
@caught_symbol = @expected_symbol unless @caught_arg == :nothing_thrown
|
|
19
23
|
end
|
|
24
|
+
|
|
25
|
+
# Ruby 1.8 uses NameError with `symbol'
|
|
26
|
+
# Ruby 1.9 uses ArgumentError with :symbol
|
|
27
|
+
rescue NameError, ArgumentError => e
|
|
28
|
+
raise e unless e.message =~ /uncaught throw (`|\:)([a-zA-Z0-9_]*)(')?/
|
|
29
|
+
@caught_symbol = $2.to_sym
|
|
30
|
+
end
|
|
31
|
+
if @expected_symbol.nil?
|
|
32
|
+
!@caught_symbol.nil?
|
|
33
|
+
elsif @expected_arg.nil?
|
|
34
|
+
@caught_symbol == @expected_symbol
|
|
35
|
+
else
|
|
36
|
+
(@caught_symbol == @expected_symbol) & (@caught_arg == @expected_arg)
|
|
20
37
|
end
|
|
21
38
|
end
|
|
22
39
|
|
|
23
|
-
def
|
|
24
|
-
if @
|
|
25
|
-
"expected #{expected}, got #{@
|
|
40
|
+
def failure_message_for_should
|
|
41
|
+
if @caught_symbol
|
|
42
|
+
"expected #{expected}, got #{@caught_symbol.inspect}"
|
|
26
43
|
else
|
|
27
44
|
"expected #{expected} but nothing was thrown"
|
|
28
45
|
end
|
|
29
46
|
end
|
|
30
|
-
|
|
31
|
-
def
|
|
32
|
-
if @
|
|
47
|
+
|
|
48
|
+
def failure_message_for_should_not
|
|
49
|
+
if @expected_symbol
|
|
33
50
|
"expected #{expected} not to be thrown"
|
|
34
51
|
else
|
|
35
|
-
"expected no Symbol, got :#{@
|
|
52
|
+
"expected no Symbol, got :#{@caught_symbol}"
|
|
36
53
|
end
|
|
37
54
|
end
|
|
38
|
-
|
|
55
|
+
|
|
39
56
|
def description
|
|
40
57
|
"throw #{expected}"
|
|
41
58
|
end
|
|
42
|
-
|
|
59
|
+
|
|
43
60
|
private
|
|
44
|
-
|
|
61
|
+
|
|
45
62
|
def expected
|
|
46
|
-
@
|
|
63
|
+
@expected_symbol.nil? ? "a Symbol" : "#{@expected_symbol.inspect}#{args}"
|
|
47
64
|
end
|
|
48
|
-
|
|
49
|
-
def
|
|
50
|
-
|
|
65
|
+
|
|
66
|
+
def args
|
|
67
|
+
@expected_arg.nil? ? "" : " with #{@expected_arg.inspect}"
|
|
51
68
|
end
|
|
69
|
+
|
|
52
70
|
end
|
|
53
|
-
|
|
71
|
+
|
|
54
72
|
# :call-seq:
|
|
55
73
|
# should throw_symbol()
|
|
56
74
|
# should throw_symbol(:sym)
|
|
75
|
+
# should throw_symbol(:sym, arg)
|
|
57
76
|
# should_not throw_symbol()
|
|
58
77
|
# should_not throw_symbol(:sym)
|
|
59
|
-
#
|
|
60
|
-
# Given a Symbol argument, matches if a proc throws the specified Symbol.
|
|
78
|
+
# should_not throw_symbol(:sym, arg)
|
|
61
79
|
#
|
|
62
80
|
# Given no argument, matches if a proc throws any Symbol.
|
|
63
81
|
#
|
|
82
|
+
# Given a Symbol, matches if the given proc throws the specified Symbol.
|
|
83
|
+
#
|
|
84
|
+
# Given a Symbol and an arg, matches if the given proc throws the
|
|
85
|
+
# specified Symbol with the specified arg.
|
|
86
|
+
#
|
|
64
87
|
# == Examples
|
|
65
88
|
#
|
|
66
89
|
# lambda { do_something_risky }.should throw_symbol
|
|
67
90
|
# lambda { do_something_risky }.should throw_symbol(:that_was_risky)
|
|
91
|
+
# lambda { do_something_risky }.should throw_symbol(:that_was_risky, culprit)
|
|
68
92
|
#
|
|
69
93
|
# lambda { do_something_risky }.should_not throw_symbol
|
|
70
94
|
# lambda { do_something_risky }.should_not throw_symbol(:that_was_risky)
|
|
71
|
-
|
|
72
|
-
|
|
95
|
+
# lambda { do_something_risky }.should_not throw_symbol(:that_was_risky, culprit)
|
|
96
|
+
def throw_symbol(expected_symbol = nil, expected_arg=nil)
|
|
97
|
+
Matchers::ThrowSymbol.new(expected_symbol, expected_arg)
|
|
73
98
|
end
|
|
74
99
|
end
|
|
75
100
|
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Matchers
|
|
3
|
+
# wraps an expectation in a block that will return true if the
|
|
4
|
+
# expectation passes and false if it fails (without bubbling up
|
|
5
|
+
# the failure).
|
|
6
|
+
#
|
|
7
|
+
# This is intended to be used in the context of a simple matcher,
|
|
8
|
+
# and is especially useful for wrapping multiple expectations or
|
|
9
|
+
# one or more assertions from test/unit extensions when running
|
|
10
|
+
# with test/unit.
|
|
11
|
+
#
|
|
12
|
+
# == Examples
|
|
13
|
+
#
|
|
14
|
+
# def eat_cheese(cheese)
|
|
15
|
+
# simple_matcher do |mouse, matcher|
|
|
16
|
+
# matcher.failure_message = "expected #{mouse} to eat cheese"
|
|
17
|
+
# wrap_expectation do |matcher|
|
|
18
|
+
# assert_eats_cheese(mouse)
|
|
19
|
+
# end
|
|
20
|
+
# end
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# describe Mouse do
|
|
24
|
+
# it "eats cheese" do
|
|
25
|
+
# Mouse.new.should eat_cheese
|
|
26
|
+
# end
|
|
27
|
+
# end
|
|
28
|
+
#
|
|
29
|
+
# You might be wondering "why would I do this if I could just say"
|
|
30
|
+
# assert_eats_cheese?", a fair question, indeed. You might prefer
|
|
31
|
+
# to replace the word assert with something more aligned with the
|
|
32
|
+
# rest of your code examples. You are using rspec, after all.
|
|
33
|
+
#
|
|
34
|
+
# The other benefit you get is that you can use the negative version
|
|
35
|
+
# of the matcher:
|
|
36
|
+
#
|
|
37
|
+
# describe Cat do
|
|
38
|
+
# it "does not eat cheese" do
|
|
39
|
+
# Cat.new.should_not eat_cheese
|
|
40
|
+
# end
|
|
41
|
+
# end
|
|
42
|
+
#
|
|
43
|
+
# So in the event there is no assert_does_not_eat_cheese available,
|
|
44
|
+
# you're all set!
|
|
45
|
+
def wrap_expectation(matcher, &block)
|
|
46
|
+
begin
|
|
47
|
+
block.call(matcher)
|
|
48
|
+
return true
|
|
49
|
+
rescue Exception => e
|
|
50
|
+
matcher.failure_message = e.message
|
|
51
|
+
return false
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
data/lib/spec/matchers.rb
CHANGED
|
@@ -1,17 +1,31 @@
|
|
|
1
|
+
require 'spec/extensions/instance_exec'
|
|
2
|
+
require 'spec/matchers/pretty'
|
|
3
|
+
require 'spec/matchers/matcher'
|
|
4
|
+
require 'spec/matchers/operator_matcher'
|
|
1
5
|
require 'spec/matchers/be'
|
|
2
6
|
require 'spec/matchers/be_close'
|
|
7
|
+
require 'spec/matchers/be_instance_of'
|
|
8
|
+
require 'spec/matchers/be_kind_of'
|
|
3
9
|
require 'spec/matchers/change'
|
|
4
10
|
require 'spec/matchers/eql'
|
|
5
11
|
require 'spec/matchers/equal'
|
|
12
|
+
require 'spec/matchers/errors'
|
|
13
|
+
require 'spec/matchers/exist'
|
|
14
|
+
require 'spec/matchers/generated_descriptions'
|
|
6
15
|
require 'spec/matchers/has'
|
|
7
16
|
require 'spec/matchers/have'
|
|
8
17
|
require 'spec/matchers/include'
|
|
9
18
|
require 'spec/matchers/match'
|
|
10
|
-
require 'spec/matchers/
|
|
19
|
+
require 'spec/matchers/match_array'
|
|
20
|
+
require 'spec/matchers/method_missing'
|
|
21
|
+
require 'spec/matchers/raise_exception'
|
|
11
22
|
require 'spec/matchers/respond_to'
|
|
12
23
|
require 'spec/matchers/satisfy'
|
|
24
|
+
require 'spec/matchers/simple_matcher'
|
|
13
25
|
require 'spec/matchers/throw_symbol'
|
|
14
|
-
require 'spec/matchers/
|
|
26
|
+
require 'spec/matchers/wrap_expectation'
|
|
27
|
+
require 'spec/matchers/compatibility'
|
|
28
|
+
require 'spec/matchers/dsl'
|
|
15
29
|
|
|
16
30
|
module Spec
|
|
17
31
|
|
|
@@ -19,12 +33,21 @@ module Spec
|
|
|
19
33
|
# is any object that responds to the following methods:
|
|
20
34
|
#
|
|
21
35
|
# matches?(actual)
|
|
22
|
-
#
|
|
23
|
-
#
|
|
36
|
+
# failure_message_for_should
|
|
37
|
+
#
|
|
38
|
+
# These methods are also part of the matcher protocol, but are optional:
|
|
39
|
+
#
|
|
40
|
+
# does_not_match?(actual)
|
|
41
|
+
# failure_message_for_should_not
|
|
24
42
|
# description #optional
|
|
25
43
|
#
|
|
44
|
+
# These methods are from older versions of the protocol. They are still supported,
|
|
45
|
+
# but are not recommended:
|
|
46
|
+
#
|
|
47
|
+
# failure_message (use failure_message_for_should instead)
|
|
48
|
+
# negative_failure_message (use failure_message_for_should_not instead)
|
|
49
|
+
#
|
|
26
50
|
# See Spec::Expectations to learn how to use these as Expectation Matchers.
|
|
27
|
-
# See Spec::Mocks to learn how to use them as Mock Argument Constraints.
|
|
28
51
|
#
|
|
29
52
|
# == Predicates
|
|
30
53
|
#
|
|
@@ -61,14 +84,17 @@ module Spec
|
|
|
61
84
|
# You can use this feature to invoke any predicate that begins with "has_", whether it is
|
|
62
85
|
# part of the Ruby libraries (like +Hash#has_key?+) or a method you wrote on your own class.
|
|
63
86
|
#
|
|
64
|
-
# == Custom
|
|
87
|
+
# == Custom Matchers
|
|
88
|
+
#
|
|
89
|
+
# When you find that none of the stock Expectation Matchers provide a natural
|
|
90
|
+
# feeling expectation, you can very easily write your own using RSpec's matcher
|
|
91
|
+
# DSL or writing one from scratch.
|
|
65
92
|
#
|
|
66
|
-
#
|
|
67
|
-
# feeling expectation, you can very easily write your own.
|
|
93
|
+
# === Matcher DSL
|
|
68
94
|
#
|
|
69
|
-
#
|
|
70
|
-
#
|
|
71
|
-
#
|
|
95
|
+
# Imagine that you are writing a game in which players can be in various
|
|
96
|
+
# zones on a virtual board. To specify that bob should be in zone 4, you
|
|
97
|
+
# could say:
|
|
72
98
|
#
|
|
73
99
|
# bob.current_zone.should eql(Zone.new("4"))
|
|
74
100
|
#
|
|
@@ -80,7 +106,61 @@ module Spec
|
|
|
80
106
|
#
|
|
81
107
|
# bob.should_not be_in_zone("3")
|
|
82
108
|
#
|
|
83
|
-
#
|
|
109
|
+
# You can create such a matcher like so:
|
|
110
|
+
#
|
|
111
|
+
# Spec::Matchers.define :be_in_zone do |zone|
|
|
112
|
+
# match do |player|
|
|
113
|
+
# player.in_zone?(zone)
|
|
114
|
+
# end
|
|
115
|
+
# end
|
|
116
|
+
#
|
|
117
|
+
# This will generate a <tt>be_in_zone</tt> method that returns a matcher
|
|
118
|
+
# with logical default messages for failures. You can override the failure
|
|
119
|
+
# messages and the generated description as follows:
|
|
120
|
+
#
|
|
121
|
+
# Spec::Matchers.define :be_in_zone do |zone|
|
|
122
|
+
# match do |player|
|
|
123
|
+
# player.in_zone?(zone)
|
|
124
|
+
# end
|
|
125
|
+
# failure_message_for_should do |player|
|
|
126
|
+
# # generate and return the appropriate string.
|
|
127
|
+
# end
|
|
128
|
+
# failure_message_for_should_not do |player|
|
|
129
|
+
# # generate and return the appropriate string.
|
|
130
|
+
# end
|
|
131
|
+
# description do
|
|
132
|
+
# # generate and return the appropriate string.
|
|
133
|
+
# end
|
|
134
|
+
# end
|
|
135
|
+
#
|
|
136
|
+
# Each of the message-generation methods has access to the block arguments
|
|
137
|
+
# passed to the <tt>create</tt> method (in this case, <tt>zone</tt>). The
|
|
138
|
+
# failure message methods (<tt>failure_message_for_should</tt> and
|
|
139
|
+
# <tt>failure_message_for_should_not</tt>) are passed the actual value (the
|
|
140
|
+
# receiver of <tt>should</tt> or <tt>should_not</tt>).
|
|
141
|
+
#
|
|
142
|
+
# You can also create matchers that obey a fluent interface using the
|
|
143
|
+
# <tt>chain</tt> method:
|
|
144
|
+
#
|
|
145
|
+
# Spec::Matchers.define :tip do |expected_tip|
|
|
146
|
+
# chain :on do |bill|
|
|
147
|
+
# @bill = bill
|
|
148
|
+
# end
|
|
149
|
+
#
|
|
150
|
+
# match do |person|
|
|
151
|
+
# person.tip_for(bill) == expected_tip
|
|
152
|
+
# end
|
|
153
|
+
# end
|
|
154
|
+
#
|
|
155
|
+
# This matcher can be used as follows:
|
|
156
|
+
#
|
|
157
|
+
# describe Customer do
|
|
158
|
+
# it { should tip(10).on(50) }
|
|
159
|
+
# end
|
|
160
|
+
#
|
|
161
|
+
# === Custom Matcher from scratch
|
|
162
|
+
#
|
|
163
|
+
# You could also write a custom matcher from scratch, as follows:
|
|
84
164
|
#
|
|
85
165
|
# class BeInZone
|
|
86
166
|
# def initialize(expected)
|
|
@@ -90,10 +170,10 @@ module Spec
|
|
|
90
170
|
# @target = target
|
|
91
171
|
# @target.current_zone.eql?(Zone.new(@expected))
|
|
92
172
|
# end
|
|
93
|
-
# def
|
|
173
|
+
# def failure_message_for_should
|
|
94
174
|
# "expected #{@target.inspect} to be in Zone #{@expected}"
|
|
95
175
|
# end
|
|
96
|
-
# def
|
|
176
|
+
# def failure_message_for_should_not
|
|
97
177
|
# "expected #{@target.inspect} not to be in Zone #{@expected}"
|
|
98
178
|
# end
|
|
99
179
|
# end
|
|
@@ -122,37 +202,13 @@ module Spec
|
|
|
122
202
|
# include CustomGameMatchers
|
|
123
203
|
# ...
|
|
124
204
|
# end
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
def generated_description=(name)
|
|
136
|
-
description_generated_callbacks.each do |callback|
|
|
137
|
-
callback.call(name)
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
private
|
|
142
|
-
def description_generated_callbacks
|
|
143
|
-
@description_generated_callbacks ||= []
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
extend ModuleMethods
|
|
147
|
-
|
|
148
|
-
def method_missing(sym, *args, &block) # :nodoc:
|
|
149
|
-
return Matchers::Be.new(sym, *args) if sym.starts_with?("be_")
|
|
150
|
-
return Matchers::Has.new(sym, *args) if sym.starts_with?("have_")
|
|
151
|
-
super
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
class MatcherError < StandardError
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
end
|
|
158
|
-
end
|
|
205
|
+
#
|
|
206
|
+
# or you can include in globally in a spec_helper.rb file <tt>require</tt>d
|
|
207
|
+
# from your spec file(s):
|
|
208
|
+
#
|
|
209
|
+
# Spec::Runner.configure do |config|
|
|
210
|
+
# config.include(CustomGameMatchers)
|
|
211
|
+
# end
|
|
212
|
+
#
|
|
213
|
+
module Matchers; end
|
|
214
|
+
end
|
|
@@ -1,134 +1,50 @@
|
|
|
1
1
|
module Spec
|
|
2
2
|
module Mocks
|
|
3
|
-
|
|
4
|
-
class MatcherConstraint
|
|
5
|
-
def initialize(matcher)
|
|
6
|
-
@matcher = matcher
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def matches?(value)
|
|
10
|
-
@matcher.matches?(value)
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
class LiteralArgConstraint
|
|
15
|
-
def initialize(literal)
|
|
16
|
-
@literal_value = literal
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def matches?(value)
|
|
20
|
-
@literal_value == value
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
3
|
|
|
24
|
-
class RegexpArgConstraint
|
|
25
|
-
def initialize(regexp)
|
|
26
|
-
@regexp = regexp
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def matches?(value)
|
|
30
|
-
return value =~ @regexp unless value.is_a?(Regexp)
|
|
31
|
-
value == @regexp
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
class AnyArgConstraint
|
|
36
|
-
def initialize(ignore)
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def matches?(value)
|
|
40
|
-
true
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
class NumericArgConstraint
|
|
45
|
-
def initialize(ignore)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def matches?(value)
|
|
49
|
-
value.is_a?(Numeric)
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
class BooleanArgConstraint
|
|
54
|
-
def initialize(ignore)
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def matches?(value)
|
|
58
|
-
return true if value.is_a?(TrueClass)
|
|
59
|
-
return true if value.is_a?(FalseClass)
|
|
60
|
-
false
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
class StringArgConstraint
|
|
65
|
-
def initialize(ignore)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def matches?(value)
|
|
69
|
-
value.is_a?(String)
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
class DuckTypeArgConstraint
|
|
74
|
-
def initialize(*methods_to_respond_to)
|
|
75
|
-
@methods_to_respond_to = methods_to_respond_to
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def matches?(value)
|
|
79
|
-
@methods_to_respond_to.all? { |sym| value.respond_to?(sym) }
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def description
|
|
83
|
-
"duck_type"
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
4
|
class ArgumentExpectation
|
|
88
5
|
attr_reader :args
|
|
89
|
-
@@constraint_classes = Hash.new { |hash, key| LiteralArgConstraint}
|
|
90
|
-
@@constraint_classes[:anything] = AnyArgConstraint
|
|
91
|
-
@@constraint_classes[:numeric] = NumericArgConstraint
|
|
92
|
-
@@constraint_classes[:boolean] = BooleanArgConstraint
|
|
93
|
-
@@constraint_classes[:string] = StringArgConstraint
|
|
94
6
|
|
|
95
|
-
def initialize(args)
|
|
7
|
+
def initialize(args, &block)
|
|
96
8
|
@args = args
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
9
|
+
@matchers_block = block
|
|
10
|
+
@match_any_args = false
|
|
11
|
+
@matchers = nil
|
|
12
|
+
|
|
13
|
+
if ArgumentMatchers::AnyArgsMatcher === args.first
|
|
14
|
+
@match_any_args = true
|
|
15
|
+
elsif ArgumentMatchers::NoArgsMatcher === args.first
|
|
16
|
+
@matchers = []
|
|
17
|
+
else
|
|
18
|
+
@matchers = args.collect {|arg| matcher_for(arg)}
|
|
100
19
|
end
|
|
101
20
|
end
|
|
102
21
|
|
|
103
|
-
def
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
22
|
+
def matcher_for(arg)
|
|
23
|
+
return ArgumentMatchers::MatcherMatcher.new(arg) if is_matcher?(arg)
|
|
24
|
+
return ArgumentMatchers::RegexpMatcher.new(arg) if arg.is_a?(Regexp)
|
|
25
|
+
return ArgumentMatchers::EqualityProxy.new(arg)
|
|
107
26
|
end
|
|
108
27
|
|
|
109
|
-
def
|
|
110
|
-
return
|
|
111
|
-
return MatcherConstraint.new(constraint) if is_matcher?(constraint)
|
|
112
|
-
return RegexpArgConstraint.new(constraint) if constraint.is_a?(Regexp)
|
|
113
|
-
return LiteralArgConstraint.new(constraint)
|
|
28
|
+
def is_matcher?(obj)
|
|
29
|
+
return obj.respond_to?(:matches?) & obj.respond_to?(:description)
|
|
114
30
|
end
|
|
115
31
|
|
|
116
|
-
def
|
|
117
|
-
|
|
32
|
+
def args_match?(given_args)
|
|
33
|
+
match_any_args? || matchers_block_matches?(given_args) || matchers_match?(given_args)
|
|
118
34
|
end
|
|
119
35
|
|
|
120
|
-
def
|
|
121
|
-
|
|
122
|
-
return true if @expected_params == args
|
|
123
|
-
return constraints_match?(args)
|
|
36
|
+
def matchers_block_matches?(given_args)
|
|
37
|
+
@matchers_block ? @matchers_block.call(*given_args) : nil
|
|
124
38
|
end
|
|
125
39
|
|
|
126
|
-
def
|
|
127
|
-
|
|
128
|
-
@expected_params.each_index { |i| return false unless @expected_params[i].matches?(args[i]) }
|
|
129
|
-
return true
|
|
40
|
+
def matchers_match?(given_args)
|
|
41
|
+
@matchers == given_args
|
|
130
42
|
end
|
|
131
|
-
|
|
43
|
+
|
|
44
|
+
def match_any_args?
|
|
45
|
+
@match_any_args
|
|
46
|
+
end
|
|
47
|
+
|
|
132
48
|
end
|
|
133
49
|
|
|
134
50
|
end
|