rspec-expectations 2.0.0.rc → 2.0.0

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.
data/Gemfile CHANGED
@@ -10,6 +10,7 @@ gem "rspec-core", :path => "../rspec-core"
10
10
  gem "rspec-mocks", :path => "../rspec-mocks"
11
11
  gem "watchr"
12
12
  gem "rcov"
13
+ gem "relish"
13
14
 
14
15
  case RUBY_VERSION
15
16
  when '1.9.2'
@@ -1,5 +1,16 @@
1
1
  ## rspec-expectations release history (incomplete)
2
2
 
3
+ ### 2.0.0 / 2010-10-10
4
+
5
+ [full changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.rc...v2.0.0)
6
+
7
+ * Enhancements
8
+ * Add match_for_should_not method to matcher DSL (Myron Marston)
9
+
10
+ * Bug fixes
11
+ * respond_to matcher works correctly with should_not with multiple methods (Myron Marston)
12
+ * include matcher works correctly with should_not with multiple values (Myron Marston)
13
+
3
14
  ### 2.0.0.rc / 2010-10-05
4
15
 
5
16
  [full changelog](http://github.com/rspec/rspec-expectations/compare/v2.0.0.beta.22...v2.0.0.rc)
data/Rakefile CHANGED
@@ -8,8 +8,6 @@ require 'rspec/core/rake_task'
8
8
  require 'rspec/expectations/version'
9
9
  require 'cucumber/rake/task'
10
10
 
11
- RSpec::Core::RakeTask.new(:spec)
12
-
13
11
  class Cucumber::Rake::Task::ForkedCucumberRunner
14
12
  # When cucumber shells out, we still need it to run in the context of our
15
13
  # bundle.
@@ -18,22 +16,34 @@ class Cucumber::Rake::Task::ForkedCucumberRunner
18
16
  end
19
17
  end
20
18
 
21
- desc "Run all examples using rcov"
22
- RSpec::Core::RakeTask.new :rcov => :cleanup_rcov_files do |t|
23
- t.rcov = true
24
- t.rcov_opts = %[-Ilib -Ispec --exclude "gems/*,features"]
25
- t.rcov_opts << %[--text-report --sort coverage --no-html --aggregate coverage.data]
26
- end
27
-
28
19
  task :cleanup_rcov_files do
29
20
  rm_rf 'coverage.data'
30
21
  end
31
22
 
32
- Cucumber::Rake::Task.new :cucumber => :cleanup_rcov_files do |t|
33
- t.cucumber_opts = %w{--format progress}
34
- t.rcov = true
35
- t.rcov_opts = %[-Ilib -Ispec --exclude "gems/*,features"]
36
- t.rcov_opts << %[--text-report --sort coverage --aggregate coverage.data]
23
+ desc "Run all examples"
24
+ RSpec::Core::RakeTask.new(:spec) do |t|
25
+ t.rspec_opts = %w[--color]
26
+ end
27
+
28
+ Cucumber::Rake::Task.new(:cucumber)
29
+
30
+ namespace :spec do
31
+ desc "Run all examples using rcov"
32
+ RSpec::Core::RakeTask.new :rcov => :cleanup_rcov_files do |t|
33
+ t.rcov = true
34
+ t.rcov_opts = %[-Ilib -Ispec --exclude "gems/*,features"]
35
+ t.rcov_opts << %[--text-report --sort coverage --no-html --aggregate coverage.data]
36
+ end
37
+ end
38
+
39
+ namespace :cucumber do
40
+ desc "Run cucumber features using rcov"
41
+ Cucumber::Rake::Task.new :rcov => :cleanup_rcov_files do |t|
42
+ t.cucumber_opts = %w{--format progress}
43
+ t.rcov = true
44
+ t.rcov_opts = %[-Ilib -Ispec --exclude "gems/*,features"]
45
+ t.rcov_opts << %[--text-report --sort coverage --aggregate coverage.data]
46
+ end
37
47
  end
38
48
 
39
49
  task :default => [:spec, :cucumber]
@@ -45,6 +55,12 @@ Rake::RDocTask.new do |rdoc|
45
55
  rdoc.rdoc_files.include('lib/**/*.rb')
46
56
  end
47
57
 
58
+ desc "Push cukes to relishapp using the relish-client-gem"
59
+ task :relish, :version do |t, args|
60
+ raise "rake relish[VERSION]" unless args[:version]
61
+ sh "bundle exec relish --organization rspec --project rspec-expectations -v #{args[:version]} push"
62
+ end
63
+
48
64
  task :clobber do
49
65
  rm_rf 'doc'
50
66
  rm_rf 'pkg'
@@ -1,12 +1,18 @@
1
- # Cucumber features
1
+ rspec-expectations is used to set expectations in executable
2
+ examples:
2
3
 
3
- RSpec is specified using both RSpec and
4
- [Cucumber](http://github.com/aslakhellesoy/cucumber). Cucumber provides
5
- _executable documentation_. This means that the _.feature_ files below this
6
- directory serve as specification, documentation _and_ regression tests of the
7
- behaviour.
4
+ describe Account do
5
+ it "has a balance of zero when first created" do
6
+ Account.new.balance.should eq(Money.new(0))
7
+ end
8
+ end
8
9
 
9
10
  ## Issues
10
11
 
11
- If you find this documentation incomplete or confusing, please [submit an
12
- issue](http://github.com/rspec/rspec-expectations/issues).
12
+ The documentation for rspec-expectations is a work in progress. We'll be adding
13
+ Cucumber features over time, and clarifying existing ones. If you have
14
+ specific features you'd like to see added, find the existing documentation
15
+ incomplete or confusing, or, better yet, wish to write a missing Cucumber
16
+ feature yourself, please [submit an
17
+ issue](http://github.com/rspec/rspec-expectations/issues) or a [pull
18
+ request](http://github.com/rspec/rspec-expectations).
@@ -1,4 +1,4 @@
1
- Feature: access running example
1
+ Feature: Access running example
2
2
 
3
3
  In order to take advantage of services that are available
4
4
  in my examples when I'm writing matchers
@@ -1,4 +1,4 @@
1
- Feature: define diffable matcher
1
+ Feature: Define diffable matcher
2
2
 
3
3
  When a matcher is defined as diffable, and the --diff
4
4
  flag is set, the output will include a diff of the submitted
@@ -1,4 +1,4 @@
1
- Feature: define matcher
1
+ Feature: Define matcher
2
2
 
3
3
  In order to express my domain clearly in my code examples
4
4
  As an RSpec user
@@ -256,3 +256,56 @@ Feature: define matcher
256
256
 
257
257
  When I run "rspec scoped_matcher_spec.rb"
258
258
  Then the output should contain "3 examples, 0 failures"
259
+
260
+ Scenario: matcher with separate logic for should and should_not
261
+ Given a file named "matcher_with_separate_should_not_logic_spec.rb" with:
262
+ """
263
+ RSpec::Matchers.define :contain do |*expected|
264
+ match_for_should do |actual|
265
+ expected.all? { |e| actual.include?(e) }
266
+ end
267
+
268
+ match_for_should_not do |actual|
269
+ expected.none? { |e| actual.include?(e) }
270
+ end
271
+ end
272
+
273
+ describe [1, 2, 3] do
274
+ it { should contain(1, 2) }
275
+ it { should_not contain(4, 5, 6) }
276
+
277
+ # deliberate failures
278
+ it { should contain(1, 4) }
279
+ it { should_not contain(1, 4) }
280
+ end
281
+ """
282
+ When I run "rspec matcher_with_separate_should_not_logic_spec.rb"
283
+ Then the output should contain all of these:
284
+ | 4 examples, 2 failures |
285
+ | expected [1, 2, 3] to contain 1 and 4 |
286
+ | expected [1, 2, 3] not to contain 1 and 4 |
287
+
288
+ Scenario: use define_method to create a helper method with access to matcher params
289
+ Given a file named "define_method_spec.rb" with:
290
+ """
291
+ RSpec::Matchers.define :be_a_multiple_of do |expected|
292
+ define_method :is_multiple? do |actual|
293
+ actual % expected == 0
294
+ end
295
+ match { |actual| is_multiple?(actual) }
296
+ end
297
+
298
+ describe 9 do
299
+ it { should be_a_multiple_of(3) }
300
+ it { should_not be_a_multiple_of(4) }
301
+
302
+ # deliberate failures
303
+ it { should be_a_multiple_of(2) }
304
+ it { should_not be_a_multiple_of(3) }
305
+ end
306
+ """
307
+ When I run "rspec define_method_spec.rb"
308
+ Then the output should contain all of these:
309
+ | 4 examples, 2 failures |
310
+ | expected 9 to be a multiple of 2 |
311
+ | expected 9 not to be a multiple of 3 |
@@ -1,4 +1,4 @@
1
- Feature: define matcher outside rspec
1
+ Feature: Define matcher outside rspec
2
2
 
3
3
  In order to express my domain clearly in my code examples
4
4
  As a non-rspec user
@@ -1,27 +1,24 @@
1
- Feature: define matcher
1
+ Feature: Define matcher with fluent interface
2
2
 
3
- In order to express my domain clearly in my code examples
4
- As an RSpec user
5
- I want to define matchers with fluent interfaces
3
+ Use the chain() method to define matchers with a fluent interface.
6
4
 
7
- Scenario: one additional method
5
+ Scenario: chained method with argumetn
8
6
  Given a file named "between_spec.rb" with:
9
7
  """
10
8
  RSpec::Matchers.define :be_bigger_than do |first|
11
- def but_smaller_than(second)
12
- @second = second
13
- self
14
- end
15
-
16
9
  match do |actual|
17
10
  (actual > first) && (actual < @second)
18
11
  end
12
+
13
+ chain :but_smaller_than do |second|
14
+ @second = second
15
+ end
19
16
  end
20
17
 
21
18
  describe 5 do
22
19
  it { should be_bigger_than(4).but_smaller_than(6) }
23
20
  end
24
21
  """
25
- When I run "rspec ./between_spec.rb --format documentation"
22
+ When I run "rspec between_spec.rb --format documentation"
26
23
  Then the output should contain "1 example, 0 failures"
27
24
  And the output should contain "should be bigger than 4"
@@ -1,4 +1,4 @@
1
- Feature: equality matchers
1
+ Feature: Equality matchers
2
2
 
3
3
  Ruby exposes several different methods for handling equality:
4
4
 
@@ -1,4 +1,4 @@
1
- Feature: expect change
1
+ Feature: Expect change
2
2
 
3
3
  Expect some code (wrapped in a proc) to change the state of some object.
4
4
 
@@ -1,4 +1,4 @@
1
- Feature: expect error
1
+ Feature: Expect error
2
2
 
3
3
  Expect a proc to raise an error when called.
4
4
 
@@ -1,4 +1,4 @@
1
- Feature: have matchers
1
+ Feature: have(n).items matcher
2
2
 
3
3
  RSpec provides several matchers that make it easy to set expectations about the
4
4
  size of a collection. There are three basic forms:
@@ -0,0 +1,136 @@
1
+ Feature: include matcher
2
+
3
+ Use the include matcher to specify than a collection includes one or more
4
+ expected objects. This works on any object that responds to #include? (such
5
+ as a string or array):
6
+
7
+ "a string".should include("a")
8
+ "a string".should include("str")
9
+ "a string".should include("str", "g")
10
+ "a string".should_not include("foo")
11
+
12
+ [1, 2].should include(1)
13
+ [1, 2].should include(1, 2)
14
+ [1, 2].should_not include(17)
15
+
16
+ The matcher also provides flexible handling for hashes:
17
+
18
+ {:a => 1, :b => 2}.should include(:a)
19
+ {:a => 1, :b => 2}.should include(:a, :b)
20
+ {:a => 1, :b => 2}.should include(:a => 1)
21
+ {:a => 1, :b => 2}.should include(:b => 2, :a => 1)
22
+ {:a => 1, :b => 2}.should_not include(:c)
23
+ {:a => 1, :b => 2}.should_not include(:a => 2)
24
+ {:a => 1, :b => 2}.should_not include(:c => 3)
25
+
26
+ Scenario: array usage
27
+ Given a file named "array_include_matcher_spec.rb" with:
28
+ """
29
+ describe [1, 3, 7] do
30
+ it { should include(1) }
31
+ it { should include(3) }
32
+ it { should include(7) }
33
+ it { should include(1, 7) }
34
+ it { should include(1, 3, 7) }
35
+ it { should_not include(17) }
36
+ it { should_not include(43, 100) }
37
+
38
+ # deliberate failures
39
+ it { should include(4) }
40
+ it { should_not include(1) }
41
+ it { should_not include(3) }
42
+ it { should_not include(7) }
43
+ it { should_not include(1, 3, 7) }
44
+
45
+ # both of these should fail since it includes 1 but not 9
46
+ it { should include(1, 9) }
47
+ it { should_not include(1, 9) }
48
+ end
49
+ """
50
+ When I run "rspec array_include_matcher_spec.rb"
51
+ Then the output should contain all of these:
52
+ | 14 examples, 7 failures |
53
+ | expected [1, 3, 7] to include 4 |
54
+ | expected [1, 3, 7] not to include 1 |
55
+ | expected [1, 3, 7] not to include 3 |
56
+ | expected [1, 3, 7] not to include 7 |
57
+ | expected [1, 3, 7] not to include 1, 3, and 7 |
58
+ | expected [1, 3, 7] to include 1 and 9 |
59
+ | expected [1, 3, 7] not to include 1 and 9 |
60
+
61
+ Scenario: string usage
62
+ Given a file named "string_include_matcher_spec.rb" with:
63
+ """
64
+ describe "a string" do
65
+ it { should include("str") }
66
+ it { should include("a", "str", "ng") }
67
+ it { should_not include("foo") }
68
+ it { should_not include("foo", "bar") }
69
+
70
+ # deliberate failures
71
+ it { should include("foo") }
72
+ it { should_not include("str") }
73
+ it { should include("str", "foo") }
74
+ it { should_not include("str", "foo") }
75
+ end
76
+ """
77
+ When I run "rspec string_include_matcher_spec.rb"
78
+ Then the output should contain all of these:
79
+ | 8 examples, 4 failures |
80
+ | expected "a string" to include "foo" |
81
+ | expected "a string" not to include "str" |
82
+ | expected "a string" to include "str" and "foo" |
83
+ | expected "a string" not to include "str" and "foo" |
84
+
85
+ Scenario: hash usage
86
+ Given a file named "hash_include_matcher_spec.rb" with:
87
+ """
88
+ describe Hash do
89
+ subject { { :a => 7, :b => 5 } }
90
+
91
+ it { should include(:a) }
92
+ it { should include(:b, :a) }
93
+ it { should include(:a => 7) }
94
+ it { should include(:b => 5, :a => 7) }
95
+ it { should_not include(:c) }
96
+ it { should_not include(:c, :d) }
97
+ it { should_not include(:d => 2) }
98
+ it { should_not include(:a => 5) }
99
+ it { should_not include(:b => 7, :a => 5) }
100
+
101
+ # deliberate failures
102
+ it { should_not include(:a) }
103
+ it { should_not include(:b, :a) }
104
+ it { should_not include(:a => 7) }
105
+ it { should_not include(:a => 7, :b => 5) }
106
+ it { should include(:c) }
107
+ it { should include(:c, :d) }
108
+ it { should include(:d => 2) }
109
+ it { should include(:a => 5) }
110
+ it { should include(:a => 5, :b => 7) }
111
+
112
+ # Mixed cases--the hash includes one but not the other.
113
+ # All 4 of these cases should fail.
114
+ it { should include(:a, :d) }
115
+ it { should_not include(:a, :d) }
116
+ it { should include(:a => 7, :d => 3) }
117
+ it { should_not include(:a => 7, :d => 3) }
118
+ end
119
+ """
120
+ When I run "rspec hash_include_matcher_spec.rb"
121
+ Then the output should contain all of these:
122
+ | 22 examples, 13 failures |
123
+ | expected {:a=>7, :b=>5} not to include :a |
124
+ | expected {:a=>7, :b=>5} not to include :b and :a |
125
+ | expected {:a=>7, :b=>5} not to include {:a=>7} |
126
+ | expected {:a=>7, :b=>5} not to include {:a=>7, :b=>5} |
127
+ | expected {:a=>7, :b=>5} to include :c |
128
+ | expected {:a=>7, :b=>5} to include :c and :d |
129
+ | expected {:a=>7, :b=>5} to include {:d=>2} |
130
+ | expected {:a=>7, :b=>5} to include {:a=>5} |
131
+ | expected {:a=>7, :b=>5} to include {:a=>5, :b=>7} |
132
+ | expected {:a=>7, :b=>5} to include :a and :d |
133
+ | expected {:a=>7, :b=>5} not to include :a and :d |
134
+ | expected {:a=>7, :b=>5} to include {:a=>7, :d=>3} |
135
+ | expected {:a=>7, :b=>5} not to include {:a=>7, :d=>3} |
136
+
@@ -1,4 +1,4 @@
1
- Feature: Operator Matchers
1
+ Feature: Operator matchers
2
2
 
3
3
  RSpec provides a number of matchers that are based on Ruby's built-in
4
4
  operators. These mostly work like you expect. For example, each of these pass:
@@ -1,4 +1,4 @@
1
- Feature: predicate matchers
1
+ Feature: Predicate matchers
2
2
 
3
3
  Ruby objects commonly provide predicate methods:
4
4
 
@@ -0,0 +1,78 @@
1
+ Feature: respond_to matcher
2
+
3
+ Use the respond_to matcher to specify details of an object's interface. In
4
+ its most basic form:
5
+
6
+ obj.should respond_to(:foo) # pass if obj.respond_to?(:foo)
7
+
8
+ You can specify that an object responds to multiple messages in a single
9
+ statement with multiple arguments passed to the matcher
10
+
11
+ obj.should respond_to(:foo, :bar) # passes if obj.respond_to?(:foo) && obj.respond_to?(:bar)
12
+
13
+ If the number of arguments accepted by the method is important to you,
14
+ you can specify that as well:
15
+
16
+ obj.should respond_to(:foo).with(1).argument
17
+ obj.should respond_to(:bar).with(2).arguments
18
+
19
+ Note that this matcher relies entirely upon #respond_to?. If an object
20
+ dynamically responds to a message via #method_missing, but does not indicate
21
+ this via #respond_to?, then this matcher will give you false results.
22
+
23
+ Scenario: basic usage
24
+ Given a file named "respond_to_matcher_spec.rb" with:
25
+ """
26
+ describe "a string" do
27
+ it { should respond_to(:length) }
28
+ it { should respond_to(:hash, :class, :to_s) }
29
+ it { should_not respond_to(:to_model) }
30
+ it { should_not respond_to(:compact, :flatten) }
31
+
32
+ # deliberate failures
33
+ it { should respond_to(:to_model) }
34
+ it { should respond_to(:compact, :flatten) }
35
+ it { should_not respond_to(:length) }
36
+ it { should_not respond_to(:hash, :class, :to_s) }
37
+
38
+ # mixed examples--String responds to :length but not :flatten
39
+ # both specs should fail
40
+ it { should respond_to(:length, :flatten) }
41
+ it { should_not respond_to(:length, :flatten) }
42
+ end
43
+ """
44
+ When I run "rspec respond_to_matcher_spec.rb"
45
+ Then the output should contain all of these:
46
+ | 10 examples, 6 failures |
47
+ | expected "a string" to respond to :to_model |
48
+ | expected "a string" to respond to :compact, :flatten |
49
+ | expected "a string" not to respond to :length |
50
+ | expected "a string" not to respond to :hash, :class, :to_s |
51
+ | expected "a string" to respond to :flatten |
52
+ | expected "a string" not to respond to :length |
53
+
54
+ Scenario: specify arguments
55
+ Given a file named "respond_to_matcher_argument_checking_spec.rb" with:
56
+ """
57
+ describe 7 do
58
+ it { should respond_to(:zero?).with(0).arguments }
59
+ it { should_not respond_to(:zero?).with(1).argument }
60
+
61
+ it { should respond_to(:between?).with(2).arguments }
62
+ it { should_not respond_to(:between?).with(7).arguments }
63
+
64
+ # deliberate failures
65
+ it { should respond_to(:zero?).with(1).argument }
66
+ it { should_not respond_to(:zero?).with(0).arguments }
67
+
68
+ it { should respond_to(:between?).with(7).arguments }
69
+ it { should_not respond_to(:between?).with(2).arguments }
70
+ end
71
+ """
72
+ When I run "rspec respond_to_matcher_argument_checking_spec.rb"
73
+ Then the output should contain all of these:
74
+ | 8 examples, 4 failures |
75
+ | expected 7 to respond to :zero? with 1 argument |
76
+ | expected 7 not to respond to :zero? with 0 arguments |
77
+ | expected 7 to respond to :between? with 7 arguments |
78
+ | expected 7 not to respond to :between? with 2 arguments |