rspec-expectations 2.0.0.a1 → 2.0.0.a2
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +3 -3
- data/.gitignore +1 -0
- data/License.txt +2 -2
- data/Rakefile +17 -10
- data/Upgrade.markdown +38 -0
- data/lib/rspec/expectations.rb +1 -0
- data/lib/rspec/expectations/extensions.rb +1 -0
- data/lib/rspec/expectations/extensions/rspec/core/example_group.rb +19 -0
- data/lib/rspec/expectations/version.rb +16 -0
- data/lib/rspec/matchers.rb +0 -2
- data/lib/rspec/matchers/exist.rb +2 -2
- data/lib/rspec/matchers/extensions/instance_exec.rb +27 -19
- data/lib/rspec/matchers/include.rb +17 -16
- data/lib/rspec/matchers/matcher.rb +71 -25
- data/rspec-expectations.gemspec +66 -19
- data/spec/rspec/matchers/be_close_spec.rb +50 -0
- data/spec/rspec/matchers/be_instance_of_spec.rb +36 -0
- data/spec/rspec/matchers/be_kind_of_spec.rb +33 -0
- data/spec/rspec/matchers/be_spec.rb +311 -0
- data/spec/rspec/matchers/change_spec.rb +349 -0
- data/spec/rspec/matchers/compatibility_spec.rb +28 -0
- data/spec/rspec/matchers/description_generation_spec.rb +160 -0
- data/spec/rspec/matchers/dsl_spec.rb +25 -0
- data/spec/rspec/matchers/eql_spec.rb +33 -0
- data/spec/rspec/matchers/equal_spec.rb +57 -0
- data/spec/rspec/matchers/exist_spec.rb +65 -0
- data/spec/rspec/matchers/has_spec.rb +81 -0
- data/spec/rspec/matchers/have_spec.rb +407 -0
- data/spec/rspec/matchers/include_spec.rb +88 -0
- data/spec/rspec/matchers/match_array_spec.rb +108 -0
- data/spec/rspec/matchers/match_spec.rb +57 -0
- data/spec/rspec/matchers/matcher_methods_spec.rb +63 -0
- data/spec/rspec/matchers/matcher_spec.rb +289 -0
- data/spec/rspec/matchers/matchers_spec.rb +2 -0
- data/spec/rspec/matchers/operator_matcher_spec.rb +191 -0
- data/spec/rspec/matchers/raise_error_spec.rb +333 -0
- data/spec/rspec/matchers/respond_to_spec.rb +116 -0
- data/spec/rspec/matchers/satisfy_spec.rb +36 -0
- data/spec/rspec/matchers/throw_symbol_spec.rb +96 -0
- data/spec/spec_helper.rb +13 -1
- data/spec/support/classes.rb +51 -0
- metadata +60 -15
- data/VERSION +0 -1
- data/VERSION.yml +0 -5
- data/lib/rspec/matchers/simple_matcher.rb +0 -133
- data/lib/rspec/matchers/wrap_expectation.rb +0 -55
- data/spec/rspec/expectations/wrap_expectation_spec.rb +0 -30
- data/spec/support/macros.rb +0 -29
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
Rspec::Matchers.define :have_public_instance_method do |method|
|
4
|
+
match do |klass|
|
5
|
+
klass.public_instance_methods.any? {|m| [method, method.to_sym].include?(m)}
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
(Rspec::Matchers.constants.sort).each do |c|
|
10
|
+
if (Class === (klass = Rspec::Matchers.const_get(c)))
|
11
|
+
describe klass do
|
12
|
+
if klass.public_instance_methods.any? {|m| ['failure_message_for_should',:failure_message_for_should].include?(m)}
|
13
|
+
describe "called with should" do
|
14
|
+
subject { klass }
|
15
|
+
it { should have_public_instance_method('failure_message_for_should')}
|
16
|
+
it { should have_public_instance_method('failure_message')}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
if klass.public_instance_methods.any? {|m| ['failure_message_for_should_not',:failure_message_for_should_not].include?(m)}
|
20
|
+
describe "called with should not" do
|
21
|
+
subject { klass }
|
22
|
+
it { should have_public_instance_method('failure_message_for_should_not')}
|
23
|
+
it { should have_public_instance_method('negative_failure_message')}
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
describe "Matchers should be able to generate their own descriptions" do
|
4
|
+
after(:each) do
|
5
|
+
Rspec::Matchers.clear_generated_description
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should == expected" do
|
9
|
+
"this".should == "this"
|
10
|
+
Rspec::Matchers.generated_description.should == "should == \"this\""
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should not == expected" do
|
14
|
+
"this".should_not == "that"
|
15
|
+
Rspec::Matchers.generated_description.should == "should not == \"that\""
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should be empty (arbitrary predicate)" do
|
19
|
+
[].should be_empty
|
20
|
+
Rspec::Matchers.generated_description.should == "should be empty"
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should not be empty (arbitrary predicate)" do
|
24
|
+
[1].should_not be_empty
|
25
|
+
Rspec::Matchers.generated_description.should == "should not be empty"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should be true" do
|
29
|
+
true.should be_true
|
30
|
+
Rspec::Matchers.generated_description.should == "should be true"
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should be false" do
|
34
|
+
false.should be_false
|
35
|
+
Rspec::Matchers.generated_description.should == "should be false"
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should be nil" do
|
39
|
+
nil.should be_nil
|
40
|
+
Rspec::Matchers.generated_description.should == "should be nil"
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should be > n" do
|
44
|
+
5.should be > 3
|
45
|
+
Rspec::Matchers.generated_description.should == "should be > 3"
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should be predicate arg1, arg2 and arg3" do
|
49
|
+
5.0.should be_between(0,10)
|
50
|
+
Rspec::Matchers.generated_description.should == "should be between 0 and 10"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should equal" do
|
54
|
+
expected = "expected"
|
55
|
+
expected.should equal(expected)
|
56
|
+
Rspec::Matchers.generated_description.should == "should equal \"expected\""
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should_not equal" do
|
60
|
+
5.should_not equal(37)
|
61
|
+
Rspec::Matchers.generated_description.should == "should not equal 37"
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should eql" do
|
65
|
+
"string".should eql("string")
|
66
|
+
Rspec::Matchers.generated_description.should == "should eql \"string\""
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should not eql" do
|
70
|
+
"a".should_not eql(:a)
|
71
|
+
Rspec::Matchers.generated_description.should == "should not eql :a"
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should have_key" do
|
75
|
+
{:a => "a"}.should have_key(:a)
|
76
|
+
Rspec::Matchers.generated_description.should == "should have key :a"
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should have n items" do
|
80
|
+
team.should have(3).players
|
81
|
+
Rspec::Matchers.generated_description.should == "should have 3 players"
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should have at least n items" do
|
85
|
+
team.should have_at_least(2).players
|
86
|
+
Rspec::Matchers.generated_description.should == "should have at least 2 players"
|
87
|
+
end
|
88
|
+
|
89
|
+
it "should have at most n items" do
|
90
|
+
team.should have_at_most(4).players
|
91
|
+
Rspec::Matchers.generated_description.should == "should have at most 4 players"
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should include" do
|
95
|
+
[1,2,3].should include(3)
|
96
|
+
Rspec::Matchers.generated_description.should == "should include 3"
|
97
|
+
end
|
98
|
+
|
99
|
+
it "array.should =~ [1,2,3]" do
|
100
|
+
[1,2,3].should =~ [1,2,3]
|
101
|
+
Rspec::Matchers.generated_description.should == "should contain exactly 1, 2 and 3"
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should match" do
|
105
|
+
"this string".should match(/this string/)
|
106
|
+
Rspec::Matchers.generated_description.should == "should match /this string/"
|
107
|
+
end
|
108
|
+
|
109
|
+
it "should raise_error" do
|
110
|
+
lambda { raise }.should raise_error
|
111
|
+
Rspec::Matchers.generated_description.should == "should raise Exception"
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should raise_error with type" do
|
115
|
+
lambda { raise }.should raise_error(RuntimeError)
|
116
|
+
Rspec::Matchers.generated_description.should == "should raise RuntimeError"
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should raise_error with type and message" do
|
120
|
+
lambda { raise "there was an error" }.should raise_error(RuntimeError, "there was an error")
|
121
|
+
Rspec::Matchers.generated_description.should == "should raise RuntimeError with \"there was an error\""
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should respond_to" do
|
125
|
+
[].should respond_to(:insert)
|
126
|
+
Rspec::Matchers.generated_description.should == "should respond to #insert"
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should throw symbol" do
|
130
|
+
lambda { throw :what_a_mess }.should throw_symbol
|
131
|
+
Rspec::Matchers.generated_description.should == "should throw a Symbol"
|
132
|
+
end
|
133
|
+
|
134
|
+
it "should throw symbol (with named symbol)" do
|
135
|
+
lambda { throw :what_a_mess }.should throw_symbol(:what_a_mess)
|
136
|
+
Rspec::Matchers.generated_description.should == "should throw :what_a_mess"
|
137
|
+
end
|
138
|
+
|
139
|
+
def team
|
140
|
+
Class.new do
|
141
|
+
def players
|
142
|
+
[1,2,3]
|
143
|
+
end
|
144
|
+
end.new
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe "a Matcher with no description" do
|
149
|
+
def matcher
|
150
|
+
Class.new do
|
151
|
+
def matches?(ignore); true; end
|
152
|
+
def failure_message; ""; end
|
153
|
+
end.new
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should provide a helpful message when used in a string-less example block" do
|
157
|
+
5.should matcher
|
158
|
+
Rspec::Matchers.generated_description.should =~ /When you call.*description method/m
|
159
|
+
end
|
160
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
module Rspec
|
4
|
+
module Matchers
|
5
|
+
module DSL
|
6
|
+
describe "#define" do
|
7
|
+
it "creates a method that initializes a new matcher with the submitted name and expected arg" do
|
8
|
+
# FIXME - this expects new to be called, but we need something
|
9
|
+
# more robust - that expects new to be called with a specific
|
10
|
+
# block (lambda, proc, whatever)
|
11
|
+
mod = Module.new
|
12
|
+
mod.extend Rspec::Matchers::DSL
|
13
|
+
mod.define(:foo)
|
14
|
+
|
15
|
+
obj = Object.new
|
16
|
+
obj.extend mod
|
17
|
+
|
18
|
+
Rspec::Matchers::Matcher.should_receive(:new).with(:foo, 3)
|
19
|
+
|
20
|
+
obj.foo(3)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
module Rspec
|
4
|
+
module Matchers
|
5
|
+
describe "eql" do
|
6
|
+
it "should match when actual.eql?(expected)" do
|
7
|
+
1.should eql(1)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should not match when !actual.eql?(expected)" do
|
11
|
+
1.should_not eql(2)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should describe itself" do
|
15
|
+
matcher = eql(1)
|
16
|
+
matcher.matches?(1)
|
17
|
+
matcher.description.should == "eql 1"
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should provide message, expected and actual on #failure_message" do
|
21
|
+
matcher = eql("1")
|
22
|
+
matcher.matches?(1)
|
23
|
+
matcher.failure_message_for_should.should == "\nexpected \"1\"\n got 1\n\n(compared using eql?)\n"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should provide message, expected and actual on #negative_failure_message" do
|
27
|
+
matcher = eql(1)
|
28
|
+
matcher.matches?(1)
|
29
|
+
matcher.failure_message_for_should_not.should == "\nexpected 1 not to equal 1\n\n(compared using eql?)\n"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
module Rspec
|
3
|
+
module Matchers
|
4
|
+
describe "equal" do
|
5
|
+
|
6
|
+
def inspect_object(o)
|
7
|
+
"#<#{o.class}:#{o.object_id}> => #{o.inspect}"
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should match when actual.equal?(expected)" do
|
11
|
+
1.should equal(1)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should not match when !actual.equal?(expected)" do
|
15
|
+
1.should_not equal("1")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should describe itself" do
|
19
|
+
matcher = equal(1)
|
20
|
+
matcher.matches?(1)
|
21
|
+
matcher.description.should == "equal 1"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should provide message on #failure_message" do
|
25
|
+
expected, actual = "1", "1"
|
26
|
+
matcher = equal(expected)
|
27
|
+
matcher.matches?(actual)
|
28
|
+
|
29
|
+
matcher.failure_message_for_should.should == <<-MESSAGE
|
30
|
+
|
31
|
+
expected #{inspect_object(expected)}
|
32
|
+
got #{inspect_object(actual)}
|
33
|
+
|
34
|
+
Compared using equal?, which compares object identity,
|
35
|
+
but expected and actual are not the same object. Use
|
36
|
+
'actual.should == expected' if you don't care about
|
37
|
+
object identity in this example.
|
38
|
+
|
39
|
+
MESSAGE
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should provide message on #negative_failure_message" do
|
43
|
+
expected = actual = "1"
|
44
|
+
matcher = equal(expected)
|
45
|
+
matcher.matches?(actual)
|
46
|
+
matcher.failure_message_for_should_not.should == <<-MESSAGE
|
47
|
+
|
48
|
+
expected not #{inspect_object(expected)}
|
49
|
+
got #{inspect_object(actual)}
|
50
|
+
|
51
|
+
Compared using equal?, which compares object identity.
|
52
|
+
|
53
|
+
MESSAGE
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
class Substance
|
4
|
+
def initialize exists, description
|
5
|
+
@exists = exists
|
6
|
+
@description = description
|
7
|
+
end
|
8
|
+
def exist?(arg=nil)
|
9
|
+
@exists
|
10
|
+
end
|
11
|
+
def inspect
|
12
|
+
@description
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class SubstanceTester
|
17
|
+
include Rspec::Matchers
|
18
|
+
def initialize substance
|
19
|
+
@substance = substance
|
20
|
+
end
|
21
|
+
def should_exist
|
22
|
+
@substance.should exist
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "should exist" do
|
27
|
+
|
28
|
+
before(:each) do
|
29
|
+
@real = Substance.new true, 'something real'
|
30
|
+
@imaginary = Substance.new false, 'something imaginary'
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "within an example group" do
|
34
|
+
|
35
|
+
it "passes if target exists" do
|
36
|
+
@real.should exist
|
37
|
+
end
|
38
|
+
|
39
|
+
it "passes if target exists with args" do
|
40
|
+
@real.should exist('this arg')
|
41
|
+
end
|
42
|
+
|
43
|
+
it "fails if target does not exist" do
|
44
|
+
lambda { @imaginary.should exist }.should fail
|
45
|
+
end
|
46
|
+
|
47
|
+
it "describes itself" do
|
48
|
+
exist.description.should == "exist"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "passes should_not exist if target doesn't exist" do
|
52
|
+
lambda { @real.should_not exist }.should fail
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "outside of an example group" do
|
57
|
+
|
58
|
+
it "should pass if target exists" do
|
59
|
+
real_tester = SubstanceTester.new @real
|
60
|
+
real_tester.should_exist
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper.rb'
|
2
|
+
|
3
|
+
describe "should have_sym(*args)" do
|
4
|
+
it "should pass if #has_sym?(*args) returns true" do
|
5
|
+
{:a => "A"}.should have_key(:a)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should fail if #has_sym?(*args) returns false" do
|
9
|
+
lambda {
|
10
|
+
{:b => "B"}.should have_key(:a)
|
11
|
+
}.should fail_with("expected #has_key?(:a) to return true, got false")
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should fail if #has_sym?(*args) returns nil" do
|
15
|
+
klass = Class.new do
|
16
|
+
def has_foo?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
lambda {
|
20
|
+
klass.new.should have_foo
|
21
|
+
}.should fail_with("expected #has_foo?(nil) to return true, got false")
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should fail if target does not respond to #has_sym?" do
|
25
|
+
lambda {
|
26
|
+
Object.new.should have_key(:a)
|
27
|
+
}.should raise_error(NoMethodError)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should reraise an exception thrown in #has_sym?(*args)" do
|
31
|
+
o = Object.new
|
32
|
+
def o.has_sym?(*args)
|
33
|
+
raise "Funky exception"
|
34
|
+
end
|
35
|
+
lambda { o.should have_sym(:foo) }.should raise_error("Funky exception")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "should_not have_sym(*args)" do
|
40
|
+
it "should pass if #has_sym?(*args) returns false" do
|
41
|
+
{:a => "A"}.should_not have_key(:b)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should pass if #has_sym?(*args) returns nil" do
|
45
|
+
klass = Class.new do
|
46
|
+
def has_foo?
|
47
|
+
end
|
48
|
+
end
|
49
|
+
klass.new.should_not have_foo
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should fail if #has_sym?(*args) returns true" do
|
53
|
+
lambda {
|
54
|
+
{:a => "A"}.should_not have_key(:a)
|
55
|
+
}.should fail_with("expected #has_key?(:a) to return false, got true")
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should fail if target does not respond to #has_sym?" do
|
59
|
+
lambda {
|
60
|
+
Object.new.should have_key(:a)
|
61
|
+
}.should raise_error(NoMethodError)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should reraise an exception thrown in #has_sym?(*args)" do
|
65
|
+
o = Object.new
|
66
|
+
def o.has_sym?(*args)
|
67
|
+
raise "Funky exception"
|
68
|
+
end
|
69
|
+
lambda { o.should_not have_sym(:foo) }.should raise_error("Funky exception")
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "has" do
|
74
|
+
it "should work when the target implements #send" do
|
75
|
+
o = {:a => "A"}
|
76
|
+
def o.send(*args); raise "DOH! Library developers shouldn't use #send!" end
|
77
|
+
lambda {
|
78
|
+
o.should have_key(:a)
|
79
|
+
}.should_not raise_error
|
80
|
+
end
|
81
|
+
end
|