summaryrefslogtreecommitdiff
path: root/spec/ruby/fixtures/reflection.rb
blob: fe004f6a82a101037765209d072d1670971c1e3a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
# These modules and classes are fixtures used by the Ruby reflection specs.
# These include specs for methods:
#
# Module:
#   instance_methods
#   public_instance_methods
#   protected_instance_methods
#   private_instance_methods
#
# Kernel:
#   methods
#   public_methods
#   protected_methods
#   private_methods
#   singleton_methods
#
# The following naming scheme is used to keep the method names short and still
# communicate the relevant facts about the methods:
#
#   X[s]_VIS
#
# where
#
#   X is the name of the module or class in lower case
#   s is the literal character 's' for singleton methods
#   VIS is the first three letters of the corresponding visibility
#   pub(lic), pro(tected), pri(vate)
#
# For example:
#
#   l_pub is a public method on module L
#   ls_pri is a private singleton method on module L

module ReflectSpecs
  # An object with no singleton methods.
  def self.o
    mock("Object with no singleton methods")
  end

  # An object with singleton methods.
  def self.os
    obj = mock("Object with singleton methods")
    class << obj
      def os_pub; :os_pub; end

      def os_pro; :os_pro; end
      protected :os_pro

      def os_pri; :os_pri; end
      private :os_pri
    end
    obj
  end

  # An object extended with a module.
  def self.oe
    obj = mock("Object extended")
    obj.extend M
    obj
  end

  # An object with duplicate methods extended with a module.
  def self.oed
    obj = mock("Object extended")
    obj.extend M

    class << obj
      def pub; :pub; end

      def pro; :pro; end
      protected :pro

      def pri; :pri; end
      private :pri
    end

    obj
  end

  # An object extended with two modules.
  def self.oee
    obj = mock("Object extended twice")
    obj.extend M
    obj.extend N
    obj
  end

  # An object extended with a module including a module.
  def self.oei
    obj = mock("Object extended, included")
    obj.extend N
    obj
  end

  # A simple module.
  module L
    class << self
      def ls_pub; :ls_pub; end

      def ls_pro; :ls_pro; end
      protected :ls_pro

      def ls_pri; :ls_pri; end
      private :ls_pri
    end

    def l_pub; :l_pub; end

    def l_pro; :l_pro; end
    protected :l_pro

    def l_pri; :l_pri; end
    private :l_pri
  end

  # A module with no singleton methods.
  module K
  end

  # A simple module.
  module M
    class << self
      def ms_pub; :ms_pub; end

      def ms_pro; :ms_pro; end
      protected :ms_pro

      def ms_pri; :ms_pri; end
      private :ms_pri
    end

    def m_pub; :m_pub; end

    def m_pro; :m_pro; end
    protected :m_pro

    def m_pri; :m_pri; end
    private :m_pri

    def pub; :pub; end

    def pro; :pro; end
    protected :pro

    def pri; :pri; end
    private :pri
  end

  # A module including a module
  module N
    include M

    class << self
      def ns_pub; :ns_pub; end

      def ns_pro; :ns_pro; end
      protected :ns_pro

      def ns_pri; :ns_pri; end
      private :ns_pri
    end

    def n_pub; :n_pub; end

    def n_pro; :n_pro; end
    protected :n_pro

    def n_pri; :n_pri; end
    private :n_pri
  end

  # A simple class.
  class A
    class << self
      def as_pub; :as_pub; end

      def as_pro; :as_pro; end
      protected :as_pro

      def as_pri; :as_pri; end
      private :as_pri

      def pub; :pub; end

      def pro; :pro; end
      protected :pro

      def pri; :pri; end
      private :pri
    end

    def a_pub; :a_pub; end

    def a_pro; :a_pro; end
    protected :a_pro

    def a_pri; :a_pri; end
    private :a_pri
  end

  # A simple subclass.
  class B < A
    class << self
      def bs_pub; :bs_pub; end

      def bs_pro; :bs_pro; end
      protected :bs_pro

      def bs_pri; :bs_pri; end
      private :bs_pri

      def pub; :pub; end

      def pro; :pro; end
      protected :pro

      def pri; :pri; end
      private :pri
    end

    def b_pub; :b_pub; end

    def b_pro; :b_pro; end
    protected :b_pro

    def b_pri; :b_pri; end
    private :b_pri
  end

  # A subclass including a module.
  class C < A
    include M

    class << self
      def cs_pub; :cs_pub; end

      def cs_pro; :cs_pro; end
      protected :cs_pro

      def cs_pri; :cs_pri; end
      private :cs_pri

      def pub; :pub; end

      def pro; :pro; end
      protected :pro

      def pri; :pri; end
      private :pri
    end

    def c_pub; :c_pub; end

    def c_pro; :c_pro; end
    protected :c_pro

    def c_pri; :c_pri; end
    private :c_pri
  end

  # A simple class including a module
  class D
    include M

    class << self
      def ds_pub; :ds_pub; end

      def ds_pro; :ds_pro; end
      protected :ds_pro

      def ds_pri; :ds_pri; end
      private :ds_pri
    end

    def d_pub; :d_pub; end

    def d_pro; :d_pro; end
    protected :d_pro

    def d_pri; :d_pri; end
    private :d_pri

    def pub; :pub; end

    def pro; :pro; end
    protected :pro

    def pri; :pri; end
    private :pri
  end

  # A subclass of a class including a module.
  class E < D
    class << self
      def es_pub; :es_pub; end

      def es_pro; :es_pro; end
      protected :es_pro

      def es_pri; :es_pri; end
      private :es_pri
    end

    def e_pub; :e_pub; end

    def e_pro; :e_pro; end
    protected :e_pro

    def e_pri; :e_pri; end
    private :e_pri

    def pub; :pub; end

    def pro; :pro; end
    protected :pro

    def pri; :pri; end
    private :pri
  end

  # A subclass that includes a module of a class including a module.
  class F < D
    include L

    class << self
      def fs_pub; :fs_pub; end

      def fs_pro; :fs_pro; end
      protected :fs_pro

      def fs_pri; :fs_pri; end
      private :fs_pri
    end

    def f_pub; :f_pub; end

    def f_pro; :f_pro; end
    protected :f_pro

    def f_pri; :f_pri; end
    private :f_pri
  end

  # Class with no singleton methods.
  class O
  end

  # Class extended with a module.
  class P
  end
  P.extend M
end