bacon-expect 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -0
  3. data/README.md +1 -1
  4. data/bacon-expect.gemspec +1 -1
  5. data/lib/bacon-expect/expectation.rb +4 -4
  6. data/lib/bacon-expect/fail_message_renderer.rb +100 -0
  7. data/lib/bacon-expect/matchers/be.rb +4 -8
  8. data/lib/bacon-expect/matchers/be_false.rb +3 -2
  9. data/lib/bacon-expect/matchers/be_generic.rb +3 -15
  10. data/lib/bacon-expect/matchers/be_nil.rb +2 -2
  11. data/lib/bacon-expect/matchers/be_true.rb +2 -2
  12. data/lib/bacon-expect/matchers/be_within.rb +2 -2
  13. data/lib/bacon-expect/matchers/change.rb +4 -5
  14. data/lib/bacon-expect/matchers/end_with.rb +2 -2
  15. data/lib/bacon-expect/matchers/eq.rb +4 -8
  16. data/lib/bacon-expect/matchers/eql.rb +2 -10
  17. data/lib/bacon-expect/matchers/have_generic.rb +2 -5
  18. data/lib/bacon-expect/matchers/have_items.rb +7 -7
  19. data/lib/bacon-expect/matchers/include.rb +2 -2
  20. data/lib/bacon-expect/matchers/match.rb +5 -9
  21. data/lib/bacon-expect/matchers/match_array.rb +6 -6
  22. data/lib/bacon-expect/matchers/raise_error.rb +4 -4
  23. data/lib/bacon-expect/matchers/respond_to.rb +2 -2
  24. data/lib/bacon-expect/matchers/satisfy.rb +2 -2
  25. data/lib/bacon-expect/matchers/single_method.rb +20 -0
  26. data/lib/bacon-expect/matchers/start_with.rb +2 -2
  27. data/run-tests.sh +3 -0
  28. data/spec_app/spec/helpers/bacon_context.rb +2 -2
  29. data/spec_app/spec/matchers/be_false_spec.rb +4 -3
  30. data/spec_app/spec/matchers/be_generic_spec.rb +4 -3
  31. data/spec_app/spec/matchers/be_nil_spec.rb +8 -3
  32. data/spec_app/spec/matchers/be_true_spec.rb +4 -3
  33. data/spec_app/spec/matchers/be_within_spec.rb +4 -4
  34. data/spec_app/spec/matchers/change_spec.rb +7 -2
  35. data/spec_app/spec/matchers/end_with_spec.rb +5 -1
  36. data/spec_app/spec/matchers/equality_spec.rb +11 -4
  37. data/spec_app/spec/matchers/have_generic_spec.rb +9 -2
  38. data/spec_app/spec/matchers/have_items_spec.rb +9 -1
  39. data/spec_app/spec/matchers/include_spec.rb +8 -3
  40. data/spec_app/spec/matchers/match_array_spec.rb +8 -3
  41. data/spec_app/spec/matchers/match_spec.rb +6 -2
  42. data/spec_app/spec/matchers/raise_error_spec.rb +12 -8
  43. data/spec_app/spec/matchers/respond_to_spec.rb +10 -3
  44. data/spec_app/spec/matchers/satisfy_spec.rb +5 -1
  45. data/spec_app/spec/matchers/start_with_spec.rb +5 -1
  46. metadata +6 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bc5cacf63327158e64370a0bf0b59175b23f9f19
4
- data.tar.gz: fd37fa78e8247be2d729564a724826ee41a240bb
3
+ metadata.gz: 2711107918bcdc5c0561e919905602d4aebd88ef
4
+ data.tar.gz: 06d592a99720bd98c0752ba34ebb69f704952fba
5
5
  SHA512:
6
- metadata.gz: 1d33f8128f35925f2b4a511ac1c9ef9bb23ce367ae90a74ce5b9413e3d9f686539436d4be12762b4ca072369cbfdf86534f9f760922aa8a323a713877f67250f
7
- data.tar.gz: ed8b806dbcbe20d5d87c16f59db77b93678e9328c157ba93f7c513bdda72a0106396f742f37927f75c13d9072576957080833deb572b6db83c874718e0491883
6
+ metadata.gz: 6d2c39d6619c345d9655f997158e3b56b5b8741c3323a1915023770976bf843b3e03f29d55d19cb126e48c1e44d802bd8f770b12fd694b77a70c51f763be85ea
7
+ data.tar.gz: d3291d91ccee3cfe7b9328f6b264b3a83dc12710510e6409443a7b0d219c165f8f250d66a2470de4fc589a6851be5d83a42a164aa80d450e752b1bb83267ccfe
@@ -0,0 +1,8 @@
1
+ language: objective-c
2
+ before_install:
3
+ - (ruby --version)
4
+ - (motion --version)
5
+ - sudo chown -R travis ~/Library/RubyMotion
6
+ - mkdir -p ~/Library/RubyMotion/build
7
+ - sudo motion update
8
+ script: "./run-tests.sh"
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # BaconExpect
1
+ # BaconExpect [![Build Status](https://travis-ci.org/ijpiantanida/bacon-expect.svg?branch=master)](https://travis-ci.org/ijpiantanida/bacon-expect) [![Code Climate](https://codeclimate.com/github/ijpiantanida/bacon-expect.png)](https://codeclimate.com/github/ijpiantanida/bacon-expect)
2
2
 
3
3
  Bring [RSpec 3.0 expect syntax](https://www.relishapp.com/rspec/rspec-expectations/v/3-0/docs/built-in-matchers) to RubyMotion's MacBacon.
4
4
  ```ruby
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "bacon-expect"
7
- spec.version = "1.0.2"
7
+ spec.version = "1.0.3"
8
8
  spec.authors = ["Ignacio Piantanida"]
9
9
  spec.email = ["ijpiantanida@gmail.com"]
10
10
  spec.description = "RSpec's expect syntax in MacBacon"
@@ -12,12 +12,12 @@ module BaconExpect
12
12
  end
13
13
 
14
14
  def to(matcher)
15
- fail(matcher) unless matcher_passes(matcher)
15
+ fail(matcher, false) unless matcher_passes(matcher)
16
16
  assert
17
17
  end
18
18
 
19
19
  def not_to(matcher)
20
- fail(matcher) if matcher_passes(matcher)
20
+ fail(matcher, true) if matcher_passes(matcher)
21
21
  assert
22
22
  end
23
23
  alias_method :to_not, :not_to
@@ -26,8 +26,8 @@ module BaconExpect
26
26
  matcher.matches?(@subject, &@subject_block)
27
27
  end
28
28
 
29
- def fail(matcher)
30
- raise matcher.fail!(@subject, &@subject_block)
29
+ def fail(matcher, negated)
30
+ raise matcher.fail!(@subject, negated, &@subject_block)
31
31
  end
32
32
 
33
33
  def assert
@@ -0,0 +1,100 @@
1
+ module BaconExpect
2
+ class FailMessageRenderer
3
+ def self.expectation(negated)
4
+ "#{negated ? " not" : ""} expected"
5
+ end
6
+
7
+ def self.message_for_be_false(negated, subject)
8
+ "#{subject.inspect}#{expectation(negated)} to be false"
9
+ end
10
+
11
+ def self.message_for_be_true(negated, subject)
12
+ "#{subject.inspect}#{expectation(negated)} to be true"
13
+ end
14
+
15
+ def self.message_for_be_nil(negated, subject)
16
+ "#{subject.inspect}#{expectation(negated)} to be nil"
17
+ end
18
+
19
+ def self.message_for_be(negated, subject, method_name, values)
20
+ message = "#{subject.inspect} ##{method_name}"
21
+ message += "(#{values.map(&:inspect).join(', ')})" unless values.empty?
22
+ message += "#{expectation(negated)} to return true"
23
+ message
24
+ end
25
+
26
+ def self.message_for_be_within(negated, subject, range, center_value)
27
+ "#{subject.inspect}#{expectation(negated)} to be within #{range} of #{center_value}"
28
+ end
29
+
30
+ def self.message_for_change(negated, change_amount, value_diff)
31
+ message = "Block#{expectation(negated)} to change value"
32
+ message += " by #{change_amount}" if change_amount
33
+ message += " but changed by #{value_diff}" if change_amount && !negated
34
+ message
35
+ end
36
+
37
+ def self.message_for_end_with(negated, subject, end_string)
38
+ "#{subject.inspect}#{expectation(negated)} to end with #{end_string.inspect}"
39
+ end
40
+
41
+ def self.message_for_start_with(negated, subject, start_string)
42
+ "#{subject.inspect}#{expectation(negated)} to start with #{start_string.inspect}"
43
+ end
44
+
45
+ def self.message_for_be_equal(negated, subject, value)
46
+ "#{subject.inspect}#{expectation(negated)} to be same object as #{value.inspect}"
47
+ end
48
+
49
+ def self.message_for_be_eq(negated, subject, value)
50
+ "#{subject.inspect}#{expectation(negated)} to be == to #{value.inspect}"
51
+ end
52
+
53
+ def self.message_for_have_generic(negated, subject, method_name, values)
54
+ message = "#{subject.inspect} #has_#{method_name}?"
55
+ message += "(#{values.map(&:inspect).join(', ')})" unless values.empty?
56
+ message += "#{expectation(negated)} to return true"
57
+ message
58
+ end
59
+
60
+ def self.message_for_have_items(negated, subject, expected_number_of_items, actual_number_of_items, key_type_name)
61
+ message = "#{subject.inspect}#{expectation(negated)} to have #{expected_number_of_items} #{key_type_name}"
62
+ message += " but had #{actual_number_of_items}" unless negated
63
+ message
64
+ end
65
+
66
+ def self.message_for_include(negated, subject, values)
67
+ values_message = values.size == 1 ? values.first : values
68
+ message = "#{subject.inspect}#{expectation(negated)} to include #{values_message.inspect}"
69
+ message
70
+ end
71
+
72
+ def self.message_for_match_array(negated, subject_array, expected_array)
73
+ message = "#{subject_array.inspect}#{expectation(negated)} to match array"
74
+ message += " #{expected_array.inspect}"
75
+ message
76
+ end
77
+
78
+ def self.message_for_match(negated, subject, match)
79
+ "#{subject.inspect}#{expectation(negated)} to match #{match.inspect}"
80
+ end
81
+
82
+ def self.message_for_raise_error(negated, show_class, error_class, show_message, error_message, rescued_exception)
83
+ message = "Block#{expectation(negated)} to raise error"
84
+ message += " of type #{error_class}" if show_class
85
+ message += " with message matching #{error_message.inspect}" if show_message
86
+ message += " but was #{rescued_exception.inspect}" if rescued_exception && !negated
87
+ message
88
+ end
89
+
90
+ def self.message_for_respond_to(negated, subject, method_name, number_of_args)
91
+ message = "#{subject.inspect}#{expectation(negated)} to respond to ##{method_name}"
92
+ message += " with #{number_of_args} arguments" if number_of_args
93
+ message
94
+ end
95
+
96
+ def self.message_for_satisfy(negated)
97
+ "Block#{expectation(negated)} to satisfy condition"
98
+ end
99
+ end
100
+ end
@@ -1,15 +1,11 @@
1
1
  module BaconExpect; module Matcher
2
- class Be
2
+ class Be < SingleMethod
3
3
  def initialize(value)
4
- @value = value
4
+ super(:equal?, value)
5
5
  end
6
6
 
7
- def matches?(subject)
8
- subject.equal?(@value)
9
- end
10
-
11
- def fail!(subject)
12
- raise FailedExpectation.new("#{subject} expected to be equal? to #{@value}")
7
+ def fail_message(subject, negated)
8
+ FailMessageRenderer.message_for_be_equal(negated, subject, @values.first)
13
9
  end
14
10
  end
15
11
  end; end
@@ -4,8 +4,9 @@ module BaconExpect; module Matcher
4
4
  !value
5
5
  end
6
6
 
7
- def fail!(subject)
8
- raise FailedExpectation.new("#{subject} expected to be false but wasn't")
7
+ def fail!(subject, negated)
8
+ message = FailMessageRenderer.message_for_be_false(negated, subject)
9
+ raise FailedExpectation.new(message)
9
10
  end
10
11
  end
11
12
  end; end
@@ -1,19 +1,7 @@
1
1
  module BaconExpect; module Matcher
2
- class BeGeneric
3
- def initialize(method_name, *args)
4
- @method_name = method_name
5
- @args = args
6
- end
7
-
8
- def matches?(value)
9
- value.send("#{@method_name}?", *@args)
10
- end
11
-
12
- def fail!(subject)
13
- message = "#{subject} expected to be #{@method_name}"
14
- message += " with #{@args}" unless @args.empty?
15
- message += " to return true"
16
- raise FailedExpectation.new(message)
2
+ class BeGeneric < SingleMethod
3
+ def initialize(method_name, *values)
4
+ super("#{method_name}?", *values)
17
5
  end
18
6
  end
19
7
  end; end
@@ -4,8 +4,8 @@ module BaconExpect; module Matcher
4
4
  value == nil
5
5
  end
6
6
 
7
- def fail!(subject)
8
- raise FailedExpectation.new("#{subject} expected to be nil but wasn't")
7
+ def fail!(subject, negated)
8
+ raise FailedExpectation.new(FailMessageRenderer.message_for_be_nil(negated, subject))
9
9
  end
10
10
  end
11
11
  end; end
@@ -4,8 +4,8 @@ module BaconExpect; module Matcher
4
4
  value == true
5
5
  end
6
6
 
7
- def fail!(subject)
8
- raise FailedExpectation.new("#{subject} expected to be true but wasn't")
7
+ def fail!(subject, negated)
8
+ raise FailedExpectation.new(FailMessageRenderer.message_for_be_true(negated, subject))
9
9
  end
10
10
  end
11
11
  end; end
@@ -14,8 +14,8 @@ module BaconExpect; module Matcher
14
14
  (subject - @center_value).abs <= @range
15
15
  end
16
16
 
17
- def fail!(subject)
18
- raise FailedExpectation.new("#{subject} expected to be within #{@range} of #{@center_value}")
17
+ def fail!(subject, negated)
18
+ raise FailedExpectation.new(FailMessageRenderer.message_for_be_within(negated, subject, @range, @center_value))
19
19
  end
20
20
  end
21
21
  end; end
@@ -14,16 +14,15 @@ module BaconExpect; module Matcher
14
14
  expectation_block.call
15
15
  new_value = @change_block.call
16
16
  if @change_amount
17
- new_value - @change_amount == old_value
17
+ @value_diff = new_value - old_value
18
+ @value_diff == @change_amount
18
19
  else
19
20
  new_value != old_value
20
21
  end
21
22
  end
22
23
 
23
- def fail!(subject)
24
- message = "Block expected to change value"
25
- message += " by #{@change_amount}" if @change_amount
26
- raise FailedExpectation.new(message)
24
+ def fail!(subject, negated)
25
+ raise FailedExpectation.new(FailMessageRenderer.message_for_change(negated, @change_amount, @value_diff))
27
26
  end
28
27
  end
29
28
  end; end
@@ -8,8 +8,8 @@ module BaconExpect; module Matcher
8
8
  subject[-@end_string.size..-1] == @end_string
9
9
  end
10
10
 
11
- def fail!(subject)
12
- raise FailedExpectation.new("#{subject} expected to end with #{@start_string}")
11
+ def fail!(subject, negated)
12
+ raise FailedExpectation.new(FailMessageRenderer.message_for_end_with(negated, subject, @end_string))
13
13
  end
14
14
  end
15
15
  end; end
@@ -1,15 +1,11 @@
1
1
  module BaconExpect; module Matcher
2
- class Eq
2
+ class Eq < SingleMethod
3
3
  def initialize(value)
4
- @value = value
4
+ super(:==, value)
5
5
  end
6
6
 
7
- def matches?(subject)
8
- subject == @value
9
- end
10
-
11
- def fail!(subject)
12
- raise FailedExpectation.new("#{subject} expected to be == to #{@value}")
7
+ def fail_message(subject, negated)
8
+ FailMessageRenderer.message_for_be_eq(negated, subject, @values.first)
13
9
  end
14
10
  end
15
11
  end; end
@@ -1,15 +1,7 @@
1
1
  module BaconExpect; module Matcher
2
- class Eql
2
+ class Eql < SingleMethod
3
3
  def initialize(value)
4
- @value = value
5
- end
6
-
7
- def matches?(subject)
8
- subject.eql?(@value)
9
- end
10
-
11
- def fail!(subject)
12
- raise FailedExpectation.new("#{subject} expected to be eql? to #{@value}")
4
+ super(:eql?, value)
13
5
  end
14
6
  end
15
7
  end; end
@@ -9,11 +9,8 @@ module BaconExpect; module Matcher
9
9
  subject.send("has_#{@method_name}?", *@args)
10
10
  end
11
11
 
12
- def fail!(subject)
13
- message = "#{subject} has_#{@method_name}?"
14
- message += " with #{@args}" unless @args.empty?
15
- message += " to return true"
16
- raise FailedExpectation.new(message)
12
+ def fail!(subject, negated)
13
+ raise FailedExpectation.new(FailMessageRenderer.message_for_have_generic(negated, subject, @method_name, @args))
17
14
  end
18
15
  end
19
16
  end; end
@@ -8,15 +8,15 @@ module BaconExpect; module Matcher
8
8
  value.size == @number_of_items
9
9
  end
10
10
 
11
- def items
12
- self
11
+ [:items, :item, :keys, :values].each do |key_type_name|
12
+ define_method(key_type_name) do
13
+ @key_type_name = key_type_name
14
+ self
15
+ end
13
16
  end
14
17
 
15
- alias_method :keys, :items
16
- alias_method :values, :items
17
-
18
- def fail!(subject)
19
- raise FailedExpectation.new("#{subject} expected to have #{@number_of_items} items")
18
+ def fail!(subject, negated)
19
+ raise FailedExpectation.new(FailMessageRenderer.message_for_have_items(negated, subject, @number_of_items, subject.size, @key_type_name))
20
20
  end
21
21
  end
22
22
  end; end
@@ -8,8 +8,8 @@ module BaconExpect; module Matcher
8
8
  @values.all?{|v| subject.include?(v)}
9
9
  end
10
10
 
11
- def fail!(subject)
12
- raise FailedExpectation.new("\"#{subject}\" expected to include #{@values}")
11
+ def fail!(subject, negated)
12
+ raise FailedExpectation.new(FailMessageRenderer.message_for_include(negated, subject, @values))
13
13
  end
14
14
  end
15
15
  end; end
@@ -1,15 +1,11 @@
1
1
  module BaconExpect; module Matcher
2
- class Match
3
- def initialize(regex)
4
- @regex = regex
2
+ class Match < SingleMethod
3
+ def initialize(value)
4
+ super(:match, value)
5
5
  end
6
6
 
7
- def matches?(subject)
8
- subject.match(@regex)
9
- end
10
-
11
- def fail!(subject)
12
- raise FailedExpectation.new("\"#{subject}\" expected to match #{@regex}")
7
+ def fail_message(subject, negated)
8
+ FailMessageRenderer.message_for_match(negated, subject, @values.first)
13
9
  end
14
10
  end
15
11
  end; end
@@ -1,21 +1,21 @@
1
1
  module BaconExpect; module Matcher
2
2
  class MatchArray
3
- def initialize(array)
4
- @array = array
3
+ def initialize(expected_array)
4
+ @expected_array = expected_array
5
5
  end
6
6
 
7
7
  def matches?(subject_array)
8
- return false unless subject_array.size == @array.size
8
+ return false unless subject_array.size == @expected_array.size
9
9
  array_copy = subject_array.dup
10
- @array.all? do |item|
10
+ @expected_array.all? do |item|
11
11
  has = array_copy.include?(item)
12
12
  array_copy.delete(item) if has
13
13
  has
14
14
  end
15
15
  end
16
16
 
17
- def fail!(subject_array)
18
- raise FailedExpectation.new("\"#{subject_array}\" expected to have same items as #{@array}")
17
+ def fail!(subject_array, negated)
18
+ raise FailedExpectation.new(FailMessageRenderer.message_for_match_array(negated, subject_array, @expected_array))
19
19
  end
20
20
  end
21
21
  end; end
@@ -22,10 +22,10 @@ module BaconExpect; module Matcher
22
22
  )
23
23
  end
24
24
 
25
- def fail!(subject)
26
- message = "Block expected to raise exception of type #{@error_class}"
27
- message += " but was #{@rescued_exception.class} #{@rescued_exception}" if @rescued_exception
28
- raise FailedExpectation.new(message)
25
+ def fail!(subject, negated)
26
+ show_class = @error_class != Exception
27
+ show_message = !@error_message.is_a?(String) || !@error_message.empty?
28
+ raise FailedExpectation.new(FailMessageRenderer.message_for_raise_error(negated, show_class, @error_class, show_message, @error_message, @rescued_exception))
29
29
  end
30
30
  end
31
31
  end; end
@@ -21,8 +21,8 @@ module BaconExpect; module Matcher
21
21
  valid
22
22
  end
23
23
 
24
- def fail!(subject)
25
- raise FailedExpectation.new("\"#{subject}\" expected to respond_to? #{@method_name}")
24
+ def fail!(subject, negated)
25
+ raise FailedExpectation.new(FailMessageRenderer.message_for_respond_to(negated, subject, @method_name, @number_of_args))
26
26
  end
27
27
  end
28
28
  end; end
@@ -8,8 +8,8 @@ module BaconExpect; module Matcher
8
8
  @condition_block.call(*values)
9
9
  end
10
10
 
11
- def fail!(subject)
12
- raise FailedExpectation.new("\"#{subject}\" expected to satisfy condition")
11
+ def fail!(subject, negated)
12
+ raise FailedExpectation.new(FailMessageRenderer.message_for_satisfy(negated))
13
13
  end
14
14
  end
15
15
  end; end
@@ -0,0 +1,20 @@
1
+ module BaconExpect; module Matcher
2
+ class SingleMethod
3
+ def initialize(method_name, *values)
4
+ @values = values
5
+ @method_name = method_name
6
+ end
7
+
8
+ def matches?(subject)
9
+ subject.send(@method_name, *@values)
10
+ end
11
+
12
+ def fail!(subject, negated)
13
+ raise FailedExpectation.new(self.fail_message(subject, negated))
14
+ end
15
+
16
+ def fail_message(subject, negated = false)
17
+ FailMessageRenderer.message_for_be(negated, subject, @method_name, @values)
18
+ end
19
+ end
20
+ end; end
@@ -8,8 +8,8 @@ module BaconExpect; module Matcher
8
8
  subject[0...@start_string.size] == @start_string
9
9
  end
10
10
 
11
- def fail!(subject)
12
- raise FailedExpectation.new("#{subject} expected to start with #{@start_string}")
11
+ def fail!(subject, negated)
12
+ raise FailedExpectation.new(FailMessageRenderer.message_for_start_with(negated, subject, @start_string))
13
13
  end
14
14
  end
15
15
  end; end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env sh
2
+ cd spec_app
3
+ rake spec
@@ -1,5 +1,5 @@
1
1
  class Bacon::Context
2
- def expect_failure(&block)
3
- expect(&block).to raise_error(BaconExpect::FailedExpectation)
2
+ def expect_failure(fail_message = "", &block)
3
+ expect(&block).to raise_error(BaconExpect::FailedExpectation, fail_message)
4
4
  end
5
5
  end
@@ -4,15 +4,16 @@ describe "Matcher::BeFalse" do
4
4
  end
5
5
 
6
6
  it "be_false fails when value is true" do
7
- expect_failure{ expect(true).to be_false }
7
+ expect_failure("true expected to be false"){ expect(true).to be_false }
8
8
  end
9
9
 
10
10
  it "be_false fails when value is an Object" do
11
- expect_failure{ expect(Object.new).to be_false }
11
+ object = Object.new
12
+ expect_failure("#{object} expected to be false"){ expect(object).to be_false }
12
13
  end
13
14
 
14
15
  it "be_false fails when value is false but asked for not_to" do
15
- expect_failure{ expect(false).not_to be_false }
16
+ expect_failure("false not expected to be false"){ expect(false).not_to be_false }
16
17
  end
17
18
 
18
19
  it "be_false passes when value is true but asked for not_to" do
@@ -4,7 +4,7 @@ describe "Matcher::BeGeneric" do
4
4
  end
5
5
 
6
6
  it "be_empty fails when value is not empty" do
7
- expect_failure{ expect([2, 3]).to be_empty }
7
+ expect_failure("[2, 3] #empty? expected to return true"){ expect([2, 3]).to be_empty }
8
8
  end
9
9
 
10
10
  it "be_kind_of passes when value is of the given type" do
@@ -12,7 +12,7 @@ describe "Matcher::BeGeneric" do
12
12
  end
13
13
 
14
14
  it "be_kind_of fails when value is not of the given type" do
15
- expect_failure{ expect("i'm a string").to be_kind_of(TrueClass) }
15
+ expect_failure("\"i'm a string\" #kind_of?(TrueClass) expected to return true"){ expect("i'm a string").to be_kind_of(TrueClass) }
16
16
  end
17
17
 
18
18
  it "be_amazing passes when the value responds to amazing? and returns true" do
@@ -22,6 +22,7 @@ describe "Matcher::BeGeneric" do
22
22
 
23
23
  it "be_amazing fails when the value responds to amazing? and returns false" do
24
24
  class TestClass; def amazing?; false; end; end
25
- expect_failure{ expect(TestClass.new).to be_amazing }
25
+ object = TestClass.new
26
+ expect_failure("#{object.inspect} #amazing? expected to return true"){ expect(object).to be_amazing }
26
27
  end
27
28
  end
@@ -4,14 +4,19 @@ describe "Matcher::BeNil" do
4
4
  end
5
5
 
6
6
  it "be_nil fails when value is true" do
7
- expect_failure{ expect(true).to be_nil }
7
+ expect_failure("true expected to be nil"){ expect(true).to be_nil }
8
8
  end
9
9
 
10
10
  it "be_nil fails when value is false" do
11
- expect_failure{ expect(false).to be_nil }
11
+ expect_failure("false expected to be nil"){ expect(false).to be_nil }
12
12
  end
13
13
 
14
14
  it "be_nil fails when value is an Object" do
15
- expect_failure{ expect(Object.new).to be_nil }
15
+ object = Object.new
16
+ expect_failure("#{object} expected to be nil"){ expect(object).to be_nil }
17
+ end
18
+
19
+ it "be_nil fails when value is nil but asked not to" do
20
+ expect_failure("nil not expected to be nil"){ expect(nil).not_to be_nil }
16
21
  end
17
22
  end
@@ -4,15 +4,16 @@ describe "Matcher::BeTrue" do
4
4
  end
5
5
 
6
6
  it "be_true fails when value is false" do
7
- expect_failure{ expect(false).to be_true }
7
+ expect_failure("false expected to be true"){ expect(false).to be_true }
8
8
  end
9
9
 
10
10
  it "be_true fails when value is an Object" do
11
- expect_failure{ expect(Object.new).to be_true }
11
+ object = Object.new
12
+ expect_failure("#{object} expected to be true"){ expect(object).to be_true }
12
13
  end
13
14
 
14
15
  it "be_true fails when value is true but asked for not_to" do
15
- expect_failure{ expect(true).not_to be_true }
16
+ expect_failure("true not expected to be true"){ expect(true).not_to be_true }
16
17
  end
17
18
 
18
19
  it "be_true passes when value is false but asked for not_to" do
@@ -9,10 +9,10 @@ describe "Matcher::BeWithin" do
9
9
  end
10
10
 
11
11
  it "fails when subject is not within range" do
12
- expect_failure{ expect(27.5).not_to be_within(0.5).of(28) }
13
- expect_failure{ expect(27.5).not_to be_within(0.5).of(27) }
14
- expect_failure{ expect(27.5).to be_within(0.5).of(28.1) }
15
- expect_failure{ expect(27.5).to be_within(0.5).of(26.9) }
12
+ expect_failure("27.5 not expected to be within 0.5 of 28"){ expect(27.5).not_to be_within(0.5).of(28) }
13
+ expect_failure("27.5 not expected to be within 0.5 of 27"){ expect(27.5).not_to be_within(0.5).of(27) }
14
+ expect_failure("27.5 expected to be within 0.5 of 28.5"){ expect(27.5).to be_within(0.5).of(28.5) }
15
+ expect_failure("27.5 expected to be within 0.5 of 26.5"){ expect(27.5).to be_within(0.5).of(26.5) }
16
16
  end
17
17
 
18
18
  it "raises an exception when the matcher is not complete" do
@@ -19,7 +19,7 @@ describe "Matcher::Change" do
19
19
 
20
20
  it "change fails when the expected block doesn't change the result of the argument block" do
21
21
  test_object = TestClass.new
22
- expect_failure{ expect{ test_object.dont_add }.to change{ test_object.counter } }
22
+ expect_failure("Block expected to change value"){ expect{ test_object.dont_add }.to change{ test_object.counter } }
23
23
  end
24
24
 
25
25
  it "change passes when the expected block doesn't change the result of the argument block but asked not_to" do
@@ -34,6 +34,11 @@ describe "Matcher::Change" do
34
34
 
35
35
  it "change when specified 'by' fails when the expected block changes the result of the argument block by a different amount" do
36
36
  test_object = TestClass.new
37
- expect_failure{ expect{ test_object.add; test_object.add }.to change{ test_object.counter }.by(6) }
37
+ expect_failure("Block expected to change value by 6 but changed by 2"){ expect{ test_object.add; test_object.add }.to change{ test_object.counter }.by(6) }
38
+ end
39
+
40
+ it "change when specified 'by' fails when the expected block changes the result of the argument block by the given amount but asked not to" do
41
+ test_object = TestClass.new
42
+ expect_failure("Block not expected to change value by 2"){ expect{ test_object.add; test_object.add }.not_to change{ test_object.counter }.by(2) }
38
43
  end
39
44
  end
@@ -4,6 +4,10 @@ describe "Matcher::EndWith" do
4
4
  end
5
5
 
6
6
  it "end_with fails when the subject doesn't end with the given string" do
7
- expect_failure{ expect("super").to end_with("key") }
7
+ expect_failure("\"super\" expected to end with \"key\""){ expect("super").to end_with("key") }
8
+ end
9
+
10
+ it "end_with fails when the subject ends with the given string but asked to not" do
11
+ expect_failure("\"super\" not expected to end with \"per\""){ expect("super").not_to end_with("per") }
8
12
  end
9
13
  end
@@ -4,7 +4,7 @@ describe "Matcher::Equality" do
4
4
  end
5
5
 
6
6
  it "eql fails when value is not eql? subject" do
7
- expect_failure{ expect(1).to eql(1.0) }
7
+ expect_failure("1 #eql?(1.0) expected to return true"){ expect(1).to eql(1.0) }
8
8
  end
9
9
 
10
10
  it "eq passes if value is == to subject" do
@@ -12,7 +12,7 @@ describe "Matcher::Equality" do
12
12
  end
13
13
 
14
14
  it "eq fails if value is == to subject" do
15
- expect_failure{ expect(1).to eq(2.0) }
15
+ expect_failure("1 expected to be == to 2.0"){ expect(1).to eq(2.0) }
16
16
  end
17
17
 
18
18
  it "be passes if value is same object as subject" do
@@ -21,10 +21,17 @@ describe "Matcher::Equality" do
21
21
  end
22
22
 
23
23
  it "be fails if value is not the same object as subject" do
24
- expect_failure{ expect("super").to be("super") }
24
+ expect_failure("\"super\" expected to be same object as \"super\""){ expect("super").to be("super") }
25
25
  end
26
26
 
27
27
  it "equal fails if value is not the same object as subject" do
28
- expect_failure{ expect("super").to equal("super") }
28
+ expect_failure("\"super\" expected to be same object as \"super\""){ expect("super").to equal("super") }
29
+ end
30
+
31
+ it "equal fails if value is the same object as subject but asked not to" do
32
+ expect_failure("\"super\" not expected to be same object as \"super\"") do
33
+ string = "super"
34
+ expect(string).not_to equal(string)
35
+ end
29
36
  end
30
37
  end
@@ -4,7 +4,7 @@ describe "Matcher::HaveGeneric" do
4
4
  end
5
5
 
6
6
  it "have_key fails if the hash doesn't include the given key" do
7
- expect_failure{ expect({a: 1, b: 2, c: 3}).to have_key(:h) }
7
+ expect_failure("{:a=>1, :b=>2, :c=>3} #has_key?(:h) expected to return true"){ expect({a: 1, b: 2, c: 3}).to have_key(:h) }
8
8
  end
9
9
 
10
10
  it "have_color passes when the value responds to has_color? and returns true" do
@@ -14,6 +14,13 @@ describe "Matcher::HaveGeneric" do
14
14
 
15
15
  it "have_color fails when the value responds to has_color? and returns false" do
16
16
  class TestClass; def has_color?(color); color == :red; end; end
17
- expect_failure{ expect(TestClass.new).to have_color(:blue) }
17
+ object = TestClass.new
18
+ expect_failure("#{object.inspect} #has_color?(:blue) expected to return true"){ expect(object).to have_color(:blue) }
19
+ end
20
+
21
+ it "have_color fails when the value responds to has_color? and returns true but asked not to" do
22
+ class TestClass; def has_color?(color); color == :red; end; end
23
+ object = TestClass.new
24
+ expect_failure("#{object.inspect} #has_color?(:red) not expected to return true"){ expect(object).to_not have_color(:red) }
18
25
  end
19
26
  end
@@ -4,6 +4,14 @@ describe "Matcher::HaveItems" do
4
4
  end
5
5
 
6
6
  it 'have fails when subject has the a different number of items' do
7
- expect_failure{ expect([1,2,3]).to have(10).items }
7
+ expect_failure("[1, 2, 3] expected to have 10 items but had 3"){ expect([1,2,3]).to have(10).items }
8
+ end
9
+
10
+ it 'have fails when subject has the same number of items but asked not to' do
11
+ expect_failure("[1, 2, 3] not expected to have 3 items"){ expect([1,2,3]).not_to have(3).items }
12
+ end
13
+
14
+ it 'have failure message changes when sending #keys instead of #items' do
15
+ expect_failure("[1, 2, 3] not expected to have 3 keys"){ expect([1,2,3]).not_to have(3).keys }
8
16
  end
9
17
  end
@@ -4,7 +4,7 @@ describe "Matcher::Include" do
4
4
  end
5
5
 
6
6
  it 'include fails when subject include? responds false' do
7
- expect_failure{ expect([1,2,3,4]).to include("asd") }
7
+ expect_failure("[1, 2, 3, 4] expected to include \"asd\""){ expect([1,2,3,4]).to include("asd") }
8
8
  end
9
9
 
10
10
  it 'include passes when an object responds true to include?' do
@@ -14,7 +14,8 @@ describe "Matcher::Include" do
14
14
 
15
15
  it 'include passes when an object responds false to include?' do
16
16
  class TestClass; def include?(value); false; end; end
17
- expect_failure{ expect(TestClass.new).to include(3) }
17
+ test_object = TestClass.new
18
+ expect_failure("#{test_object.inspect} expected to include 3"){ expect(test_object).to include(3) }
18
19
  end
19
20
 
20
21
  it "include passes when all values are included in subject" do
@@ -22,6 +23,10 @@ describe "Matcher::Include" do
22
23
  end
23
24
 
24
25
  it "include fails when some values are not included in subject" do
25
- expect_failure{ expect([1,2,3,4]).to include(2,3,4, 6) }
26
+ expect_failure("#{[1,2,3,4]} expected to include #{[2, 3, 4, 6]}"){ expect([1,2,3,4]).to include(2, 3, 4, 6) }
27
+ end
28
+
29
+ it "include fails when all values are included but asked not to" do
30
+ expect_failure("#{[1,2,3,4,5,6]} not expected to include #{[3, 4, 6]}"){ expect([1,2,3,4,5,6]).not_to include(3, 4, 6) }
26
31
  end
27
32
  end
@@ -4,14 +4,19 @@ describe "Matcher::MatchArray" do
4
4
  end
5
5
 
6
6
  it "match_array fails when subject has less items than value" do
7
- expect_failure{ expect([1,2,3]).to match_array([1,2,3,4]) }
7
+ expect_failure("#{[1,2,3]} expected to match array #{[1,2,3,4]}"){ expect([1,2,3]).to match_array([1,2,3,4]) }
8
8
  end
9
9
 
10
10
  it "match_array fails when subject has more items than value" do
11
- expect_failure{ expect([1,2,3,4]).to match_array([1,2,4,4,3]) }
11
+ expect_failure("#{[1,2,3, 4]} expected to match array #{[1,2,4,4,3]}"){ expect([1,2,3,4]).to match_array([1,2,4,4,3]) }
12
12
  end
13
13
 
14
14
  it "match_array fails when subject has different items" do
15
- expect_failure{ expect([1,2,3,4]).to match_array([Object.new, "a", 2, 3]) }
15
+ expected_array = [Object.new, "a", 2, 3]
16
+ expect_failure("#{[1,2,3,4]} expected to match array #{expected_array}"){ expect([1,2,3,4]).to match_array(expected_array) }
17
+ end
18
+
19
+ it 'match_array fails when subject matches the array but asked not to' do
20
+ expect_failure("#{[1,2,3,4]} not expected to match array"){ expect([1,2,3,4]).to_not match_array([4,2,1,3]) }
16
21
  end
17
22
  end
@@ -4,7 +4,7 @@ describe "Matcher::Match" do
4
4
  end
5
5
 
6
6
  it "match fails when subject is a string and doesn't match the regex" do
7
- expect_failure{ expect("qwerty qwerty").to match(/asd/) }
7
+ expect_failure("\"qwerty qwerty\" expected to match /asd/"){ expect("qwerty qwerty").to match(/asd/) }
8
8
  end
9
9
 
10
10
  it "match passes when subject is a regex and matches the given string" do
@@ -12,6 +12,10 @@ describe "Matcher::Match" do
12
12
  end
13
13
 
14
14
  it "match fails when subject is a regex and doesn't matche the given string" do
15
- expect_failure{ expect(/foo/).to match("drink") }
15
+ expect_failure("/foo/ expected to match \"drink\""){ expect(/foo/).to match("drink") }
16
+ end
17
+
18
+ it 'match fails when subject is a string and matches the regex but asked not to' do
19
+ expect_failure("\"asd asd asd\" not expected to match /asd/"){ expect("asd asd asd").to_not match(/asd/) }
16
20
  end
17
21
  end
@@ -4,7 +4,7 @@ describe "Matcher::RaiseError" do
4
4
  end
5
5
 
6
6
  it "raise_error without argument failes when the block doesn't raise any exception" do
7
- expect_failure{ expect{ Object.new }.to raise_error }
7
+ expect_failure("Block expected to raise error"){ expect{ Object.new }.to raise_error }
8
8
  end
9
9
 
10
10
  it "raise_error with a class argument passes when the block raises an exception of the argument class" do
@@ -12,7 +12,7 @@ describe "Matcher::RaiseError" do
12
12
  end
13
13
 
14
14
  it "raise_error with a class argument fails when the block raises an exception of a different class" do
15
- expect_failure{ expect{ 1/0 }.to raise_error(ArgumentError) }
15
+ expect_failure("Block expected to raise error of type ArgumentError"){ expect{ 1/0 }.to raise_error(ArgumentError) }
16
16
  end
17
17
 
18
18
  it "raise_error with a string argument passes when the block raises an exception with a message that includes the string" do
@@ -20,7 +20,7 @@ describe "Matcher::RaiseError" do
20
20
  end
21
21
 
22
22
  it "raise_error with a string argument fails when the block raises an exception with a message that doesn't include the string" do
23
- expect_failure{ expect{ raise "one message" }.to raise_error("different") }
23
+ expect_failure("Block expected to raise error with message matching \"different\" but was #<RuntimeError: one message>"){ expect{ raise "one message" }.to raise_error("different") }
24
24
  end
25
25
 
26
26
  it "raise_error with a Regex argument passes when the block raises an exception with a message that matches the Regex" do
@@ -28,7 +28,7 @@ describe "Matcher::RaiseError" do
28
28
  end
29
29
 
30
30
  it "raise_error with a Regex argument fails when the block raises an exception with a message that doesn't match the Regex" do
31
- expect_failure{ expect{ raise "one message" }.to raise_error(/different/) }
31
+ expect_failure("Block expected to raise error with message matching #{/different/.inspect} but was #<RuntimeError: one message>"){ expect{ raise "one message" }.to raise_error(/different/) }
32
32
  end
33
33
 
34
34
  it "raise_error with a class and a string argument passes if the block raises an exception of the same class and includes the string in its message" do
@@ -36,11 +36,11 @@ describe "Matcher::RaiseError" do
36
36
  end
37
37
 
38
38
  it "raise_error with a class and a string argument fails if the block raises an exception of the same class and but doesn't include the string in its message" do
39
- expect_failure{ expect{ raise ArgumentError.new("with a message") }.to raise_error(ArgumentError, "different") }
39
+ expect_failure("Block expected to raise error of type ArgumentError with message matching #{"different".inspect}"){ expect{ raise ArgumentError.new("with a message") }.to raise_error(ArgumentError, "different") }
40
40
  end
41
41
 
42
42
  it "raise_error with a class and a string argument fails if the block raises an exception of a different class" do
43
- expect_failure{ expect{ raise ArgumentError.new("with a message") }.to raise_error(ZeroDivisionError, "message") }
43
+ expect_failure("Block expected to raise error of type ZeroDivisionError with message matching #{"message".inspect}"){ expect{ raise ArgumentError.new("with a message") }.to raise_error(ZeroDivisionError, "message") }
44
44
  end
45
45
 
46
46
  it "raise_error with a class and a regex argument passes if the block raises an exception of the same class and includes the string in its message" do
@@ -48,14 +48,18 @@ describe "Matcher::RaiseError" do
48
48
  end
49
49
 
50
50
  it "raise_error with a class and a regex argument fails if the block raises an exception of the same class and but doesn't include the string in its message" do
51
- expect_failure{ expect{ raise ArgumentError.new("with a message") }.to raise_error(ArgumentError, /different/) }
51
+ expect_failure("Block expected to raise error of type ArgumentError with message matching #{/different/.inspect}"){ expect{ raise ArgumentError.new("with a message") }.to raise_error(ArgumentError, /different/) }
52
52
  end
53
53
 
54
54
  it "raise_error with a class and a regex argument fails if the block raises an exception of a different class" do
55
- expect_failure{ expect{ raise ArgumentError.new("with a message") }.to raise_error(ZeroDivisionError, /message/) }
55
+ expect_failure("Block expected to raise error of type ZeroDivisionError with message matching #{/message/.inspect} but was "){ expect{ raise ArgumentError.new("with a message") }.to raise_error(ZeroDivisionError, /message/) }
56
56
  end
57
57
 
58
58
  it "raise_exception is an alias of raise_error " do
59
59
  expect{ 1/0 }.to raise_exception(ZeroDivisionError)
60
60
  end
61
+
62
+ it "raise_error with a class argument fails when the block raises an exception of the argument class but asked not to" do
63
+ expect_failure("Block not expected to raise error of type ZeroDivisionError"){ expect{ 1/0 }.not_to raise_error(ZeroDivisionError) }
64
+ end
61
65
  end
@@ -4,11 +4,11 @@ describe "Matcher::RespondTo" do
4
4
  end
5
5
 
6
6
  it "respond_to fails when subject doesn't respond to method name" do
7
- expect_failure{ expect("string").to respond_to(:floor) }
7
+ expect_failure("\"string\" expected to respond to #floor"){ expect("string").to respond_to(:floor) }
8
8
  end
9
9
 
10
10
  it "respond_to when given number of arguments fails when subject doesn't respond to method name" do
11
- expect_failure{ expect("string").to respond_to(:floor).with(2).arguments }
11
+ expect_failure("\"string\" expected to respond to #floor with 2 arguments"){ expect("string").to respond_to(:floor).with(2).arguments }
12
12
  end
13
13
 
14
14
  it "respond_to when given number of arguments passes when subject responds to method name with exactly the same number of arguments" do
@@ -18,6 +18,13 @@ describe "Matcher::RespondTo" do
18
18
 
19
19
  it "respond_to when given number of arguments fails when subject responds to method name with different number of arguments" do
20
20
  class TestCase; def call_me(a,b,c); end; end
21
- expect_failure{ expect(TestCase.new).to respond_to(:call_me).with(1).argument }
21
+ test_object = TestCase.new
22
+ expect_failure("#{test_object.inspect} expected to respond to #call_me with 1 arguments"){ expect(test_object).to respond_to(:call_me).with(1).argument }
23
+ end
24
+
25
+ it "respond_to when given number of arguments fails when subject responds to method name with exactly the same number of arguments but asked not to" do
26
+ class TestCase; def call_me(a,b,c); end; end
27
+ test_object = TestCase.new
28
+ expect_failure("#{test_object.inspect} not expected to respond to #call_me with 3 arguments"){ expect(test_object).not_to respond_to(:call_me).with(3).arguments }
22
29
  end
23
30
  end
@@ -4,10 +4,14 @@ describe "Matcher::Satisfy" do
4
4
  end
5
5
 
6
6
  it 'satisfy fails when the block returns false' do
7
- expect_failure{ expect(1).to satisfy{|v| v == 3} }
7
+ expect_failure("Block expected to satisfy condition"){ expect(1).to satisfy{|v| v == 3} }
8
8
  end
9
9
 
10
10
  it 'satisfy fails when the block raises an exception' do
11
11
  expect{ expect(1).to satisfy{|v| 1/0 } }.to raise_error(ZeroDivisionError)
12
12
  end
13
+
14
+ it 'satisfy fails when the block returns true but asked not to' do
15
+ expect_failure("Block not expected to satisfy condition"){ expect(1).not_to satisfy{|v| v == 1} }
16
+ end
13
17
  end
@@ -4,6 +4,10 @@ describe "Matcher::StartWith" do
4
4
  end
5
5
 
6
6
  it "start_with fails when the subject doesn't start with the given string" do
7
- expect_failure{ expect("super").to start_with("key") }
7
+ expect_failure("\"super\" expected to start with \"key\""){ expect("super").to start_with("key") }
8
+ end
9
+
10
+ it 'start_with fails when the subject starts with the given string but asked not to' do
11
+ expect_failure("\"super\" not expected to start with \"sup\""){ expect("super").to_not start_with("sup") }
8
12
  end
9
13
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bacon-expect
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ignacio Piantanida
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-15 00:00:00.000000000 Z
11
+ date: 2014-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -46,6 +46,7 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - .gitignore
49
+ - .travis.yml
49
50
  - Gemfile
50
51
  - LICENSE.txt
51
52
  - README.md
@@ -55,6 +56,7 @@ files:
55
56
  - lib/bacon-expect/bacon_context.rb
56
57
  - lib/bacon-expect/exceptions.rb
57
58
  - lib/bacon-expect/expectation.rb
59
+ - lib/bacon-expect/fail_message_renderer.rb
58
60
  - lib/bacon-expect/matchers/be.rb
59
61
  - lib/bacon-expect/matchers/be_false.rb
60
62
  - lib/bacon-expect/matchers/be_generic.rb
@@ -74,7 +76,9 @@ files:
74
76
  - lib/bacon-expect/matchers/raise_error.rb
75
77
  - lib/bacon-expect/matchers/respond_to.rb
76
78
  - lib/bacon-expect/matchers/satisfy.rb
79
+ - lib/bacon-expect/matchers/single_method.rb
77
80
  - lib/bacon-expect/matchers/start_with.rb
81
+ - run-tests.sh
78
82
  - spec_app/.repl_history
79
83
  - spec_app/Gemfile
80
84
  - spec_app/Rakefile