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
data/lib/spec/rake/spectask.rb
CHANGED
@@ -8,7 +8,7 @@ require 'rake/tasklib'
|
|
8
8
|
module Spec
|
9
9
|
module Rake
|
10
10
|
|
11
|
-
# A Rake task that runs a set of
|
11
|
+
# A Rake task that runs a set of specs.
|
12
12
|
#
|
13
13
|
# Example:
|
14
14
|
#
|
@@ -44,6 +44,17 @@ module Spec
|
|
44
44
|
# Each attribute of this task may be a proc. This allows for lazy evaluation,
|
45
45
|
# which is sometimes handy if you want to defer the evaluation of an attribute value
|
46
46
|
# until the task is run (as opposed to when it is defined).
|
47
|
+
#
|
48
|
+
# This task can also be used to run existing Test::Unit tests and get RSpec
|
49
|
+
# output, for example like this:
|
50
|
+
#
|
51
|
+
# require 'rubygems'
|
52
|
+
# require 'spec/rake/spectask'
|
53
|
+
# Spec::Rake::SpecTask.new do |t|
|
54
|
+
# t.ruby_opts = ['-rtest/unit']
|
55
|
+
# t.spec_files = FileList['test/**/*_test.rb']
|
56
|
+
# end
|
57
|
+
#
|
47
58
|
class SpecTask < ::Rake::TaskLib
|
48
59
|
class << self
|
49
60
|
def attr_accessor(*names)
|
@@ -106,6 +117,10 @@ module Spec
|
|
106
117
|
# used, then the list of spec files is the union of the two.
|
107
118
|
# Setting the SPEC environment variable overrides this.
|
108
119
|
attr_accessor :spec_files
|
120
|
+
|
121
|
+
# Use verbose output. If this is set to true, the task will print
|
122
|
+
# the executed spec command to stdout. Defaults to false.
|
123
|
+
attr_accessor :verbose
|
109
124
|
|
110
125
|
# Defines a new task, using the name +name+.
|
111
126
|
def initialize(name=:spec)
|
@@ -161,6 +176,9 @@ module Spec
|
|
161
176
|
cmd << %Q| > "#{out}"|
|
162
177
|
STDERR.puts "The Spec::Rake::SpecTask#out attribute is DEPRECATED and will be removed in a future version. Use --format FORMAT:WHERE instead."
|
163
178
|
end
|
179
|
+
if verbose
|
180
|
+
puts cmd
|
181
|
+
end
|
164
182
|
unless system(cmd)
|
165
183
|
STDERR.puts failure_message if failure_message
|
166
184
|
raise("Command #{cmd} failed") if fail_on_error
|
data/lib/spec/runner.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
|
-
require 'spec/runner/formatter'
|
2
|
-
require 'spec/runner/behaviour_runner'
|
3
1
|
require 'spec/runner/options'
|
4
2
|
require 'spec/runner/option_parser'
|
3
|
+
require 'spec/runner/example_group_runner'
|
5
4
|
require 'spec/runner/command_line'
|
6
5
|
require 'spec/runner/drb_command_line'
|
7
6
|
require 'spec/runner/backtrace_tweaker'
|
8
7
|
require 'spec/runner/reporter'
|
9
|
-
require 'spec/runner/extensions/object'
|
10
|
-
require 'spec/runner/extensions/kernel'
|
11
8
|
require 'spec/runner/spec_parser'
|
9
|
+
require 'spec/runner/class_and_arguments_parser'
|
12
10
|
|
13
11
|
module Spec
|
14
12
|
# == Behaviours and Examples
|
@@ -16,7 +14,7 @@ module Spec
|
|
16
14
|
# Rather than expressing examples in classes, RSpec uses a custom domain specific language to
|
17
15
|
# describe Behaviours and Examples of those behaviours.
|
18
16
|
#
|
19
|
-
# A
|
17
|
+
# A Example is the equivalent of a fixture in xUnit-speak. It is a metaphor for the context
|
20
18
|
# in which you will run your executable example - a set of known objects in a known starting state.
|
21
19
|
# We begin be describing
|
22
20
|
#
|
@@ -32,7 +30,7 @@ module Spec
|
|
32
30
|
#
|
33
31
|
# end
|
34
32
|
#
|
35
|
-
# We use the before block to set up the
|
33
|
+
# We use the before block to set up the Example (given), and then the #it method to
|
36
34
|
# hold the example code that expresses the event (when) and the expected outcome (then).
|
37
35
|
#
|
38
36
|
# == Helper Methods
|
@@ -47,7 +45,7 @@ module Spec
|
|
47
45
|
#
|
48
46
|
# == Setup and Teardown
|
49
47
|
#
|
50
|
-
# You can use before and after within a
|
48
|
+
# You can use before and after within a Example. Both methods take an optional
|
51
49
|
# scope argument so you can run the block before :each example or before :all examples
|
52
50
|
#
|
53
51
|
# describe "..." do
|
@@ -140,10 +138,35 @@ module Spec
|
|
140
138
|
# ...
|
141
139
|
# end
|
142
140
|
# end
|
141
|
+
#
|
142
|
+
# You can also assign the shared behaviour to a module and include that
|
143
|
+
#
|
144
|
+
# AllEditions = describe "All Editions", :shared => true do
|
145
|
+
# it "should do all editions stuff" ...
|
146
|
+
# end
|
147
|
+
#
|
148
|
+
# describe SmallEdition do
|
149
|
+
# it_should_behave_like AllEditions
|
150
|
+
#
|
151
|
+
# it "should do small edition stuff" do
|
152
|
+
# ...
|
153
|
+
# end
|
154
|
+
# end
|
155
|
+
#
|
156
|
+
# And, for those of you who prefer to use something more like Ruby, you
|
157
|
+
# can just include the module directly
|
158
|
+
#
|
159
|
+
# describe SmallEdition do
|
160
|
+
# include AllEditions
|
161
|
+
#
|
162
|
+
# it "should do small edition stuff" do
|
163
|
+
# ...
|
164
|
+
# end
|
165
|
+
# end
|
143
166
|
module Runner
|
144
167
|
class << self
|
145
168
|
def configuration # :nodoc:
|
146
|
-
@configuration ||= Spec::
|
169
|
+
@configuration ||= Spec::Example::Configuration.new
|
147
170
|
end
|
148
171
|
|
149
172
|
# Use this to configure various configurable aspects of
|
@@ -154,11 +177,11 @@ module Spec
|
|
154
177
|
# end
|
155
178
|
#
|
156
179
|
# The yielded <tt>configuration</tt> object is a
|
157
|
-
# Spec::
|
180
|
+
# Spec::Example::Configuration instance. See its RDoc
|
158
181
|
# for details about what you can do with it.
|
159
182
|
#
|
160
183
|
def configure
|
161
|
-
yield configuration
|
184
|
+
yield configuration
|
162
185
|
end
|
163
186
|
end
|
164
187
|
end
|
@@ -7,7 +7,7 @@ module Spec
|
|
7
7
|
end
|
8
8
|
|
9
9
|
class NoisyBacktraceTweaker < BacktraceTweaker
|
10
|
-
def tweak_backtrace(error
|
10
|
+
def tweak_backtrace(error)
|
11
11
|
return if error.backtrace.nil?
|
12
12
|
error.backtrace.each do |line|
|
13
13
|
clean_up_double_slashes(line)
|
@@ -19,7 +19,7 @@ module Spec
|
|
19
19
|
class QuietBacktraceTweaker < BacktraceTweaker
|
20
20
|
unless defined?(IGNORE_PATTERNS)
|
21
21
|
root_dir = File.expand_path(File.join(__FILE__, '..', '..', '..', '..'))
|
22
|
-
spec_files = Dir["#{root_dir}/lib
|
22
|
+
spec_files = Dir["#{root_dir}/lib/*"].map do |path|
|
23
23
|
subpath = path[root_dir.length..-1]
|
24
24
|
/#{subpath}/
|
25
25
|
end
|
@@ -38,7 +38,7 @@ module Spec
|
|
38
38
|
]
|
39
39
|
end
|
40
40
|
|
41
|
-
def tweak_backtrace(error
|
41
|
+
def tweak_backtrace(error)
|
42
42
|
return if error.backtrace.nil?
|
43
43
|
error.backtrace.collect! do |line|
|
44
44
|
clean_up_double_slashes(line)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Spec
|
2
|
+
module Runner
|
3
|
+
class ClassAndArgumentsParser
|
4
|
+
class << self
|
5
|
+
def parse(s)
|
6
|
+
if s =~ /([a-zA-Z_]+(?:::[a-zA-Z_]+)*):?(.*)/
|
7
|
+
arg = $2 == "" ? nil : $2
|
8
|
+
[$1, arg]
|
9
|
+
else
|
10
|
+
raise "Couldn't parse #{s.inspect}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -4,18 +4,24 @@ module Spec
|
|
4
4
|
module Runner
|
5
5
|
# Facade to run specs without having to fork a new ruby process (using `spec ...`)
|
6
6
|
class CommandLine
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
7
|
+
class << self
|
8
|
+
# Runs specs. +argv+ is the commandline args as per the spec commandline API, +err+
|
9
|
+
# and +out+ are the streams output will be written to.
|
10
|
+
def run(instance_rspec_options)
|
11
|
+
# NOTE - this call to init_rspec_options is not spec'd, but neither is any of this
|
12
|
+
# swapping of $rspec_options. That is all here to enable rspec to run against itself
|
13
|
+
# and maintain coverage in a single process. Therefore, DO NOT mess with this stuff
|
14
|
+
# unless you know what you are doing!
|
15
|
+
init_rspec_options(instance_rspec_options)
|
16
|
+
orig_rspec_options = rspec_options
|
17
|
+
begin
|
18
|
+
$rspec_options = instance_rspec_options
|
19
|
+
return $rspec_options.run_examples
|
20
|
+
ensure
|
21
|
+
::Spec.run = true
|
22
|
+
$rspec_options = orig_rspec_options
|
23
|
+
end
|
24
|
+
end
|
19
25
|
end
|
20
26
|
end
|
21
27
|
end
|
@@ -6,14 +6,13 @@ module Spec
|
|
6
6
|
class DrbCommandLine
|
7
7
|
# Runs specs on a DRB server. Note that this API is similar to that of
|
8
8
|
# CommandLine - making it possible for clients to use both interchangeably.
|
9
|
-
def self.run(
|
9
|
+
def self.run(options)
|
10
10
|
begin
|
11
11
|
DRb.start_service
|
12
12
|
spec_server = DRbObject.new_with_uri("druby://localhost:8989")
|
13
|
-
spec_server.run(argv,
|
14
|
-
rescue DRb::DRbConnError
|
15
|
-
|
16
|
-
exit 1 if exit
|
13
|
+
spec_server.run(options.argv, options.error_stream, options.output_stream)
|
14
|
+
rescue DRb::DRbConnError => e
|
15
|
+
options.error_stream.puts "No server is running"
|
17
16
|
end
|
18
17
|
end
|
19
18
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Spec
|
2
|
+
module Runner
|
3
|
+
class ExampleGroupRunner
|
4
|
+
def initialize(options)
|
5
|
+
@options = options
|
6
|
+
end
|
7
|
+
|
8
|
+
def load_files(files)
|
9
|
+
# It's important that loading files (or choosing not to) stays the
|
10
|
+
# responsibility of the ExampleGroupRunner. Some implementations (like)
|
11
|
+
# the one using DRb may choose *not* to load files, but instead tell
|
12
|
+
# someone else to do it over the wire.
|
13
|
+
files.each do |file|
|
14
|
+
load file
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
prepare
|
20
|
+
success = true
|
21
|
+
example_groups.each do |example_group|
|
22
|
+
success = success & example_group.run
|
23
|
+
end
|
24
|
+
return success
|
25
|
+
ensure
|
26
|
+
finish
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
def prepare
|
31
|
+
reporter.start(number_of_examples)
|
32
|
+
example_groups.reverse! if reverse
|
33
|
+
end
|
34
|
+
|
35
|
+
def finish
|
36
|
+
reporter.end
|
37
|
+
reporter.dump
|
38
|
+
end
|
39
|
+
|
40
|
+
def reporter
|
41
|
+
@options.reporter
|
42
|
+
end
|
43
|
+
|
44
|
+
def reverse
|
45
|
+
@options.reverse
|
46
|
+
end
|
47
|
+
|
48
|
+
def example_groups
|
49
|
+
@options.example_groups
|
50
|
+
end
|
51
|
+
|
52
|
+
def number_of_examples
|
53
|
+
@options.number_of_examples
|
54
|
+
end
|
55
|
+
end
|
56
|
+
# TODO: BT - Deprecate BehaviourRunner?
|
57
|
+
BehaviourRunner = ExampleGroupRunner
|
58
|
+
end
|
59
|
+
end
|
@@ -3,7 +3,9 @@ module Spec
|
|
3
3
|
module Formatter
|
4
4
|
# Baseclass for formatters that implements all required methods as no-ops.
|
5
5
|
class BaseFormatter
|
6
|
-
|
6
|
+
attr_accessor :example_group, :options, :where
|
7
|
+
def initialize(options, where)
|
8
|
+
@options = options
|
7
9
|
@where = where
|
8
10
|
end
|
9
11
|
|
@@ -12,16 +14,17 @@ module Spec
|
|
12
14
|
# formatters that need to provide progress on feedback (graphical ones)
|
13
15
|
#
|
14
16
|
# This method will only be invoked once, and the next one to be invoked
|
15
|
-
# is #
|
17
|
+
# is #add_example_group
|
16
18
|
def start(example_count)
|
17
19
|
end
|
18
20
|
|
19
|
-
# This method is invoked at the beginning of the execution of each
|
20
|
-
# +name+ is the name of the
|
21
|
-
# first
|
21
|
+
# This method is invoked at the beginning of the execution of each example_group.
|
22
|
+
# +name+ is the name of the example_group and +first+ is true if it is the
|
23
|
+
# first example_group - otherwise it's false.
|
22
24
|
#
|
23
25
|
# The next method to be invoked after this is #example_failed or #example_finished
|
24
|
-
def
|
26
|
+
def add_example_group(example_group)
|
27
|
+
@example_group = example_group
|
25
28
|
end
|
26
29
|
|
27
30
|
# This method is invoked when an +example+ starts.
|
@@ -41,10 +44,9 @@ module Spec
|
|
41
44
|
|
42
45
|
# This method is invoked when an example is not yet implemented (i.e. has not
|
43
46
|
# been provided a block), or when an ExamplePendingError is raised.
|
44
|
-
# +name+ is the name of the example.
|
45
47
|
# +message+ is the message from the ExamplePendingError, if it exists, or the
|
46
48
|
# default value of "Not Yet Implemented"
|
47
|
-
def example_pending(
|
49
|
+
def example_pending(example_group_description, example, message)
|
48
50
|
end
|
49
51
|
|
50
52
|
# This method is invoked after all of the examples have executed. The next method
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'spec/runner/formatter/base_formatter'
|
2
|
+
|
1
3
|
module Spec
|
2
4
|
module Runner
|
3
5
|
module Formatter
|
@@ -5,13 +7,12 @@ module Spec
|
|
5
7
|
# non-text based ones too - just ignore the +output+ constructor
|
6
8
|
# argument.
|
7
9
|
class BaseTextFormatter < BaseFormatter
|
8
|
-
|
9
|
-
|
10
|
+
attr_reader :output, :pending_examples
|
10
11
|
# Creates a new instance that will write to +where+. If +where+ is a
|
11
12
|
# String, output will be written to the File with that name, otherwise
|
12
13
|
# +where+ is exected to be an IO (or an object that responds to #puts and #write).
|
13
|
-
def initialize(where)
|
14
|
-
super
|
14
|
+
def initialize(options, where)
|
15
|
+
super
|
15
16
|
if where.is_a?(String)
|
16
17
|
@output = File.open(where, 'w')
|
17
18
|
elsif where == STDOUT
|
@@ -22,21 +23,13 @@ module Spec
|
|
22
23
|
else
|
23
24
|
@output = where
|
24
25
|
end
|
25
|
-
@colour = false
|
26
|
-
@dry_run = false
|
27
|
-
@snippet_extractor = SnippetExtractor.new
|
28
26
|
@pending_examples = []
|
29
27
|
end
|
30
28
|
|
31
|
-
def example_pending(
|
32
|
-
@pending_examples << ["#{
|
29
|
+
def example_pending(example_group_description, example, message)
|
30
|
+
@pending_examples << ["#{example_group_description} #{example.description}", message]
|
33
31
|
end
|
34
32
|
|
35
|
-
def colour=(colour)
|
36
|
-
@colour = colour
|
37
|
-
begin ; require 'Win32/Console/ANSI' if @colour && PLATFORM =~ /win32/ ; rescue LoadError ; raise "You must gem install win32console to use colour on Windows" ; end
|
38
|
-
end
|
39
|
-
|
40
33
|
def dump_failure(counter, failure)
|
41
34
|
@output.puts
|
42
35
|
@output.puts "#{counter.to_s})"
|
@@ -56,7 +49,7 @@ module Spec
|
|
56
49
|
end
|
57
50
|
|
58
51
|
def dump_summary(duration, example_count, failure_count, pending_count)
|
59
|
-
return if
|
52
|
+
return if dry_run?
|
60
53
|
@output.puts
|
61
54
|
@output.puts "Finished in #{duration} seconds"
|
62
55
|
@output.puts
|
@@ -74,7 +67,6 @@ module Spec
|
|
74
67
|
@output.puts red(summary)
|
75
68
|
end
|
76
69
|
@output.flush
|
77
|
-
dump_pending
|
78
70
|
end
|
79
71
|
|
80
72
|
def dump_pending
|
@@ -100,13 +92,21 @@ module Spec
|
|
100
92
|
end
|
101
93
|
|
102
94
|
protected
|
103
|
-
|
95
|
+
|
96
|
+
def colour?
|
97
|
+
@options.colour ? true : false
|
98
|
+
end
|
99
|
+
|
100
|
+
def dry_run?
|
101
|
+
@options.dry_run ? true : false
|
102
|
+
end
|
103
|
+
|
104
104
|
def backtrace_line(line)
|
105
105
|
line.sub(/\A([^:]+:\d+)$/, '\\1:')
|
106
106
|
end
|
107
107
|
|
108
108
|
def colour(text, colour_code)
|
109
|
-
return text unless
|
109
|
+
return text unless colour? && output_to_tty?
|
110
110
|
"#{colour_code}#{text}\e[0m"
|
111
111
|
end
|
112
112
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'spec/runner/formatter/base_text_formatter'
|
2
|
+
|
3
|
+
module Spec
|
4
|
+
module Runner
|
5
|
+
module Formatter
|
6
|
+
class FailingExampleGroupsFormatter < BaseTextFormatter
|
7
|
+
def add_example_group(example_group)
|
8
|
+
super
|
9
|
+
@example_group_description_parts = example_group.description_parts
|
10
|
+
end
|
11
|
+
|
12
|
+
def example_failed(example, counter, failure)
|
13
|
+
if @example_group_description_parts
|
14
|
+
description_parts = @example_group_description_parts.collect do |description|
|
15
|
+
description =~ /(.*) \(druby.*\)$/ ? $1 : description
|
16
|
+
end
|
17
|
+
@output.puts ::Spec::Example::ExampleGroupMethods.description_text(*description_parts)
|
18
|
+
@output.flush
|
19
|
+
@example_group_description_parts = nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def dump_failure(counter, failure)
|
24
|
+
end
|
25
|
+
|
26
|
+
def dump_summary(duration, example_count, failure_count, pending_count)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|