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
@@ -1,10 +1,15 @@
1
1
  module RR
2
- class RecordedCall < Struct.new(:subject, :method_name, :arguments, :block)
2
+ class RecordedCall < Struct.new(:subject,
3
+ :method_name,
4
+ :arguments,
5
+ :keyword_arguments,
6
+ :block)
3
7
  def inspect
4
- '[%s, %s, %s, %s]' % [
8
+ '[%s, %s, %s, %s, %s]' % [
5
9
  subject_to_s,
6
10
  method_name.inspect,
7
11
  arguments.inspect,
12
+ keyword_arguments.inspect,
8
13
  block.inspect
9
14
  ]
10
15
  end
@@ -13,7 +18,8 @@ module RR
13
18
  other.is_a?(self.class) &&
14
19
  subject == other.subject &&
15
20
  method_name == other.method_name &&
16
- arguments == other.arguments
21
+ arguments == other.arguments &&
22
+ keyword_arguments == other.keyword_arguments
17
23
  end
18
24
 
19
25
  private
@@ -18,8 +18,12 @@ module RR
18
18
  recorded_calls.clear
19
19
  end
20
20
 
21
- def add(subject, method_name, arguments, block)
22
- recorded_calls << RecordedCall.new(subject, method_name, arguments, block)
21
+ def add(subject, method_name, arguments, keyword_arguments, block)
22
+ recorded_calls << RecordedCall.new(subject,
23
+ method_name,
24
+ arguments,
25
+ keyword_arguments,
26
+ block)
23
27
  end
24
28
 
25
29
  def any?(&block)
@@ -81,22 +85,28 @@ module RR
81
85
 
82
86
  def match_double_injection(spy_verification)
83
87
  lambda do |recorded_call|
84
- recorded_call[0] == spy_verification.subject &&
85
- recorded_call[1] == spy_verification.method_name
88
+ recorded_call.subject == spy_verification.subject &&
89
+ recorded_call.method_name == spy_verification.method_name
86
90
  end
87
91
  end
88
92
 
89
93
  def match_argument_expectation(spy_verification)
90
94
  lambda do |recorded_call|
91
- spy_verification.argument_expectation.exact_match?(*recorded_call[2]) ||
92
- spy_verification.argument_expectation.wildcard_match?(*recorded_call[2])
95
+ expectation = spy_verification.argument_expectation
96
+ arguments = recorded_call.arguments
97
+ keyword_arguments = recorded_call.keyword_arguments
98
+ expectation.exact_match?(arguments, keyword_arguments) ||
99
+ expectation.wildcard_match?(arguments, keyword_arguments)
93
100
  end
94
101
  end
95
102
 
96
103
  def invocation_count_error(spy_verification, matching_recorded_calls)
104
+ method_name = spy_verification.method_name
105
+ arguments = spy_verification.argument_expectation.expected_arguments
106
+ keyword_arguments = spy_verification.argument_expectation.expected_keyword_arguments
97
107
  RR::Errors.build_error(RR::Errors::SpyVerificationErrors::InvocationCountError,
98
108
  "On subject #{spy_verification.subject.inspect}\n" <<
99
- "Expected #{Double.formatted_name(spy_verification.method_name, spy_verification.argument_expectation.expected_arguments)}\n" <<
109
+ "Expected #{Double.formatted_name(method_name, arguments, keyword_arguments)}\n" <<
100
110
  "to be called #{spy_verification.times_matcher.expected_times_message},\n" <<
101
111
  "but was called #{matching_recorded_calls.size} times.\n" <<
102
112
  "All of the method calls related to Doubles are:\n" <<
data/lib/rr/space.rb CHANGED
@@ -13,9 +13,15 @@ module RR
13
13
  end
14
14
  attr_writer :instance
15
15
 
16
- protected
17
- def method_missing(method_name, *args, &block)
18
- instance.__send__(method_name, *args, &block)
16
+ protected
17
+ if KeywordArguments.fully_supported?
18
+ def method_missing(method_name, *args, **kwargs, &block)
19
+ instance.__send__(method_name, *args, **kwargs, &block)
20
+ end
21
+ else
22
+ def method_missing(method_name, *args, &block)
23
+ instance.__send__(method_name, *args, &block)
24
+ end
19
25
  end
20
26
  end
21
27
 
@@ -79,8 +85,12 @@ module RR
79
85
  Injections::DoubleInjection.reset_double(class << subject; self; end, method_name)
80
86
  end
81
87
 
82
- def record_call(subject, method_name, arguments, block)
83
- @recorded_calls.add(subject, method_name, arguments, block)
88
+ def record_call(subject, method_name, arguments, keyword_arguments, block)
89
+ @recorded_calls.add(subject,
90
+ method_name,
91
+ arguments,
92
+ keyword_arguments,
93
+ block)
84
94
  end
85
95
 
86
96
  def blank_slate_whitelist
data/lib/rr/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module RR
2
- VERSION = '1.2.1'.freeze
2
+ VERSION = '3.0.0'.freeze
3
3
  def self.version; VERSION; end
4
4
  end
@@ -6,6 +6,8 @@ require 'rr/core_ext/array'
6
6
  require 'rr/core_ext/range'
7
7
  require 'rr/core_ext/regexp'
8
8
 
9
+ require 'rr/keyword_arguments'
10
+
9
11
  require 'rr/class_instance_method_defined'
10
12
  require 'rr/blank_slate'
11
13
 
@@ -51,7 +53,6 @@ require 'rr/method_dispatches/method_missing_dispatch'
51
53
  require 'rr/hash_with_object_id_key'
52
54
  require 'rr/recorded_call'
53
55
  require 'rr/recorded_calls'
54
- require 'rr/proc_from_block'
55
56
 
56
57
  require 'rr/double_definitions/double_definition_create_blank_slate'
57
58
  require 'rr/double_definitions/double_definition_create'
data/rr.gemspec CHANGED
@@ -29,4 +29,9 @@ Gem::Specification.new do |gem|
29
29
  ].to_a
30
30
 
31
31
  gem.require_paths = ['lib']
32
+
33
+ gem.add_development_dependency("bundler")
34
+ gem.add_development_dependency("rake")
35
+ gem.add_development_dependency("test-unit")
36
+ gem.add_development_dependency("test-unit-rr")
32
37
  end
data/spec/suites.yml CHANGED
@@ -1,13 +1,3 @@
1
- 18:
2
- rvm_versions:
3
- - name: 1.8.7
4
- suites:
5
- - name: rspec_1
6
- desc: 'RSpec 1'
7
- - name: rspec_1_rails_2
8
- desc: 'RSpec 1 + Rails 2'
9
- env:
10
- SPEC_OPTS: '--require $PWD/spec/custom_formatter_for_rspec --format CustomFormatterForRSpec --backtrace'
11
1
  19:
12
2
  rvm_versions:
13
3
  - name: 1.9.3
@@ -16,9 +6,5 @@
16
6
  suites:
17
7
  - name: rspec_2
18
8
  desc: 'RSpec 2'
19
- - name: rspec_2_rails_3
20
- desc: 'RSpec 2 + Rails 3'
21
- - name: rspec_2_rails_4
22
- desc: 'RSpec 2 + Rails 4'
23
9
  env:
24
- SPEC_OPTS: '--require $PWD/spec/custom_formatter_for_rspec_2 --format CustomFormatterForRSpec2 --backtrace --fail-fast'
10
+ SPEC_OPTS: '--require $PWD/spec/custom_formatter_for_rspec_2 --format CustomFormatterForRSpec2 --backtrace'
@@ -223,7 +223,7 @@ module RR
223
223
 
224
224
  describe "#subject.method_name being called" do
225
225
  it "returns the return value of the Double#returns block" do
226
- double_definition_create.call(:foobar, 1, 2) {:baz}
226
+ double_definition_create.call(:foobar, [1, 2], {}) {:baz}
227
227
  expect(subject.foobar(1, 2)).to eq :baz
228
228
  end
229
229
  end
@@ -254,7 +254,7 @@ module RR
254
254
  original_method_called = true
255
255
  end
256
256
  end
257
- double_definition_create.call(:foobar, 1, 2)
257
+ double_definition_create.call(:foobar, [1, 2], {})
258
258
  subject.foobar(1, 2)
259
259
  expect(original_method_called).to be_true
260
260
  end
@@ -264,7 +264,7 @@ module RR
264
264
  def subject.foobar(*args)
265
265
  :baz;
266
266
  end
267
- double_definition_create.call(:foobar, 1, 2)
267
+ double_definition_create.call(:foobar, [1, 2], {})
268
268
  expect(subject.foobar(1, 2)).to eq :baz
269
269
  end
270
270
  end
@@ -279,7 +279,7 @@ module RR
279
279
  end
280
280
 
281
281
  it "calls the block with the return value of the original method" do
282
- double_definition_create.call(:foobar, 1, 2) do |value|
282
+ double_definition_create.call(:foobar, [1, 2], {}) do |value|
283
283
  mock(value).a_method {99}
284
284
  value
285
285
  end
@@ -288,7 +288,7 @@ module RR
288
288
  end
289
289
 
290
290
  it "returns the return value of the block" do
291
- double_definition_create.call(:foobar, 1, 2) do |value|
291
+ double_definition_create.call(:foobar, [1, 2], {}) do |value|
292
292
  :something_else
293
293
  end
294
294
  expect(subject.foobar(1, 2)).to eq :something_else
@@ -306,7 +306,7 @@ module RR
306
306
 
307
307
  context "when not passed a block" do
308
308
  it "returns nil" do
309
- double_definition_create.call(:foobar)
309
+ double_definition_create.call(:foobar, [], {})
310
310
  expect(subject.foobar).to be_nil
311
311
  end
312
312
  end
@@ -314,7 +314,7 @@ module RR
314
314
  context "when passed a block" do
315
315
  describe "#subject.method_name being called" do
316
316
  it "returns the return value of the block" do
317
- double_definition_create.call(:foobar) {:baz}
317
+ double_definition_create.call(:foobar, [], {}) {:baz}
318
318
  expect(subject.foobar).to eq :baz
319
319
  end
320
320
  end
@@ -323,7 +323,7 @@ module RR
323
323
  context "when not passed args" do
324
324
  describe "#subject.method_name being called with any arguments" do
325
325
  it "invokes the implementation of the Stub" do
326
- double_definition_create.call(:foobar) {:baz}
326
+ double_definition_create.call(:foobar, [], {}) {:baz}
327
327
  expect(subject.foobar(1, 2)).to eq :baz
328
328
  expect(subject.foobar()).to eq :baz
329
329
  expect(subject.foobar([])).to eq :baz
@@ -334,14 +334,14 @@ module RR
334
334
  context "when passed args" do
335
335
  describe "#subject.method_name being called with the passed-in arguments" do
336
336
  it "invokes the implementation of the Stub" do
337
- double_definition_create.call(:foobar, 1, 2) {:baz}
337
+ double_definition_create.call(:foobar, [1, 2], {}) {:baz}
338
338
  expect(subject.foobar(1, 2)).to eq :baz
339
339
  end
340
340
  end
341
341
 
342
342
  describe "#subject.method_name being called with different arguments" do
343
343
  it "raises a DoubleNotFoundError" do
344
- double_definition_create.call(:foobar, 1, 2) {:baz}
344
+ double_definition_create.call(:foobar, [1, 2], {}) {:baz}
345
345
  expect {
346
346
  subject.foobar
347
347
  }.to raise_error(RR::Errors::DoubleNotFoundError)
@@ -362,7 +362,7 @@ module RR
362
362
  context "when not passed a block" do
363
363
  describe "#subject.method_name being called" do
364
364
  it "invokes the original implementanion" do
365
- double_definition_create.call(:foobar)
365
+ double_definition_create.call(:foobar, [], {})
366
366
  expect(subject.foobar).to eq :original_return_value
367
367
  end
368
368
  end
@@ -372,7 +372,7 @@ module RR
372
372
  describe "#subject.method_name being called" do
373
373
  it "invokes the original implementanion and invokes the block with the return value of the original implementanion" do
374
374
  passed_in_value = nil
375
- double_definition_create.call(:foobar) do |original_return_value|
375
+ double_definition_create.call(:foobar, [], {}) do |original_return_value|
376
376
  passed_in_value = original_return_value
377
377
  end
378
378
  subject.foobar
@@ -380,7 +380,7 @@ module RR
380
380
  end
381
381
 
382
382
  it "returns the return value of the block" do
383
- double_definition_create.call(:foobar) do |original_return_value|
383
+ double_definition_create.call(:foobar, [], {}) do |original_return_value|
384
384
  :new_return_value
385
385
  end
386
386
  expect(subject.foobar).to eq :new_return_value
@@ -391,14 +391,14 @@ module RR
391
391
  context "when passed args" do
392
392
  describe "#subject.method_name being called with the passed-in arguments" do
393
393
  it "invokes the implementation of the Stub" do
394
- double_definition_create.call(:foobar, 1, 2) {:baz}
394
+ double_definition_create.call(:foobar, [1, 2], {}) {:baz}
395
395
  expect(subject.foobar(1, 2)).to eq :baz
396
396
  end
397
397
  end
398
398
 
399
399
  describe "#subject.method_name being called with different arguments" do
400
400
  it "raises a DoubleNotFoundError" do
401
- double_definition_create.call(:foobar, 1, 2) {:baz}
401
+ double_definition_create.call(:foobar, [1, 2], {}) {:baz}
402
402
  expect {
403
403
  subject.foobar
404
404
  }.to raise_error(RR::Errors::DoubleNotFoundError)
@@ -416,7 +416,7 @@ module RR
416
416
  context "when not passed args" do
417
417
  describe "#subject.method_name being called with any arguments" do
418
418
  it "raises a TimesCalledError" do
419
- double_definition_create.call(:foobar)
419
+ double_definition_create.call(:foobar, [], {})
420
420
  expect { subject.foobar }.to raise_error(RR::Errors::TimesCalledError)
421
421
  expect { subject.foobar(1, 2) }.to raise_error(RR::Errors::TimesCalledError)
422
422
  end
@@ -426,14 +426,14 @@ module RR
426
426
  context "when passed args" do
427
427
  describe "#subject.method_name being called with the passed-in arguments" do
428
428
  it "raises a TimesCalledError" do
429
- double_definition_create.call(:foobar, 1, 2)
429
+ double_definition_create.call(:foobar, [1, 2], {})
430
430
  expect { subject.foobar(1, 2) }.to raise_error(RR::Errors::TimesCalledError)
431
431
  end
432
432
  end
433
433
 
434
434
  describe "#subject.method_name being called with different arguments" do
435
435
  it "raises a DoubleNotFoundError" do
436
- double_definition_create.call(:foobar, 1, 2)
436
+ double_definition_create.call(:foobar, [1, 2], {})
437
437
  expect { subject.foobar() }.to raise_error(RR::Errors::DoubleNotFoundError)
438
438
  end
439
439
  end
@@ -21,26 +21,26 @@ module RR
21
21
  end
22
22
 
23
23
  it "returns false when comparing with ArgumentEqualityExpectation" do
24
- expect(expectation).to_not eq ArgumentEqualityExpectation.new(1)
24
+ expect(expectation).to_not eq ArgumentEqualityExpectation.new([1], {})
25
25
  end
26
26
  end
27
27
 
28
28
  describe "#exact_match?" do
29
29
  it "returns false" do
30
- expectation.should_not be_exact_match(1, 2, 3)
31
- expectation.should_not be_exact_match(1, 2)
32
- expectation.should_not be_exact_match(1)
33
- expectation.should_not be_exact_match()
34
- expectation.should_not be_exact_match("does not match")
30
+ expectation.should_not be_exact_match([1, 2, 3], {})
31
+ expectation.should_not be_exact_match([1, 2], {})
32
+ expectation.should_not be_exact_match([1], {})
33
+ expectation.should_not be_exact_match([], {})
34
+ expectation.should_not be_exact_match(["does not match"], {})
35
35
  end
36
36
  end
37
37
 
38
38
  describe "#wildcard_match?" do
39
39
  it "returns true" do
40
40
  expectation = AnyArgumentExpectation.new
41
- expect(expectation).to be_wildcard_match(1, 2, 3)
42
- expect(expectation).to be_wildcard_match("whatever")
43
- expect(expectation).to be_wildcard_match("whatever", "else")
41
+ expect(expectation).to be_wildcard_match([1, 2, 3], {})
42
+ expect(expectation).to be_wildcard_match(["whatever"], {})
43
+ expect(expectation).to be_wildcard_match(["whatever", "else"], {})
44
44
  end
45
45
  end
46
46
  end
@@ -5,7 +5,7 @@ module RR
5
5
  describe ArgumentEqualityExpectation do
6
6
  attr_reader :expectation
7
7
  before do
8
- @expectation = ArgumentEqualityExpectation.new(1, 2, 3)
8
+ @expectation = ArgumentEqualityExpectation.new([1, 2, 3], {})
9
9
  end
10
10
 
11
11
  describe "#expected_arguments" do
@@ -16,30 +16,30 @@ module RR
16
16
 
17
17
  describe "==" do
18
18
  it "returns true when passed in expected_arguments are equal" do
19
- expect(expectation).to eq ArgumentEqualityExpectation.new(1, 2, 3)
19
+ expect(expectation).to eq ArgumentEqualityExpectation.new([1, 2, 3], {})
20
20
  end
21
21
 
22
22
  it "returns false when passed in expected_arguments are not equal" do
23
- expect(expectation).to_not eq ArgumentEqualityExpectation.new(1, 2)
24
- expect(expectation).to_not eq ArgumentEqualityExpectation.new(1)
25
- expect(expectation).to_not eq ArgumentEqualityExpectation.new(:something)
26
- expect(expectation).to_not eq ArgumentEqualityExpectation.new()
23
+ expect(expectation).to_not eq ArgumentEqualityExpectation.new([1, 2], {})
24
+ expect(expectation).to_not eq ArgumentEqualityExpectation.new([1], {})
25
+ expect(expectation).to_not eq ArgumentEqualityExpectation.new([:something], {})
26
+ expect(expectation).to_not eq ArgumentEqualityExpectation.new([], {})
27
27
  end
28
28
  end
29
29
 
30
30
  describe "#exact_match?" do
31
31
  context "when all arguments exactly match" do
32
32
  it "returns true" do
33
- expect(expectation).to be_exact_match(1, 2, 3)
33
+ expect(expectation).to be_exact_match([1, 2, 3], {})
34
34
  end
35
35
  end
36
36
 
37
37
  context "when all arguments do not exactly match" do
38
38
  it "returns false" do
39
- expectation.should_not be_exact_match(1, 2)
40
- expectation.should_not be_exact_match(1)
41
- expectation.should_not be_exact_match()
42
- expectation.should_not be_exact_match("does not match")
39
+ expectation.should_not be_exact_match([1, 2], {})
40
+ expectation.should_not be_exact_match([1], {})
41
+ expectation.should_not be_exact_match([], {})
42
+ expectation.should_not be_exact_match(["does not match"], {})
43
43
  end
44
44
  end
45
45
  end
@@ -47,26 +47,26 @@ module RR
47
47
  describe "#wildcard_match?" do
48
48
  context "when not an exact match" do
49
49
  it "returns false" do
50
- expectation = ArgumentEqualityExpectation.new(1)
51
- expectation.should_not be_wildcard_match(1, 2, 3)
52
- expectation.should_not be_wildcard_match("whatever")
53
- expectation.should_not be_wildcard_match("whatever", "else")
50
+ expectation = ArgumentEqualityExpectation.new([1], {})
51
+ expectation.should_not be_wildcard_match([1, 2, 3], {})
52
+ expectation.should_not be_wildcard_match(["whatever"], {})
53
+ expectation.should_not be_wildcard_match(["whatever", "else"], {})
54
54
  end
55
55
  end
56
56
 
57
57
  context "when an exact match" do
58
58
  it "returns true" do
59
- expectation = ArgumentEqualityExpectation.new(1, 2)
60
- expect(expectation).to be_wildcard_match(1, 2)
61
- expectation.should_not be_wildcard_match(1)
62
- expectation.should_not be_wildcard_match("whatever", "else")
59
+ expectation = ArgumentEqualityExpectation.new([1, 2], {})
60
+ expect(expectation).to be_wildcard_match([1, 2], {})
61
+ expectation.should_not be_wildcard_match([1], {})
62
+ expectation.should_not be_wildcard_match(["whatever", "else"], {})
63
63
  end
64
64
  end
65
65
 
66
66
  context "when not passed correct number of arguments" do
67
67
  it "returns false" do
68
- expectation.should_not be_wildcard_match()
69
- expectation.should_not be_wildcard_match(Object.new, Object.new)
68
+ expectation.should_not be_wildcard_match([], {})
69
+ expectation.should_not be_wildcard_match([Object.new, Object.new], {})
70
70
  end
71
71
  end
72
72
  end