1module DefinedSpecs
2  self::SelfScoped = 42
3
4  def self.side_effects
5    ScratchPad.record :defined_specs_side_effects
6  end
7
8  def self.fixnum_method
9    ScratchPad.record :defined_specs_fixnum_method
10    42
11  end
12
13  def self.exception_method
14    ScratchPad.record :defined_specs_exception
15    raise "defined? specs exception method"
16  end
17
18  def self.defined_method
19    DefinedSpecs
20  end
21
22  class Basic
23    A = 42
24
25    def defined_method
26      DefinedSpecs
27    end
28
29    def a_defined_method
30    end
31
32    def protected_method
33    end
34    protected :protected_method
35
36    def private_method
37    end
38    private :private_method
39
40    def private_method_defined
41      defined? private_method
42    end
43
44    def private_predicate?
45    end
46    private :private_predicate?
47
48    def private_predicate_defined
49      defined? private_predicate?
50    end
51
52    def local_variable_defined
53      x = 2
54      defined? x
55    end
56
57    def local_variable_defined_nil
58      x = nil
59      defined? x
60    end
61
62    def instance_variable_undefined
63      defined? @instance_variable_undefined
64    end
65
66    def instance_variable_read
67      value = @instance_variable_read
68      defined? @instance_variable_read
69    end
70
71    def instance_variable_defined
72      @instance_variable_defined = 1
73      defined? @instance_variable_defined
74    end
75
76    def instance_variable_defined_nil
77      @instance_variable_defined_nil = nil
78      defined? @instance_variable_defined_nil
79    end
80
81    def global_variable_undefined
82      defined? $defined_specs_global_variable_undefined
83    end
84
85    def global_variable_read
86      suppress_warning do
87        value = $defined_specs_global_variable_read
88      end
89      defined? $defined_specs_global_variable_read
90    end
91
92    def global_variable_defined
93      $defined_specs_global_variable_defined = 1
94      defined? $defined_specs_global_variable_defined
95    end
96
97    def global_variable_defined_as_nil
98      $defined_specs_global_variable_defined_as_nil = nil
99      defined? $defined_specs_global_variable_defined_as_nil
100    end
101
102    def class_variable_undefined
103      defined? @@class_variable_undefined
104    end
105
106    def class_variable_defined
107      @@class_variable_defined = 1
108      defined? @@class_variable_defined
109    end
110
111    def yield_defined_method
112      defined? yield
113    end
114
115    def yield_defined_parameter_method(&block)
116      defined? yield
117    end
118
119    def no_yield_block
120      yield_defined_method
121    end
122
123    def no_yield_block_parameter
124      yield_defined_parameter_method
125    end
126
127    def yield_block
128      yield_defined_method { 42 }
129    end
130
131    def yield_block_parameter
132      yield_defined_parameter_method { 42 }
133    end
134  end
135
136  module Mixin
137    MixinConstant = 42
138
139    def defined_super
140      defined? super()
141    end
142  end
143
144  class Parent
145    ParentConstant = 42
146
147    def defined_super; end
148  end
149
150  class Child < Parent
151    include Mixin
152
153    A = 42
154
155    def self.parent_constant_defined
156      defined? self::ParentConstant
157    end
158
159    def self.module_defined
160      defined? Mixin
161    end
162
163    def self.module_constant_defined
164      defined? MixinConstant
165    end
166
167    def defined_super
168      super
169    end
170  end
171
172  class Superclass
173    def yield_method
174      yield
175    end
176
177    def method_no_args
178    end
179
180    def method_args
181    end
182
183    def method_block_no_args
184    end
185
186    def method_block_args
187    end
188
189    def define_method_no_args
190    end
191
192    def define_method_args
193    end
194
195    def define_method_block_no_args
196    end
197
198    def define_method_block_args
199    end
200  end
201
202  class Super < Superclass
203    def no_super_method_no_args
204      defined? super
205    end
206
207    def no_super_method_args
208      defined? super()
209    end
210
211    def method_no_args
212      defined? super
213    end
214
215    def method_args
216      defined? super()
217    end
218
219    def no_super_method_block_no_args
220      yield_method { defined? super }
221    end
222
223    def no_super_method_block_args
224      yield_method { defined? super() }
225    end
226
227    def method_block_no_args
228      yield_method { defined? super }
229    end
230
231    def method_block_args
232      yield_method { defined? super() }
233    end
234
235    define_method(:no_super_define_method_no_args) { defined? super }
236    define_method(:no_super_define_method_args) { defined? super() }
237    define_method(:define_method_no_args) { defined? super }
238    define_method(:define_method_args) { defined? super() }
239
240    define_method(:no_super_define_method_block_no_args) do
241      yield_method { defined? super }
242    end
243
244    define_method(:no_super_define_method_block_args) do
245      yield_method { defined? super() }
246    end
247
248    define_method(:define_method_block_no_args) do
249      yield_method { defined? super }
250    end
251
252    define_method(:define_method_block_args) do
253      yield_method { defined? super() }
254    end
255  end
256
257  class ClassWithMethod
258    def test
259    end
260  end
261
262  class ClassUndefiningMethod < ClassWithMethod
263    undef :test
264  end
265
266  class ClassWithoutMethod < ClassUndefiningMethod
267    # If an undefined method overridden in descendants
268    # define?(super) should return nil
269    def test
270      defined?(super)
271    end
272  end
273
274  module IntermediateModule1
275    def method_no_args
276    end
277  end
278
279  module IntermediateModule2
280    def method_no_args
281      defined?(super)
282    end
283  end
284
285  class SuperWithIntermediateModules
286    include IntermediateModule1
287    include IntermediateModule2
288
289    def method_no_args
290      super
291    end
292  end
293end
294
295class Object
296  def defined_specs_method
297    DefinedSpecs
298  end
299
300  def defined_specs_receiver
301    DefinedSpecs::Basic.new
302  end
303end
304