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,28 +1,5 @@
1
1
  module Spec
2
2
  module Matchers
3
- class BeKindOf
4
- def initialize(expected)
5
- @expected = expected
6
- end
7
-
8
- def matches?(actual)
9
- @actual = actual
10
- @actual.kind_of?(@expected)
11
- end
12
-
13
- def description
14
- "be a kind of #{@expected}"
15
- end
16
-
17
- def failure_message_for_should
18
- "expected kind of #{@expected}, got #{@actual.inspect}"
19
- end
20
-
21
- def failure_message_for_should_not
22
- "expected #{@actual.inspect} not to be a kind of #{@expected}"
23
- end
24
- end
25
-
26
3
  # :call-seq:
27
4
  # should be_kind_of(expected)
28
5
  # should be_a_kind_of(expected)
@@ -36,10 +13,14 @@ module Spec
36
13
  # 5.should be_kind_of(Fixnum)
37
14
  # 5.should be_kind_of(Numeric)
38
15
  # 5.should_not be_kind_of(Float)
39
- def be_kind_of(expected)
40
- BeKindOf.new(expected)
16
+ def be_a_kind_of(expected)
17
+ Matcher.new :be_a_kind_of, expected do |expected|
18
+ match do |actual|
19
+ actual.kind_of?(expected)
20
+ end
21
+ end
41
22
  end
42
23
 
43
- alias_method :be_a_kind_of, :be_kind_of
24
+ alias_method :be_kind_of, :be_a_kind_of
44
25
  end
45
26
  end
@@ -1,15 +1,20 @@
1
1
  module Spec
2
2
  module Matchers
3
3
  module DSL
4
- def create(name, &block_passed_to_create)
4
+ # See Spec::Matchers
5
+ def define(name, &declarations)
5
6
  define_method name do |*expected|
6
- Spec::Matchers::Matcher.new name, *expected, &block_passed_to_create
7
+ Spec::Matchers::Matcher.new name, *expected, &declarations
7
8
  end
8
9
  end
10
+
11
+ # Deprecated - use define
12
+ def create(name, &declarations)
13
+ Spec.deprecate("Spec::Matchers.create","Spec::Matchers.define")
14
+ define(name, &declarations)
15
+ end
9
16
  end
10
17
  end
11
18
  end
12
19
 
13
20
  Spec::Matchers.extend Spec::Matchers::DSL
14
-
15
-
@@ -1,29 +1,5 @@
1
1
  module Spec
2
2
  module Matchers
3
- class Eql
4
- def initialize(expected)
5
- @expected = expected
6
- end
7
-
8
- def matches?(actual)
9
- @actual = actual
10
- @actual.eql?(@expected)
11
- end
12
-
13
- def failure_message_for_should
14
- return "expected #{@expected.inspect}, got #{@actual.inspect} (using .eql?)", @expected, @actual
15
- end
16
-
17
- def failure_message_for_should_not
18
- return "expected #{@actual.inspect} not to equal #{@expected.inspect} (using .eql?)", @expected, @actual
19
- end
20
-
21
- def description
22
- "eql #{@expected.inspect}"
23
- end
24
- end
25
-
26
-
27
3
  # :call-seq:
28
4
  # should eql(expected)
29
5
  # should_not eql(expected)
@@ -37,7 +13,30 @@ module Spec
37
13
  # 5.should eql(5)
38
14
  # 5.should_not eql(3)
39
15
  def eql(expected)
40
- Eql.new(expected)
16
+ Matcher.new :eql, expected do |expected|
17
+ match do |actual|
18
+ actual.eql?(expected)
19
+ end
20
+
21
+ failure_message_for_should do |actual|
22
+ <<-MESSAGE
23
+
24
+ expected #{expected.inspect}
25
+ got #{actual.inspect}
26
+
27
+ (compared using eql?)
28
+ MESSAGE
29
+ end
30
+
31
+ failure_message_for_should_not do |actual|
32
+ <<-MESSAGE
33
+
34
+ expected #{actual.inspect} not to equal #{expected.inspect}
35
+
36
+ (compared using eql?)
37
+ MESSAGE
38
+ end
39
+ end
41
40
  end
42
41
  end
43
42
  end
@@ -1,29 +1,6 @@
1
1
  module Spec
2
2
  module Matchers
3
-
4
- class Equal
5
- def initialize(expected)
6
- @expected = expected
7
- end
8
-
9
- def matches?(actual)
10
- @actual = actual
11
- @actual.equal?(@expected)
12
- end
13
-
14
- def failure_message_for_should
15
- return "expected #{@expected.inspect}, got #{@actual.inspect} (using .equal?)", @expected, @actual
16
- end
17
-
18
- def failure_message_for_should_not
19
- return "expected #{@actual.inspect} not to equal #{@expected.inspect} (using .equal?)", @expected, @actual
20
- end
21
-
22
- def description
23
- "equal #{@expected.inspect}"
24
- end
25
- end
26
-
3
+
27
4
  # :call-seq:
28
5
  # should equal(expected)
29
6
  # should_not equal(expected)
@@ -37,7 +14,30 @@ module Spec
37
14
  # 5.should equal(5) #Fixnums are equal
38
15
  # "5".should_not equal("5") #Strings that look the same are not the same object
39
16
  def equal(expected)
40
- Equal.new(expected)
17
+ Matcher.new :equal, expected do |expected|
18
+ match do |actual|
19
+ actual.equal?(expected)
20
+ end
21
+
22
+ failure_message_for_should do |actual|
23
+ <<-MESSAGE
24
+
25
+ expected #{expected.inspect}
26
+ got #{actual.inspect}
27
+
28
+ (compared using equal?)
29
+ MESSAGE
30
+ end
31
+
32
+ failure_message_for_should_not do |actual|
33
+ <<-MESSAGE
34
+
35
+ expected #{actual.inspect} not to equal #{expected.inspect}
36
+
37
+ (compared using equal?)
38
+ MESSAGE
39
+ end
40
+ end
41
41
  end
42
42
  end
43
43
  end
@@ -1,32 +1,16 @@
1
1
  module Spec
2
2
  module Matchers
3
-
4
- class Exist
5
- def matches?(actual)
6
- @actual = actual
7
- actual.exist?
8
- end
9
-
10
- def failure_message_for_should
11
- "expected #{@actual.inspect} to exist, but it doesn't."
12
- end
13
-
14
- def failure_message_for_should_not
15
- "expected #{@actual.inspect} to not exist, but it does."
16
- end
17
-
18
- def description
19
- "exists"
20
- end
21
- end
22
-
23
3
  # :call-seq:
24
4
  # should exist
25
5
  # should_not exist
26
6
  #
27
7
  # Passes if actual.exist?
28
8
  def exist
29
- Exist.new
9
+ Matcher.new :exist do
10
+ match do |actual|
11
+ actual.exist?
12
+ end
13
+ end
30
14
  end
31
15
  end
32
16
  end
@@ -1,48 +1,5 @@
1
1
  module Spec
2
2
  module Matchers
3
- class Include #:nodoc:
4
- include Spec::Matchers::Pretty
5
-
6
- def initialize(*expecteds)
7
- @expecteds = expecteds
8
- end
9
-
10
- def matches?(actual)
11
- @actual = actual
12
- @expecteds.each do |expected|
13
- if actual.is_a?(Hash)
14
- if expected.is_a?(Hash)
15
- expected.each_pair do |k,v|
16
- return false unless actual[k] == v
17
- end
18
- else
19
- return false unless actual.has_key?(expected)
20
- end
21
- else
22
- return false unless actual.include?(expected)
23
- end
24
- end
25
- true
26
- end
27
-
28
- def failure_message_for_should
29
- _message
30
- end
31
-
32
- def failure_message_for_should_not
33
- _message("not ")
34
- end
35
-
36
- def description
37
- "include #{_pretty_print(@expecteds)}"
38
- end
39
-
40
- private
41
- def _message(maybe_not="")
42
- "expected #{@actual.inspect} #{maybe_not}to include #{_pretty_print(@expecteds)}"
43
- end
44
- end
45
-
46
3
  # :call-seq:
47
4
  # should include(expected)
48
5
  # should_not include(expected)
@@ -60,7 +17,28 @@ module Spec
60
17
  # "spread".should include("read")
61
18
  # "spread".should_not include("red")
62
19
  def include(*expected)
63
- Matchers::Include.new(*expected)
20
+ Matcher.new :include, *expected do |*expecteds|
21
+ match do |actual|
22
+ helper(actual, *expecteds)
23
+ end
24
+
25
+ def helper(actual, *expecteds)
26
+ expecteds.each do |expected|
27
+ if actual.is_a?(Hash)
28
+ if expected.is_a?(Hash)
29
+ expected.each_pair do |k,v|
30
+ return false unless actual[k] == v
31
+ end
32
+ else
33
+ return false unless actual.has_key?(expected)
34
+ end
35
+ else
36
+ return false unless actual.include?(expected)
37
+ end
38
+ end
39
+ true
40
+ end
41
+ end
64
42
  end
65
43
  end
66
44
  end
@@ -1,29 +1,5 @@
1
1
  module Spec
2
2
  module Matchers
3
- class Match
4
- def initialize(expected)
5
- @expected = expected
6
- end
7
-
8
- def matches?(actual)
9
- @actual = actual
10
- actual =~ @expected
11
- end
12
-
13
- def failure_message_for_should
14
- return "expected #{@actual.inspect} to match #{@expected.inspect}", @expected, @actual
15
- end
16
-
17
- def failure_message_for_should_not
18
- return "expected #{@actual.inspect} not to match #{@expected.inspect}", @expected, @actual
19
- end
20
-
21
- def description
22
- "match #{@expected.inspect}"
23
- end
24
- end
25
-
26
-
27
3
  # :call-seq:
28
4
  # should match(regexp)
29
5
  # should_not match(regexp)
@@ -34,7 +10,11 @@ module Spec
34
10
  #
35
11
  # email.should match(/^([^\s]+)((?:[-a-z0-9]+\.)+[a-z]{2,})$/i)
36
12
  def match(expected)
37
- Match.new(expected)
13
+ Matcher.new :match, expected do |expected|
14
+ match do |actual|
15
+ actual =~ expected
16
+ end
17
+ end
38
18
  end
39
19
  end
40
20
  end
@@ -16,10 +16,10 @@ module Spec
16
16
  end
17
17
 
18
18
  def failure_message_for_should
19
- message = "expected collection contained: #{@expected.sort.inspect}\n"
20
- message += "actual collection contained: #{@actual.sort.inspect}\n"
21
- message += "the missing elements were: #{@missing_items.sort.inspect}\n" unless @missing_items.empty?
22
- message += "the extra elements were: #{@extra_items.sort.inspect}\n" unless @extra_items.empty?
19
+ message = "expected collection contained: #{safe_sort(@expected).inspect}\n"
20
+ message += "actual collection contained: #{safe_sort(@actual).inspect}\n"
21
+ message += "the missing elements were: #{safe_sort(@missing_items).inspect}\n" unless @missing_items.empty?
22
+ message += "the extra elements were: #{safe_sort(@extra_items).inspect}\n" unless @extra_items.empty?
23
23
  message
24
24
  end
25
25
 
@@ -33,6 +33,10 @@ module Spec
33
33
 
34
34
  private
35
35
 
36
+ def safe_sort(array)
37
+ array.all?{|item| item.respond_to?(:<=>)} ? array.sort : array
38
+ end
39
+
36
40
  def difference_between_arrays(array_1, array_2)
37
41
  difference = array_1.dup
38
42
  array_2.each do |element|
@@ -3,14 +3,17 @@ module Spec
3
3
  class Matcher
4
4
  include Spec::Matchers::Pretty
5
5
 
6
+ attr_reader :expected, :actual
7
+
6
8
  def initialize(name, *expected, &declarations)
7
9
  @name = name
8
10
  @expected = expected
9
11
  @declarations = declarations
12
+ @diffable = false
10
13
  @messages = {
11
14
  :description => lambda {"#{name_to_sentence}#{expected_to_sentence}"},
12
- :failure_message_for_should => lambda {|actual| "expected #{actual} to #{name_to_sentence}#{expected_to_sentence}"},
13
- :failure_message_for_should_not => lambda {|actual| "expected #{actual} not to #{name_to_sentence}#{expected_to_sentence}"}
15
+ :failure_message_for_should => lambda {|actual| "expected #{actual.inspect} to #{name_to_sentence}#{expected_to_sentence}"},
16
+ :failure_message_for_should_not => lambda {|actual| "expected #{actual.inspect} not to #{name_to_sentence}#{expected_to_sentence}"}
14
17
  }
15
18
  end
16
19
 
@@ -36,6 +39,14 @@ module Spec
36
39
  @match_block = block
37
40
  end
38
41
 
42
+ def diffable?
43
+ @diffable
44
+ end
45
+
46
+ def diffable
47
+ @diffable = true
48
+ end
49
+
39
50
  private
40
51
 
41
52
  def cache_or_call_cached(key, actual=nil, &block)
@@ -6,6 +6,7 @@ module Spec
6
6
  end
7
7
 
8
8
  def to_sentence(words)
9
+ words = words.map{|w| w.inspect}
9
10
  case words.length
10
11
  when 0
11
12
  ""
@@ -23,11 +23,11 @@ module Spec
23
23
  @description || explanation
24
24
  end
25
25
 
26
- def failure_message
26
+ def failure_message_for_should
27
27
  @failure_message || (@description.nil? ? explanation : %[expected #{@description.inspect} but got #{@given.inspect}])
28
28
  end
29
29
 
30
- def negative_failure_message
30
+ def failure_message_for_should_not
31
31
  @negative_failure_message || (@description.nil? ? explanation : %[expected not to get #{@description.inspect}, but got #{@given.inspect}])
32
32
  end
33
33
 
@@ -21,16 +21,6 @@ module Spec
21
21
  other == __mock_proxy
22
22
  end
23
23
 
24
- def method_missing(sym, *args, &block)
25
- __mock_proxy.record_message_received(sym, args, block)
26
- begin
27
- return self if __mock_proxy.null_object?
28
- super(sym, *args, &block)
29
- rescue NameError
30
- __mock_proxy.raise_unexpected_message_error sym, *args
31
- end
32
- end
33
-
34
24
  def inspect
35
25
  "#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>"
36
26
  end
@@ -40,6 +30,16 @@ module Spec
40
30
  end
41
31
 
42
32
  private
33
+
34
+ def method_missing(sym, *args, &block)
35
+ __mock_proxy.record_message_received(sym, args, block)
36
+ begin
37
+ return self if __mock_proxy.null_object?
38
+ super(sym, *args, &block)
39
+ rescue NameError
40
+ __mock_proxy.raise_unexpected_message_error sym, *args
41
+ end
42
+ end
43
43
 
44
44
  def parse_options(options)
45
45
  options.has_key?(:null_object) ? {:null_object => options.delete(:null_object)} : {}