rspec 1.1.11 → 1.1.12
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/.autotest +4 -0
- data/History.txt +55 -0
- data/Manifest.txt +102 -122
- data/README.txt +30 -12
- data/Rakefile +10 -10
- data/TODO.txt +10 -2
- data/{failing_examples → examples/failing}/README.txt +0 -0
- data/{failing_examples → examples/failing}/diffing_spec.rb +0 -0
- data/{failing_examples → examples/failing}/failing_autogenerated_docstrings_example.rb +0 -0
- data/{failing_examples/failure_in_teardown.rb → examples/failing/failure_in_after.rb} +1 -1
- data/{failing_examples/failure_in_setup.rb → examples/failing/failure_in_before.rb} +1 -1
- data/{failing_examples → examples/failing}/mocking_example.rb +0 -0
- data/{failing_examples → examples/failing}/mocking_with_flexmock.rb +0 -0
- data/{failing_examples → examples/failing}/mocking_with_mocha.rb +0 -0
- data/{failing_examples → examples/failing}/mocking_with_rr.rb +0 -0
- data/{failing_examples → examples/failing}/partial_mock_example.rb +0 -0
- data/{failing_examples → examples/failing}/predicate_example.rb +5 -0
- data/{failing_examples → examples/failing}/raising_example.rb +0 -0
- data/{failing_examples → examples/failing}/spec_helper.rb +1 -1
- data/{failing_examples → examples/failing}/syntax_error_example.rb +0 -0
- data/{failing_examples → examples/failing}/team_spec.rb +0 -0
- data/{failing_examples → examples/failing}/timeout_behaviour.rb +0 -0
- data/examples/{pure → passing}/autogenerated_docstrings_example.rb +6 -0
- data/examples/{pure → passing}/before_and_after_example.rb +0 -0
- data/examples/{pure → passing}/behave_as_example.rb +0 -0
- data/examples/{pure → passing}/custom_expectation_matchers.rb +0 -0
- data/examples/{pure → passing}/custom_formatter.rb +1 -1
- data/examples/{pure → passing}/dynamic_spec.rb +2 -2
- data/examples/{pure → passing}/file_accessor.rb +0 -0
- data/examples/{pure → passing}/file_accessor_spec.rb +0 -0
- data/examples/{pure → passing}/greeter_spec.rb +0 -0
- data/examples/{pure → passing}/helper_method_example.rb +0 -0
- data/examples/{pure → passing}/io_processor.rb +0 -0
- data/examples/{pure → passing}/io_processor_spec.rb +0 -0
- data/examples/{pure → passing}/legacy_spec.rb +0 -0
- data/examples/{pure → passing}/mocking_example.rb +0 -0
- data/examples/{pure/multi_threaded_behaviour_runner.rb → passing/multi_threaded_example_group_runner.rb} +1 -3
- data/examples/{pure → passing}/nested_classes_example.rb +0 -0
- data/examples/{pure → passing}/partial_mock_example.rb +0 -0
- data/examples/{pure → passing}/pending_example.rb +0 -0
- data/examples/{pure → passing}/predicate_example.rb +0 -0
- data/examples/{pure → passing}/priority.txt +0 -0
- data/examples/{pure → passing}/shared_example_group_example.rb +0 -0
- data/examples/{pure → passing}/shared_stack_examples.rb +1 -3
- data/examples/passing/simple_matcher_example.rb +31 -0
- data/examples/{pure → passing}/spec_helper.rb +0 -0
- data/examples/{pure → passing}/stack.rb +0 -0
- data/examples/{pure → passing}/stack_spec.rb +3 -2
- data/examples/{pure → passing}/stack_spec_with_nested_example_groups.rb +0 -0
- data/examples/{pure → passing}/stubbing_example.rb +0 -0
- data/examples/{pure → passing}/yielding_example.rb +0 -0
- data/examples/ruby1.9.compatibility/access_to_constants_spec.rb +86 -0
- data/features/before_and_after_blocks/before_and_after_blocks.feature +168 -0
- data/{stories/example_groups/autogenerated_docstrings → features/example_groups/autogenerated_docstrings.feature} +5 -5
- data/{stories/example_groups/example_group_with_should_methods → features/example_groups/example_group_with_should_methods.feature} +3 -3
- data/{stories/example_groups/nested_groups → features/example_groups/nested_groups.feature} +4 -4
- data/{stories/example_groups/output → features/example_groups/output.feature} +3 -8
- data/{stories/interop/examples_and_tests_together → features/interop/examples_and_tests_together.feature} +5 -4
- data/features/interop/test_but_not_test_unit.feature +14 -0
- data/{stories/interop/test_case_with_should_methods → features/interop/test_case_with_should_methods.feature} +2 -2
- data/{stories/mock_framework_integration/use_flexmock.story → features/mock_framework_integration/use_flexmock.feature} +1 -1
- data/features/step_definitions/running_rspec.rb +54 -0
- data/features/support/env.rb +26 -0
- data/{stories/resources → features/support}/helpers/cmdline.rb +0 -0
- data/{stories/resources → features/support}/helpers/story_helper.rb +1 -1
- data/{stories/resources → features/support}/matchers/smart_match.rb +0 -0
- data/{plugins → lib/adapters}/mock_frameworks/flexmock.rb +1 -1
- data/{plugins → lib/adapters}/mock_frameworks/mocha.rb +1 -1
- data/{plugins → lib/adapters}/mock_frameworks/rr.rb +1 -1
- data/{plugins → lib/adapters}/mock_frameworks/rspec.rb +2 -2
- data/lib/autotest/rspec.rb +4 -3
- data/lib/spec.rb +2 -27
- data/lib/spec/dsl.rb +1 -0
- data/lib/spec/{extensions → dsl}/main.rb +10 -10
- data/lib/spec/example.rb +175 -1
- data/lib/spec/example/before_and_after_hooks.rb +30 -24
- data/lib/spec/example/example_group.rb +1 -0
- data/lib/spec/example/example_group_factory.rb +26 -9
- data/lib/spec/example/example_group_methods.rb +138 -113
- data/lib/spec/example/example_methods.rb +88 -25
- data/lib/spec/example/shared_example_group.rb +28 -21
- data/lib/spec/expectations.rb +22 -18
- data/lib/spec/expectations/handler.rb +16 -36
- data/lib/spec/interop/test/unit/testcase.rb +19 -17
- data/lib/spec/interop/test/unit/testresult.rb +1 -1
- data/lib/spec/interop/test/unit/testsuite_adapter.rb +1 -1
- data/lib/spec/matchers.rb +7 -28
- data/lib/spec/matchers/be.rb +103 -116
- data/lib/spec/matchers/be_close.rb +6 -22
- data/lib/spec/matchers/eql.rb +7 -25
- data/lib/spec/matchers/equal.rb +7 -25
- data/lib/spec/matchers/errors.rb +5 -0
- data/lib/spec/matchers/exist.rb +8 -14
- data/lib/spec/matchers/generated_descriptions.rb +48 -0
- data/lib/spec/matchers/has.rb +12 -28
- data/lib/spec/matchers/include.rb +12 -9
- data/lib/spec/matchers/match.rb +8 -27
- data/lib/spec/matchers/match_array.rb +79 -0
- data/lib/spec/matchers/method_missing.rb +9 -0
- data/lib/spec/matchers/operator_matcher.rb +39 -48
- data/lib/spec/matchers/raise_error.rb +4 -8
- data/lib/spec/matchers/respond_to.rb +33 -8
- data/lib/spec/matchers/throw_symbol.rb +49 -17
- data/lib/spec/matchers/wrap_expectation.rb +55 -0
- data/lib/spec/mocks/argument_constraints.rb +77 -5
- data/lib/spec/mocks/message_expectation.rb +7 -7
- data/lib/spec/mocks/proxy.rb +14 -12
- data/lib/spec/rake/spectask.rb +4 -6
- data/lib/spec/ruby.rb +9 -0
- data/lib/spec/runner.rb +37 -162
- data/lib/spec/runner/backtrace_tweaker.rb +5 -3
- data/lib/spec/runner/class_and_arguments_parser.rb +7 -9
- data/lib/spec/runner/command_line.rb +6 -8
- data/lib/spec/{example → runner}/configuration.rb +46 -47
- data/lib/spec/runner/example_group_runner.rb +15 -4
- data/lib/spec/runner/formatter/base_text_formatter.rb +4 -3
- data/lib/spec/runner/formatter/html_formatter.rb +14 -11
- data/lib/spec/runner/formatter/nested_text_formatter.rb +2 -2
- data/lib/spec/runner/heckle_runner.rb +58 -56
- data/lib/spec/runner/option_parser.rb +8 -4
- data/lib/spec/runner/options.rb +29 -14
- data/lib/spec/runner/reporter.rb +1 -1
- data/lib/spec/runner/spec_parser.rb +11 -9
- data/lib/spec/story/runner.rb +40 -42
- data/lib/spec/story/runner/story_runner.rb +10 -6
- data/lib/spec/story/world.rb +66 -70
- data/lib/spec/version.rb +4 -2
- data/{rake_tasks → resources/rake}/examples.rake +0 -0
- data/{rake_tasks → resources/rake}/examples_with_rcov.rake +0 -0
- data/{rake_tasks → resources/rake}/failing_examples_with_html.rake +0 -0
- data/{rake_tasks → resources/rake}/verify_rcov.rake +0 -0
- data/{stories/resources → resources}/spec/example_group_with_should_methods.rb +1 -1
- data/{stories/resources → resources}/spec/simple_spec.rb +1 -1
- data/resources/spec/spec_with_flexmock.rb +19 -0
- data/{stories/resources → resources}/test/spec_and_test_together.rb +1 -1
- data/resources/test/spec_including_test_but_not_unit.rb +11 -0
- data/{stories/resources → resources}/test/test_case_with_should_methods.rb +2 -2
- data/rspec.gemspec +16 -6
- data/spec/autotest/autotest_helper.rb +2 -2
- data/spec/autotest/discover_spec.rb +4 -15
- data/spec/autotest/failed_results_re_spec.rb +24 -0
- data/spec/autotest/rspec_spec.rb +2 -38
- data/spec/spec/dsl/main_spec.rb +88 -0
- data/spec/spec/example/example_group_class_definition_spec.rb +6 -2
- data/spec/spec/example/example_group_factory_spec.rb +50 -10
- data/spec/spec/example/example_group_methods_spec.rb +210 -160
- data/spec/spec/example/example_group_spec.rb +44 -52
- data/spec/spec/example/example_matcher_spec.rb +6 -23
- data/spec/spec/example/example_methods_spec.rb +176 -54
- data/spec/spec/example/helper_method_spec.rb +24 -0
- data/spec/spec/example/pending_module_spec.rb +2 -8
- data/spec/spec/example/shared_example_group_spec.rb +56 -80
- data/spec/spec/expectations/extensions/object_spec.rb +0 -50
- data/spec/spec/expectations/wrap_expectation_spec.rb +30 -0
- data/spec/spec/interop/test/unit/spec_spec.rb +1 -5
- data/spec/spec/interop/test/unit/test_unit_spec_helper.rb +4 -0
- data/spec/spec/matchers/be_close_spec.rb +12 -10
- data/spec/spec/matchers/be_spec.rb +62 -7
- data/spec/spec/matchers/description_generation_spec.rb +19 -0
- data/spec/spec/matchers/eql_spec.rb +7 -6
- data/spec/spec/matchers/equal_spec.rb +7 -6
- data/spec/spec/matchers/handler_spec.rb +4 -43
- data/spec/spec/matchers/has_spec.rb +1 -1
- data/spec/spec/matchers/have_spec.rb +23 -18
- data/spec/spec/matchers/include_spec.rb +24 -0
- data/spec/spec/matchers/match_array_spec.rb +83 -0
- data/spec/spec/matchers/matcher_methods_spec.rb +1 -13
- data/spec/spec/matchers/raise_error_spec.rb +18 -0
- data/spec/spec/matchers/respond_to_spec.rb +71 -9
- data/spec/spec/matchers/throw_symbol_spec.rb +85 -43
- data/spec/spec/mocks/bug_report_11545_spec.rb +4 -5
- data/spec/spec/mocks/bug_report_496.rb +11 -9
- data/spec/spec/mocks/bug_report_600_spec.rb +22 -0
- data/spec/spec/mocks/hash_including_matcher_spec.rb +39 -2
- data/spec/spec/mocks/hash_not_including_matcher_spec.rb +67 -0
- data/spec/spec/mocks/mock_spec.rb +5 -6
- data/spec/spec/mocks/nil_expectation_warning_spec.rb +2 -2
- data/spec/spec/mocks/passing_mock_argument_constraints_spec.rb +18 -3
- data/spec/spec/mocks/stub_spec.rb +6 -0
- data/spec/spec/mocks/stubbed_message_expectations_spec.rb +14 -0
- data/spec/spec/runner/command_line_spec.rb +4 -4
- data/spec/spec/runner/configuration_spec.rb +301 -0
- data/spec/spec/runner/drb_command_line_spec.rb +4 -4
- data/spec/spec/runner/example_group_runner_spec.rb +33 -0
- data/spec/spec/runner/formatter/base_formatter_spec.rb +13 -102
- data/spec/spec/runner/formatter/base_text_formatter_spec.rb +23 -0
- data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +5 -5
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +3 -3
- data/spec/spec/runner/formatter/html_formatted-1.8.4.html +6 -6
- data/spec/spec/runner/formatter/html_formatted-1.8.5-jruby.html +9 -9
- data/spec/spec/runner/formatter/html_formatted-1.8.5.html +6 -6
- data/spec/spec/runner/formatter/html_formatted-1.8.6-jruby.html +10 -10
- data/spec/spec/runner/formatter/html_formatted-1.8.6.html +39 -30
- data/spec/spec/runner/formatter/html_formatted-1.8.7.html +379 -0
- data/spec/spec/runner/formatter/html_formatted-1.9.1.html +379 -0
- data/spec/spec/runner/formatter/html_formatter_spec.rb +14 -13
- data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +5 -5
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +7 -17
- data/spec/spec/runner/formatter/spec_mate_formatter_spec.rb +18 -17
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +5 -5
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.4.html +6 -6
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +33 -30
- data/spec/spec/runner/formatter/text_mate_formatted-1.8.7.html +373 -0
- data/spec/spec/runner/formatter/text_mate_formatted-1.9.1.html +373 -0
- data/spec/spec/runner/heckler_spec.rb +16 -9
- data/spec/spec/runner/option_parser_spec.rb +3 -18
- data/spec/spec/runner/options_spec.rb +27 -8
- data/spec/spec/runner/reporter_spec.rb +5 -5
- data/spec/spec/runner/resources/custom_example_group_runner.rb +14 -0
- data/spec/spec/runner/resources/utf8_encoded.rb +7 -0
- data/spec/spec/runner/spec_parser_spec.rb +85 -79
- data/spec/spec/spec_spec.rb +21 -0
- data/spec/spec_helper.rb +9 -1
- data/story_server/prototype/javascripts/prototype.js +1 -1
- metadata +119 -131
- data/examples/stories/adder.rb +0 -13
- data/examples/stories/addition +0 -34
- data/examples/stories/addition.rb +0 -9
- data/examples/stories/calculator.rb +0 -65
- data/examples/stories/game-of-life/.loadpath +0 -5
- data/examples/stories/game-of-life/README.txt +0 -21
- data/examples/stories/game-of-life/behaviour/everything.rb +0 -6
- data/examples/stories/game-of-life/behaviour/examples/examples.rb +0 -3
- data/examples/stories/game-of-life/behaviour/examples/game_behaviour.rb +0 -35
- data/examples/stories/game-of-life/behaviour/examples/grid_behaviour.rb +0 -66
- data/examples/stories/game-of-life/behaviour/stories/CellsWithLessThanTwoNeighboursDie.story +0 -21
- data/examples/stories/game-of-life/behaviour/stories/CellsWithMoreThanThreeNeighboursDie.story +0 -21
- data/examples/stories/game-of-life/behaviour/stories/EmptySpacesWithThreeNeighboursCreateACell.story +0 -42
- data/examples/stories/game-of-life/behaviour/stories/ICanCreateACell.story +0 -42
- data/examples/stories/game-of-life/behaviour/stories/ICanKillACell.story +0 -17
- data/examples/stories/game-of-life/behaviour/stories/TheGridWraps.story +0 -53
- data/examples/stories/game-of-life/behaviour/stories/create_a_cell.rb +0 -52
- data/examples/stories/game-of-life/behaviour/stories/helper.rb +0 -6
- data/examples/stories/game-of-life/behaviour/stories/kill_a_cell.rb +0 -26
- data/examples/stories/game-of-life/behaviour/stories/steps.rb +0 -5
- data/examples/stories/game-of-life/behaviour/stories/stories.rb +0 -3
- data/examples/stories/game-of-life/behaviour/stories/stories.txt +0 -22
- data/examples/stories/game-of-life/life.rb +0 -3
- data/examples/stories/game-of-life/life/game.rb +0 -23
- data/examples/stories/game-of-life/life/grid.rb +0 -43
- data/examples/stories/helper.rb +0 -9
- data/examples/stories/steps/addition_steps.rb +0 -18
- data/lib/spec/adapters.rb +0 -1
- data/lib/spec/adapters/ruby_engine.rb +0 -26
- data/lib/spec/adapters/ruby_engine/mri.rb +0 -8
- data/lib/spec/adapters/ruby_engine/rubinius.rb +0 -8
- data/lib/spec/extensions.rb +0 -4
- data/lib/spec/extensions/class.rb +0 -24
- data/lib/spec/extensions/metaclass.rb +0 -7
- data/lib/spec/extensions/object.rb +0 -6
- data/spec/spec/adapters/ruby_engine_spec.rb +0 -16
- data/spec/spec/example/configuration_spec.rb +0 -296
- data/spec/spec/example/example_runner_spec.rb +0 -194
- data/spec/spec/extensions/main_spec.rb +0 -71
- data/stories/all.rb +0 -5
- data/stories/configuration/before_blocks.story +0 -21
- data/stories/configuration/stories.rb +0 -7
- data/stories/example_groups/stories.rb +0 -7
- data/stories/helper.rb +0 -6
- data/stories/interop/stories.rb +0 -7
- data/stories/mock_framework_integration/stories.rb +0 -7
- data/stories/pending_stories/README +0 -3
- data/stories/resources/spec/before_blocks_example.rb +0 -32
- data/stories/resources/spec/spec_with_flexmock.rb +0 -18
- data/stories/resources/steps/running_rspec.rb +0 -50
- data/stories/resources/stories/failing_story.rb +0 -15
- data/stories/stories/multiline_steps.story +0 -23
- data/stories/stories/steps/multiline_steps.rb +0 -13
- data/stories/stories/stories.rb +0 -6
@@ -1,11 +1,11 @@
|
|
1
|
-
|
1
|
+
Feature: autogenerated docstrings
|
2
2
|
|
3
3
|
As an RSpec user
|
4
4
|
I want examples to generate their own names
|
5
5
|
So that I can reduce duplication between example names and example code
|
6
6
|
|
7
7
|
Scenario: run passing examples with ruby
|
8
|
-
Given the file ../../examples/
|
8
|
+
Given the file ../../examples/passing/autogenerated_docstrings_example.rb
|
9
9
|
|
10
10
|
When I run it with the ruby interpreter -fs
|
11
11
|
|
@@ -15,7 +15,7 @@ Story: autogenerated docstrings
|
|
15
15
|
And the stdout should match /should respond to #size/
|
16
16
|
|
17
17
|
Scenario: run failing examples with ruby
|
18
|
-
Given the file ../../
|
18
|
+
Given the file ../../examples/failing/failing_autogenerated_docstrings_example.rb
|
19
19
|
|
20
20
|
When I run it with the ruby interpreter -fs
|
21
21
|
|
@@ -25,7 +25,7 @@ Story: autogenerated docstrings
|
|
25
25
|
And the stdout should match /should not respond to #size/
|
26
26
|
|
27
27
|
Scenario: run passing examples with spec
|
28
|
-
Given the file ../../examples/
|
28
|
+
Given the file ../../examples/passing/autogenerated_docstrings_example.rb
|
29
29
|
|
30
30
|
When I run it with the spec script -fs
|
31
31
|
|
@@ -35,7 +35,7 @@ Story: autogenerated docstrings
|
|
35
35
|
And the stdout should match /should respond to #size/
|
36
36
|
|
37
37
|
Scenario: run failing examples with spec
|
38
|
-
Given the file ../../
|
38
|
+
Given the file ../../examples/failing/failing_autogenerated_docstrings_example.rb
|
39
39
|
|
40
40
|
When I run it with the spec script -fs
|
41
41
|
|
@@ -1,17 +1,17 @@
|
|
1
|
-
|
1
|
+
Feature: Spec::ExampleGroup with should methods
|
2
2
|
|
3
3
|
As an RSpec adopter accustomed to classes and methods
|
4
4
|
I want to use should_* methods in an ExampleGroup
|
5
5
|
So that I use RSpec with classes and methods that look more like RSpec examples
|
6
6
|
|
7
7
|
Scenario: Run with ruby
|
8
|
-
Given the file spec/example_group_with_should_methods.rb
|
8
|
+
Given the file ../../resources/spec/example_group_with_should_methods.rb
|
9
9
|
When I run it with the ruby interpreter
|
10
10
|
Then the exit code should be 256
|
11
11
|
And the stdout should match "2 examples, 1 failure"
|
12
12
|
|
13
13
|
Scenario: Run with spec
|
14
|
-
Given the file spec/example_group_with_should_methods.rb
|
14
|
+
Given the file ../../resources/spec/example_group_with_should_methods.rb
|
15
15
|
When I run it with the spec script
|
16
16
|
Then the exit code should be 256
|
17
17
|
And the stdout should match "2 examples, 1 failure"
|
@@ -1,17 +1,17 @@
|
|
1
|
-
|
1
|
+
Feature: Nested example groups
|
2
2
|
|
3
3
|
As an RSpec user
|
4
4
|
I want to nest examples groups
|
5
5
|
So that I can better organize my examples
|
6
6
|
|
7
7
|
Scenario: Run with ruby
|
8
|
-
Given the file ../../examples/
|
8
|
+
Given the file ../../examples/passing/stack_spec_with_nested_example_groups.rb
|
9
9
|
When I run it with the ruby interpreter -fs
|
10
10
|
Then the stdout should match /Stack \(empty\)/
|
11
11
|
And the stdout should match /Stack \(full\)/
|
12
12
|
|
13
|
-
Scenario: Run with
|
14
|
-
Given the file ../../examples/
|
13
|
+
Scenario: Run with spec
|
14
|
+
Given the file ../../examples/passing/stack_spec_with_nested_example_groups.rb
|
15
15
|
When I run it with the spec script -fs
|
16
16
|
Then the stdout should match /Stack \(empty\)/
|
17
17
|
And the stdout should match /Stack \(full\)/
|
@@ -1,25 +1,20 @@
|
|
1
|
-
|
1
|
+
Feature: Getting correct output
|
2
2
|
|
3
3
|
As an RSpec user
|
4
4
|
I want to see output only once
|
5
5
|
So that I don't get confused
|
6
6
|
|
7
7
|
Scenario: Run with ruby
|
8
|
-
Given the file spec/simple_spec.rb
|
8
|
+
Given the file ../../resources/spec/simple_spec.rb
|
9
9
|
When I run it with the ruby interpreter
|
10
10
|
Then the exit code should be 0
|
11
11
|
And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m
|
12
12
|
And the stdout should match "1 example, 0 failures"
|
13
13
|
|
14
14
|
Scenario: Run with CommandLine object
|
15
|
-
Given the file spec/simple_spec.rb
|
15
|
+
Given the file ../../resources/spec/simple_spec.rb
|
16
16
|
When I run it with the CommandLine object
|
17
17
|
Then the exit code should be 0
|
18
18
|
And the stdout should not match "Loaded suite"
|
19
19
|
And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m
|
20
20
|
And the stdout should match "1 example, 0 failures"
|
21
|
-
|
22
|
-
Scenario: Tweak backtrace
|
23
|
-
Given the file stories/failing_story.rb
|
24
|
-
When I run it with the ruby interpreter
|
25
|
-
Then the stdout should not match /\/lib\/spec\//
|
@@ -1,11 +1,11 @@
|
|
1
|
-
|
1
|
+
Feature: Spec and test together
|
2
2
|
|
3
3
|
As an RSpec adopter with existing Test::Unit tests
|
4
4
|
I want to run a few specs alongside my existing Test::Unit tests
|
5
5
|
So that I can experience a smooth, gradual migration path
|
6
6
|
|
7
7
|
Scenario: Run with ruby
|
8
|
-
Given the file test/spec_and_test_together.rb
|
8
|
+
Given the file ../../resources/test/spec_and_test_together.rb
|
9
9
|
|
10
10
|
When I run it with the ruby interpreter -fs
|
11
11
|
|
@@ -16,13 +16,14 @@ Story: Spec and test together
|
|
16
16
|
And the stdout should match "10 examples, 6 failures"
|
17
17
|
And the stdout should match /expected: 40,\s*got: 4/m
|
18
18
|
And the stdout should match /expected: 50,\s*got: 5/m
|
19
|
+
|
19
20
|
Scenario: Run with spec
|
20
|
-
Given the file test/spec_and_test_together.rb
|
21
|
+
Given the file ../../resources/test/spec_and_test_together.rb
|
21
22
|
|
22
23
|
When I run it with the spec script -fs
|
23
24
|
|
24
25
|
Then the exit code should be 256
|
25
|
-
|
26
|
+
And the stdout should match "ATest"
|
26
27
|
And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'"
|
27
28
|
And the stdout should match "'An Example should fail with should' FAILED"
|
28
29
|
And the stdout should match "10 examples, 6 failures"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
Story: Test is defined, but not Test::Unit
|
2
|
+
|
3
|
+
As an RSpec user who has my own library named Test (but not Test::Unit)
|
4
|
+
I want to run examples without getting Test::Unit NameErrors
|
5
|
+
|
6
|
+
Scenario: Run with ruby
|
7
|
+
Given the file ../../resources/test/spec_including_test_but_not_unit.rb
|
8
|
+
When I run it with the ruby interpreter
|
9
|
+
Then the stderr should not match "Test::Unit"
|
10
|
+
|
11
|
+
Scenario: Run with spec
|
12
|
+
Given the file ../../resources/test/spec_including_test_but_not_unit.rb
|
13
|
+
When I run it with the spec script
|
14
|
+
Then the stderr should not match "Test::Unit"
|
@@ -5,13 +5,13 @@ Story: Test::Unit::TestCase extended by rspec with should methods
|
|
5
5
|
So that I use RSpec with classes and methods that look more like RSpec examples
|
6
6
|
|
7
7
|
Scenario: Run with ruby
|
8
|
-
Given the file test/test_case_with_should_methods.rb
|
8
|
+
Given the file ../../resources/test/test_case_with_should_methods.rb
|
9
9
|
When I run it with the ruby interpreter
|
10
10
|
Then the exit code should be 256
|
11
11
|
And the stdout should match "5 examples, 3 failures"
|
12
12
|
|
13
13
|
Scenario: Run with spec
|
14
|
-
Given the file test/test_case_with_should_methods.rb
|
14
|
+
Given the file ../../resources/test/test_case_with_should_methods.rb
|
15
15
|
When I run it with the spec script
|
16
16
|
Then the exit code should be 256
|
17
17
|
And the stdout should match "5 examples, 3 failures"
|
@@ -4,6 +4,6 @@ Story: Getting correct output with flexmock
|
|
4
4
|
I want to be able to use flexmock without rspec mocks interfering
|
5
5
|
|
6
6
|
Scenario: Mock with flexmock
|
7
|
-
Given the file spec/spec_with_flexmock.rb
|
7
|
+
Given the file ../../resources/spec/spec_with_flexmock.rb
|
8
8
|
When I run it with the ruby interpreter
|
9
9
|
Then the exit code should be 0
|
@@ -0,0 +1,54 @@
|
|
1
|
+
Given /^the file (.*)$/ do |relative_path|
|
2
|
+
@path = File.expand_path(File.join(File.dirname(__FILE__), "..", "support", relative_path))
|
3
|
+
unless File.exist?(@path)
|
4
|
+
raise "could not find file at #{@path}"
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
Given /^the following spec:$/ do |spec|
|
9
|
+
@path = "/tmp/example_spec.rb"
|
10
|
+
File.open(@path, "w") do |f|
|
11
|
+
f.write spec
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
When /^I run it with the (.*)$/ do |interpreter|
|
16
|
+
stderr_file = Tempfile.new('rspec')
|
17
|
+
stderr_file.close
|
18
|
+
@stdout = case(interpreter)
|
19
|
+
when /^ruby interpreter/
|
20
|
+
args = interpreter.gsub('ruby interpreter','')
|
21
|
+
ruby("#{@path}#{args}", stderr_file.path)
|
22
|
+
when /^spec script/
|
23
|
+
args = interpreter.gsub('spec script','')
|
24
|
+
spec("#{@path}#{args}", stderr_file.path)
|
25
|
+
when 'CommandLine object' then cmdline(@path, stderr_file.path)
|
26
|
+
else raise "Unknown interpreter: #{interpreter}"
|
27
|
+
end
|
28
|
+
@stderr = IO.read(stderr_file.path)
|
29
|
+
@exit_code = $?.to_i
|
30
|
+
end
|
31
|
+
|
32
|
+
Then /^the (.*) should match (.*)$/ do |stream, string_or_regex|
|
33
|
+
written = case(stream)
|
34
|
+
when 'stdout' then @stdout
|
35
|
+
when 'stderr' then @stderr
|
36
|
+
else raise "Unknown stream: #{stream}"
|
37
|
+
end
|
38
|
+
written.should smart_match(string_or_regex)
|
39
|
+
end
|
40
|
+
|
41
|
+
Then /^the (.*) should not match (.*)$/ do |stream, string_or_regex|
|
42
|
+
written = case(stream)
|
43
|
+
when 'stdout' then @stdout
|
44
|
+
when 'stderr' then @stderr
|
45
|
+
else raise "Unknown stream: #{stream}"
|
46
|
+
end
|
47
|
+
written.should_not smart_match(string_or_regex)
|
48
|
+
end
|
49
|
+
|
50
|
+
Then /^the exit code should be (\d+)$/ do |exit_code|
|
51
|
+
if @exit_code != exit_code.to_i
|
52
|
+
raise "Did not exit with #{exit_code}, but with #{@exit_code}. Standard error:\n#{@stderr}"
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require File.dirname(__FILE__) + '/../../spec/ruby_forker'
|
3
|
+
require File.dirname(__FILE__) + '/matchers/smart_match'
|
4
|
+
|
5
|
+
$:.push File.join(File.dirname(__FILE__), "/../../lib")
|
6
|
+
require 'spec/expectations'
|
7
|
+
require 'spec/matchers'
|
8
|
+
|
9
|
+
module RspecWorld
|
10
|
+
include Spec::Expectations
|
11
|
+
include Spec::Matchers
|
12
|
+
include RubyForker
|
13
|
+
|
14
|
+
def spec(args, stderr)
|
15
|
+
ruby("#{File.dirname(__FILE__) + '/../../bin/spec'} #{args}", stderr)
|
16
|
+
end
|
17
|
+
|
18
|
+
def cmdline(args, stderr)
|
19
|
+
ruby("#{File.dirname(__FILE__) + '/helpers/cmdline.rb'} #{args}", stderr)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
World do |world|
|
24
|
+
world.extend(RspecWorld)
|
25
|
+
world
|
26
|
+
end
|
File without changes
|
File without changes
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "spec", "mocks"))
|
2
2
|
require 'spec/mocks/framework'
|
3
3
|
require 'spec/mocks/extensions'
|
4
4
|
|
5
5
|
module Spec
|
6
|
-
module
|
6
|
+
module Adapters
|
7
7
|
module MockFramework
|
8
8
|
include Spec::Mocks::ExampleMethods
|
9
9
|
def setup_mocks_for_rspec
|
data/lib/autotest/rspec.rb
CHANGED
@@ -21,14 +21,14 @@ class Autotest::Rspec < Autotest
|
|
21
21
|
|
22
22
|
def initialize
|
23
23
|
super
|
24
|
-
self.failed_results_re = /^\d+\)\n(?:\e\[\d*m)?(?:.*?
|
24
|
+
self.failed_results_re = /^\d+\)\n(?:\e\[\d*m)?(?:.*?in )?'([^\n]*)'(?: FAILED)?(?:\e\[\d*m)?\n(.*?)\n\n/m
|
25
25
|
self.completed_re = /\n(?:\e\[\d*m)?\d* examples?/m
|
26
26
|
end
|
27
27
|
|
28
28
|
def consolidate_failures(failed)
|
29
29
|
filters = new_hash_of_arrays
|
30
30
|
failed.each do |spec, trace|
|
31
|
-
if trace =~ /\n(\.\/)?(.*spec\.rb):[\d]
|
31
|
+
if trace =~ /\n(\.\/)?(.*spec\.rb):[\d]+:/
|
32
32
|
filters[$2] << spec
|
33
33
|
end
|
34
34
|
end
|
@@ -37,7 +37,8 @@ class Autotest::Rspec < Autotest
|
|
37
37
|
|
38
38
|
def make_test_cmd(files_to_test)
|
39
39
|
return '' if files_to_test.empty?
|
40
|
-
|
40
|
+
spec_program = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'bin', 'spec'))
|
41
|
+
return "#{ruby} #{spec_program} #{files_to_test.keys.flatten.join(' ')} #{add_options_if_present}"
|
41
42
|
end
|
42
43
|
|
43
44
|
def add_options_if_present # :nodoc:
|
data/lib/spec.rb
CHANGED
@@ -1,32 +1,7 @@
|
|
1
1
|
require 'spec/matchers'
|
2
2
|
require 'spec/expectations'
|
3
3
|
require 'spec/example'
|
4
|
-
require 'spec/extensions'
|
5
4
|
require 'spec/runner'
|
6
|
-
require 'spec/adapters'
|
7
5
|
require 'spec/version'
|
8
|
-
|
9
|
-
|
10
|
-
require 'spec/interop/test'
|
11
|
-
end
|
12
|
-
|
13
|
-
module Spec
|
14
|
-
class << self
|
15
|
-
def run?
|
16
|
-
Runner.options.examples_run?
|
17
|
-
end
|
18
|
-
|
19
|
-
def run
|
20
|
-
return true if run?
|
21
|
-
Runner.options.run_examples
|
22
|
-
end
|
23
|
-
|
24
|
-
def exit?
|
25
|
-
!Object.const_defined?(:Test) || Test::Unit.run?
|
26
|
-
end
|
27
|
-
|
28
|
-
def spec_command?
|
29
|
-
$0.split('/').last == 'spec'
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
6
|
+
require 'spec/dsl'
|
7
|
+
require 'spec/ruby'
|
data/lib/spec/dsl.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'spec/dsl/main'
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Spec
|
2
|
-
module
|
2
|
+
module DSL
|
3
3
|
module Main
|
4
4
|
# Creates and returns a class that includes the ExampleGroupMethods
|
5
5
|
# module. Which ExampleGroup type is created depends on the directory of the file
|
@@ -20,10 +20,8 @@ module Spec
|
|
20
20
|
# register special implementations.
|
21
21
|
#
|
22
22
|
def describe(*args, &block)
|
23
|
-
|
24
|
-
|
25
|
-
args << {} unless Hash === args.last
|
26
|
-
args.last[:spec_path] = File.expand_path(caller(0)[1])
|
23
|
+
Spec::Example::add_spec_path_to(args)
|
24
|
+
Spec::Example::ExampleGroupFactory.assign_scope(self, args)
|
27
25
|
Spec::Example::ExampleGroupFactory.create_example_group(*args, &block)
|
28
26
|
end
|
29
27
|
alias :context :describe
|
@@ -43,10 +41,10 @@ module Spec
|
|
43
41
|
# ...
|
44
42
|
# end
|
45
43
|
# end
|
46
|
-
def share_examples_for(
|
47
|
-
|
44
|
+
def share_examples_for(*args, &block)
|
45
|
+
Spec::Example::add_spec_path_to(args)
|
46
|
+
Spec::Example::ExampleGroupFactory.create_shared_example_group(*args, &block)
|
48
47
|
end
|
49
|
-
|
50
48
|
alias :shared_examples_for :share_examples_for
|
51
49
|
|
52
50
|
# Creates a Shared Example Group and assigns it to a constant
|
@@ -75,7 +73,9 @@ module Spec
|
|
75
73
|
# end
|
76
74
|
def share_as(name, &block)
|
77
75
|
begin
|
78
|
-
|
76
|
+
args = [name]
|
77
|
+
Spec::Example::add_spec_path_to(args)
|
78
|
+
Object.const_set(name, Spec::Example::ExampleGroupFactory.create_shared_example_group(*args, &block))
|
79
79
|
rescue NameError => e
|
80
80
|
raise NameError.new(e.message + "\nThe first argument to share_as must be a legal name for a constant\n")
|
81
81
|
end
|
@@ -84,4 +84,4 @@ module Spec
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
-
include Spec::
|
87
|
+
include Spec::DSL::Main
|
data/lib/spec/example.rb
CHANGED
@@ -1,3 +1,177 @@
|
|
1
|
+
module Spec
|
2
|
+
# == Example Groups and Code Examples
|
3
|
+
#
|
4
|
+
# A Code Example is an executable example of how a bit of code is expected
|
5
|
+
# to behave.
|
6
|
+
#
|
7
|
+
# An Example Group is a group of code examples.
|
8
|
+
#
|
9
|
+
# RSpec exposes a DSL to describe groups of examples.
|
10
|
+
#
|
11
|
+
# describe Account do
|
12
|
+
# it "should have a balance of $0" do
|
13
|
+
# account = Account.new
|
14
|
+
# account.balance.should == Money.new(0, :dollars)
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# == Before and After
|
19
|
+
#
|
20
|
+
# You can use the <tt>before()</tt> and <tt>after()</tt> methods to extract
|
21
|
+
# common code within an Example Group. Both methods take an optional scope
|
22
|
+
# argument so you can run the block before :each example or before :all
|
23
|
+
# examples
|
24
|
+
#
|
25
|
+
# describe "..." do
|
26
|
+
# before :all do
|
27
|
+
# ...
|
28
|
+
# end
|
29
|
+
#
|
30
|
+
# before :each do
|
31
|
+
# ...
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# it "should do something" do
|
35
|
+
# ...
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# it "should do something else" do
|
39
|
+
# ...
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
# after :each do
|
43
|
+
# ...
|
44
|
+
# end
|
45
|
+
#
|
46
|
+
# after :all do
|
47
|
+
# ...
|
48
|
+
# end
|
49
|
+
#
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# The <tt>before :each</tt> block will run before each of the examples, once
|
53
|
+
# for each example. Likewise, the <tt>after :each</tt> block will run after
|
54
|
+
# each of the examples.
|
55
|
+
#
|
56
|
+
# It is also possible to specify a <tt>before :all</tt> and <tt>after
|
57
|
+
# :all</tt> block that will run only once for each example group, before the
|
58
|
+
# first <code>before :each</code> and after the last <code>after
|
59
|
+
# :each</code> respectively. The use of these is generally discouraged,
|
60
|
+
# because it introduces dependencies between the examples. Still, it might
|
61
|
+
# prove useful for very expensive operations if you know what you are doing.
|
62
|
+
#
|
63
|
+
# == Local helper methods
|
64
|
+
#
|
65
|
+
# You can include local helper methods by simply expressing them within an
|
66
|
+
# example group:
|
67
|
+
#
|
68
|
+
# describe "..." do
|
69
|
+
#
|
70
|
+
# it "..." do
|
71
|
+
# helper_method
|
72
|
+
# end
|
73
|
+
#
|
74
|
+
# def helper_method
|
75
|
+
# ...
|
76
|
+
# end
|
77
|
+
#
|
78
|
+
# end
|
79
|
+
#
|
80
|
+
# == Included helper methods
|
81
|
+
#
|
82
|
+
# You can include helper methods in multiple example groups by expressing
|
83
|
+
# them within a module, and then including that module in your example
|
84
|
+
# groups:
|
85
|
+
#
|
86
|
+
# module AccountExampleHelperMethods
|
87
|
+
# def helper_method
|
88
|
+
# ...
|
89
|
+
# end
|
90
|
+
# end
|
91
|
+
#
|
92
|
+
# describe "A new account" do
|
93
|
+
# include AccountExampleHelperMethods
|
94
|
+
# before do
|
95
|
+
# @account = Account.new
|
96
|
+
# end
|
97
|
+
#
|
98
|
+
# it "should have a balance of $0" do
|
99
|
+
# helper_method
|
100
|
+
# @account.balance.should eql(Money.new(0, :dollars))
|
101
|
+
# end
|
102
|
+
# end
|
103
|
+
#
|
104
|
+
# == Shared Example Groups
|
105
|
+
#
|
106
|
+
# You can define a shared example group, that may be used on other groups
|
107
|
+
#
|
108
|
+
# share_examples_for "All Editions" do
|
109
|
+
# it "all editions behaviour" ...
|
110
|
+
# end
|
111
|
+
#
|
112
|
+
# describe SmallEdition do
|
113
|
+
# it_should_behave_like "All Editions"
|
114
|
+
#
|
115
|
+
# it "should do small edition stuff" do
|
116
|
+
# ...
|
117
|
+
# end
|
118
|
+
# end
|
119
|
+
#
|
120
|
+
# You can also assign the shared group to a module and include that
|
121
|
+
#
|
122
|
+
# share_as :AllEditions do
|
123
|
+
# it "should do all editions stuff" ...
|
124
|
+
# end
|
125
|
+
#
|
126
|
+
# describe SmallEdition do
|
127
|
+
# it_should_behave_like AllEditions
|
128
|
+
#
|
129
|
+
# it "should do small edition stuff" do
|
130
|
+
# ...
|
131
|
+
# end
|
132
|
+
# end
|
133
|
+
#
|
134
|
+
# And, for those of you who prefer to use something more like Ruby, you can
|
135
|
+
# just include the module directly
|
136
|
+
#
|
137
|
+
# describe SmallEdition do
|
138
|
+
# include AllEditions
|
139
|
+
#
|
140
|
+
# it "should do small edition stuff" do
|
141
|
+
# ...
|
142
|
+
# end
|
143
|
+
# end
|
144
|
+
module Example
|
145
|
+
class << self
|
146
|
+
def args_and_options(*args) # :nodoc:
|
147
|
+
with_options_from(args) do |options|
|
148
|
+
return args, options
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def scope_from(*args) # :nodoc:
|
153
|
+
args[0] || :each
|
154
|
+
end
|
155
|
+
|
156
|
+
def scope_and_options(*args) # :nodoc:
|
157
|
+
args, options = args_and_options(*args)
|
158
|
+
return scope_from(*args), options
|
159
|
+
end
|
160
|
+
|
161
|
+
def add_spec_path_to(args) # :nodoc:
|
162
|
+
args << {} unless Hash === args.last
|
163
|
+
args.last[:spec_path] ||= caller(0)[2]
|
164
|
+
end
|
165
|
+
|
166
|
+
private
|
167
|
+
|
168
|
+
def with_options_from(args)
|
169
|
+
yield Hash === args.last ? args.pop : {} if block_given?
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
1
175
|
require 'timeout'
|
2
176
|
require 'spec/example/before_and_after_hooks'
|
3
177
|
require 'spec/example/pending'
|
@@ -8,5 +182,5 @@ require 'spec/example/example_group'
|
|
8
182
|
require 'spec/example/shared_example_group'
|
9
183
|
require 'spec/example/example_group_factory'
|
10
184
|
require 'spec/example/errors'
|
11
|
-
require 'spec/example/configuration'
|
12
185
|
require 'spec/example/example_matcher'
|
186
|
+
|