rspec 1.0.8 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +122 -2
- data/README +10 -9
- data/Rakefile +22 -49
- data/TODO +2 -0
- data/bin/spec +1 -1
- data/bin/spec_translator +8 -8
- data/examples/{auto_spec_description_example.rb → pure/autogenerated_docstrings_example.rb} +0 -0
- data/examples/{before_and_after_example.rb → pure/before_and_after_example.rb} +1 -0
- data/examples/{behave_as_example.rb → pure/behave_as_example.rb} +0 -0
- data/examples/{custom_expectation_matchers.rb → pure/custom_expectation_matchers.rb} +0 -0
- data/examples/{custom_formatter.rb → pure/custom_formatter.rb} +1 -0
- data/examples/{dynamic_spec.rb → pure/dynamic_spec.rb} +0 -0
- data/examples/{file_accessor.rb → pure/file_accessor.rb} +1 -0
- data/examples/{file_accessor_spec.rb → pure/file_accessor_spec.rb} +0 -0
- data/examples/{greeter_spec.rb → pure/greeter_spec.rb} +1 -0
- data/examples/{helper_method_example.rb → pure/helper_method_example.rb} +0 -0
- data/examples/{io_processor.rb → pure/io_processor.rb} +0 -0
- data/examples/{io_processor_spec.rb → pure/io_processor_spec.rb} +0 -0
- data/examples/{legacy_spec.rb → pure/legacy_spec.rb} +1 -0
- data/examples/{mocking_example.rb → pure/mocking_example.rb} +0 -0
- data/examples/pure/multi_threaded_behaviour_runner.rb +28 -0
- data/examples/pure/nested_classes_example.rb +36 -0
- data/examples/{partial_mock_example.rb → pure/partial_mock_example.rb} +0 -0
- data/examples/{pending_example.rb → pure/pending_example.rb} +0 -0
- data/examples/{predicate_example.rb → pure/predicate_example.rb} +0 -0
- data/examples/{priority.txt → pure/priority.txt} +0 -0
- data/examples/pure/shared_example_group_example.rb +66 -0
- data/examples/pure/shared_stack_examples.rb +38 -0
- data/examples/pure/spec_helper.rb +3 -0
- data/examples/{stack.rb → pure/stack.rb} +0 -0
- data/examples/{stack_spec.rb → pure/stack_spec.rb} +1 -35
- data/examples/pure/stack_spec_with_nested_example_groups.rb +67 -0
- data/examples/{stubbing_example.rb → pure/stubbing_example.rb} +0 -0
- data/examples/stories/adder.rb +13 -0
- data/examples/stories/addition +34 -0
- data/examples/stories/addition.rb +9 -0
- data/examples/stories/calculator.rb +65 -0
- data/examples/stories/game-of-life/README.txt +21 -0
- data/examples/stories/game-of-life/behaviour/everything.rb +6 -0
- data/examples/stories/game-of-life/behaviour/examples/examples.rb +3 -0
- data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +35 -0
- data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +66 -0
- data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +21 -0
- data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +21 -0
- data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +42 -0
- data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +42 -0
- data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +17 -0
- data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +53 -0
- data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +52 -0
- data/examples/stories/game-of-life/behaviour/stories/helper.rb +6 -0
- data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +26 -0
- data/examples/stories/game-of-life/behaviour/stories/steps.rb +5 -0
- data/examples/stories/game-of-life/behaviour/stories/stories.rb +3 -0
- data/examples/stories/game-of-life/behaviour/stories/stories.txt +22 -0
- data/examples/stories/game-of-life/life.rb +3 -0
- data/examples/stories/game-of-life/life/game.rb +23 -0
- data/examples/stories/game-of-life/life/grid.rb +43 -0
- data/examples/stories/helper.rb +9 -0
- data/examples/stories/steps/addition_steps.rb +18 -0
- data/lib/autotest/rspec.rb +1 -2
- data/lib/spec.rb +30 -6
- data/lib/spec/example.rb +12 -0
- data/lib/spec/{dsl → example}/configuration.rb +48 -39
- data/lib/spec/{dsl → example}/errors.rb +2 -2
- data/lib/spec/example/example_group.rb +16 -0
- data/lib/spec/example/example_group_factory.rb +62 -0
- data/lib/spec/example/example_group_methods.rb +412 -0
- data/lib/spec/example/example_matcher.rb +42 -0
- data/lib/spec/example/example_methods.rb +101 -0
- data/lib/spec/example/module_reopening_fix.rb +21 -0
- data/lib/spec/example/pending.rb +18 -0
- data/lib/spec/example/shared_example_group.rb +58 -0
- data/lib/spec/expectations/differs/default.rb +15 -10
- data/lib/spec/expectations/errors.rb +7 -1
- data/lib/spec/expectations/extensions/object.rb +12 -7
- data/lib/spec/expectations/handler.rb +13 -4
- data/lib/spec/extensions.rb +2 -0
- data/lib/spec/extensions/class.rb +24 -0
- data/lib/spec/extensions/main.rb +54 -0
- data/lib/spec/extensions/object.rb +5 -1
- data/lib/spec/interop/test.rb +10 -0
- data/lib/spec/interop/test/unit/autorunner.rb +6 -0
- data/lib/spec/interop/test/unit/testcase.rb +61 -0
- data/lib/spec/interop/test/unit/testresult.rb +6 -0
- data/lib/spec/interop/test/unit/testsuite_adapter.rb +34 -0
- data/lib/spec/interop/test/unit/ui/console/testrunner.rb +60 -0
- data/lib/spec/matchers.rb +11 -15
- data/lib/spec/matchers/be.rb +23 -6
- data/lib/spec/matchers/change.rb +25 -1
- data/lib/spec/matchers/exist.rb +17 -0
- data/lib/spec/matchers/operator_matcher.rb +1 -0
- data/lib/spec/matchers/simple_matcher.rb +29 -0
- data/lib/spec/matchers/throw_symbol.rb +2 -0
- data/lib/spec/mocks.rb +5 -2
- data/lib/spec/mocks/argument_expectation.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +62 -44
- data/lib/spec/mocks/methods.rb +2 -2
- data/lib/spec/mocks/mock.rb +24 -3
- data/lib/spec/mocks/proxy.rb +26 -23
- data/lib/spec/mocks/space.rb +1 -1
- data/lib/spec/mocks/spec_methods.rb +20 -12
- data/lib/spec/rake/spectask.rb +19 -1
- data/lib/spec/rake/verify_rcov.rb +1 -1
- data/lib/spec/runner.rb +33 -10
- data/lib/spec/runner/backtrace_tweaker.rb +3 -3
- data/lib/spec/runner/class_and_arguments_parser.rb +16 -0
- data/lib/spec/runner/command_line.rb +18 -12
- data/lib/spec/runner/drb_command_line.rb +4 -5
- data/lib/spec/runner/example_group_runner.rb +59 -0
- data/lib/spec/runner/formatter/base_formatter.rb +10 -8
- data/lib/spec/runner/formatter/base_text_formatter.rb +18 -18
- data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +31 -0
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +3 -5
- data/lib/spec/runner/formatter/html_formatter.rb +37 -27
- data/lib/spec/runner/formatter/profile_formatter.rb +47 -0
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +3 -4
- data/lib/spec/runner/formatter/specdoc_formatter.rb +27 -13
- data/lib/spec/runner/formatter/story/html_formatter.rb +124 -0
- data/lib/spec/runner/formatter/story/plain_text_formatter.rb +123 -0
- data/lib/spec/runner/formatter/text_mate_formatter.rb +16 -0
- data/lib/spec/runner/heckle_runner.rb +9 -9
- data/lib/spec/runner/option_parser.rb +140 -138
- data/lib/spec/runner/options.rb +168 -90
- data/lib/spec/runner/reporter.rb +58 -40
- data/lib/spec/runner/spec_parser.rb +11 -8
- data/lib/spec/story.rb +10 -0
- data/lib/spec/story/extensions.rb +1 -0
- data/lib/spec/story/extensions/main.rb +86 -0
- data/lib/spec/story/given_scenario.rb +14 -0
- data/lib/spec/story/runner.rb +58 -0
- data/lib/spec/story/runner/plain_text_story_runner.rb +48 -0
- data/lib/spec/story/runner/scenario_collector.rb +18 -0
- data/lib/spec/story/runner/scenario_runner.rb +46 -0
- data/lib/spec/story/runner/story_mediator.rb +123 -0
- data/lib/spec/story/runner/story_parser.rb +227 -0
- data/lib/spec/story/runner/story_runner.rb +67 -0
- data/lib/spec/story/scenario.rb +14 -0
- data/lib/spec/story/step.rb +48 -0
- data/lib/spec/story/step_group.rb +89 -0
- data/lib/spec/story/step_mother.rb +37 -0
- data/lib/spec/story/story.rb +42 -0
- data/lib/spec/story/world.rb +124 -0
- data/lib/spec/version.rb +4 -5
- data/plugins/mock_frameworks/rspec.rb +1 -1
- data/spec/autotest/rspec_spec.rb +13 -7
- data/spec/autotest_helper.rb +4 -3
- data/spec/rspec_suite.rb +7 -0
- data/spec/ruby_forker.rb +13 -0
- data/spec/spec/example/configuration_spec.rb +290 -0
- data/spec/spec/example/example_group_class_definition_spec.rb +48 -0
- data/spec/spec/example/example_group_factory_spec.rb +129 -0
- data/spec/spec/example/example_group_methods_spec.rb +465 -0
- data/spec/spec/example/example_group_spec.rb +711 -0
- data/spec/spec/{dsl → example}/example_matcher_spec.rb +23 -18
- data/spec/spec/example/example_methods_spec.rb +75 -0
- data/spec/spec/example/example_runner_spec.rb +194 -0
- data/spec/spec/example/example_spec.rb +53 -0
- data/spec/spec/example/nested_example_group_spec.rb +59 -0
- data/spec/spec/example/pending_module_spec.rb +31 -0
- data/spec/spec/{dsl → example}/predicate_matcher_spec.rb +1 -1
- data/spec/spec/example/shared_example_group_spec.rb +265 -0
- data/spec/spec/example/subclassing_example_group_spec.rb +25 -0
- data/spec/spec/expectations/differs/default_spec.rb +5 -3
- data/spec/spec/expectations/extensions/object_spec.rb +63 -2
- data/spec/spec/extensions/main_spec.rb +50 -0
- data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +14 -0
- data/spec/spec/interop/test/unit/testcase_spec.rb +10 -0
- data/spec/spec/interop/test/unit/testcase_spec_with_test_unit.rb +20 -0
- data/spec/spec/interop/test/unit/testsuite_adapter_spec.rb +9 -0
- data/spec/spec/interop/test/unit/testsuite_adapter_spec_with_test_unit.rb +34 -0
- data/spec/spec/matchers/be_spec.rb +15 -0
- data/spec/spec/matchers/change_spec.rb +87 -0
- data/spec/spec/matchers/description_generation_spec.rb +31 -37
- data/spec/spec/matchers/exist_spec.rb +31 -22
- data/spec/spec/matchers/handler_spec.rb +42 -1
- data/spec/spec/matchers/have_spec.rb +1 -1
- data/spec/spec/matchers/mock_constraint_matchers_spec.rb +1 -1
- data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
- data/spec/spec/matchers/simple_matcher_spec.rb +31 -0
- data/spec/spec/matchers/throw_symbol_spec.rb +4 -1
- data/spec/spec/mocks/bug_report_10263.rb +24 -0
- data/spec/spec/mocks/bug_report_15719_spec.rb +30 -0
- data/spec/spec/mocks/bug_report_8165_spec.rb +2 -2
- data/spec/spec/mocks/failing_mock_argument_constraints_spec.rb +1 -0
- data/spec/spec/mocks/mock_spec.rb +200 -102
- data/spec/spec/mocks/multiple_return_value_spec.rb +1 -1
- data/spec/spec/mocks/options_hash_spec.rb +19 -7
- data/spec/spec/mocks/partial_mock_spec.rb +31 -9
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +6 -0
- data/spec/spec/mocks/stub_spec.rb +120 -98
- data/spec/spec/package/bin_spec_spec.rb +7 -5
- data/spec/spec/runner/class_and_argument_parser_spec.rb +23 -0
- data/spec/spec/runner/command_line_spec.rb +140 -27
- data/spec/spec/runner/drb_command_line_spec.rb +39 -31
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +44 -0
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +16 -11
- data/spec/spec/runner/formatter/html_formatter_spec.rb +60 -50
- data/spec/spec/runner/formatter/profile_formatter_spec.rb +65 -0
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +29 -13
- data/spec/spec/runner/formatter/snippet_extractor_spec.rb +14 -7
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +103 -0
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +103 -39
- data/spec/spec/runner/formatter/story/html_formatter_spec.rb +56 -0
- data/spec/spec/runner/formatter/story/plain_text_formatter_spec.rb +289 -0
- data/spec/spec/runner/heckle_runner_spec.rb +29 -14
- data/spec/spec/runner/heckler_spec.rb +4 -5
- data/spec/spec/runner/noisy_backtrace_tweaker_spec.rb +5 -5
- data/spec/spec/runner/option_parser_spec.rb +86 -58
- data/spec/spec/runner/options_spec.rb +239 -120
- data/spec/spec/runner/output_one_time_fixture.rb +7 -0
- data/spec/spec/runner/output_one_time_fixture_runner.rb +8 -0
- data/spec/spec/runner/output_one_time_spec.rb +16 -0
- data/spec/spec/runner/quiet_backtrace_tweaker_spec.rb +6 -6
- data/spec/spec/runner/reporter_spec.rb +147 -163
- data/spec/spec/runner/spec_parser_spec.rb +31 -0
- data/spec/spec/runner_spec.rb +11 -0
- data/spec/spec/spec_classes.rb +12 -5
- data/spec/spec/story/builders.rb +46 -0
- data/spec/spec/story/extensions/main_spec.rb +161 -0
- data/spec/spec/story/extensions_spec.rb +14 -0
- data/spec/spec/story/given_scenario_spec.rb +27 -0
- data/spec/spec/story/runner/plain_text_story_runner_spec.rb +92 -0
- data/spec/spec/story/runner/scenario_collector_spec.rb +27 -0
- data/spec/spec/story/runner/scenario_runner_spec.rb +142 -0
- data/spec/spec/story/runner/story_mediator_spec.rb +133 -0
- data/spec/spec/story/runner/story_parser_spec.rb +384 -0
- data/spec/spec/story/runner/story_runner_spec.rb +219 -0
- data/spec/spec/story/runner_spec.rb +106 -0
- data/spec/spec/story/scenario_spec.rb +20 -0
- data/spec/spec/story/step_group_spec.rb +157 -0
- data/spec/spec/story/step_mother_spec.rb +72 -0
- data/spec/spec/story/step_spec.rb +147 -0
- data/spec/spec/story/story_helper.rb +2 -0
- data/spec/spec/story/story_spec.rb +86 -0
- data/spec/spec/story/world_spec.rb +416 -0
- data/spec/spec/translator_spec.rb +2 -1
- data/spec/spec_helper.rb +59 -2
- data/stories/all.rb +5 -0
- data/stories/example_groups/autogenerated_docstrings +26 -0
- data/stories/example_groups/example_group_with_should_methods +17 -0
- data/stories/example_groups/nested_groups +17 -0
- data/stories/example_groups/output +20 -0
- data/stories/example_groups/stories.rb +7 -0
- data/stories/helper.rb +6 -0
- data/stories/interop/examples_and_tests_together +30 -0
- data/stories/interop/stories.rb +7 -0
- data/stories/interop/test_case_with_should_methods +17 -0
- data/stories/pending_stories/README +3 -0
- data/stories/resources/helpers/cmdline.rb +9 -0
- data/stories/resources/helpers/story_helper.rb +16 -0
- data/stories/resources/matchers/smart_match.rb +37 -0
- data/stories/resources/spec/example_group_with_should_methods.rb +12 -0
- data/stories/resources/spec/simple_spec.rb +8 -0
- data/stories/resources/steps/running_rspec.rb +50 -0
- data/stories/resources/test/spec_and_test_together.rb +57 -0
- data/stories/resources/test/test_case_with_should_methods.rb +30 -0
- metadata +232 -106
- data/EXAMPLES.rd +0 -111
- data/examples/multi_threaded_behaviour_runner.rb +0 -25
- data/examples/shared_behaviours_example.rb +0 -39
- data/examples/spec_helper.rb +0 -1
- data/examples/test_case_adapter_example.rb +0 -26
- data/examples/test_case_spec.rb +0 -65
- data/lib/spec/dsl.rb +0 -11
- data/lib/spec/dsl/behaviour.rb +0 -220
- data/lib/spec/dsl/behaviour_callbacks.rb +0 -82
- data/lib/spec/dsl/behaviour_eval.rb +0 -231
- data/lib/spec/dsl/behaviour_factory.rb +0 -42
- data/lib/spec/dsl/composite_proc_builder.rb +0 -33
- data/lib/spec/dsl/description.rb +0 -76
- data/lib/spec/dsl/example.rb +0 -135
- data/lib/spec/dsl/example_matcher.rb +0 -40
- data/lib/spec/dsl/example_should_raise_handler.rb +0 -74
- data/lib/spec/runner/behaviour_runner.rb +0 -123
- data/lib/spec/runner/extensions/kernel.rb +0 -50
- data/lib/spec/runner/extensions/object.rb +0 -32
- data/lib/spec/runner/formatter.rb +0 -9
- data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +0 -29
- data/lib/spec/runner/formatter/rdoc_formatter.rb +0 -24
- data/lib/spec/test_case_adapter.rb +0 -10
- data/spec/spec/dsl/behaviour_eval_spec.rb +0 -79
- data/spec/spec/dsl/behaviour_factory_spec.rb +0 -48
- data/spec/spec/dsl/behaviour_spec.rb +0 -661
- data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -44
- data/spec/spec/dsl/configuration_spec.rb +0 -55
- data/spec/spec/dsl/description_spec.rb +0 -89
- data/spec/spec/dsl/example_class_spec.rb +0 -24
- data/spec/spec/dsl/example_instance_spec.rb +0 -160
- data/spec/spec/dsl/example_should_raise_spec.rb +0 -137
- data/spec/spec/dsl/shared_behaviour_spec.rb +0 -252
- data/spec/spec/runner/behaviour_runner_spec.rb +0 -229
- data/spec/spec/runner/context_matching_spec.rb +0 -27
- data/spec/spec/runner/extensions/bug_report_10577_spec.rb +0 -35
- data/spec/spec/runner/extensions/kernel_spec.rb +0 -36
- data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +0 -40
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +0 -20
- data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +0 -36
- data/spec/spec/runner/formatter/rdoc_formatter_dry_run_spec.rb +0 -19
- data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +0 -46
- data/spec/spec/runner/formatter/specdoc_formatter_dry_run_spec.rb +0 -21
- data/spec/spec/runner/object_ext_spec.rb +0 -11
@@ -0,0 +1,42 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
class ExampleMatcher
|
4
|
+
def initialize(example_group_description, example_name)
|
5
|
+
@example_group_description = example_group_description
|
6
|
+
@example_name = example_name
|
7
|
+
end
|
8
|
+
|
9
|
+
def matches?(specified_examples)
|
10
|
+
specified_examples.each do |specified_example|
|
11
|
+
return true if matches_literal_example?(specified_example) || matches_example_not_considering_modules?(specified_example)
|
12
|
+
end
|
13
|
+
false
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
def matches_literal_example?(specified_example)
|
18
|
+
specified_example =~ /(^#{example_group_regex} #{example_regexp}$|^#{example_group_regex}$|^#{example_group_with_before_all_regexp}$|^#{example_regexp}$)/
|
19
|
+
end
|
20
|
+
|
21
|
+
def matches_example_not_considering_modules?(specified_example)
|
22
|
+
specified_example =~ /(^#{example_group_regex_not_considering_modules} #{example_regexp}$|^#{example_group_regex_not_considering_modules}$|^#{example_regexp}$)/
|
23
|
+
end
|
24
|
+
|
25
|
+
def example_group_regex
|
26
|
+
Regexp.escape(@example_group_description)
|
27
|
+
end
|
28
|
+
|
29
|
+
def example_group_with_before_all_regexp
|
30
|
+
Regexp.escape("#{@example_group_description} before(:all)")
|
31
|
+
end
|
32
|
+
|
33
|
+
def example_group_regex_not_considering_modules
|
34
|
+
Regexp.escape(@example_group_description.split('::').last)
|
35
|
+
end
|
36
|
+
|
37
|
+
def example_regexp
|
38
|
+
Regexp.escape(@example_name)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
module ExampleMethods
|
4
|
+
extend ExampleGroupMethods
|
5
|
+
extend ModuleReopeningFix
|
6
|
+
|
7
|
+
PENDING_EXAMPLE_BLOCK = lambda {
|
8
|
+
raise Spec::Example::ExamplePendingError.new("Not Yet Implemented")
|
9
|
+
}
|
10
|
+
|
11
|
+
def execute(options, instance_variables)
|
12
|
+
options.reporter.example_started(self)
|
13
|
+
set_instance_variables_from_hash(instance_variables)
|
14
|
+
|
15
|
+
execution_error = nil
|
16
|
+
Timeout.timeout(options.timeout) do
|
17
|
+
begin
|
18
|
+
before_example
|
19
|
+
run_with_description_capturing
|
20
|
+
rescue Exception => e
|
21
|
+
execution_error ||= e
|
22
|
+
end
|
23
|
+
begin
|
24
|
+
after_example
|
25
|
+
rescue Exception => e
|
26
|
+
execution_error ||= e
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
options.reporter.example_finished(self, execution_error)
|
31
|
+
success = execution_error.nil? || ExamplePendingError === execution_error
|
32
|
+
end
|
33
|
+
|
34
|
+
def instance_variable_hash
|
35
|
+
instance_variables.inject({}) do |variable_hash, variable_name|
|
36
|
+
variable_hash[variable_name] = instance_variable_get(variable_name)
|
37
|
+
variable_hash
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def violated(message="")
|
42
|
+
raise Spec::Expectations::ExpectationNotMetError.new(message)
|
43
|
+
end
|
44
|
+
|
45
|
+
def eval_each_fail_fast(procs) #:nodoc:
|
46
|
+
procs.each do |proc|
|
47
|
+
instance_eval(&proc)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def eval_each_fail_slow(procs) #:nodoc:
|
52
|
+
first_exception = nil
|
53
|
+
procs.each do |proc|
|
54
|
+
begin
|
55
|
+
instance_eval(&proc)
|
56
|
+
rescue Exception => e
|
57
|
+
first_exception ||= e
|
58
|
+
end
|
59
|
+
end
|
60
|
+
raise first_exception if first_exception
|
61
|
+
end
|
62
|
+
|
63
|
+
def description
|
64
|
+
@_defined_description || @_matcher_description || "NO NAME"
|
65
|
+
end
|
66
|
+
|
67
|
+
def set_instance_variables_from_hash(instance_variables)
|
68
|
+
instance_variables.each do |variable_name, value|
|
69
|
+
unless ['@_implementation', '@_defined_description', '@_matcher_description', '@method_name'].index(variable_name)
|
70
|
+
instance_variable_set variable_name, value
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def run_with_description_capturing
|
76
|
+
return_value = nil
|
77
|
+
|
78
|
+
@_matcher_description = Matchers.capture_generated_description do
|
79
|
+
return_value = instance_eval(&(@_implementation || PENDING_EXAMPLE_BLOCK))
|
80
|
+
end
|
81
|
+
return_value
|
82
|
+
end
|
83
|
+
|
84
|
+
protected
|
85
|
+
include Matchers
|
86
|
+
include Pending
|
87
|
+
|
88
|
+
def before_example
|
89
|
+
setup_mocks_for_rspec
|
90
|
+
self.class.run_before_each(self)
|
91
|
+
end
|
92
|
+
|
93
|
+
def after_example
|
94
|
+
self.class.run_after_each(self)
|
95
|
+
verify_mocks_for_rspec
|
96
|
+
ensure
|
97
|
+
teardown_mocks_for_rspec
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
# This is a fix for ...Something in Ruby 1.8.6??... (Someone fill in here please - Aslak)
|
4
|
+
module ModuleReopeningFix
|
5
|
+
def child_modules
|
6
|
+
@child_modules ||= []
|
7
|
+
end
|
8
|
+
|
9
|
+
def included(mod)
|
10
|
+
child_modules << mod
|
11
|
+
end
|
12
|
+
|
13
|
+
def include(mod)
|
14
|
+
super
|
15
|
+
child_modules.each do |child_module|
|
16
|
+
child_module.__send__(:include, mod)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
module Pending
|
4
|
+
def pending(message = "TODO")
|
5
|
+
if block_given?
|
6
|
+
begin
|
7
|
+
yield
|
8
|
+
rescue Exception => e
|
9
|
+
raise Spec::Example::ExamplePendingError.new(message)
|
10
|
+
end
|
11
|
+
raise Spec::Example::PendingExampleFixedError.new("Expected pending '#{message}' to fail. No Error was raised.")
|
12
|
+
else
|
13
|
+
raise Spec::Example::ExamplePendingError.new(message)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Spec
|
2
|
+
module Example
|
3
|
+
class SharedExampleGroup < Module
|
4
|
+
class << self
|
5
|
+
def add_shared_example_group(new_example_group)
|
6
|
+
guard_against_redefining_existing_example_group(new_example_group)
|
7
|
+
shared_example_groups << new_example_group
|
8
|
+
end
|
9
|
+
|
10
|
+
def find_shared_example_group(example_group_description)
|
11
|
+
shared_example_groups.find do |b|
|
12
|
+
b.description == example_group_description
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def shared_example_groups
|
17
|
+
# TODO - this needs to be global, or at least accessible from
|
18
|
+
# from subclasses of Example in a centralized place. I'm not loving
|
19
|
+
# this as a solution, but it works for now.
|
20
|
+
$shared_example_groups ||= []
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
def guard_against_redefining_existing_example_group(new_example_group)
|
25
|
+
existing_example_group = find_shared_example_group(new_example_group.description)
|
26
|
+
return unless existing_example_group
|
27
|
+
return if new_example_group.equal?(existing_example_group)
|
28
|
+
return if spec_path(new_example_group) == spec_path(existing_example_group)
|
29
|
+
raise ArgumentError.new("Shared Example '#{existing_example_group.description}' already exists")
|
30
|
+
end
|
31
|
+
|
32
|
+
def spec_path(example_group)
|
33
|
+
File.expand_path(example_group.spec_path)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
include ExampleGroupMethods
|
37
|
+
public :include
|
38
|
+
|
39
|
+
def initialize(*args, &example_group_block)
|
40
|
+
describe(*args)
|
41
|
+
@example_group_block = example_group_block
|
42
|
+
self.class.add_shared_example_group(self)
|
43
|
+
end
|
44
|
+
|
45
|
+
def included(mod) # :nodoc:
|
46
|
+
mod.module_eval(&@example_group_block)
|
47
|
+
end
|
48
|
+
|
49
|
+
def execute_in_class_hierarchy(superclass_last=false)
|
50
|
+
classes = [self]
|
51
|
+
superclass_last ? classes << ExampleMethods : classes.unshift(ExampleMethods)
|
52
|
+
classes.each do |example_group|
|
53
|
+
yield example_group
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -12,12 +12,8 @@ module Spec
|
|
12
12
|
|
13
13
|
# TODO add some rdoc
|
14
14
|
class Default
|
15
|
-
def initialize(
|
16
|
-
|
17
|
-
context_lines ||= 3
|
18
|
-
colour ||= false
|
19
|
-
|
20
|
-
@format,@context_lines,@colour = format,context_lines,colour
|
15
|
+
def initialize(options)
|
16
|
+
@options = options
|
21
17
|
end
|
22
18
|
|
23
19
|
# This is snagged from diff/lcs/ldiff.rb (which is a commandline tool)
|
@@ -31,17 +27,17 @@ module Spec
|
|
31
27
|
file_length_difference = 0
|
32
28
|
diffs.each do |piece|
|
33
29
|
begin
|
34
|
-
hunk = Diff::LCS::Hunk.new(data_old, data_new, piece,
|
30
|
+
hunk = Diff::LCS::Hunk.new(data_old, data_new, piece, context_lines,
|
35
31
|
file_length_difference)
|
36
32
|
file_length_difference = hunk.file_length_difference
|
37
33
|
next unless oldhunk
|
38
34
|
# Hunks may overlap, which is why we need to be careful when our
|
39
35
|
# diff includes lines of context. Otherwise, we might print
|
40
36
|
# redundant lines.
|
41
|
-
if (
|
37
|
+
if (context_lines > 0) and hunk.overlaps?(oldhunk)
|
42
38
|
hunk.unshift(oldhunk)
|
43
39
|
else
|
44
|
-
output << oldhunk.diff(
|
40
|
+
output << oldhunk.diff(format)
|
45
41
|
end
|
46
42
|
ensure
|
47
43
|
oldhunk = hunk
|
@@ -49,12 +45,21 @@ module Spec
|
|
49
45
|
end
|
50
46
|
end
|
51
47
|
#Handle the last remaining hunk
|
52
|
-
output << oldhunk.diff(
|
48
|
+
output << oldhunk.diff(format) << "\n"
|
53
49
|
end
|
54
50
|
|
55
51
|
def diff_as_object(target,expected)
|
56
52
|
diff_as_string(PP.pp(target,""), PP.pp(expected,""))
|
57
53
|
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
def format
|
57
|
+
@options.diff_format
|
58
|
+
end
|
59
|
+
|
60
|
+
def context_lines
|
61
|
+
@options.context_lines
|
62
|
+
end
|
58
63
|
end
|
59
64
|
end
|
60
65
|
end
|
@@ -1,6 +1,12 @@
|
|
1
1
|
module Spec
|
2
2
|
module Expectations
|
3
|
-
|
3
|
+
# If Test::Unit is loaed, we'll use its error as baseclass, so that Test::Unit
|
4
|
+
# will report unmet RSpec expectations as failures rather than errors.
|
5
|
+
superclass = ['Test::Unit::AssertionFailedError', '::StandardError'].map do |c|
|
6
|
+
eval(c) rescue nil
|
7
|
+
end.compact.first
|
8
|
+
|
9
|
+
class ExpectationNotMetError < superclass
|
4
10
|
end
|
5
11
|
end
|
6
12
|
end
|
@@ -3,7 +3,6 @@ module Spec
|
|
3
3
|
# rspec adds #should and #should_not to every Object (and,
|
4
4
|
# implicitly, every Class).
|
5
5
|
module ObjectExpectations
|
6
|
-
|
7
6
|
# :call-seq:
|
8
7
|
# should(matcher)
|
9
8
|
# should == expected
|
@@ -28,9 +27,12 @@ module Spec
|
|
28
27
|
#
|
29
28
|
# NOTE that this does NOT support receiver.should != expected.
|
30
29
|
# Instead, use receiver.should_not == expected
|
31
|
-
def should(matcher=
|
32
|
-
|
33
|
-
|
30
|
+
def should(matcher = :default_parameter, &block)
|
31
|
+
if :default_parameter == matcher
|
32
|
+
Spec::Matchers::PositiveOperatorMatcher.new(self)
|
33
|
+
else
|
34
|
+
ExpectationMatcherHandler.handle_matcher(self, matcher, &block)
|
35
|
+
end
|
34
36
|
end
|
35
37
|
|
36
38
|
# :call-seq:
|
@@ -52,9 +54,12 @@ module Spec
|
|
52
54
|
# => Passes unless (receiver =~ regexp)
|
53
55
|
#
|
54
56
|
# See Spec::Matchers for more information about matchers
|
55
|
-
def should_not(matcher=
|
56
|
-
|
57
|
-
|
57
|
+
def should_not(matcher = :default_parameter, &block)
|
58
|
+
if :default_parameter == matcher
|
59
|
+
Spec::Matchers::NegativeOperatorMatcher.new(self)
|
60
|
+
else
|
61
|
+
NegativeExpectationMatcherHandler.handle_matcher(self, matcher, &block)
|
62
|
+
end
|
58
63
|
end
|
59
64
|
|
60
65
|
end
|
@@ -1,18 +1,23 @@
|
|
1
1
|
module Spec
|
2
2
|
module Expectations
|
3
|
+
class InvalidMatcherError < ArgumentError; end
|
3
4
|
|
4
5
|
module MatcherHandlerHelper
|
5
|
-
def
|
6
|
+
def describe_matcher(matcher)
|
6
7
|
matcher.respond_to?(:description) ? matcher.description : "[#{matcher.class.name} does not provide a description]"
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
10
|
-
class ExpectationMatcherHandler
|
11
|
+
class ExpectationMatcherHandler
|
11
12
|
class << self
|
12
13
|
include MatcherHandlerHelper
|
13
14
|
def handle_matcher(actual, matcher, &block)
|
15
|
+
unless matcher.respond_to?(:matches?)
|
16
|
+
raise InvalidMatcherError, "Expected a matcher, got #{matcher.inspect}."
|
17
|
+
end
|
18
|
+
|
14
19
|
match = matcher.matches?(actual, &block)
|
15
|
-
::Spec::Matchers.generated_description = "should #{
|
20
|
+
::Spec::Matchers.generated_description = "should #{describe_matcher(matcher)}"
|
16
21
|
Spec::Expectations.fail_with(matcher.failure_message) unless match
|
17
22
|
end
|
18
23
|
end
|
@@ -22,6 +27,10 @@ module Spec
|
|
22
27
|
class << self
|
23
28
|
include MatcherHandlerHelper
|
24
29
|
def handle_matcher(actual, matcher, &block)
|
30
|
+
unless matcher.respond_to?(:matches?)
|
31
|
+
raise InvalidMatcherError, "Expected a matcher, got #{matcher.inspect}."
|
32
|
+
end
|
33
|
+
|
25
34
|
unless matcher.respond_to?(:negative_failure_message)
|
26
35
|
Spec::Expectations.fail_with(
|
27
36
|
<<-EOF
|
@@ -32,7 +41,7 @@ EOF
|
|
32
41
|
)
|
33
42
|
end
|
34
43
|
match = matcher.matches?(actual, &block)
|
35
|
-
::Spec::Matchers.generated_description = "should not #{
|
44
|
+
::Spec::Matchers.generated_description = "should not #{describe_matcher(matcher)}"
|
36
45
|
Spec::Expectations.fail_with(matcher.negative_failure_message) if match
|
37
46
|
end
|
38
47
|
end
|
data/lib/spec/extensions.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
class Class
|
2
|
+
# Creates a new subclass of self, with a name "under" our own name.
|
3
|
+
# Example:
|
4
|
+
#
|
5
|
+
# x = Foo::Bar.subclass('Zap'){}
|
6
|
+
# x.name # => Foo::Bar::Zap_1
|
7
|
+
# x.superclass.name # => Foo::Bar
|
8
|
+
def subclass(base_name, &body)
|
9
|
+
klass = Class.new(self)
|
10
|
+
class_name = "#{base_name}_#{class_count!}"
|
11
|
+
instance_eval do
|
12
|
+
const_set(class_name, klass)
|
13
|
+
end
|
14
|
+
klass.instance_eval(&body)
|
15
|
+
klass
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def class_count!
|
20
|
+
@class_count ||= 0
|
21
|
+
@class_count += 1
|
22
|
+
@class_count
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Spec
|
2
|
+
module Extensions
|
3
|
+
module Main
|
4
|
+
# Creates and returns a class that includes the ExampleGroupMethods
|
5
|
+
# module. The ExampleGroup sub-class depends on the directory of the file
|
6
|
+
# calling this method. For example, Spec::Rails will use different
|
7
|
+
# classes for specs living in <tt>spec/models</tt>,
|
8
|
+
# <tt>spec/helpers</tt>, <tt>spec/views</tt> and
|
9
|
+
# <tt>spec/controllers</tt>.
|
10
|
+
#
|
11
|
+
# It is also possible to override autodiscovery of the example group
|
12
|
+
# type with an options Hash as the last argument:
|
13
|
+
#
|
14
|
+
# describe "name", :type => :something_special do ...
|
15
|
+
#
|
16
|
+
# The reason for using different behaviour classes is to have different
|
17
|
+
# matcher methods available from within the <tt>describe</tt> block.
|
18
|
+
#
|
19
|
+
# See Spec::Example::ExampleFactory#register for details about how to
|
20
|
+
# register special implementations.
|
21
|
+
#
|
22
|
+
def describe(*args, &block)
|
23
|
+
raise ArgumentError if args.empty?
|
24
|
+
raise ArgumentError unless block
|
25
|
+
args << {} unless Hash === args.last
|
26
|
+
args.last[:spec_path] = caller(0)[1]
|
27
|
+
Spec::Example::ExampleGroupFactory.create_example_group(*args, &block)
|
28
|
+
end
|
29
|
+
alias :context :describe
|
30
|
+
|
31
|
+
# Shortcut for creating a shared example group
|
32
|
+
def shared_examples_for(name, &block)
|
33
|
+
describe(name, :shared => true, &block)
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def rspec_options
|
39
|
+
$rspec_options ||= begin; \
|
40
|
+
parser = ::Spec::Runner::OptionParser.new(STDERR, STDOUT); \
|
41
|
+
parser.order!(ARGV); \
|
42
|
+
$rspec_options = parser.options; \
|
43
|
+
end
|
44
|
+
$rspec_options
|
45
|
+
end
|
46
|
+
|
47
|
+
def init_rspec_options(options)
|
48
|
+
$rspec_options = options if $rspec_options.nil?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
include Spec::Extensions::Main
|