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
data/lib/spec/matchers/match.rb
CHANGED
|
@@ -1,41 +1,21 @@
|
|
|
1
1
|
module Spec
|
|
2
2
|
module Matchers
|
|
3
|
-
|
|
4
|
-
class Match #:nodoc:
|
|
5
|
-
def initialize(expected)
|
|
6
|
-
@expected = expected
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def matches?(actual)
|
|
10
|
-
@actual = actual
|
|
11
|
-
return true if actual =~ @expected
|
|
12
|
-
return false
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def failure_message
|
|
16
|
-
return "expected #{@actual.inspect} to match #{@expected.inspect}", @expected, @actual
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def negative_failure_message
|
|
20
|
-
return "expected #{@actual.inspect} not to match #{@expected.inspect}", @expected, @actual
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def description
|
|
24
|
-
"match #{@expected.inspect}"
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
|
|
28
3
|
# :call-seq:
|
|
29
|
-
# should match(
|
|
30
|
-
# should_not match(
|
|
4
|
+
# should match(pattern)
|
|
5
|
+
# should_not match(pattern)
|
|
31
6
|
#
|
|
32
|
-
# Given a Regexp, passes if actual
|
|
7
|
+
# Given a Regexp or String, passes if actual.match(pattern)
|
|
33
8
|
#
|
|
34
9
|
# == Examples
|
|
35
10
|
#
|
|
36
|
-
# email.should match(/^([
|
|
37
|
-
|
|
38
|
-
|
|
11
|
+
# email.should match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
|
|
12
|
+
# email.should match("@example.com")
|
|
13
|
+
def match(expected)
|
|
14
|
+
Matcher.new :match, expected do |_expected_|
|
|
15
|
+
match do |actual|
|
|
16
|
+
actual.match(_expected_)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
39
19
|
end
|
|
40
20
|
end
|
|
41
21
|
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Matchers
|
|
3
|
+
|
|
4
|
+
class MatchArray #:nodoc:
|
|
5
|
+
include Spec::Matchers::Pretty
|
|
6
|
+
|
|
7
|
+
def initialize(expected)
|
|
8
|
+
@expected = expected
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def matches?(actual)
|
|
12
|
+
@actual = actual
|
|
13
|
+
@extra_items = difference_between_arrays(@actual, @expected)
|
|
14
|
+
@missing_items = difference_between_arrays(@expected, @actual)
|
|
15
|
+
@extra_items.empty? & @missing_items.empty?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def failure_message_for_should
|
|
19
|
+
message = "expected collection contained: #{safe_sort(@expected).inspect}\n"
|
|
20
|
+
message += "actual collection contained: #{safe_sort(@actual).inspect}\n"
|
|
21
|
+
message += "the missing elements were: #{safe_sort(@missing_items).inspect}\n" unless @missing_items.empty?
|
|
22
|
+
message += "the extra elements were: #{safe_sort(@extra_items).inspect}\n" unless @extra_items.empty?
|
|
23
|
+
message
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def failure_message_for_should_not
|
|
27
|
+
"Matcher does not support should_not"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def description
|
|
31
|
+
"contain exactly #{_pretty_print(@expected)}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def safe_sort(array)
|
|
37
|
+
array.all?{|item| item.respond_to?(:<=>)} ? array.sort : array
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def difference_between_arrays(array_1, array_2)
|
|
41
|
+
difference = array_1.dup
|
|
42
|
+
array_2.each do |element|
|
|
43
|
+
if index = difference.index(element)
|
|
44
|
+
difference.delete_at(index)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
difference
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# :call-seq:
|
|
54
|
+
# should =~ expected
|
|
55
|
+
#
|
|
56
|
+
# Passes if actual contains all of the expected regardless of order.
|
|
57
|
+
# This works for collections. Pass in multiple args and it will only
|
|
58
|
+
# pass if all args are found in collection.
|
|
59
|
+
#
|
|
60
|
+
# NOTE: there is no should_not version of array.should =~ other_array
|
|
61
|
+
#
|
|
62
|
+
# == Examples
|
|
63
|
+
#
|
|
64
|
+
# [1,2,3].should =~ [1,2,3] # => would pass
|
|
65
|
+
# [1,2,3].should =~ [2,3,1] # => would pass
|
|
66
|
+
# [1,2,3,4].should =~ [1,2,3] # => would fail
|
|
67
|
+
# [1,2,2,3].should =~ [1,2,3] # => would fail
|
|
68
|
+
# [1,2,3].should =~ [1,2,3,4] # => would fail
|
|
69
|
+
OperatorMatcher.register(Array, '=~', Spec::Matchers::MatchArray)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Matchers
|
|
3
|
+
class Matcher
|
|
4
|
+
include Spec::Matchers::InstanceExec
|
|
5
|
+
include Spec::Matchers::Pretty
|
|
6
|
+
include Spec::Matchers
|
|
7
|
+
|
|
8
|
+
attr_reader :expected, :actual
|
|
9
|
+
|
|
10
|
+
def initialize(name, *expected, &declarations)
|
|
11
|
+
@name = name
|
|
12
|
+
@expected = expected
|
|
13
|
+
@actual = nil
|
|
14
|
+
@diffable = false
|
|
15
|
+
@expected_exception = nil
|
|
16
|
+
@messages = {
|
|
17
|
+
:description => lambda {"#{name_to_sentence}#{expected_to_sentence}"},
|
|
18
|
+
:failure_message_for_should => lambda {|actual| "expected #{actual.inspect} to #{name_to_sentence}#{expected_to_sentence}"},
|
|
19
|
+
:failure_message_for_should_not => lambda {|actual| "expected #{actual.inspect} not to #{name_to_sentence}#{expected_to_sentence}"}
|
|
20
|
+
}
|
|
21
|
+
making_declared_methods_public do
|
|
22
|
+
instance_exec(*@expected, &declarations)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
#Used internally by objects returns by +should+ and +should_not+.
|
|
27
|
+
def matches?(actual)
|
|
28
|
+
@actual = actual
|
|
29
|
+
if @expected_exception
|
|
30
|
+
begin
|
|
31
|
+
instance_exec(actual, &@match_block)
|
|
32
|
+
true
|
|
33
|
+
rescue @expected_exception
|
|
34
|
+
false
|
|
35
|
+
end
|
|
36
|
+
else
|
|
37
|
+
begin
|
|
38
|
+
instance_exec(actual, &@match_block)
|
|
39
|
+
rescue Spec::Expectations::ExpectationNotMetError
|
|
40
|
+
false
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# See Spec::Matchers
|
|
46
|
+
def match(&block)
|
|
47
|
+
@match_block = block
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# See Spec::Matchers
|
|
51
|
+
def match_unless_raises(exception=Exception, &block)
|
|
52
|
+
@expected_exception = exception
|
|
53
|
+
match(&block)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# See Spec::Matchers
|
|
57
|
+
def failure_message_for_should(&block)
|
|
58
|
+
cache_or_call_cached(:failure_message_for_should, &block)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# See Spec::Matchers
|
|
62
|
+
def failure_message_for_should_not(&block)
|
|
63
|
+
cache_or_call_cached(:failure_message_for_should_not, &block)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# See Spec::Matchers
|
|
67
|
+
def description(&block)
|
|
68
|
+
cache_or_call_cached(:description, &block)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
#Used internally by objects returns by +should+ and +should_not+.
|
|
72
|
+
def diffable?
|
|
73
|
+
@diffable
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# See Spec::Matchers
|
|
77
|
+
def diffable
|
|
78
|
+
@diffable = true
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# See Spec::Matchers
|
|
82
|
+
def chain(method, &block)
|
|
83
|
+
self.class.class_eval do
|
|
84
|
+
define_method method do |*args|
|
|
85
|
+
block.call(*args)
|
|
86
|
+
self
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
private
|
|
92
|
+
|
|
93
|
+
def making_declared_methods_public # :nodoc:
|
|
94
|
+
# Our home-grown instance_exec in ruby 1.8.6 results in any methods
|
|
95
|
+
# declared in the block eval'd by instance_exec in the block to which we
|
|
96
|
+
# are yielding here are scoped private. This is NOT the case for Ruby
|
|
97
|
+
# 1.8.7 or 1.9.
|
|
98
|
+
#
|
|
99
|
+
# Also, due some crazy scoping that I don't understand, these methods
|
|
100
|
+
# are actually available in the specs (something about the matcher being
|
|
101
|
+
# defined in the scope of Spec::Matchers or within an example), so not
|
|
102
|
+
# doing the following will not cause specs to fail, but they *will*
|
|
103
|
+
# cause features to fail and that will make users unhappy. So don't.
|
|
104
|
+
orig_private_methods = private_methods
|
|
105
|
+
yield
|
|
106
|
+
st = (class << self; self; end)
|
|
107
|
+
(private_methods - orig_private_methods).each {|m| st.__send__ :public, m}
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def cache_or_call_cached(key, &block)
|
|
111
|
+
block ? cache(key, &block) : call_cached(key)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def cache(key, &block)
|
|
115
|
+
@messages[key] = block
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def call_cached(key)
|
|
119
|
+
@messages[key].arity == 1 ? @messages[key].call(@actual) : @messages[key].call
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def name_to_sentence
|
|
123
|
+
split_words(@name)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def expected_to_sentence
|
|
127
|
+
to_sentence(@expected)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -1,69 +1,80 @@
|
|
|
1
1
|
module Spec
|
|
2
2
|
module Matchers
|
|
3
|
-
class BaseOperatorMatcher
|
|
4
|
-
|
|
5
|
-
def initialize(target)
|
|
6
|
-
@target = target
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def ==(expected)
|
|
10
|
-
@expected = expected
|
|
11
|
-
__delegate_method_missing_to_target("==", expected)
|
|
12
|
-
end
|
|
13
3
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
4
|
+
class OperatorMatcher
|
|
5
|
+
class << self
|
|
6
|
+
def registry
|
|
7
|
+
@registry ||= {}
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def register(klass, operator, matcher)
|
|
11
|
+
registry[klass] ||= {}
|
|
12
|
+
registry[klass][operator] = matcher
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def get(klass, operator)
|
|
16
|
+
matcher = registry[klass] && registry[klass][operator]
|
|
17
|
+
unless matcher
|
|
18
|
+
parent_class = registry.keys.detect {|pc| klass <= pc }
|
|
19
|
+
matcher = registry[parent_class] && registry[parent_class][operator]
|
|
20
|
+
end
|
|
21
|
+
matcher
|
|
22
|
+
end
|
|
17
23
|
end
|
|
18
24
|
|
|
19
|
-
def
|
|
20
|
-
@
|
|
21
|
-
__delegate_method_missing_to_target("=~", expected)
|
|
25
|
+
def initialize(actual)
|
|
26
|
+
@actual = actual
|
|
22
27
|
end
|
|
23
28
|
|
|
24
|
-
def
|
|
25
|
-
|
|
26
|
-
|
|
29
|
+
def self.use_custom_matcher_or_delegate(operator)
|
|
30
|
+
define_method(operator) do |expected|
|
|
31
|
+
if matcher = OperatorMatcher.get(@actual.class, operator)
|
|
32
|
+
@actual.send(::Spec::Matchers.last_should, matcher.new(expected))
|
|
33
|
+
else
|
|
34
|
+
eval_match(@actual, operator, expected)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
27
37
|
end
|
|
28
38
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
__delegate_method_missing_to_target(">=", expected)
|
|
39
|
+
['==', '===', '=~', '>', '>=', '<', '<='].each do |operator|
|
|
40
|
+
use_custom_matcher_or_delegate operator
|
|
32
41
|
end
|
|
33
42
|
|
|
34
|
-
def
|
|
35
|
-
@expected
|
|
36
|
-
__delegate_method_missing_to_target("<", expected)
|
|
43
|
+
def fail_with_message(message)
|
|
44
|
+
Spec::Expectations.fail_with(message, @expected, @actual)
|
|
37
45
|
end
|
|
38
46
|
|
|
39
|
-
def
|
|
40
|
-
@
|
|
41
|
-
__delegate_method_missing_to_target("<=", expected)
|
|
47
|
+
def description
|
|
48
|
+
"#{@operator} #{@expected.inspect}"
|
|
42
49
|
end
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
def eval_match(actual, operator, expected)
|
|
54
|
+
::Spec::Matchers.last_matcher = self
|
|
55
|
+
@operator, @expected = operator, expected
|
|
56
|
+
__delegate_operator(actual, operator, expected)
|
|
46
57
|
end
|
|
47
58
|
|
|
48
59
|
end
|
|
49
60
|
|
|
50
|
-
class PositiveOperatorMatcher <
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
class PositiveOperatorMatcher < OperatorMatcher #:nodoc:
|
|
62
|
+
def __delegate_operator(actual, operator, expected)
|
|
63
|
+
if actual.__send__(operator, expected)
|
|
64
|
+
true
|
|
65
|
+
elsif ['==','===', '=~'].include?(operator)
|
|
66
|
+
fail_with_message("expected: #{expected.inspect},\n got: #{actual.inspect} (using #{operator})")
|
|
67
|
+
else
|
|
68
|
+
fail_with_message("expected: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}")
|
|
69
|
+
end
|
|
57
70
|
end
|
|
58
71
|
|
|
59
72
|
end
|
|
60
73
|
|
|
61
|
-
class NegativeOperatorMatcher <
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
return unless @target.send(operator, expected)
|
|
66
|
-
return fail_with_message("expected not #{operator} #{expected.inspect}, got #{@target.inspect}")
|
|
74
|
+
class NegativeOperatorMatcher < OperatorMatcher #:nodoc:
|
|
75
|
+
def __delegate_operator(actual, operator, expected)
|
|
76
|
+
return false unless actual.__send__(operator, expected)
|
|
77
|
+
return fail_with_message("expected not: #{operator} #{expected.inspect},\n got: #{operator.gsub(/./, ' ')} #{actual.inspect}")
|
|
67
78
|
end
|
|
68
79
|
|
|
69
80
|
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Matchers
|
|
3
|
+
module Pretty
|
|
4
|
+
def split_words(sym)
|
|
5
|
+
sym.to_s.gsub(/_/,' ')
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def to_sentence(words=[])
|
|
9
|
+
words = words.map{|w| w.inspect}
|
|
10
|
+
case words.length
|
|
11
|
+
when 0
|
|
12
|
+
""
|
|
13
|
+
when 1
|
|
14
|
+
" #{words[0]}"
|
|
15
|
+
when 2
|
|
16
|
+
" #{words[0]} and #{words[1]}"
|
|
17
|
+
else
|
|
18
|
+
" #{words[0...-1].join(', ')}, and #{words[-1]}"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def _pretty_print(array)
|
|
23
|
+
result = ""
|
|
24
|
+
array.each_with_index do |item, index|
|
|
25
|
+
if index < (array.length - 2)
|
|
26
|
+
result << "#{item.inspect}, "
|
|
27
|
+
elsif index < (array.length - 1)
|
|
28
|
+
result << "#{item.inspect} and "
|
|
29
|
+
else
|
|
30
|
+
result << "#{item.inspect}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
result
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
module Spec
|
|
2
|
+
module Matchers
|
|
3
|
+
class RaiseException #:nodoc:
|
|
4
|
+
def initialize(expected_exception_or_message=Exception, expected_message=nil, &block)
|
|
5
|
+
@block = block
|
|
6
|
+
@actual_exception = nil
|
|
7
|
+
case expected_exception_or_message
|
|
8
|
+
when String, Regexp
|
|
9
|
+
@expected_exception, @expected_message = Exception, expected_exception_or_message
|
|
10
|
+
else
|
|
11
|
+
@expected_exception, @expected_message = expected_exception_or_message, expected_message
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def matches?(given_proc)
|
|
16
|
+
@raised_expected_exception = false
|
|
17
|
+
@with_expected_message = false
|
|
18
|
+
@eval_block = false
|
|
19
|
+
@eval_block_passed = false
|
|
20
|
+
begin
|
|
21
|
+
given_proc.call
|
|
22
|
+
rescue @expected_exception => @actual_exception
|
|
23
|
+
@raised_expected_exception = true
|
|
24
|
+
@with_expected_message = verify_message
|
|
25
|
+
rescue Exception => @actual_exception
|
|
26
|
+
# This clause should be empty, but rcov will not report it as covered
|
|
27
|
+
# unless something (anything) is executed within the clause
|
|
28
|
+
rcov_exception_report = "http://eigenclass.org/hiki.rb?rcov-0.8.0"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
unless negative_expectation?
|
|
32
|
+
eval_block if @raised_expected_exception && @with_expected_message && @block
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
(@raised_expected_exception & @with_expected_message) ? (@eval_block ? @eval_block_passed : true) : false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def eval_block
|
|
39
|
+
@eval_block = true
|
|
40
|
+
begin
|
|
41
|
+
@block[@actual_exception]
|
|
42
|
+
@eval_block_passed = true
|
|
43
|
+
rescue Exception => err
|
|
44
|
+
@actual_exception = err
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def verify_message
|
|
49
|
+
case @expected_message
|
|
50
|
+
when nil
|
|
51
|
+
true
|
|
52
|
+
when Regexp
|
|
53
|
+
@expected_message =~ @actual_exception.message
|
|
54
|
+
else
|
|
55
|
+
@expected_message == @actual_exception.message
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def failure_message_for_should
|
|
60
|
+
@eval_block ? @actual_exception.message : "expected #{expected_exception}#{given_exception}"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def failure_message_for_should_not
|
|
64
|
+
"expected no #{expected_exception}#{given_exception}"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def description
|
|
68
|
+
"raise #{expected_exception}"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
def expected_exception
|
|
73
|
+
case @expected_message
|
|
74
|
+
when nil
|
|
75
|
+
@expected_exception
|
|
76
|
+
when Regexp
|
|
77
|
+
"#{@expected_exception} with message matching #{@expected_message.inspect}"
|
|
78
|
+
else
|
|
79
|
+
"#{@expected_exception} with #{@expected_message.inspect}"
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def given_exception
|
|
84
|
+
@actual_exception.nil? ? " but nothing was raised" : ", got #{@actual_exception.inspect}"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def negative_expectation?
|
|
88
|
+
# YES - I'm a bad person... help me find a better way - ryand
|
|
89
|
+
caller.first(3).find { |s| s =~ /should_not/ }
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# :call-seq:
|
|
94
|
+
# should raise_exception()
|
|
95
|
+
# should raise_exception(NamedError)
|
|
96
|
+
# should raise_exception(NamedError, String)
|
|
97
|
+
# should raise_exception(NamedError, Regexp)
|
|
98
|
+
# should raise_exception() { |exception| ... }
|
|
99
|
+
# should raise_exception(NamedError) { |exception| ... }
|
|
100
|
+
# should raise_exception(NamedError, String) { |exception| ... }
|
|
101
|
+
# should raise_exception(NamedError, Regexp) { |exception| ... }
|
|
102
|
+
# should_not raise_exception()
|
|
103
|
+
# should_not raise_exception(NamedError)
|
|
104
|
+
# should_not raise_exception(NamedError, String)
|
|
105
|
+
# should_not raise_exception(NamedError, Regexp)
|
|
106
|
+
#
|
|
107
|
+
# With no args, matches if any exception is raised.
|
|
108
|
+
# With a named exception, matches only if that specific exception is raised.
|
|
109
|
+
# With a named exception and messsage specified as a String, matches only if both match.
|
|
110
|
+
# With a named exception and messsage specified as a Regexp, matches only if both match.
|
|
111
|
+
# Pass an optional block to perform extra verifications on the exception matched
|
|
112
|
+
#
|
|
113
|
+
# == Examples
|
|
114
|
+
#
|
|
115
|
+
# lambda { do_something_risky }.should raise_exception
|
|
116
|
+
# lambda { do_something_risky }.should raise_exception(PoorRiskDecisionError)
|
|
117
|
+
# lambda { do_something_risky }.should raise_exception(PoorRiskDecisionError) { |exception| exception.data.should == 42 }
|
|
118
|
+
# lambda { do_something_risky }.should raise_exception(PoorRiskDecisionError, "that was too risky")
|
|
119
|
+
# lambda { do_something_risky }.should raise_exception(PoorRiskDecisionError, /oo ri/)
|
|
120
|
+
#
|
|
121
|
+
# lambda { do_something_risky }.should_not raise_exception
|
|
122
|
+
# lambda { do_something_risky }.should_not raise_exception(PoorRiskDecisionError)
|
|
123
|
+
# lambda { do_something_risky }.should_not raise_exception(PoorRiskDecisionError, "that was too risky")
|
|
124
|
+
# lambda { do_something_risky }.should_not raise_exception(PoorRiskDecisionError, /oo ri/)
|
|
125
|
+
def raise_exception(exception=Exception, message=nil, &block)
|
|
126
|
+
Matchers::RaiseException.new(exception, message, &block)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
alias_method :raise_error, :raise_exception
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -4,28 +4,54 @@ module Spec
|
|
|
4
4
|
class RespondTo #:nodoc:
|
|
5
5
|
def initialize(*names)
|
|
6
6
|
@names = names
|
|
7
|
+
@expected_arity = nil
|
|
7
8
|
@names_not_responded_to = []
|
|
8
9
|
end
|
|
9
10
|
|
|
10
|
-
def matches?(
|
|
11
|
+
def matches?(actual)
|
|
12
|
+
@actual = actual
|
|
11
13
|
@names.each do |name|
|
|
12
|
-
unless
|
|
13
|
-
@names_not_responded_to << name
|
|
14
|
-
end
|
|
14
|
+
@names_not_responded_to << name unless actual.respond_to?(name) && matches_arity?(actual, name)
|
|
15
15
|
end
|
|
16
16
|
return @names_not_responded_to.empty?
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
def
|
|
20
|
-
"expected
|
|
19
|
+
def failure_message_for_should
|
|
20
|
+
"expected #{@actual.inspect} to respond to #{@names_not_responded_to.collect {|name| name.inspect }.join(', ')}#{with_arity}"
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def
|
|
24
|
-
"expected
|
|
23
|
+
def failure_message_for_should_not
|
|
24
|
+
"expected #{@actual.inspect} not to respond to #{@names.collect {|name| name.inspect }.join(', ')}"
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def description
|
|
28
|
-
"respond to
|
|
28
|
+
"respond to #{pp_names}#{with_arity}"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def with(n)
|
|
32
|
+
@expected_arity = n
|
|
33
|
+
self
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def argument
|
|
37
|
+
self
|
|
38
|
+
end
|
|
39
|
+
alias :arguments :argument
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def matches_arity?(actual, name)
|
|
44
|
+
@expected_arity.nil?? true : @expected_arity == actual.method(name).arity
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def with_arity
|
|
48
|
+
@expected_arity.nil?? "" :
|
|
49
|
+
" with #{@expected_arity} argument#{@expected_arity == 1 ? '' : 's'}"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def pp_names
|
|
53
|
+
# Ruby 1.9 returns the same thing for array.to_s as array.inspect, so just use array.inspect here
|
|
54
|
+
@names.length == 1 ? "##{@names.first}" : @names.inspect
|
|
29
55
|
end
|
|
30
56
|
end
|
|
31
57
|
|
|
@@ -12,11 +12,11 @@ module Spec
|
|
|
12
12
|
@block.call(actual)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
def
|
|
15
|
+
def failure_message_for_should
|
|
16
16
|
"expected #{@actual} to satisfy block"
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
def
|
|
19
|
+
def failure_message_for_should_not
|
|
20
20
|
"expected #{@actual} not to satisfy block"
|
|
21
21
|
end
|
|
22
22
|
end
|