muack 0.5.0 → 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
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