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,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)} : {}