rspec 1.2.2 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
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