C0 code coverage information
Generated on Mon Aug 13 01:18:54 -0400 2007 with rcov 0.8.0
Code reported as executed by Ruby looks like this...
and this: this line is also marked as covered.
Lines considered as run by rcov, but not reported by Ruby, look like this,
and this: these lines were inferred by rcov (using simple heuristics).
Finally, here's a line marked as not executed.
1 module Spec
2 module Mocks
3 class Proxy
4 DEFAULT_OPTIONS = {
5 :null_object => false,
6 }
7
8 def initialize(target, name, options={})
9 @target = target
10 @name = name
11 @error_generator = ErrorGenerator.new target, name
12 @expectation_ordering = OrderGroup.new @error_generator
13 @expectations = []
14 @messages_received = []
15 @stubs = []
16 @proxied_methods = []
17 @options = options ? DEFAULT_OPTIONS.dup.merge(options) : DEFAULT_OPTIONS
18 end
19
20 def null_object?
21 @options[:null_object]
22 end
23
24 def add_message_expectation(expected_from, sym, opts={}, &block)
25 __add sym, block
26 @expectations << MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts)
27 @expectations.last
28 end
29
30 def add_negative_message_expectation(expected_from, sym, &block)
31 __add sym, block
32 @expectations << NegativeMessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
33 @expectations.last
34 end
35
36 def add_stub(expected_from, sym)
37 __add sym, nil
38 @stubs.unshift MethodStub.new(@error_generator, @expectation_ordering, expected_from, sym, nil)
39 @stubs.first
40 end
41
42 def verify #:nodoc:
43 begin
44 verify_expectations
45 ensure
46 reset
47 end
48 end
49
50 def reset
51 clear_expectations
52 clear_stubs
53 reset_proxied_methods
54 clear_proxied_methods
55 end
56
57 def received_message?(sym, *args, &block)
58 return true if @messages_received.find {|array| array == [sym, args, block]}
59 return false
60 end
61
62 def has_negative_expectation?(sym)
63 @expectations.detect {|expectation| expectation.negative_expectation_for?(sym)}
64 end
65
66 def message_received(sym, *args, &block)
67 if expectation = find_matching_expectation(sym, *args)
68 expectation.invoke(args, block)
69 elsif stub = find_matching_method_stub(sym)
70 stub.invoke([], block)
71 elsif expectation = find_almost_matching_expectation(sym, *args)
72 raise_unexpected_message_args_error(expectation, *args) unless has_negative_expectation?(sym) unless null_object?
73 else
74 @target.send :method_missing, sym, *args, &block
75 end
76 end
77
78 def raise_unexpected_message_args_error(expectation, *args)
79 @error_generator.raise_unexpected_message_args_error expectation, *args
80 end
81
82 def raise_unexpected_message_error(sym, *args)
83 @error_generator.raise_unexpected_message_error sym, *args
84 end
85
86 private
87
88 def __add(sym, block)
89 $rspec_mocks.add(@target) unless $rspec_mocks.nil?
90 define_expected_method(sym)
91 end
92
93 def define_expected_method(sym)
94 if target_responds_to?(sym) && !@proxied_methods.include?(sym)
95 metaclass.__send__(:alias_method, munge(sym), sym) if metaclass.instance_methods.include?(sym.to_s)
96 @proxied_methods << sym
97 end
98
99 metaclass_eval(<<-EOF, __FILE__, __LINE__)
100 def #{sym}(*args, &block)
101 __mock_proxy.message_received :#{sym}, *args, &block
102 end
103 EOF
104 end
105
106 def target_responds_to?(sym)
107 return @target.send(munge(:respond_to?),sym) if @already_proxied_respond_to
108 return @already_proxied_respond_to = true if sym == :respond_to?
109 return @target.respond_to?(sym)
110 end
111
112 def munge(sym)
113 "proxied_by_rspec__#{sym.to_s}".to_sym
114 end
115
116 def clear_expectations
117 @expectations.clear
118 end
119
120 def clear_stubs
121 @stubs.clear
122 end
123
124 def clear_proxied_methods
125 @proxied_methods.clear
126 end
127
128 def metaclass_eval(str, filename, lineno)
129 metaclass.class_eval(str, filename, lineno)
130 end
131
132 def metaclass
133 (class << @target; self; end)
134 end
135
136 def verify_expectations
137 @expectations.each do |expectation|
138 expectation.verify_messages_received
139 end
140 end
141
142 def reset_proxied_methods
143 @proxied_methods.each do |sym|
144 if metaclass.instance_methods.include?(munge(sym).to_s)
145 metaclass.__send__(:alias_method, sym, munge(sym))
146 metaclass.__send__(:undef_method, munge(sym))
147 else
148 metaclass.__send__(:undef_method, sym)
149 end
150 end
151 end
152
153 def find_matching_expectation(sym, *args)
154 @expectations.find {|expectation| expectation.matches(sym, args)}
155 end
156
157 def find_almost_matching_expectation(sym, *args)
158 @expectations.find {|expectation| expectation.matches_name_but_not_args(sym, args)}
159 end
160
161 def find_matching_method_stub(sym)
162 @stubs.find {|stub| stub.matches(sym, [])}
163 end
164
165 end
166 end
167 end
Generated using the rcov code coverage analysis tool for Ruby version 0.8.0.