rr 1.2.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES.md +25 -0
  3. data/Gemfile +1 -8
  4. data/README.md +8 -13
  5. data/Rakefile +16 -6
  6. data/lib/rr/class_instance_method_defined.rb +1 -1
  7. data/lib/rr/double.rb +28 -10
  8. data/lib/rr/double_definitions/double_definition.rb +39 -16
  9. data/lib/rr/double_definitions/double_definition_create.rb +5 -5
  10. data/lib/rr/double_definitions/double_definition_create_blank_slate.rb +10 -4
  11. data/lib/rr/double_definitions/strategies/strategy.rb +27 -8
  12. data/lib/rr/double_definitions/strategies/verification/mock.rb +8 -2
  13. data/lib/rr/double_matches.rb +4 -3
  14. data/lib/rr/expectations/any_argument_expectation.rb +4 -4
  15. data/lib/rr/expectations/argument_equality_expectation.rb +43 -5
  16. data/lib/rr/injections/double_injection.rb +65 -18
  17. data/lib/rr/injections/method_missing_injection.rb +36 -9
  18. data/lib/rr/keyword_arguments.rb +15 -0
  19. data/lib/rr/method_dispatches/base_method_dispatch.rb +22 -5
  20. data/lib/rr/method_dispatches/method_dispatch.rb +21 -10
  21. data/lib/rr/method_dispatches/method_missing_dispatch.rb +14 -5
  22. data/lib/rr/recorded_call.rb +9 -3
  23. data/lib/rr/recorded_calls.rb +17 -7
  24. data/lib/rr/space.rb +15 -5
  25. data/lib/rr/version.rb +1 -1
  26. data/lib/rr/without_autohook.rb +2 -1
  27. data/rr.gemspec +5 -0
  28. data/spec/suites.yml +1 -15
  29. data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_spec.rb +18 -18
  30. data/spec/suites/rspec_2/unit/expectations/any_argument_expectation_spec.rb +9 -9
  31. data/spec/suites/rspec_2/unit/expectations/argument_equality_expectation_spec.rb +21 -21
  32. data/spec/suites/rspec_2/unit/expectations/boolean_argument_equality_expectation_spec.rb +4 -4
  33. data/spec/suites/rspec_2/unit/expectations/hash_including_argument_equality_expectation_spec.rb +31 -21
  34. data/spec/suites/rspec_2/unit/space_spec.rb +4 -3
  35. metadata +61 -10
  36. data/lib/rr/proc_from_block.rb +0 -11
  37. data/spec/suites/rspec_2/unit/proc_from_block_spec.rb +0 -14
  38. data/spec/suites/rspec_2_rails_4/integration/astc_rails_4_spec.rb +0 -142
  39. data/spec/suites/rspec_2_rails_4/integration/minitest_4_rails_4_spec.rb +0 -149
  40. data/spec/suites/rspec_2_rails_4/spec_helper.rb +0 -3
@@ -7,20 +7,20 @@ module RR
7
7
  attr_reader :expectation
8
8
 
9
9
  before do
10
- @expectation = ArgumentEqualityExpectation.new(boolean)
10
+ @expectation = ArgumentEqualityExpectation.new([boolean], {})
11
11
  end
12
12
 
13
13
  describe "#wildcard_match?" do
14
14
  context "when passed a Boolean" do
15
15
  it "returns true" do
16
- expect(expectation).to be_wildcard_match(true)
17
- expect(expectation).to be_wildcard_match(false)
16
+ expect(expectation).to be_wildcard_match([true], {})
17
+ expect(expectation).to be_wildcard_match([false], {})
18
18
  end
19
19
  end
20
20
 
21
21
  context "when not passed a Boolean" do
22
22
  it "returns false" do
23
- expectation.should_not be_wildcard_match(:not_a_boolean)
23
+ expectation.should_not be_wildcard_match([:not_a_boolean], {})
24
24
  end
25
25
  end
26
26
  end
@@ -11,70 +11,80 @@ module Expectations
11
11
 
12
12
  describe "#exact_match?" do
13
13
  before do
14
- @expectation = ArgumentEqualityExpectation.new(hash_including(expected_hash))
14
+ @expectation = ArgumentEqualityExpectation.new([hash_including(expected_hash)], {})
15
15
  end
16
16
 
17
17
  it "returns true when passed in a HashIncluding matcher with the same hash" do
18
- expect(expectation).to be_exact_match(RR::WildcardMatchers::HashIncluding.new(expected_hash))
18
+ expect(expectation).to be_exact_match([RR::WildcardMatchers::HashIncluding.new(expected_hash)],
19
+ {})
19
20
  end
20
21
 
21
22
  it "returns false when passed in a HashIncluding matcher with a different argument list" do
22
- expectation.should_not be_exact_match(RR::WildcardMatchers::HashIncluding.new(:foo => 1))
23
+ expectation.should_not be_exact_match([RR::WildcardMatchers::HashIncluding.new(:foo => 1)],
24
+ {})
23
25
  end
24
26
 
25
27
  it "returns false otherwise" do
26
- expectation.should_not be_exact_match("hello")
27
- expectation.should_not be_exact_match(:hello)
28
- expectation.should_not be_exact_match(1)
29
- expectation.should_not be_exact_match(nil)
30
- expectation.should_not be_exact_match(true)
31
- expectation.should_not be_exact_match()
28
+ expectation.should_not be_exact_match(["hello"], {})
29
+ expectation.should_not be_exact_match([:hello], {})
30
+ expectation.should_not be_exact_match([1], {})
31
+ expectation.should_not be_exact_match([nil], {})
32
+ expectation.should_not be_exact_match([true], {})
33
+ expectation.should_not be_exact_match([], {})
32
34
  end
33
35
  end
34
36
 
35
37
  describe "#wildcard_match?" do
36
38
  before do
37
- @expectation = ArgumentEqualityExpectation.new(hash_including(expected_hash))
39
+ @expectation = ArgumentEqualityExpectation.new([hash_including(expected_hash)],
40
+ {})
38
41
  end
39
42
 
40
43
  it "returns true when hash contains same key/values as the expectation" do
41
- expect(expectation).to be_wildcard_match(expected_hash)
44
+ expect(expectation).to be_wildcard_match([expected_hash], {})
42
45
  end
43
46
 
44
47
  it "returns true when hash contains at least expectation's key/values" do
45
- expect(expectation).to be_wildcard_match(expected_hash.merge(:oregon => "Salem"))
48
+ expect(expectation).to be_wildcard_match([expected_hash.merge(:oregon => "Salem")],
49
+ {})
46
50
  end
47
51
 
48
52
  it "returns true when passed the same hash, even after the original is modified" do
49
53
  original_expected_hash = expected_hash.clone
50
54
  expected_hash[:texas] = nil
51
- expect(expectation).to be_wildcard_match(original_expected_hash)
55
+ expect(expectation).to be_wildcard_match([original_expected_hash], {})
52
56
  end
53
57
 
54
58
  it "returns true even if one of the expectation's values is nil" do
55
- expectation = ArgumentEqualityExpectation.new(hash_including(:foo => nil))
56
- expect(expectation).to be_wildcard_match({:foo => nil})
59
+ expectation = ArgumentEqualityExpectation.new([hash_including(:foo => nil)],
60
+ {})
61
+ expect(expectation).to be_wildcard_match([{:foo => nil}],
62
+ {})
57
63
  end
58
64
 
59
65
  it "returns false when hash matches only some required key/values" do
60
- expectation.should_not be_wildcard_match({:texas => "Austin"})
66
+ expectation.should_not be_wildcard_match([{:texas => "Austin"}],
67
+ {})
61
68
  end
62
69
 
63
70
  it "returns false when hash matches all the keys but not all the values" do
64
- expectation.should_not be_wildcard_match({:texas => "Austin", :maine => "Portland"})
71
+ expectation.should_not be_wildcard_match([{:texas => "Austin", :maine => "Portland"}],
72
+ {})
65
73
  end
66
74
 
67
75
  it "returns false when passed a hash that matches all values but not all keys" do
68
- expectation.should_not be_wildcard_match({:texas => "Austin", :georgia => "Augusta"})
76
+ expectation.should_not be_wildcard_match([{:texas => "Austin", :georgia => "Augusta"}],
77
+ {})
69
78
  end
70
79
 
71
80
  it "returns true when an exact match" do
72
- expect(expectation).to be_wildcard_match(hash_including(expected_hash))
81
+ expect(expectation).to be_wildcard_match([hash_including(expected_hash)],
82
+ {})
73
83
  end
74
84
 
75
85
  it "returns false when not passed correct number of arguments" do
76
- expectation.should_not be_wildcard_match()
77
- expectation.should_not be_wildcard_match(:a, :b)
86
+ expectation.should_not be_wildcard_match([], {})
87
+ expectation.should_not be_wildcard_match([:a, :b], {})
78
88
  end
79
89
  end
80
90
  end
@@ -13,9 +13,10 @@ module RR
13
13
  object = Object.new
14
14
  method_name = :to_s
15
15
  arguments = []
16
- space.record_call(object, method_name, arguments, lambda {})
16
+ keyword_arguments = {}
17
+ space.record_call(object, method_name, arguments, keyword_arguments, lambda {})
17
18
  expect(space.recorded_calls[0]).to eq \
18
- RR::RecordedCall.new(object, method_name, arguments, lambda {})
19
+ RR::RecordedCall.new(object, method_name, arguments, keyword_arguments, lambda {})
19
20
  end
20
21
  end
21
22
 
@@ -202,7 +203,7 @@ module RR
202
203
 
203
204
  it "should clear the #recorded_calls" do
204
205
  object = Object.new
205
- space.record_call(object, :to_s, [], nil)
206
+ space.record_call(object, :to_s, [], {}, nil)
206
207
 
207
208
  space.reset
208
209
  expect(space.recorded_calls).to eq RR::RecordedCalls.new([])
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rr
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kouhei Sutou
@@ -10,8 +10,64 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-07-22 00:00:00.000000000 Z
14
- dependencies: []
13
+ date: 2021-03-31 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: bundler
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: rake
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: test-unit
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ - !ruby/object:Gem::Dependency
58
+ name: test-unit-rr
59
+ requirement: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ type: :development
65
+ prerelease: false
66
+ version_requirements: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
15
71
  description: RR is a test double framework that features a rich selection of double
16
72
  techniques and a terse syntax.
17
73
  email:
@@ -93,10 +149,10 @@ files:
93
149
  - lib/rr/integrations/minitest_active_support.rb
94
150
  - lib/rr/integrations/rspec/invocation_matcher.rb
95
151
  - lib/rr/integrations/rspec_2.rb
152
+ - lib/rr/keyword_arguments.rb
96
153
  - lib/rr/method_dispatches/base_method_dispatch.rb
97
154
  - lib/rr/method_dispatches/method_dispatch.rb
98
155
  - lib/rr/method_dispatches/method_missing_dispatch.rb
99
- - lib/rr/proc_from_block.rb
100
156
  - lib/rr/recorded_call.rb
101
157
  - lib/rr/recorded_calls.rb
102
158
  - lib/rr/space.rb
@@ -214,7 +270,6 @@ files:
214
270
  - spec/suites/rspec_2/unit/injections/double_injection/double_injection_verify_spec.rb
215
271
  - spec/suites/rspec_2/unit/integrations/rspec/invocation_matcher_spec.rb
216
272
  - spec/suites/rspec_2/unit/integrations/rspec_spec.rb
217
- - spec/suites/rspec_2/unit/proc_from_block_spec.rb
218
273
  - spec/suites/rspec_2/unit/rr_spec.rb
219
274
  - spec/suites/rspec_2/unit/space_spec.rb
220
275
  - spec/suites/rspec_2/unit/spy_verification_spec.rb
@@ -232,9 +287,6 @@ files:
232
287
  - spec/suites/rspec_2/unit/wildcard_matchers/is_a_spec.rb
233
288
  - spec/suites/rspec_2/unit/wildcard_matchers/numeric_spec.rb
234
289
  - spec/suites/rspec_2/unit/wildcard_matchers/satisfy_spec.rb
235
- - spec/suites/rspec_2_rails_4/integration/astc_rails_4_spec.rb
236
- - spec/suites/rspec_2_rails_4/integration/minitest_4_rails_4_spec.rb
237
- - spec/suites/rspec_2_rails_4/spec_helper.rb
238
290
  - spec/support/adapter.rb
239
291
  - spec/support/adapter_tests/base.rb
240
292
  - spec/support/adapter_tests/minitest.rb
@@ -310,8 +362,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
310
362
  - !ruby/object:Gem::Version
311
363
  version: '0'
312
364
  requirements: []
313
- rubyforge_project:
314
- rubygems_version: 2.5.2
365
+ rubygems_version: 3.3.0.dev
315
366
  signing_key:
316
367
  specification_version: 4
317
368
  summary: RR is a test double framework that features a rich selection of double techniques
@@ -1,11 +0,0 @@
1
- module RR
2
- if RUBY_VERSION =~ /^1.8/
3
- class ProcFromBlock < Proc
4
- def ==(other)
5
- Proc.new(&self) == other
6
- end
7
- end
8
- else
9
- ProcFromBlock = Proc
10
- end
11
- end
@@ -1,14 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../spec_helper")
2
-
3
- module RR
4
- describe ProcFromBlock do
5
- describe "#==" do
6
- it "acts the same as #== on a Proc" do
7
- original_proc = lambda {}
8
- expect(Proc.new(&original_proc)).to eq original_proc
9
-
10
- expect(ProcFromBlock.new(&original_proc)).to eq original_proc
11
- end
12
- end
13
- end
14
- end
@@ -1,142 +0,0 @@
1
- require File.expand_path('../../spec_helper', __FILE__)
2
-
3
- describe 'Integration with straight ActiveSupport::TestCase and Rails 4' do
4
- include IntegrationTests::RailsTestUnitLike
5
-
6
- def configure_rails_project_generator(project_generator)
7
- super
8
- project_generator.configure do |project|
9
- project.rails_version = 4
10
- end
11
- end
12
-
13
- def self.including_the_adapter_manually_works
14
- specify "including the adapter manually works" do
15
- project = generate_project do |project|
16
- project.add_to_prelude <<-EOT
17
- class ActiveSupport::TestCase
18
- include RR::Adapters::TestUnit
19
- end
20
- EOT
21
- end
22
- project.add_test_file do |file|
23
- file.add_working_test_case_with_adapter_tests do |test_case|
24
- test_case.add_to_body <<-EOT
25
- def test_the_correct_adapters_are_loaded
26
- assert_adapters_loaded #{adapters_that_should_be_loaded.inspect}
27
- end
28
- EOT
29
- end
30
- end
31
- result = project.run_tests
32
- result.should be_success
33
- result.should_not have_errors_or_failures
34
- end
35
- end
36
-
37
- def self.rr_hooks_into_the_test_framework_automatically
38
- specify "RR hooks into the test framework automatically" do
39
- project = generate_project
40
- project.add_test_file do |file|
41
- file.add_working_test_case
42
- end
43
- result = project.run_tests
44
- result.should be_success
45
- result.should_not have_errors_or_failures
46
- end
47
- end
48
-
49
- def self.using_rr_with_cucumber_works
50
- specify "using RR with Cucumber works" do
51
- pending "Cucumber doesn't work with Rails 4 just yet"
52
- project_generator = build_rails_project_generator do |project_generator|
53
- project_generator.mixin Project::Cucumber
54
- end
55
- project = project_generator.call
56
- result = project.run_command_within("bundle exec cucumber")
57
- result.should be_success
58
- end
59
- end
60
-
61
- context 'when Bundler is autorequiring RR' do
62
- def configure_project_generator(project_generator)
63
- super
64
- project_generator.configure do |project|
65
- project.autorequire_gems = true
66
- end
67
- end
68
-
69
- def adapters_that_should_be_loaded
70
- [:MiniTest4]
71
- end
72
-
73
- including_the_adapter_manually_works
74
- using_rr_with_cucumber_works
75
- end
76
-
77
- context 'when RR is being required manually' do
78
- def configure_project_generator(project_generator)
79
- super
80
- project_generator.configure do |project|
81
- project.autorequire_gems = false
82
- end
83
- end
84
-
85
- def adapters_that_should_be_loaded
86
- [:MiniTest4, :MiniTest4ActiveSupport]
87
- end
88
-
89
- rr_hooks_into_the_test_framework_automatically
90
- including_the_adapter_manually_works
91
- using_rr_with_cucumber_works
92
-
93
- specify "when RR raises an error it raises a failure not an exception" do
94
- project = generate_project
95
- project.add_test_file do |file|
96
- file.add_test_case do |test_case|
97
- test_case.add_test <<-EOT
98
- object = Object.new
99
- mock(object).foo
100
- EOT
101
- end
102
- end
103
- result = project.run_tests
104
- result.should fail_with_output(/1 failure/)
105
- end
106
-
107
- specify "the database is properly rolled back after an RR error" do
108
- project = generate_project do |project|
109
- project.add_model_and_migration(:person, :people, :name => :string)
110
- end
111
- project.add_test_file do |file|
112
- file.add_test_case do |test_case|
113
- test_case.add_test <<-EOT
114
- Person.create!(:name => 'Joe Blow')
115
- object = Object.new
116
- mock(object).foo
117
- EOT
118
- end
119
- end
120
- expect {
121
- result = project.run_tests
122
- result.should have_errors_or_failures
123
- }.to leave_database_table_clear(project, :people)
124
- end
125
-
126
- specify "throwing an error in teardown doesn't mess things up" do
127
- project = generate_project
128
- project.add_test_file do |file|
129
- file.add_test_case do |test_case|
130
- test_case.add_to_body <<-EOT
131
- def teardown
132
- raise 'hell'
133
- end
134
- EOT
135
- test_case.add_test("") # doesn't matter
136
- end
137
- end
138
- result = project.run_tests
139
- result.should fail_with_output(/1 error/)
140
- end
141
- end
142
- end
@@ -1,149 +0,0 @@
1
- require File.expand_path('../../spec_helper', __FILE__)
2
-
3
- describe 'Integration with MiniTest 4 and Rails 4' do
4
- include IntegrationTests::RailsMinitest
5
-
6
- def configure_rails_project_generator(project_generator)
7
- super
8
- project_generator.configure do |project|
9
- project.rails_version = 4
10
- end
11
- end
12
-
13
- def configure_project_generator(project_generator)
14
- super
15
- project_generator.configure do |project|
16
- project.minitest_version = 4
17
- end
18
- end
19
-
20
- def self.including_the_adapter_manually_works
21
- specify "including the adapter manually works" do
22
- project = generate_project do |project|
23
- project.add_to_prelude <<-EOT
24
- class ActiveSupport::TestCase
25
- include RR::Adapters::MiniTest
26
- end
27
- EOT
28
- end
29
- project.add_test_file do |file|
30
- file.add_working_test_case_with_adapter_tests do |test_case|
31
- test_case.add_to_body <<-EOT
32
- def test_the_correct_adapters_are_loaded
33
- assert_adapters_loaded #{adapters_that_should_be_loaded.inspect}
34
- end
35
- EOT
36
- end
37
- end
38
- result = project.run_tests
39
- result.should be_success
40
- result.should_not have_errors_or_failures
41
- end
42
- end
43
-
44
- def self.rr_hooks_into_the_test_framework_automatically
45
- specify "RR hooks into the test framework automatically" do
46
- project = generate_project
47
- project.add_test_file do |file|
48
- file.add_working_test_case
49
- end
50
- result = project.run_tests
51
- result.should be_success
52
- result.should_not have_errors_or_failures
53
- end
54
- end
55
-
56
- def self.using_rr_with_cucumber_works
57
- specify "using RR with Cucumber works" do
58
- pending "Cucumber doesn't work with Rails 4 just yet"
59
- project_generator = build_rails_project_generator do |project_generator|
60
- project_generator.mixin Project::Cucumber
61
- end
62
- project = project_generator.call
63
- result = project.run_command_within("bundle exec cucumber")
64
- result.should be_success
65
- end
66
- end
67
-
68
- context 'when Bundler is autorequiring RR' do
69
- def configure_project_generator(project_generator)
70
- super
71
- project_generator.configure do |project|
72
- project.autorequire_gems = true
73
- end
74
- end
75
-
76
- def adapters_that_should_be_loaded
77
- [:MiniTest4]
78
- end
79
-
80
- including_the_adapter_manually_works
81
- using_rr_with_cucumber_works
82
- end
83
-
84
- context 'when RR is being required manually' do
85
- def configure_project_generator(project_generator)
86
- super
87
- project_generator.configure do |project|
88
- project.autorequire_gems = false
89
- end
90
- end
91
-
92
- def adapters_that_should_be_loaded
93
- [:MiniTest4, :MiniTest4ActiveSupport]
94
- end
95
-
96
- rr_hooks_into_the_test_framework_automatically
97
- including_the_adapter_manually_works
98
- using_rr_with_cucumber_works
99
-
100
- specify "when RR raises an error it raises a failure not an exception" do
101
- project = generate_project
102
- project.add_test_file do |file|
103
- file.add_test_case do |test_case|
104
- test_case.add_test <<-EOT
105
- object = Object.new
106
- mock(object).foo
107
- EOT
108
- end
109
- end
110
- result = project.run_tests
111
- result.should fail_with_output(/1 failure/)
112
- end
113
-
114
- specify "the database is properly rolled back after an RR error" do
115
- project = generate_project do |project|
116
- project.add_model_and_migration(:person, :people, :name => :string)
117
- end
118
- project.add_test_file do |file|
119
- file.add_test_case do |test_case|
120
- test_case.add_test <<-EOT
121
- Person.create!(:name => 'Joe Blow')
122
- object = Object.new
123
- mock(object).foo
124
- EOT
125
- end
126
- end
127
- expect {
128
- result = project.run_tests
129
- result.should have_errors_or_failures
130
- }.to leave_database_table_clear(project, :people)
131
- end
132
-
133
- specify "throwing an error in teardown doesn't mess things up" do
134
- project = generate_project
135
- project.add_test_file do |file|
136
- file.add_test_case do |test_case|
137
- test_case.add_to_body <<-EOT
138
- def teardown
139
- raise 'hell'
140
- end
141
- EOT
142
- test_case.add_test("") # doesn't matter
143
- end
144
- end
145
- result = project.run_tests
146
- result.should fail_with_output(/1 error/)
147
- end
148
- end
149
- end