fakes 0.3.2 → 0.3.7

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,14 @@
1
1
  module Fakes
2
2
  class Matches
3
3
  class << self
4
+ def not_nil
5
+ condition(lambda{|item| item != nil})
6
+ end
7
+
8
+ def nil
9
+ condition(lambda{|item| item == nil})
10
+ end
11
+
4
12
  def any
5
13
  condition(lambda{|ignored| true})
6
14
  end
@@ -0,0 +1,27 @@
1
+ module Fakes
2
+ class ClassSwap
3
+ attr_accessor :original,:replacement
4
+ attr_reader :klass
5
+
6
+ def initialize(klass,replacement,options ={})
7
+ @klass = klass.to_s.to_sym
8
+ @replacement = replacement
9
+ @remove_strategy = options.fetch(:remove_strategy,lambda{|klass_symbol| Object.send(:remove_const,klass_symbol)})
10
+ @set_strategy = options.fetch(:set_strategy,lambda{|klass_symbol,new_value| Object.const_set(klass_symbol,new_value)})
11
+ end
12
+
13
+ def initiate
14
+ swap_to(replacement){|original| @original = original}
15
+ end
16
+
17
+ def reset
18
+ swap_to(@original)
19
+ end
20
+
21
+ def swap_to(new_value,&block)
22
+ current = @remove_strategy.call(@klass)
23
+ yield current if block_given?
24
+ @set_strategy.call(@klass,new_value)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ require 'singleton'
2
+
3
+ module Fakes
4
+ class ClassSwaps
5
+ include Singleton
6
+ attr_reader :swaps
7
+
8
+ def initialize
9
+ @swaps = {}
10
+ end
11
+
12
+ def add_fake_for(klass,the_fake)
13
+ symbol = klass.to_s.to_sym
14
+ ensure_swap_does_not_already_exist_for(symbol)
15
+ swap = ClassSwap.new(klass,the_fake)
16
+ @swaps[symbol] = swap
17
+ swap.initiate
18
+ end
19
+
20
+ def ensure_swap_does_not_already_exist_for(symbol)
21
+ raise "A swap already exists for the class #{symbol}" if @swaps.has_key?(symbol)
22
+ end
23
+
24
+ def reset
25
+ @swaps.values.each{|item| item.reset}
26
+ @swaps.clear
27
+ end
28
+ end
29
+ end
data/lib/core/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Fakes
2
- VERSION = "0.3.2"
2
+ VERSION = "0.3.7"
3
3
  end
data/lib/fakes.rb CHANGED
@@ -7,17 +7,26 @@ require 'core/arg_matching/matches'
7
7
  require 'core/arg_matching/regular_arg_matcher'
8
8
  require 'core/arg_behaviour'
9
9
  require 'core/arg_set'
10
+ require 'core/class_swap'
11
+ require 'core/class_swaps'
10
12
  require 'core/fake'
11
13
  require 'core/ignore_set'
12
14
  require 'core/method_stub'
15
+ require 'singleton'
13
16
 
14
- module Kernel
17
+ class Object
15
18
  def fake
16
19
  return Fakes::Fake.new
17
20
  end
18
- end
19
- class Object
20
21
  def matches
21
22
  return Fakes::Matches
22
23
  end
24
+ def fake_class(klass)
25
+ item = fake
26
+ Fakes::ClassSwaps.instance.add_fake_for(klass,item)
27
+ item
28
+ end
29
+ def reset_fake_classes
30
+ Fakes::ClassSwaps.instance.reset
31
+ end
23
32
  end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,19 @@
1
1
  Dir.chdir(File.join(File.dirname(__FILE__),"..,lib".split(','))) do
2
2
  require 'fakes.rb'
3
3
  end
4
+
5
+ def catch_exception(&block)
6
+ begin
7
+ yield
8
+ rescue Exception => e
9
+ e
10
+ end
11
+ end
12
+
13
+ module RSpec
14
+ Matchers.define :contain do|string_to_find|
15
+ match do|string_element|
16
+ string_element.include?(string_to_find)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ module Fakes
4
+ class MyClass
5
+ end
6
+ describe ClassSwap do
7
+ context "when created" do
8
+ let(:sut){ClassSwap.new(MyClass,Object.new)}
9
+
10
+ it "should store the symbol of the class it is going to replace" do
11
+ sut.klass.should == MyClass.to_s.to_sym
12
+ end
13
+ end
14
+ context "when initiated" do
15
+ let(:replacement){Object.new}
16
+ let(:the_sym){MyClass.to_s.to_sym}
17
+ let(:remove_strategy){Proc.new do|klass_to_remove|
18
+ @klass_to_remove = klass_to_remove
19
+ MyClass
20
+ end}
21
+ let(:set_strategy){Proc.new do|klass_to_change,new_value|
22
+ @klass_to_change = klass_to_change
23
+ @replacement_value = new_value
24
+ MyClass
25
+ end}
26
+ let(:sut){ClassSwap.new(MyClass,replacement,:remove_strategy => remove_strategy,:set_strategy => set_strategy)}
27
+
28
+ before (:each) do
29
+ sut.initiate
30
+ end
31
+
32
+ it "should remove the current value of the class constant and store it for reset at a later point" do
33
+ @klass_to_remove.should == the_sym
34
+ end
35
+ it "should replace the current value of the symbol with the replacement value" do
36
+ @klass_to_change.should == the_sym
37
+ @replacement_value.should == replacement
38
+ end
39
+ end
40
+ context "when reset" do
41
+ let(:original){MyClass}
42
+ let(:the_sym){MyClass.to_s.to_sym}
43
+ let(:replacement){Object.new}
44
+ let(:remove_strategy){Proc.new do|klass_to_remove|
45
+ @klass_to_remove = klass_to_remove
46
+ MyClass
47
+ end}
48
+ let(:set_strategy){Proc.new do|klass_to_change,new_value|
49
+ @klass_to_change = klass_to_change
50
+ @replacement_value = new_value
51
+ MyClass
52
+ end}
53
+ let(:sut){ClassSwap.new(MyClass,replacement,:remove_strategy => remove_strategy,:set_strategy => set_strategy)}
54
+
55
+ before (:each) do
56
+ sut.original = MyClass
57
+ end
58
+
59
+
60
+
61
+
62
+ before (:each) do
63
+ sut.reset
64
+ end
65
+
66
+ it "should switch the value of the class back to its original value" do
67
+ @klass_to_remove.should == the_sym
68
+ @klass_to_change.should == the_sym
69
+ @replacement_value.should == MyClass
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,99 @@
1
+ require 'spec_helper'
2
+
3
+ module Fakes
4
+ class SomeClass
5
+ def self.calculate
6
+ 42
7
+ end
8
+ end
9
+ describe ClassSwaps do
10
+ class MySwap
11
+ attr_accessor :inititated,:was_reset
12
+
13
+ def initiate
14
+ @inititated = true
15
+ end
16
+ def reset
17
+ @was_reset = true
18
+ end
19
+ end
20
+ context 'when a class swap is registered ' do
21
+ context 'and it does not already exist' do
22
+ let(:the_sym){MyClass.to_s.to_sym}
23
+ let(:replacement){Object.new}
24
+ let(:the_swap){MySwap.new}
25
+ let(:sut){ClassSwaps.instance}
26
+ before (:each) do
27
+ ClassSwap.stub(:new).with(MyClass,replacement).and_return(the_swap)
28
+ end
29
+ after (:each) do
30
+ sut.swaps.clear
31
+ end
32
+
33
+ before (:each) do
34
+ sut.add_fake_for(MyClass,replacement)
35
+ end
36
+
37
+ it 'should add a new class swap to the set of class swaps' do
38
+ ClassSwaps.instance.swaps[the_sym].should == the_swap
39
+ end
40
+
41
+ it "should initiate the swap" do
42
+ the_swap.inititated.should be_true
43
+ end
44
+
45
+
46
+ end
47
+ context 'and it already exist' do
48
+ let(:the_sym){MyClass.to_s.to_sym}
49
+ let(:sut){ClassSwaps.instance}
50
+ before (:each) do
51
+ sut.swaps[the_sym] = 2
52
+ end
53
+ after (:each) do
54
+ sut.swaps.clear
55
+ end
56
+
57
+ before (:each) do
58
+ @exception = catch_exception {sut.add_fake_for(MyClass,Object.new)}
59
+ end
60
+
61
+ it 'should throw an error indicating that the swap is already present' do
62
+ @exception.message.should contain(MyClass.to_s)
63
+ end
64
+ end
65
+ end
66
+ context 'when reset' do
67
+ let(:first_swap){MySwap.new}
68
+ let(:second_swap){MySwap.new}
69
+ let(:sut){ClassSwaps.instance}
70
+
71
+ before (:each) do
72
+ sut.swaps[:first] = first_swap
73
+ sut.swaps[:second] = second_swap
74
+ end
75
+
76
+ before (:each) do
77
+ sut.reset
78
+ end
79
+
80
+ it 'should reset each of the swaps' do
81
+ first_swap.was_reset.should be_true
82
+ second_swap.was_reset.should be_true
83
+ end
84
+ it "should clear the swaps" do
85
+ sut.swaps.count.should == 0
86
+ end
87
+ end
88
+ context "Integration Test" do
89
+ let(:replacement){ Object.new }
90
+
91
+ it 'should be able to swap class values' do
92
+ ClassSwaps.instance.add_fake_for(Dir,replacement)
93
+ Dir.should == replacement
94
+ ClassSwaps.instance.reset
95
+ Dir.should_not == replacement
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,38 @@
1
+ describe Object do
2
+ it "should be able to create a new fake" do
3
+ fake.class.should == Fakes::Fake
4
+ end
5
+
6
+ context "when specifying a fake for a class" do
7
+ let(:swaps){fake}
8
+ before (:each) do
9
+ Fakes::ClassSwaps.stub(:instance).and_return(swaps)
10
+ end
11
+ before (:each) do
12
+ @result = fake_class Dir
13
+ end
14
+
15
+ it "should register a new fake with the class swaps" do
16
+ swaps.received(:add_fake_for).called_with(Dir,matches.not_nil).should_not be_nil
17
+ end
18
+
19
+ it "should return the newly created fake" do
20
+ @result.should_not be_nil
21
+ end
22
+
23
+ end
24
+
25
+ context "resetting fake classes" do
26
+ let(:swaps){fake}
27
+ before (:each) do
28
+ Fakes::ClassSwaps.stub(:instance).and_return(swaps)
29
+ end
30
+ before (:each) do
31
+ reset_fake_classes
32
+ end
33
+ it "should be able to reset all of the fake classes" do
34
+ swaps.received(:reset)
35
+ end
36
+ end
37
+ end
38
+
@@ -17,6 +17,16 @@ module Fakes
17
17
  match.matches?(10).should be_true
18
18
  match.matches?(11).should be_false
19
19
  end
20
+ it "should be able to create a nil matcher" do
21
+ match = Matches.nil
22
+ match.matches?(nil).should be_true
23
+ match.matches?(10).should be_false
24
+ end
25
+ it "should be able to create a not nil matcher" do
26
+ match = Matches.not_nil
27
+ match.matches?(10).should be_true
28
+ match.matches?(nil).should be_false
29
+ end
20
30
  it "should be able to create a regex string matcher" do
21
31
  match = Matches.regex(/a|e|i|o|u/)
22
32
  match.matches?("awwef").should be_true
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.3.2
4
+ version: 0.3.7
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-06-09 00:00:00.000000000 Z
12
+ date: 2012-06-11 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -114,6 +114,8 @@ files:
114
114
  - lib/core/arg_matching/matches.rb
115
115
  - lib/core/arg_matching/regular_arg_matcher.rb
116
116
  - lib/core/arg_set.rb
117
+ - lib/core/class_swap.rb
118
+ - lib/core/class_swaps.rb
117
119
  - lib/core/fake.rb
118
120
  - lib/core/ignore_set.rb
119
121
  - lib/core/method_stub.rb
@@ -125,10 +127,12 @@ files:
125
127
  - spec/specs/arg_matching_scenarios_spec.rb
126
128
  - spec/specs/arg_set_spec.rb
127
129
  - spec/specs/block_arg_matcher_spec.rb
130
+ - spec/specs/class_swap_spec.rb
131
+ - spec/specs/class_swaps_spec.rb
128
132
  - spec/specs/combined_arg_matcher_spec.rb
133
+ - spec/specs/extensions_spec.rb
129
134
  - spec/specs/fake_spec.rb
130
135
  - spec/specs/ignore_set_spec.rb
131
- - spec/specs/kernel_spec.rb
132
136
  - spec/specs/matches_spec.rb
133
137
  - spec/specs/method_stub_spec.rb
134
138
  - spec/specs/regular_arg_matcher_spec.rb
@@ -163,10 +167,12 @@ test_files:
163
167
  - spec/specs/arg_matching_scenarios_spec.rb
164
168
  - spec/specs/arg_set_spec.rb
165
169
  - spec/specs/block_arg_matcher_spec.rb
170
+ - spec/specs/class_swap_spec.rb
171
+ - spec/specs/class_swaps_spec.rb
166
172
  - spec/specs/combined_arg_matcher_spec.rb
173
+ - spec/specs/extensions_spec.rb
167
174
  - spec/specs/fake_spec.rb
168
175
  - spec/specs/ignore_set_spec.rb
169
- - spec/specs/kernel_spec.rb
170
176
  - spec/specs/matches_spec.rb
171
177
  - spec/specs/method_stub_spec.rb
172
178
  - spec/specs/regular_arg_matcher_spec.rb
@@ -1,6 +0,0 @@
1
- describe Kernel do
2
- it "should be able to create a new fake using the kernel exposed method" do
3
- fake.class.should == Fakes::Fake
4
- end
5
- end
6
-