Class: RBS::Test::Tester
- Inherits:
-
Object
- Object
- RBS::Test::Tester
- Defined in:
- lib/rbs/test/tester.rb
Defined Under Namespace
Classes: MethodCallTester, TypeError
Instance Attribute Summary collapse
-
#env ⇒ Object
readonly
Returns the value of attribute env.
-
#instance_testers ⇒ Object
readonly
Returns the value of attribute instance_testers.
-
#singleton_testers ⇒ Object
readonly
Returns the value of attribute singleton_testers.
-
#targets ⇒ Object
readonly
Returns the value of attribute targets.
Instance Method Summary collapse
- #builder ⇒ Object
- #factory ⇒ Object
-
#initialize(env:) ⇒ Tester
constructor
A new instance of Tester.
- #install!(klass, sample_size:, unchecked_classes:) ⇒ Object
- #new_key(type_name, prefix) ⇒ Object
- #skip_method?(type_name, method) ⇒ Boolean
Constructor Details
#initialize(env:) ⇒ Tester
Returns a new instance of Tester.
11 12 13 14 15 16 |
# File 'lib/rbs/test/tester.rb', line 11 def initialize(env:) @env = env @targets = [] @instance_testers = {} @singleton_testers = {} end |
Instance Attribute Details
#env ⇒ Object (readonly)
Returns the value of attribute env.
6 7 8 |
# File 'lib/rbs/test/tester.rb', line 6 def env @env end |
#instance_testers ⇒ Object (readonly)
Returns the value of attribute instance_testers.
8 9 10 |
# File 'lib/rbs/test/tester.rb', line 8 def instance_testers @instance_testers end |
#singleton_testers ⇒ Object (readonly)
Returns the value of attribute singleton_testers.
9 10 11 |
# File 'lib/rbs/test/tester.rb', line 9 def singleton_testers @singleton_testers end |
#targets ⇒ Object (readonly)
Returns the value of attribute targets.
7 8 9 |
# File 'lib/rbs/test/tester.rb', line 7 def targets @targets end |
Instance Method Details
#builder ⇒ Object
22 23 24 |
# File 'lib/rbs/test/tester.rb', line 22 def builder @builder ||= DefinitionBuilder.new(env: env) end |
#factory ⇒ Object
18 19 20 |
# File 'lib/rbs/test/tester.rb', line 18 def factory @factory ||= Factory.new end |
#install!(klass, sample_size:, unchecked_classes:) ⇒ Object
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 |
# File 'lib/rbs/test/tester.rb', line 42 def install!(klass, sample_size:, unchecked_classes:) RBS.logger.info { "Installing runtime type checker in #{klass}..." } type_name = factory.type_name(klass.name).absolute! builder.build_instance(type_name).tap do |definition| instance_key = new_key(type_name, "InstanceChecker") tester, set = instance_testers[klass] ||= [ MethodCallTester.new(klass, builder, definition, kind: :instance, sample_size: sample_size, unchecked_classes: unchecked_classes), Set[] ] Observer.register(instance_key, tester) definition.methods.each do |name, method| if reason = skip_method?(type_name, method) unless reason == :implemented_in RBS.logger.info { "Skipping ##{name} because of `#{reason}`..." } end else if !set.include?(name) && ( name == :initialize || klass.instance_methods(false).include?(name) || klass.private_instance_methods(false).include?(name)) RBS.logger.info { "Setting up method hook in ##{name}..." } Hook.hook_instance_method klass, name, key: instance_key set << name end end end end builder.build_singleton(type_name).tap do |definition| singleton_key = new_key(type_name, "SingletonChecker") tester, set = singleton_testers[klass] ||= [ MethodCallTester.new(klass.singleton_class, builder, definition, kind: :singleton, sample_size: sample_size, unchecked_classes: unchecked_classes), Set[] ] Observer.register(singleton_key, tester) definition.methods.each do |name, method| if reason = skip_method?(type_name, method) unless reason == :implemented_in RBS.logger.info { "Skipping .#{name} because of `#{reason}`..." } end else if klass.methods(false).include?(name) && !set.include?(name) RBS.logger.info { "Setting up method hook in .#{name}..." } Hook.hook_singleton_method klass, name, key: singleton_key set << name end end end end targets << klass end |
#new_key(type_name, prefix) ⇒ Object
99 100 101 |
# File 'lib/rbs/test/tester.rb', line 99 def new_key(type_name, prefix) "#{prefix}__#{type_name}__#{SecureRandom.hex(10)}" end |
#skip_method?(type_name, method) ⇒ Boolean
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/rbs/test/tester.rb', line 26 def skip_method?(type_name, method) if method.implemented_in == type_name if method.annotations.any? {|a| a.string == "rbs:test:skip" } :skip else false end else if method.annotations.any? {|a| a.string == "rbs:test:target" } false else :implemented_in end end end |