1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/ruby/core/module/fixtures/classes.rb
2019-11-30 21:26:52 +01:00

614 lines
10 KiB
Ruby

module ModuleSpecs
def self.without_test_modules(modules)
ignore = %w[MSpecRSpecAdapter PP::ObjectMixin ModuleSpecs::IncludedInObject MainSpecs::Module ConstantSpecs::ModuleA]
modules.reject { |k| ignore.include?(k.name) }
end
CONST = :plain_constant
class NamedClass
end
module PrivConstModule
PRIVATE_CONSTANT = 1
private_constant :PRIVATE_CONSTANT
PUBLIC_CONSTANT = 2
end
class Subclass < Module
end
class SubclassSpec
end
class RemoveClassVariable
end
module LookupModInMod
INCS = :ethereal
end
module LookupMod
include LookupModInMod
MODS = :rockers
end
class Lookup
include LookupMod
LOOKIE = :lookie
end
class LookupChild < Lookup
end
class Parent
# For private_class_method spec
def self.private_method; end
private_class_method :private_method
def undefed_method() end
undef_method :undefed_method
def parent_method; end
def another_parent_method; end
# For public_class_method spec
private
def self.public_method; end
public_class_method :public_method
public
def public_parent() end
protected
def protected_parent() end
private
def private_parent() end
end
module Basic
def public_module() end
protected
def protected_module() end
private
def private_module() end
end
module Super
include Basic
def public_super_module() end
protected
def protected_super_module() end
private
def private_super_module() end
def super_included_method; end
class SuperChild
end
end
module Internal
end
class Child < Parent
include Super
class << self
include Internal
end
attr_accessor :accessor_method
def public_child() end
undef_method :parent_method
undef_method :another_parent_method
protected
def protected_child() end
private
def private_child() end
end
class Grandchild < Child
undef_method :super_included_method
end
class Child2 < Parent
attr_reader :foo
end
# Be careful touching the Counts* classes as there used for testing
# private_instance_methods, public_instance_methods, etc. So adding, removing
# a method will break those tests.
module CountsMixin
def public_3; end
public :public_3
def private_3; end
private :private_3
def protected_3; end
protected :protected_3
end
class CountsParent
include CountsMixin
def public_2; end
private
def private_2; end
protected
def protected_2; end
end
class CountsChild < CountsParent
def public_1; end
private
def private_1; end
protected
def protected_1; end
end
module AddConstant
end
module A
CONSTANT_A = :a
OVERRIDE = :a
def ma(); :a; end
def self.cma(); :a; end
end
module B
CONSTANT_B = :b
OVERRIDE = :b
include A
def mb(); :b; end
def self.cmb(); :b; end
end
class C
OVERRIDE = :c
include B
end
module Z
MODULE_SPEC_TOPLEVEL_CONSTANT = 1
end
module Alias
def report() :report end
alias publish report
end
class Allonym
include ModuleSpecs::Alias
end
class Aliasing
def self.make_alias(*a)
alias_method(*a)
end
def public_one; 1; end
def public_two(n); n * 2; end
private
def private_one; 1; end
protected
def protected_one; 1; end
end
class AliasingSubclass < Aliasing
end
module AliasingSuper
module Parent
def super_call(arg)
arg
end
end
module Child
include Parent
def super_call(arg)
super(arg)
end
end
class Target
include Child
alias_method :alias_super_call, :super_call
alias_method :super_call, :alias_super_call
end
class RedefineAfterAlias
include Parent
def super_call(arg)
super(arg)
end
alias_method :alias_super_call, :super_call
def super_call(arg)
:wrong
end
end
end
module ReopeningModule
def foo; true; end
module_function :foo
private :foo
end
# Yes, we want to re-open the module
module ReopeningModule
alias :foo2 :foo
module_function :foo2
end
module Nesting
@tests = {}
def self.[](name); @tests[name]; end
def self.[]=(name, val); @tests[name] = val; end
def self.meta; class << self; self; end; end
Nesting[:basic] = Module.nesting
module ::ModuleSpecs
Nesting[:open_first_level] = Module.nesting
end
class << self
Nesting[:open_meta] = Module.nesting
end
def self.called_from_module_method
Module.nesting
end
class NestedClass
Nesting[:nest_class] = Module.nesting
def self.called_from_class_method
Module.nesting
end
def called_from_inst_method
Module.nesting
end
end
end
Nesting[:first_level] = Module.nesting
module InstanceMethMod
def bar(); :bar; end
end
class InstanceMeth
include InstanceMethMod
def foo(); :foo; end
end
class InstanceMethChild < InstanceMeth
end
module ClassVars
class A
@@a_cvar = :a_cvar
end
module M
@@m_cvar = :m_cvar
end
class B < A
include M
@@b_cvar = :b_cvar
end
end
class CVars
@@cls = :class
# Singleton class lexical scopes are ignored for class variables
class << self
def cls
# This looks in the parent lexical scope, class CVars
@@cls
end
# This actually adds it to the parent lexical scope, class CVars
@@meta = :metainfo
end
def self.meta
@@meta
end
def meta
@@meta
end
end
module MVars
@@mvar = :mvar
end
class SubModule < Module
attr_reader :special
def initialize
@special = 10
end
end
module MA; end
module MB
include MA
end
module MC; end
class MultipleIncludes
include MB
end
# empty modules
module M1; end
module M2; end
module Autoload
def self.use_ex1
begin
begin
raise "test exception"
rescue ModuleSpecs::Autoload::EX1
end
rescue RuntimeError
return :good
end
end
class Parent
end
class Child < Parent
end
module FromThread
module A
autoload :B, fixture(__FILE__, "autoload_empty.rb")
class B
autoload :C, fixture(__FILE__, "autoload_abc.rb")
def self.foo
C.foo
end
end
end
class D < A::B; end
end
end
# This class isn't inherited from or included in anywhere.
# It exists to test the constant scoping rules.
class Detached
DETACHED_CONSTANT = :d
end
class ParentPrivateMethodRedef
private
def private_method_redefined
:before_redefinition
end
end
class ChildPrivateMethodMadePublic < ParentPrivateMethodRedef
public :private_method_redefined
end
class ParentPrivateMethodRedef
def private_method_redefined
:after_redefinition
end
end
module CyclicAppendA
end
module CyclicAppendB
include CyclicAppendA
end
module CyclicPrepend
end
module ExtendObject
C = :test
def test_method
"hello test"
end
end
module ExtendObjectPrivate
class << self
def extend_object(obj)
ScratchPad.record :extended
end
private :extend_object
end
end
class CyclicBarrier
def initialize(count = 1)
@count = count
@state = 0
@mutex = Mutex.new
@cond = ConditionVariable.new
end
def await
@mutex.synchronize do
@state += 1
if @state >= @count
@state = 0
@cond.broadcast
true
else
@cond.wait @mutex
false
end
end
end
def enabled?
@mutex.synchronize { @count != -1 }
end
def disable!
@mutex.synchronize do
@count = -1
@cond.broadcast
end
end
end
class ThreadSafeCounter
def initialize(value = 0)
@value = 0
@mutex = Mutex.new
end
def get
@mutex.synchronize { @value }
end
def increment_and_get
@mutex.synchronize do
prev_value = @value
@value += 1
prev_value
end
end
end
module ShadowingOuter
module M
SHADOW = 123
end
module N
SHADOW = 456
end
end
module UnboundMethodTest
def foo
'bar'
end
end
module ClassEvalTest
def self.get_constant_from_scope
module_eval("Lookup")
end
def self.get_constant_from_scope_with_send(method)
send(method, "Lookup")
end
end
class RecordIncludedModules
def self.inherited(base)
ScratchPad.record base
end
end
module SingletonOnModuleCase
module Foo
class << Foo
def included(base)
base.included_called
super
end
end
end
class Bar
@included_called = false
class << self
def included_called
@included_called = true
end
def included_called?
@included_called
end
end
end
end
module CaseCompareOnSingleton
def self.===(*)
raise 'method contents are irrelevant to test'
end
end
m = Module.new do
def foo
end
private :foo
end
EmptyFooMethod = m.instance_method(:foo)
end
class Object
def module_specs_public_method_on_object; end
def module_specs_private_method_on_object; end
private :module_specs_private_method_on_object
def module_specs_protected_method_on_object; end
protected :module_specs_private_method_on_object
def module_specs_private_method_on_object_for_kernel_public; end
private :module_specs_private_method_on_object_for_kernel_public
def module_specs_public_method_on_object_for_kernel_protected; end
def module_specs_public_method_on_object_for_kernel_private; end
end
module Kernel
def module_specs_public_method_on_kernel; end
alias_method :module_specs_alias_on_kernel, :module_specs_public_method_on_object
public :module_specs_private_method_on_object_for_kernel_public
protected :module_specs_public_method_on_object_for_kernel_protected
private :module_specs_public_method_on_object_for_kernel_private
end
ModuleSpecs::Nesting[:root_level] = Module.nesting