rspec 1.2.2 → 1.2.3

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.
Files changed (138) hide show
  1. data/History.rdoc +31 -1
  2. data/Manifest.txt +14 -12
  3. data/Rakefile +1 -1
  4. data/Upgrade.rdoc +43 -3
  5. data/examples/failing/failing_implicit_docstrings_example.rb +5 -5
  6. data/examples/passing/implicit_docstrings_example.rb +3 -3
  7. data/features/before_and_after_blocks/before_and_after_blocks.feature +20 -21
  8. data/features/example_groups/example_group_with_should_methods.feature +20 -8
  9. data/features/example_groups/implicit_docstrings.feature +36 -20
  10. data/features/example_groups/nested_groups.feature +25 -10
  11. data/features/extensions/custom_example_group.feature +19 -0
  12. data/features/formatters/custom_formatter.feature +30 -0
  13. data/features/heckle/heckle.feature +7 -7
  14. data/features/interop/examples_and_tests_together.feature +63 -14
  15. data/features/interop/rspec_output.feature +25 -0
  16. data/features/interop/test_but_not_test_unit.feature +19 -7
  17. data/features/interop/test_case_with_should_methods.feature +37 -8
  18. data/features/matchers/{create_matcher.feature → define_matcher.feature} +54 -30
  19. data/features/matchers/{create_matcher_outside_rspec.feature → define_matcher_outside_rspec.feature} +7 -7
  20. data/features/mock_framework_integration/use_flexmock.feature +3 -3
  21. data/features/mock_framework_integration/use_mocha.feature +3 -3
  22. data/features/mock_framework_integration/use_rr.feature +3 -3
  23. data/features/mocks/mix_stubs_and_mocks.feature +4 -4
  24. data/features/pending/pending_examples.feature +18 -18
  25. data/features/runner/specify_line_number.feature +32 -0
  26. data/features/step_definitions/running_rspec_steps.rb +41 -0
  27. data/features/subject/explicit_subject.feature +4 -4
  28. data/features/subject/implicit_subject.feature +4 -4
  29. data/features/support/env.rb +64 -11
  30. data/features/support/matchers/smart_match.rb +10 -35
  31. data/lib/spec.rb +1 -0
  32. data/lib/spec/deprecation.rb +40 -0
  33. data/lib/spec/dsl/main.rb +10 -5
  34. data/lib/spec/example.rb +1 -27
  35. data/lib/spec/example/args_and_options.rb +27 -0
  36. data/lib/spec/example/before_and_after_hooks.rb +30 -21
  37. data/lib/spec/example/errors.rb +8 -18
  38. data/lib/spec/example/example_group_factory.rb +0 -4
  39. data/lib/spec/example/example_group_methods.rb +27 -41
  40. data/lib/spec/example/example_group_proxy.rb +12 -22
  41. data/lib/spec/example/example_methods.rb +8 -18
  42. data/lib/spec/example/example_proxy.rb +4 -4
  43. data/lib/spec/example/pending.rb +3 -4
  44. data/lib/spec/example/predicate_matchers.rb +1 -1
  45. data/lib/spec/example/subject.rb +2 -0
  46. data/lib/spec/expectations.rb +1 -26
  47. data/lib/spec/expectations/extensions.rb +1 -1
  48. data/lib/spec/expectations/extensions/kernel.rb +52 -0
  49. data/lib/spec/expectations/handler.rb +21 -10
  50. data/lib/spec/matchers/be.rb +3 -3
  51. data/lib/spec/matchers/be_close.rb +17 -21
  52. data/lib/spec/matchers/be_instance_of.rb +7 -26
  53. data/lib/spec/matchers/be_kind_of.rb +7 -26
  54. data/lib/spec/matchers/dsl.rb +9 -4
  55. data/lib/spec/matchers/eql.rb +24 -25
  56. data/lib/spec/matchers/equal.rb +25 -25
  57. data/lib/spec/matchers/exist.rb +5 -21
  58. data/lib/spec/matchers/include.rb +22 -44
  59. data/lib/spec/matchers/match.rb +5 -25
  60. data/lib/spec/matchers/match_array.rb +8 -4
  61. data/lib/spec/matchers/matcher.rb +13 -2
  62. data/lib/spec/matchers/pretty.rb +1 -0
  63. data/lib/spec/matchers/simple_matcher.rb +2 -2
  64. data/lib/spec/mocks/mock.rb +10 -10
  65. data/lib/spec/mocks/spec_methods.rb +1 -1
  66. data/lib/spec/runner/configuration.rb +53 -42
  67. data/lib/spec/{expectations → runner}/differs/default.rb +0 -0
  68. data/lib/spec/{expectations → runner}/differs/load-diff-lcs.rb +0 -0
  69. data/lib/spec/runner/drb_command_line.rb +1 -1
  70. data/lib/spec/runner/example_group_runner.rb +0 -12
  71. data/lib/spec/runner/formatter/base_formatter.rb +77 -30
  72. data/lib/spec/runner/formatter/base_text_formatter.rb +19 -24
  73. data/lib/spec/runner/formatter/failing_example_groups_formatter.rb +1 -1
  74. data/lib/spec/runner/formatter/html_formatter.rb +4 -6
  75. data/lib/spec/runner/formatter/nested_text_formatter.rb +2 -2
  76. data/lib/spec/runner/formatter/no_op_method_missing.rb +21 -0
  77. data/lib/spec/runner/formatter/profile_formatter.rb +0 -4
  78. data/lib/spec/runner/formatter/progress_bar_formatter.rb +4 -5
  79. data/lib/spec/runner/formatter/silent_formatter.rb +10 -0
  80. data/lib/spec/runner/formatter/specdoc_formatter.rb +2 -2
  81. data/lib/spec/runner/option_parser.rb +14 -7
  82. data/lib/spec/runner/options.rb +17 -7
  83. data/lib/spec/runner/reporter.rb +69 -64
  84. data/lib/spec/version.rb +1 -1
  85. data/spec/spec/dsl/main_spec.rb +7 -0
  86. data/spec/spec/example/example_group_methods_spec.rb +16 -32
  87. data/spec/spec/example/example_group_proxy_spec.rb +25 -5
  88. data/spec/spec/example/example_group_spec.rb +2 -2
  89. data/spec/spec/example/example_methods_spec.rb +19 -24
  90. data/spec/spec/example/example_proxy_spec.rb +11 -1
  91. data/spec/spec/example/pending_module_spec.rb +2 -108
  92. data/spec/spec/example/predicate_matcher_spec.rb +23 -3
  93. data/spec/spec/expectations/extensions/object_spec.rb +9 -9
  94. data/spec/spec/expectations/fail_with_spec.rb +13 -13
  95. data/spec/spec/expectations/handler_spec.rb +44 -15
  96. data/spec/spec/matchers/be_close_spec.rb +9 -0
  97. data/spec/spec/matchers/be_instance_of_spec.rb +6 -4
  98. data/spec/spec/matchers/be_kind_of_spec.rb +5 -3
  99. data/spec/spec/matchers/be_spec.rb +1 -5
  100. data/spec/spec/matchers/compatibility_spec.rb +1 -1
  101. data/spec/spec/matchers/dsl_spec.rb +10 -1
  102. data/spec/spec/matchers/eql_spec.rb +8 -4
  103. data/spec/spec/matchers/equal_spec.rb +8 -4
  104. data/spec/spec/matchers/exist_spec.rb +1 -1
  105. data/spec/spec/matchers/include_spec.rb +1 -1
  106. data/spec/spec/matchers/match_array_spec.rb +26 -1
  107. data/spec/spec/matchers/match_spec.rb +2 -2
  108. data/spec/spec/matchers/matcher_methods_spec.rb +0 -3
  109. data/spec/spec/matchers/matcher_spec.rb +53 -0
  110. data/spec/spec/matchers/operator_matcher_spec.rb +1 -1
  111. data/spec/spec/mocks/mock_spec.rb +6 -0
  112. data/spec/spec/runner/configuration_spec.rb +11 -1
  113. data/spec/spec/runner/drb_command_line_spec.rb +13 -1
  114. data/spec/spec/runner/example_group_runner_spec.rb +0 -7
  115. data/spec/spec/runner/formatter/base_formatter_spec.rb +19 -12
  116. data/spec/spec/runner/formatter/base_text_formatter_spec.rb +2 -2
  117. data/spec/spec/runner/formatter/failing_example_groups_formatter_spec.rb +4 -4
  118. data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +2 -2
  119. data/spec/spec/runner/formatter/html_formatted-1.8.6.html +31 -34
  120. data/spec/spec/runner/formatter/html_formatter_spec.rb +20 -0
  121. data/spec/spec/runner/formatter/nested_text_formatter_spec.rb +20 -20
  122. data/spec/spec/runner/formatter/profile_formatter_spec.rb +22 -3
  123. data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +24 -3
  124. data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +6 -6
  125. data/spec/spec/runner/formatter/text_mate_formatted-1.8.6.html +25 -28
  126. data/spec/spec/runner/formatter/text_mate_formatter_spec.rb +2 -2
  127. data/spec/spec/runner/option_parser_spec.rb +108 -40
  128. data/spec/spec/runner/reporter_spec.rb +16 -17
  129. data/spec/spec_helper.rb +4 -1
  130. metadata +20 -18
  131. data/features/example_groups/output.feature +0 -20
  132. data/features/step_definitions/running_rspec.rb +0 -69
  133. data/lib/spec/expectations/extensions/object.rb +0 -63
  134. data/resources/spec/example_group_with_should_methods.rb +0 -12
  135. data/resources/spec/simple_spec.rb +0 -8
  136. data/resources/test/spec_and_test_together.rb +0 -56
  137. data/resources/test/spec_including_test_but_not_unit.rb +0 -11
  138. data/resources/test/test_case_with_should_methods.rb +0 -29
@@ -1,17 +1,17 @@
1
- Feature: custom matcher shortcut
1
+ Feature: define matcher outside rspec
2
2
 
3
3
  In order to express my domain clearly in my code examples
4
4
  As a non-rspec user
5
- I want a shortcut for create custom matchers
5
+ I want a shortcut to define custom matchers
6
6
 
7
- Scenario: creating a matcher with default messages
8
- Given a file named test_multiples.rb with:
7
+ Scenario: define a matcher with default messages
8
+ Given a file named "test_multiples.rb" with:
9
9
  """
10
- $:.unshift File.join(File.dirname(__FILE__), "/../lib")
10
+ $:.unshift File.join(File.dirname(__FILE__), "/../../lib")
11
11
  require 'test/unit'
12
12
  require 'spec/expectations'
13
13
 
14
- Spec::Matchers.create :be_a_multiple_of do |expected|
14
+ Spec::Matchers.define :be_a_multiple_of do |expected|
15
15
  match do |actual|
16
16
  actual % expected == 0
17
17
  end
@@ -33,7 +33,7 @@ Feature: custom matcher shortcut
33
33
 
34
34
  end
35
35
  """
36
- When I run it with the ruby interpreter
36
+ When I run "ruby test_multiples.rb"
37
37
  Then the exit code should be 256
38
38
  And the stdout should match "expected 9 to be a multiple of 4"
39
39
  And the stdout should match "2 tests, 0 assertions, 1 failures, 0 errors"
@@ -4,7 +4,7 @@ Feature: mock 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 following spec:
7
+ Given a file named "flexmock_example_spec.rb" with:
8
8
  """
9
9
  Spec::Runner.configure do |config|
10
10
  config.mock_with :flexmock
@@ -22,6 +22,6 @@ Feature: mock with flexmock
22
22
  end
23
23
  end
24
24
  """
25
- When I run it with the spec command
25
+ When I run "spec flexmock_example_spec.rb"
26
26
  Then the exit code should be 0
27
- And the stdout should match "2 examples, 0 failures"
27
+ And the stdout should match "2 examples, 0 failures"
@@ -4,7 +4,7 @@ Feature: mock with mocha
4
4
  I want to be able to use mocha without rspec mocks interfering
5
5
 
6
6
  Scenario: Mock with mocha
7
- Given the following spec:
7
+ Given a file named "mocha_example_spec.rb" with:
8
8
  """
9
9
  Spec::Runner.configure do |config|
10
10
  config.mock_with :mocha
@@ -22,6 +22,6 @@ Feature: mock with mocha
22
22
  end
23
23
  end
24
24
  """
25
- When I run it with the spec command
25
+ When I run "spec mocha_example_spec.rb"
26
26
  Then the exit code should be 0
27
- And the stdout should match "2 examples, 0 failures"
27
+ And the stdout should match "2 examples, 0 failures"
@@ -4,7 +4,7 @@ Feature: mock with rr
4
4
  I want to be able to use rr without rspec mocks interfering
5
5
 
6
6
  Scenario: Mock with rr
7
- Given the following spec:
7
+ Given a file named "rr_example_spec.rb" with:
8
8
  """
9
9
  Spec::Runner.configure do |config|
10
10
  config.mock_with :rr
@@ -22,6 +22,6 @@ Feature: mock with rr
22
22
  end
23
23
  end
24
24
  """
25
- When I run it with the spec command
25
+ When I run "spec rr_example_spec.rb"
26
26
  Then the exit code should be 0
27
- And the stdout should match "2 examples, 0 failures"
27
+ And the stdout should match "2 examples, 0 failures"
@@ -4,13 +4,13 @@ Feature: Spec and test together
4
4
  I want to use stubs and mocks together
5
5
 
6
6
  Scenario: stub in before
7
- Given the following spec:
7
+ Given a file named "stub_and_mocks_spec.rb" with:
8
8
  """
9
9
  describe "a stub in before" do
10
10
  before(:each) do
11
11
  @messenger = mock('messenger').as_null_object
12
12
  end
13
-
13
+
14
14
  it "a" do
15
15
  @messenger.should_receive(:foo).with('first')
16
16
  @messenger.foo('second')
@@ -18,5 +18,5 @@ Feature: Spec and test together
18
18
  end
19
19
  end
20
20
  """
21
- When I run it with the spec command --format nested
22
- Then the stdout should match "expected :foo with (\"first\") but received it with ([\"second\"], [\"third\"])"
21
+ When I run "spec stub_and_mocks_spec.rb --format nested"
22
+ Then the stdout should match "expected :foo with (\"first\") but received it with ([\"second\"], [\"third\"])"
@@ -2,36 +2,36 @@ Feature: pending examples
2
2
 
3
3
  RSpec offers three ways to indicate that an example is disabled pending
4
4
  some action.
5
-
5
+
6
6
  Scenario: pending implementation
7
- Given the following spec:
7
+ Given a file named "example_without_block_spec.rb" with:
8
8
  """
9
9
  describe "an example" do
10
10
  it "has not yet been implemented"
11
11
  end
12
12
  """
13
- When I run it with the spec command
13
+ When I run "spec example_without_block_spec.rb"
14
14
  Then the exit code should be 0
15
15
  And the stdout should match "1 example, 0 failures, 1 pending"
16
16
  And the stdout should match "Not Yet Implemented"
17
- And the stdout should match "current_example.rb:3"
18
-
17
+ And the stdout should match "example_without_block_spec.rb:2"
18
+
19
19
  Scenario: pending implementation with spec/test/unit
20
- Given the following spec:
20
+ Given a file named "example_without_block_spec.rb" with:
21
21
  """
22
22
  require 'spec/test/unit'
23
23
  describe "an example" do
24
24
  it "has not yet been implemented"
25
25
  end
26
26
  """
27
- When I run it with the spec command
27
+ When I run "spec example_without_block_spec.rb"
28
28
  Then the exit code should be 0
29
29
  And the stdout should match "1 example, 0 failures, 1 pending"
30
30
  And the stdout should match "Not Yet Implemented"
31
- And the stdout should match "current_example.rb:4"
31
+ And the stdout should match "example_without_block_spec.rb:3"
32
32
 
33
33
  Scenario: pending any arbitary reason, with no block
34
- Given the following spec:
34
+ Given a file named "pending_without_block_spec.rb" with:
35
35
  """
36
36
  describe "an example" do
37
37
  it "is implemented but waiting" do
@@ -39,14 +39,14 @@ Feature: pending examples
39
39
  end
40
40
  end
41
41
  """
42
- When I run it with the spec command
42
+ When I run "spec pending_without_block_spec.rb"
43
43
  Then the exit code should be 0
44
44
  And the stdout should match "1 example, 0 failures, 1 pending"
45
45
  And the stdout should match "(something else getting finished)"
46
- And the stdout should match "current_example.rb:4"
46
+ And the stdout should match "pending_without_block_spec.rb:2"
47
47
 
48
- Scenario: pending any arbitary reason, with a block
49
- Given the following spec:
48
+ Scenario: pending any arbitary reason, with a block that fails
49
+ Given a file named "pending_with_failing_block_spec.rb" with:
50
50
  """
51
51
  describe "an example" do
52
52
  it "is implemented but waiting" do
@@ -56,14 +56,14 @@ Feature: pending examples
56
56
  end
57
57
  end
58
58
  """
59
- When I run it with the spec command
59
+ When I run "spec pending_with_failing_block_spec.rb"
60
60
  Then the exit code should be 0
61
61
  And the stdout should match "1 example, 0 failures, 1 pending"
62
62
  And the stdout should match "(something else getting finished)"
63
- And the stdout should match "current_example.rb:4"
63
+ And the stdout should match "pending_with_failing_block_spec.rb:2"
64
64
 
65
65
  Scenario: pending any arbitary reason, with a block that passes
66
- Given the following spec:
66
+ Given a file named "pending_with_passing_block_spec.rb" with:
67
67
  """
68
68
  describe "an example" do
69
69
  it "is implemented but waiting" do
@@ -73,9 +73,9 @@ Feature: pending examples
73
73
  end
74
74
  end
75
75
  """
76
- When I run it with the spec command
76
+ When I run "spec pending_with_passing_block_spec.rb"
77
77
  Then the exit code should be 256
78
78
  And the stdout should match "1 example, 1 failure"
79
79
  And the stdout should match "FIXED"
80
80
  And the stdout should match "Expected pending 'something else getting finished' to fail. No Error was raised."
81
- And the stdout should match "current_example.rb:4"
81
+ And the stdout should match "pending_with_passing_block_spec.rb:3"
@@ -0,0 +1,32 @@
1
+ Feature: run specific examples by line number
2
+
3
+ In order to run a single example from command line
4
+ RSpec allows you to specify the line number of the example(s) to run
5
+
6
+ Scenario: --line syntax on single example
7
+ Given a file named "example_spec.rb" with:
8
+ """
9
+ describe "an example" do
10
+ it "has not yet been implemented"
11
+ it "has been implemented" do
12
+ true
13
+ end
14
+ end
15
+ """
16
+ When I run "spec example_spec.rb --line 2"
17
+ Then the stdout should match "1 example, 0 failures, 1 pending"
18
+ And the stdout should match "example_spec.rb:2"
19
+
20
+ Scenario: colon line syntax on single example
21
+ Given a file named "example_spec.rb" with:
22
+ """
23
+ describe "an example" do
24
+ it "has not yet been implemented"
25
+ it "has been implemented" do
26
+ true
27
+ end
28
+ end
29
+ """
30
+ When I run "spec example_spec.rb:2"
31
+ Then the stdout should match "1 example, 0 failures, 1 pending"
32
+ And the stdout should match "example_spec.rb:2"
@@ -0,0 +1,41 @@
1
+ Given %r{^a file named "([^"]+)" with:$} do |file_name, code|
2
+ create_file(file_name, code)
3
+ end
4
+
5
+
6
+ When %r{^I run "spec ([^"]+)"$} do |file_and_args|
7
+ spec(file_and_args)
8
+ end
9
+
10
+ When %r{^I run "ruby ([^"]+)"$} do |file_and_args|
11
+ ruby(file_and_args)
12
+ end
13
+
14
+ When %r{^I run "cmdline.rb ([^"]+)"$} do |file_and_args|
15
+ cmdline(file_and_args)
16
+ end
17
+
18
+
19
+ Then /^the (.*) should match (.*)$/ do |stream, string_or_regex|
20
+ written = case(stream)
21
+ when 'stdout' then last_stdout
22
+ when 'stderr' then last_stderr
23
+ else raise "Unknown stream: #{stream}"
24
+ end
25
+ written.should smart_match(string_or_regex)
26
+ end
27
+
28
+ Then /^the (.*) should not match (.*)$/ do |stream, string_or_regex|
29
+ written = case(stream)
30
+ when 'stdout' then last_stdout
31
+ when 'stderr' then last_stderr
32
+ else raise "Unknown stream: #{stream}"
33
+ end
34
+ written.should_not smart_match(string_or_regex)
35
+ end
36
+
37
+ Then /^the exit code should be (\d+)$/ do |exit_code|
38
+ if last_exit_code != exit_code.to_i
39
+ raise "Did not exit with #{exit_code}, but with #{last_exit_code}. Standard error:\n#{last_stderr}"
40
+ end
41
+ end
@@ -3,7 +3,7 @@ Feature: explicit subject
3
3
  You can override the implicit subject using the subject() method.
4
4
 
5
5
  Scenario: subject in top level group
6
- Given the following spec:
6
+ Given a file named "top_level_subject_spec.rb" with:
7
7
  """
8
8
  describe Array, "with some elements" do
9
9
  subject { [1,2,3] }
@@ -12,11 +12,11 @@ Feature: explicit subject
12
12
  end
13
13
  end
14
14
  """
15
- When I run it with the spec command
15
+ When I run "spec top_level_subject_spec.rb"
16
16
  Then the stdout should match "1 example, 0 failures"
17
17
 
18
18
  Scenario: subject in a nested group
19
- Given the following spec:
19
+ Given a file named "nested_subject_spec.rb" with:
20
20
  """
21
21
  describe Array do
22
22
  subject { [1,2,3] }
@@ -27,5 +27,5 @@ Feature: explicit subject
27
27
  end
28
28
  end
29
29
  """
30
- When I run it with the spec command
30
+ When I run "spec nested_subject_spec.rb"
31
31
  Then the stdout should match "1 example, 0 failures"
@@ -5,7 +5,7 @@ Feature: implicit subject
5
5
  that example.
6
6
 
7
7
  Scenario: subject in top level group
8
- Given the following spec:
8
+ Given a file named "top_level_subject_spec.rb" with:
9
9
  """
10
10
  describe Array, "when first created" do
11
11
  it "should be empty" do
@@ -13,11 +13,11 @@ Feature: implicit subject
13
13
  end
14
14
  end
15
15
  """
16
- When I run it with the spec command
16
+ When I run "spec top_level_subject_spec.rb"
17
17
  Then the stdout should match "1 example, 0 failures"
18
18
 
19
19
  Scenario: subject in a nested group
20
- Given the following spec:
20
+ Given a file named "nested_subject_spec.rb" with:
21
21
  """
22
22
  describe Array do
23
23
  describe "when first created" do
@@ -27,5 +27,5 @@ Feature: implicit subject
27
27
  end
28
28
  end
29
29
  """
30
- When I run it with the spec command
30
+ When I run "spec nested_subject_spec.rb"
31
31
  Then the stdout should match "1 example, 0 failures"
@@ -1,26 +1,79 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "/../../lib")
2
+
3
+ require 'spec/expectations'
4
+ require 'forwardable'
1
5
  require 'tempfile'
2
6
  require File.dirname(__FILE__) + '/../../spec/ruby_forker'
3
7
  require File.dirname(__FILE__) + '/matchers/smart_match'
4
8
 
5
- $:.push File.join(File.dirname(__FILE__), "/../../lib")
6
- require 'spec/expectations'
7
- require 'spec/matchers'
8
9
 
9
- module RspecWorld
10
+ class RspecWorld
10
11
  include Spec::Expectations
11
12
  include Spec::Matchers
12
13
  include RubyForker
13
14
 
14
- def spec(args, stderr)
15
- ruby("#{File.dirname(__FILE__) + '/../../bin/spec'} #{args}", stderr)
15
+ extend Forwardable
16
+ def_delegators RspecWorld, :working_dir, :spec_command, :cmdline_file, :rspec_lib
17
+
18
+ def self.working_dir
19
+ @working_dir ||= File.expand_path(File.join(File.dirname(__FILE__), "/../../tmp/cucumber-generated-files"))
16
20
  end
17
21
 
18
- def cmdline(args, stderr)
19
- ruby("#{File.dirname(__FILE__) + '/../../resources/helpers/cmdline.rb'} #{args}", stderr)
22
+ def self.spec_command
23
+ @spec_command ||= File.expand_path(File.join(File.dirname(__FILE__), "/../../bin/spec"))
20
24
  end
25
+
26
+ def self.cmdline_file
27
+ @cmdline_file ||= File.expand_path(File.join(File.dirname(__FILE__), "/../../resources/helpers/cmdline.rb"))
28
+ end
29
+
30
+ def self.rspec_lib
31
+ @rspec_lib ||= File.join(working_dir, "/../../lib")
32
+ end
33
+
34
+ def spec(args)
35
+ ruby("#{spec_command} #{args}")
36
+ end
37
+
38
+ def cmdline(args)
39
+ ruby("#{cmdline_file} #{args}")
40
+ end
41
+
42
+ def create_file(file_name, contents)
43
+ file_path = File.join(working_dir, file_name)
44
+ File.open(file_path, "w") { |f| f << contents }
45
+ end
46
+
47
+ def last_stdout
48
+ @stdout
49
+ end
50
+
51
+ def last_stderr
52
+ @stderr
53
+ end
54
+
55
+ def last_exit_code
56
+ @exit_code
57
+ end
58
+
59
+ # it seems like this, and the last_* methods, could be moved into RubyForker-- is that being used anywhere but the features?
60
+ def ruby(args)
61
+ stderr_file = Tempfile.new('rspec')
62
+ stderr_file.close
63
+ Dir.chdir(working_dir) do
64
+ @stdout = super("-I #{rspec_lib} #{args}", stderr_file.path)
65
+ end
66
+ @stderr = IO.read(stderr_file.path)
67
+ @exit_code = $?.to_i
68
+ end
69
+
70
+ end
71
+
72
+ Before do
73
+ FileUtils.rm_rf RspecWorld.working_dir if test ?d, RspecWorld.working_dir
74
+ FileUtils.mkdir_p RspecWorld.working_dir
21
75
  end
22
76
 
23
- World do |world|
24
- world.extend(RspecWorld)
25
- world
77
+ World do
78
+ RspecWorld.new
26
79
  end
@@ -1,37 +1,12 @@
1
- module Spec
2
- module Matchers
3
- class SmartMatch
4
- def initialize(expected)
5
- @expected = expected
6
- end
7
-
8
- def matches?(actual)
9
- @actual = actual
10
- # Satisfy expectation here. Return false or raise an error if it's not met.
11
-
12
- if @expected =~ /^\/.*\/?$/ || @expected =~ /^".*"$/
13
- regex_or_string = eval(@expected)
14
- if Regexp === regex_or_string
15
- (@actual =~ regex_or_string) ? true : false
16
- else
17
- @actual.index(regex_or_string) != nil
18
- end
19
- else
20
- false
21
- end
22
- end
23
-
24
- def failure_message
25
- "expected #{@actual} to smart_match #{@expected}"
26
- end
27
-
28
- def negative_failure_message
29
- "expected #{@actual} not to smart_match #{@expected}"
30
- end
31
- end
32
-
33
- def smart_match(expected)
34
- SmartMatch.new(expected)
1
+ Spec::Matchers.define :smart_match do |expected|
2
+ match do |actual|
3
+ case expected
4
+ when /^\/.*\/?$/
5
+ actual =~ eval(expected)
6
+ when /^".*"$/
7
+ actual.index(eval(expected))
8
+ else
9
+ false
35
10
  end
36
11
  end
37
- end
12
+ end