muack 0.5.0 → 0.5.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ee7881104f617fa965f32fb46340cd71f6de26d5
4
- data.tar.gz: 5047ee579c7fdf9118139d34823c53d1224abbd2
3
+ metadata.gz: 4ca32470f688bde71bc3a56bed45ead89c3c9123
4
+ data.tar.gz: c54e8badae54d1b321cf5c95cc0facdc36b2a604
5
5
  SHA512:
6
- metadata.gz: 10d056827ffb86c201c3720019782e510168a288186b057f4b25f0550a90448fa91b77dd87c36eb976bd94eff8b0600e4bc0dc8d1f4ccdf6c904bc280594838e
7
- data.tar.gz: 433d4c055de69a0fd83251aa3e4b0b1e1a012753690470c6b5d738ad7452f1b6e6f9eca586a1fe24c87c4b19c7d19d226c324b14d8f424f8009cd8f5ed3158ec
6
+ metadata.gz: 7cfb937f5866fa9b92380029a3b2327874b4e28a0e87bb99652e7f0550a8b62731cd0bea78d2854bb2b379ce7dd1734cc5c837333b6463724adbf5cb8733dbbb
7
+ data.tar.gz: b47a79b28dbfe31d81e78c99308ef45596556531436bcd8294987b5d688301cdfbbee8a8eb7d8437712337b3e39a44f70085ac1b50ca16512faf58bdb9676ddb
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ pkg
2
+ *.rbc
data/CHANGES.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # CHANGES
2
2
 
3
+ ## Muack 0.5.1 -- 2013-06-25
4
+
5
+ * Fix issues with multiple call to any_instance_of with the same class.
6
+ * any_instance_of now accepts a block as mock and others.
7
+ * Fixed various bugs for dispatching methods with proxy and any_instance_of.
8
+
3
9
  ## Muack 0.5.0 -- 2013-06-24
4
10
 
5
11
  * Birthday!
data/lib/muack.rb CHANGED
@@ -1,12 +1,6 @@
1
1
 
2
- require 'muack/mock'
3
- require 'muack/stub'
4
- require 'muack/proxy'
5
-
6
- require 'muack/satisfy'
7
2
  require 'muack/session'
8
-
9
- require 'muack/any_instance_of'
3
+ require 'muack/satisfy'
10
4
 
11
5
  module Muack
12
6
  def self.verify
@@ -27,27 +21,28 @@ module Muack
27
21
  module API
28
22
  module_function
29
23
  def mock obj=Object.new
30
- ret = Muack.session["mk #{obj.__id__}"] ||= Muack::Mock.new(obj)
24
+ ret = Muack.session.mock(obj)
31
25
  if block_given? then yield(ret) else ret end
32
26
  end
33
27
 
34
28
  def stub obj=Object.new
35
- ret = Muack.session["sb #{obj.__id__}"] ||= Muack::Stub.new(obj)
29
+ ret = Muack.session.stub(obj)
36
30
  if block_given? then yield(ret) else ret end
37
31
  end
38
32
 
39
33
  def mock_proxy obj=Object.new
40
- ret = Muack.session["mp #{obj.__id__}"] ||= Muack::MockProxy.new(obj)
34
+ ret = Muack.session.mock_proxy(obj)
41
35
  if block_given? then yield(ret) else ret end
42
36
  end
43
37
 
44
38
  def stub_proxy obj=Object.new
45
- ret = Muack.session["sp #{obj.__id__}"] ||= Muack::StubProxy.new(obj)
39
+ ret = Muack.session.stub_proxy(obj)
46
40
  if block_given? then yield(ret) else ret end
47
41
  end
48
42
 
49
43
  def any_instance_of klass
50
- yield Muack::AnyInstanceOf.new(klass)
44
+ ret = Muack.session.any_instance_of(klass)
45
+ if block_given? then yield(ret) else ret end
51
46
  end
52
47
 
53
48
  def is_a klass
data/lib/muack/mock.rb CHANGED
@@ -8,7 +8,7 @@ module Muack
8
8
  attr_reader :object
9
9
  def initialize object
10
10
  @object = object
11
- @__mock_ignore = []
11
+ @__mock_injected = {}
12
12
  [:__mock_defis=, :__mock_disps=].each do |m|
13
13
  __send__(m, ::Hash.new{ |h, k| h[k] = [] })
14
14
  end
@@ -22,7 +22,11 @@ module Muack
22
22
  # Public API: Define mocked method
23
23
  def method_missing msg, *args, &block
24
24
  defi = Definition.new(msg, args, block)
25
- __mock_inject_method(defi) if __mock_pure?(defi)
25
+ if injected = __mock_injected[defi.msg]
26
+ defi.original_method = injected.original_method
27
+ else
28
+ __mock_inject_method(defi)
29
+ end
26
30
  __mock_defis_push(defi)
27
31
  Modifier.new(self, defi)
28
32
  end
@@ -37,11 +41,6 @@ module Muack
37
41
  __mock_defis[defi.msg].pop
38
42
  end
39
43
 
40
- # used for Muack::Modifier#times
41
- def __mock_ignore defi
42
- @__mock_ignore << defi
43
- end
44
-
45
44
  # used for mocked object to dispatch mocked method
46
45
  def __mock_dispatch msg, actual_args, actual_block
47
46
  if defi = __mock_defis[msg].shift
@@ -77,14 +76,11 @@ module Muack
77
76
 
78
77
  # used for Muack::Session#reset
79
78
  def __mock_reset
80
- [__mock_defis.values, __mock_disps.values, @__mock_ignore].
81
- flatten.compact.each do |defi|
79
+ __mock_injected.each_value do |defi|
82
80
  object.singleton_class.module_eval do
83
- methods = instance_methods(false)
84
- if methods.include?(defi.msg) # removed mocked method
85
- remove_method(defi.msg) # could be removed by other defi
86
- end
87
- if methods.include?(defi.original_method) # restore original method
81
+ remove_method(defi.msg)
82
+ # restore original method
83
+ if instance_methods(false).include?(defi.original_method)
88
84
  alias_method defi.msg, defi.original_method
89
85
  remove_method defi.original_method
90
86
  end
@@ -93,14 +89,11 @@ module Muack
93
89
  end
94
90
 
95
91
  protected # get warnings for private attributes
96
- attr_accessor :__mock_defis, :__mock_disps
92
+ attr_accessor :__mock_defis, :__mock_disps, :__mock_injected
97
93
 
98
94
  private
99
- def __mock_pure? defi
100
- __mock_defis[defi.msg].empty? && __mock_disps[defi.msg].empty?
101
- end
102
-
103
95
  def __mock_inject_method defi
96
+ __mock_injected[defi.msg] = defi
104
97
  target = object.singleton_class
105
98
  Mock.store_original_method(target, defi)
106
99
  __mock_inject_mock_method(target, defi)
@@ -14,7 +14,7 @@ module Muack
14
14
  if number >= 1
15
15
  (number - 1).times{ mock.__mock_defis_push(defi) }
16
16
  elsif number == 0
17
- mock.__mock_ignore(mock.__mock_defis_pop(defi))
17
+ mock.__mock_defis_pop(defi)
18
18
  else
19
19
  raise "What would you expect from calling a method #{number} times?"
20
20
  end
data/lib/muack/session.rb CHANGED
@@ -1,12 +1,27 @@
1
1
 
2
+ require 'muack/mock'
3
+ require 'muack/stub'
4
+ require 'muack/proxy'
5
+ require 'muack/any_instance_of'
6
+
2
7
  module Muack
3
8
  class Session < Hash
9
+ def mock obj; self["mk #{obj.__id__}"] ||= Mock .new(obj); end
10
+ def stub obj; self["sb #{obj.__id__}"] ||= Stub .new(obj); end
11
+ def mock_proxy obj; self["mp #{obj.__id__}"] ||= MockProxy.new(obj); end
12
+ def stub_proxy obj; self["sp #{obj.__id__}"] ||= StubProxy.new(obj); end
13
+
14
+ def any_instance_of klass
15
+ (@any_instance_of ||= {})[klass.__id__] ||= AnyInstanceOf.new(klass)
16
+ end
17
+
4
18
  def verify
5
19
  each_value.all?(&:__mock_verify)
6
20
  end
7
21
 
8
22
  def reset
9
23
  each_value(&:__mock_reset)
24
+ clear
10
25
  end
11
26
  end
12
27
  end
data/lib/muack/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Muack
3
- VERSION = '0.5.0'
3
+ VERSION = '0.5.1'
4
4
  end
data/muack.gemspec CHANGED
@@ -2,14 +2,15 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "muack"
5
- s.version = "0.5.0"
5
+ s.version = "0.5.1"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Lin Jen-Shin (godfat)"]
9
- s.date = "2013-06-24"
9
+ s.date = "2013-06-25"
10
10
  s.description = "Muack -- Yet another mocking library.\n\nBasically it's an [RR][] clone, but much faster under heavy use.\nIt's 32x times faster (750s vs 23s) for running [Rib][] tests.\n\n[RR]: https://github.com/rr/rr\n[Rib]: https://github.com/godfat/rib"
11
11
  s.email = ["godfat (XD) godfat.org"]
12
12
  s.files = [
13
+ ".gitignore",
13
14
  ".gitmodules",
14
15
  ".travis.yml",
15
16
  "CHANGES.md",
@@ -16,15 +16,39 @@ describe Muack::AnyInstanceOf do
16
16
  klass = Class.new{ def f; true; end }
17
17
  any_instance_of(klass){ |instance| mock_proxy(instance).f }
18
18
  obj = klass.new
19
- obj.f.should.eq true
19
+ obj.f .should.eq true
20
20
  Muack.verify.should.eq true
21
+ obj.f .should.eq true
21
22
  end
22
23
 
23
24
  should 'proxy any_instance_of with a block' do
24
25
  klass = Class.new{ def f; 0; end }
25
26
  any_instance_of(klass){ |instance| mock_proxy(instance).f{ |i| i+1 } }
26
27
  obj = klass.new
28
+ obj.f .should.eq 1
29
+ Muack.verify.should.eq true
30
+ obj.f .should.eq 0
31
+ end
32
+
33
+ should 'proxy with multiple any_instance_of call' do
34
+ klass = Class.new{ def f; 0; end }
35
+ any_instance_of(klass){ |instance| mock_proxy(instance).f{ |i| i+1 } }
36
+ any_instance_of(klass){ |instance| mock_proxy(instance).f{ |i| i+2 } }
37
+ obj = klass.new
27
38
  obj.f.should.eq 1
39
+ obj.f.should.eq 2
40
+ Muack.verify.should.eq true
41
+ obj.f.should.eq 0
42
+ end
43
+
44
+ should 'mock with multiple any_instance_of call' do
45
+ klass = Class.new{ def f; 0; end }
46
+ any_instance_of(klass){ |inst| mock(inst).f(is_a(Fixnum)){ |i| i+1 } }
47
+ any_instance_of(klass){ |inst| mock(inst).f(is_a(Fixnum)){ |i| i+2 } }
48
+ obj = klass.new
49
+ obj.f(0).should.eq 1
50
+ obj.f(0).should.eq 2
28
51
  Muack.verify.should.eq true
52
+ obj.f.should.eq 0
29
53
  end
30
54
  end
data/test/test_mock.rb CHANGED
@@ -68,6 +68,14 @@ describe Muack::Mock do
68
68
  mock(Obj).say{1}
69
69
  Obj.say.should.eq 1
70
70
  end
71
+
72
+ should 'not remove original singleton method' do
73
+ obj = Class.new{ def self.f; 0; end }
74
+ 2.times{ mock(obj).f{ 1 } }
75
+ 2.times{ obj.f.should.eq 1 }
76
+ Muack.verify.should.eq true
77
+ obj.f .should.eq 0
78
+ end
71
79
  end
72
80
 
73
81
  describe 'Muack.verify==false' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: muack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lin Jen-Shin (godfat)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-06-24 00:00:00.000000000 Z
11
+ date: 2013-06-25 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |-
14
14
  Muack -- Yet another mocking library.
@@ -24,6 +24,7 @@ executables: []
24
24
  extensions: []
25
25
  extra_rdoc_files: []
26
26
  files:
27
+ - .gitignore
27
28
  - .gitmodules
28
29
  - .travis.yml
29
30
  - CHANGES.md