fakes 0.2.3 → 0.3.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.
@@ -1,6 +1,10 @@
1
1
  module Fakes
2
2
  module ArgBehaviour
3
- attr_accessor :return_value,:times_called
3
+ attr_accessor :return_value,:times_called,:arg_matcher
4
+
5
+ def initialize_matcher_using(args)
6
+ @arg_matcher = ArgMatchFactory.create_arg_matcher_using(args)
7
+ end
4
8
 
5
9
  def and_return(item)
6
10
  @return_value = item
@@ -16,11 +20,11 @@ module Fakes
16
20
  end
17
21
 
18
22
  def matches?(args)
19
- return @args == args
23
+ return @arg_matcher.matches?(args)
20
24
  end
21
25
 
22
26
  def was_called_with?(args)
23
- return @called_args == args
27
+ ArgMatchFactory.create_arg_matcher_using(args).matches?(@called_args)
24
28
  end
25
29
 
26
30
  def process
@@ -0,0 +1,12 @@
1
+ module Fakes
2
+ class ArgMatchFactory
3
+ def self.create_arg_matcher_using(args)
4
+ matcher = CombinedArgMatcher.new
5
+ args.each do|arg|
6
+ current_matcher = arg.respond_to?(:is_used_in_the_arg_matching_process?) ? arg : RegularArgMatcher.new(arg)
7
+ matcher.add current_matcher
8
+ end
9
+ matcher
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ module Fakes
2
+ module ArgMatchProtocol
3
+ def is_used_in_the_arg_matching_process?
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ module Fakes
2
+ class BlockArgMatcher
3
+ include ArgMatchProtocol
4
+
5
+ def initialize(specification_block)
6
+ @specification_block = specification_block
7
+ end
8
+
9
+ def matches?(item)
10
+ @specification_block.call(item)
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ module Fakes
2
+ class CombinedArgMatcher
3
+ include ArgMatchProtocol
4
+ attr_reader :all_matchers
5
+
6
+ def initialize(options = {})
7
+ @all_matchers = options.fetch(:matchers,[])
8
+ end
9
+
10
+ def matches?(args)
11
+ matches = true
12
+ for index in 0..@all_matchers.count - 1
13
+ matches &= @all_matchers[index].matches?(args[index])
14
+ return false unless matches
15
+ end
16
+ matches
17
+ end
18
+
19
+ def add(matcher)
20
+ @all_matchers << matcher
21
+ end
22
+
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ module Fakes
2
+ class Matches
3
+ class << self
4
+ def any
5
+ condition(lambda{|ignored| true})
6
+ end
7
+
8
+ def greater_than(value)
9
+ condition(lambda{|number| number > value})
10
+ end
11
+
12
+
13
+ def in_range(range)
14
+ condition(lambda{|item| range === item})
15
+ end
16
+
17
+ def regex(regex)
18
+ condition(lambda{|string| regex =~ string})
19
+ end
20
+
21
+ def condition(conditional_block)
22
+ return BlockArgMatcher.new(conditional_block)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ module Fakes
2
+ class RegularArgMatcher
3
+ include ArgMatchProtocol
4
+
5
+ def initialize(value_to_match)
6
+ @value_to_match = value_to_match
7
+ end
8
+
9
+ def matches?(item)
10
+ @value_to_match == item
11
+ end
12
+ end
13
+ end
data/lib/core/arg_set.rb CHANGED
@@ -3,7 +3,7 @@ module Fakes
3
3
  include ArgBehaviour
4
4
 
5
5
  def initialize(args)
6
- @args = args
6
+ initialize_matcher_using(args)
7
7
  @times_called = 0
8
8
  end
9
9
  end
@@ -16,9 +16,9 @@ module Fakes
16
16
  return true
17
17
  end
18
18
 
19
-
20
19
  def was_called_with?(args)
21
- return @arg_sets.select{|set| set == args}.count > 0
20
+ matcher = ArgMatchFactory.create_arg_matcher_using(args)
21
+ return @arg_sets.select{|set| matcher.matches?(set)}.count > 0
22
22
  end
23
23
  end
24
24
  end
data/lib/core/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fakes
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/fakes.rb CHANGED
@@ -1,5 +1,11 @@
1
1
  require 'developwithpassion_arrays'
2
2
 
3
+ require 'core/arg_matching/arg_match_factory'
4
+ require 'core/arg_matching/arg_match_protocol'
5
+ require 'core/arg_matching/block_arg_matcher'
6
+ require 'core/arg_matching/combined_arg_matcher'
7
+ require 'core/arg_matching/matches'
8
+ require 'core/arg_matching/regular_arg_matcher'
3
9
  require 'core/arg_behaviour'
4
10
  require 'core/arg_set'
5
11
  require 'core/fake'
@@ -48,34 +48,36 @@ module Fakes
48
48
  sut.called_args.should == 2
49
49
  end
50
50
  end
51
-
51
+
52
52
  context "when matching a set of arguments" do
53
+ let(:matcher){Object.new}
53
54
  before (:each) do
54
- sut.args = 2
55
+ sut.arg_matcher = matcher
56
+
57
+ matcher.stub(:matches?).with(2).and_return(true)
58
+ matcher.stub(:matches?).with(3).and_return(false)
55
59
  end
56
- it "should match if its own set of arguments are the same" do
60
+ it "should match if its argument matcher matches the argument set" do
57
61
  sut.matches?(2).should be_true
58
62
  sut.matches?(3).should be_false
59
63
  end
60
64
  end
61
65
 
62
- context "when matching a set of arguments that is passed in as a dictionary" do
63
- before (:each) do
64
- sut.args = {:id => 0,:name => "JP"}
65
- end
66
- it "should match if its hash is the same" do
67
- sut.matches?(:id => 0,:name => "JP").should be_true
68
- end
69
- end
70
66
 
71
67
  context "when determining whether it was called with a set of arguments" do
68
+ let(:the_matcher){Object.new}
69
+
70
+ before (:each) do
71
+ ArgMatchFactory.stub(:create_arg_matcher_using).with(2).and_return(the_matcher)
72
+ the_matcher.stub(:matches?).with(2).and_return(true)
73
+ end
74
+
72
75
  before (:each) do
73
76
  sut.called_args = 2
74
77
  end
75
78
 
76
- it "should match if the arguments are the same as the arguments it was invoked with" do
79
+ it "should make the decision by using the matcher created to match the arguments" do
77
80
  sut.was_called_with?(2).should be_true
78
- sut.was_called_with?(3).should be_false
79
81
  end
80
82
  end
81
83
  end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ module Fakes
4
+ describe ArgMatchFactory do
5
+ context "when creating an argument matcher" do
6
+ context "and none of the arguments are matchers themselves" do
7
+ before (:each) do
8
+ @result = ArgMatchFactory.create_arg_matcher_using([2,3,4])
9
+ end
10
+
11
+ it "should create a combined matcher that is composed of regular matchers" do
12
+ @result.all_matchers.count.should == 3
13
+ @result.all_matchers.each do|matcher|
14
+ matcher.class.should == RegularArgMatcher
15
+ end
16
+ end
17
+ end
18
+ context "and the arguments are matchers themselves" do
19
+ let(:matcher){Object.new}
20
+ before (:each) do
21
+ matcher.stub(:respond_to?).with(:is_used_in_the_arg_matching_process?).and_return(true)
22
+ end
23
+
24
+ before (:each) do
25
+ @result = ArgMatchFactory.create_arg_matcher_using([matcher])
26
+ end
27
+
28
+ it "should create a combined matcher that only using the matchers provided" do
29
+ @result.all_matchers.count.should == 1
30
+ @result.all_matchers[0].should == matcher
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ module Fakes
4
+ describe "Arg matching scenarios" do
5
+ it "should be able to intercept using argument matchers" do
6
+ fake = Fake.new
7
+
8
+ fake.hello("World")
9
+
10
+ fake.received(:hello).called_with(Matches.any).should_not be_nil
11
+ end
12
+
13
+ it "should be able to intercept using greater than matchers" do
14
+ fake = Fake.new
15
+
16
+ fake.hello(10)
17
+
18
+ fake.received(:hello).called_with(Matches.greater_than(2)).should_not be_nil
19
+ end
20
+
21
+ it "should be able to intercept using regex matchers" do
22
+ fake = Fake.new
23
+
24
+ fake.hello("This is cool")
25
+
26
+ fake.received(:hello).called_with(Matches.regex(/is/)).should_not be_nil
27
+ end
28
+
29
+ it "should be able to intercept using range matchers" do
30
+ fake = Fake.new
31
+
32
+ fake.hello(7)
33
+
34
+ fake.received(:hello).called_with(Matches.in_range(4..8)).should_not be_nil
35
+ end
36
+
37
+ it "should be able to intercept using conditional matchers" do
38
+ fake = Fake.new
39
+
40
+ fake.hello(7)
41
+
42
+ fake.received(:hello).called_with(Matches.condition(lambda{|item| item < 10})).should_not be_nil
43
+ end
44
+
45
+ it "should be able to intercept by mixing regular arguments with matchers" do
46
+ fake = Fake.new
47
+
48
+ fake.hello(7,4,"Yes")
49
+
50
+ fake.received(:hello).called_with(7,Matches.greater_than(2),Matches.regex(/Y/)).should_not be_nil
51
+ fake.received(:hello).called_with(7,Matches.any,Matches.regex(/Y/)).should_not be_nil
52
+ fake.received(:hello).called_with(7,Matches.any,"Yes").should_not be_nil
53
+ fake.received(:hello).called_with(6,Matches.any,"Yes").should be_nil
54
+ end
55
+ end
56
+
57
+ end
@@ -3,11 +3,14 @@ require 'spec_helper'
3
3
  module Fakes
4
4
  describe ArgSet do
5
5
  context "when created" do
6
- let(:sut){ArgSet.new(1)}
6
+ let(:sut){ArgSet.new([1])}
7
7
 
8
+
8
9
  it "should initialize required members" do
9
10
  sut.times_called.should == 0
10
11
  end
12
+
11
13
  end
14
+
12
15
  end
13
16
  end
@@ -0,0 +1,14 @@
1
+ require 'spec_helper'
2
+
3
+ module Fakes
4
+ describe BlockArgMatcher do
5
+ context "when determining if it matches a value" do
6
+ let(:sut){BlockArgMatcher.new(lambda{|item| true})}
7
+
8
+ it "should decide by using its provided block" do
9
+ sut.matches?(2).should be_true
10
+ end
11
+ end
12
+ end
13
+
14
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ module Fakes
4
+ describe CombinedArgMatcher do
5
+ context "when determining whether it matches an set of arguments" do
6
+ let(:args){[2,3]}
7
+ let(:first_matcher){Object.new}
8
+ let(:second_matcher){Object.new}
9
+ let(:matchers){[first_matcher,second_matcher]}
10
+ let(:options){{:matchers => matchers}}
11
+ let(:sut){CombinedArgMatcher.new(options)}
12
+ before (:each) do
13
+ first_matcher.stub(:matches?).with(2).and_return(3)
14
+ second_matcher.stub(:matches?).with(3).and_return(3)
15
+ end
16
+
17
+
18
+ before (:each) do
19
+ @result = sut.matches?(args)
20
+ end
21
+
22
+
23
+ it "should match if each of its argument matchers matches its respective argument" do
24
+ @result.should be_true
25
+ end
26
+ end
27
+ context "when adding a matcher" do
28
+ let(:first_matcher){Object.new}
29
+ let(:matchers){[]}
30
+ let(:options){{:matchers => matchers}}
31
+ let(:sut){CombinedArgMatcher.new(options)}
32
+
33
+ before (:each) do
34
+ sut.add(first_matcher)
35
+ end
36
+
37
+
38
+ it "should add the matcher to its set of matchers" do
39
+ matchers[0].should == first_matcher
40
+ end
41
+ end
42
+ end
43
+ end
44
+
@@ -135,6 +135,22 @@ module Fakes
135
135
  end
136
136
 
137
137
  context "scenarios" do
138
+ context "setting up return values using argument matchers" do
139
+ it "should be able to intercept on methods using the matches factory" do
140
+ fake = Fake.new
141
+
142
+ fake.stub(:hello).with(Matches.regex(/W/)).and_return("Hello World")
143
+ fake.hello("World").should == "Hello World"
144
+ end
145
+ it "should be able to intercept on methods using combinations of explicit values and matchers" do
146
+ fake = Fake.new
147
+
148
+ fake.stub(:hello).with(Matches.regex(/W/),Matches.greater_than(3),10).and_return("Hello World")
149
+
150
+ fake.hello("World",4,10).should == "Hello World"
151
+ fake.hello("World",2,10).should == nil
152
+ end
153
+ end
138
154
  context "setting up return values" do
139
155
  it "should be able to intercept on methods that take a singular value" do
140
156
  fake = Fake.new
@@ -214,6 +230,7 @@ module Fakes
214
230
  fake.received(:hello).called_with(1,[1,2,3,4]).should_not be_nil
215
231
  fake.received(:hello).called_with(1,[1,2,3,5]).should be_nil
216
232
  end
233
+
217
234
  end
218
235
  end
219
236
  end
@@ -28,11 +28,20 @@ module Fakes
28
28
  end
29
29
 
30
30
  context "when determining if it was called with a set of arguments" do
31
+ let(:the_matcher){Object.new}
32
+
33
+ before (:each) do
34
+ ArgMatchFactory.stub(:create_arg_matcher_using).with(2).and_return(the_matcher)
35
+ the_matcher.stub(:matches?).with(3).and_return(true)
36
+ the_matcher.stub(:matches?).with(1).and_return(true)
37
+ end
38
+
31
39
  before (:each) do
32
40
  sut.capture_args(1)
33
- sut.capture_args(2)
41
+ sut.capture_args(3)
34
42
  end
35
- it "should match if any of its argument sets match" do
43
+
44
+ it "should make the decision by using the matcher created to match the argument sets that were stored" do
36
45
  sut.was_called_with?(2).should be_true
37
46
  end
38
47
  end
@@ -0,0 +1,36 @@
1
+ module Fakes
2
+ describe Matches do
3
+ context "when creating matchers" do
4
+ it "should be able to create a matcher that matches anything" do
5
+ (1..10).each{|item| Matches.any.matches?(item).should be_true}
6
+ end
7
+ it "should be able to create a numeric greater than matcher" do
8
+ match = Matches.greater_than(5)
9
+ match.matches?(4).should be_false
10
+ match.matches?(5).should be_false
11
+ match.matches?(6).should be_true
12
+
13
+ end
14
+ it "should be able to create a range matcher" do
15
+ match = Matches.in_range((1..10))
16
+ match.matches?(4).should be_true
17
+ match.matches?(10).should be_true
18
+ match.matches?(11).should be_false
19
+ end
20
+ it "should be able to create a regex string matcher" do
21
+ match = Matches.regex(/a|e|i|o|u/)
22
+ match.matches?("awwef").should be_true
23
+ match.matches?("rwwgf").should be_false
24
+ end
25
+
26
+ it "should be able to create a lambda based matcher" do
27
+ match = Matches.condition(lambda{|item| item > 3})
28
+ match.matches?(2).should be_false
29
+ match.matches?(7).should be_true
30
+ end
31
+ end
32
+
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ module Fakes
4
+ describe RegularArgMatcher do
5
+ context "when determining if it matches a value" do
6
+ let(:sut){RegularArgMatcher.new(2)}
7
+
8
+ it "should match if the incoming value matches the value it was created to match" do
9
+ sut.matches?(2).should be_true
10
+ sut.matches?(3).should be_false
11
+ end
12
+ end
13
+ end
14
+
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fakes
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-31 00:00:00.000000000 Z
12
+ date: 2012-06-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -108,6 +108,12 @@ files:
108
108
  - Rakefile
109
109
  - fakes.gemspec
110
110
  - lib/core/arg_behaviour.rb
111
+ - lib/core/arg_matching/arg_match_factory.rb
112
+ - lib/core/arg_matching/arg_match_protocol.rb
113
+ - lib/core/arg_matching/block_arg_matcher.rb
114
+ - lib/core/arg_matching/combined_arg_matcher.rb
115
+ - lib/core/arg_matching/matches.rb
116
+ - lib/core/arg_matching/regular_arg_matcher.rb
111
117
  - lib/core/arg_set.rb
112
118
  - lib/core/fake.rb
113
119
  - lib/core/ignore_set.rb
@@ -116,11 +122,17 @@ files:
116
122
  - lib/fakes.rb
117
123
  - spec/spec_helper.rb
118
124
  - spec/specs/arg_behaviour_spec.rb
125
+ - spec/specs/arg_match_factory_spec.rb
126
+ - spec/specs/arg_matching_scenarios_spec.rb
119
127
  - spec/specs/arg_set_spec.rb
128
+ - spec/specs/block_arg_matcher_spec.rb
129
+ - spec/specs/combined_arg_matcher_spec.rb
120
130
  - spec/specs/fake_spec.rb
121
131
  - spec/specs/ignore_set_spec.rb
122
132
  - spec/specs/kernel_spec.rb
133
+ - spec/specs/matches_spec.rb
123
134
  - spec/specs/method_stub_spec.rb
135
+ - spec/specs/regular_arg_matcher_spec.rb
124
136
  homepage: http://www.developwithpassion.com
125
137
  licenses: []
126
138
  post_install_message:
@@ -148,8 +160,14 @@ summary: Simple faking library
148
160
  test_files:
149
161
  - spec/spec_helper.rb
150
162
  - spec/specs/arg_behaviour_spec.rb
163
+ - spec/specs/arg_match_factory_spec.rb
164
+ - spec/specs/arg_matching_scenarios_spec.rb
151
165
  - spec/specs/arg_set_spec.rb
166
+ - spec/specs/block_arg_matcher_spec.rb
167
+ - spec/specs/combined_arg_matcher_spec.rb
152
168
  - spec/specs/fake_spec.rb
153
169
  - spec/specs/ignore_set_spec.rb
154
170
  - spec/specs/kernel_spec.rb
171
+ - spec/specs/matches_spec.rb
155
172
  - spec/specs/method_stub_spec.rb
173
+ - spec/specs/regular_arg_matcher_spec.rb