vendor/ruby-signature/Rakefile in steep-0.15.0 vs vendor/ruby-signature/Rakefile in steep-0.16.0

- old
+ new

@@ -13,11 +13,11 @@ task :validate => :parser do sh "rbs validate" end -FileList["test/stdlib/*_test.rb"].each do |test| +FileList["test/stdlib/**/*_test.rb"].each do |test| multitask test => :parser do sh "ruby bin/test_runner.rb #{test}" end multitask stdlib_test: test end @@ -42,24 +42,99 @@ end path = Pathname("test/stdlib/#{klass}_test.rb") raise "#{path} already exists!" if path.exist? - path.write <<~RUBY - require_relative "test_helper" - - class #{klass}Test < StdlibTest - target #{klass} - # library "pathname", "set", "securerandom" # Declare library signatures to load - using hook.refinement + require "erb" + require "ruby/signature" - # def test_method_name - # # Call the method - # method_name(arg) - # method_name(arg, arg2) - # end + class TestTemplateBuilder + attr_reader :klass, :env + + def initialize(klass) + @klass = klass + + @env = Ruby::Signature::Environment.new + Ruby::Signature::EnvironmentLoader.new.load(env: @env) end - RUBY + + def call + ERB.new(<<~ERB, trim_mode: "-").result(binding) + require_relative "test_helper" + + class <%= klass %>Test < StdlibTest + target <%= klass %> + # library "pathname", "set", "securerandom" # Declare library signatures to load + using hook.refinement + <%- class_methods.each do |method_name, definition| %> + def test_class_method_<%= test_name_for(method_name) %> + <%- definition.method_types.each do |method_type| -%> + # <%= method_type %> + <%= klass %>.<%= method_name %> + <%- end -%> + end + <%- end -%> + <%- instance_methods.each do |method_name, definition| %> + def test_<%= test_name_for(method_name) %> + <%- definition.method_types.each do |method_type| -%> + # <%= method_type %> + <%= klass %>.new.<%= method_name %> + <%- end -%> + end + <%- end -%> + end + ERB + end + + private + + def test_name_for(method_name) + { + :== => 'double_equal', + :!= => 'not_equal', + :=== => 'triple_equal', + :[] => 'square_bracket', + :[]= => 'square_bracket_assign', + :> => 'greater_than', + :< => 'less_than', + :>= => 'greater_than_equal_to', + :<= => 'less_than_equal_to', + :<=> => 'spaceship', + :+ => 'plus', + :- => 'minus', + :* => 'multiply', + :/ => 'divide', + :** => 'power', + :% => 'modulus', + :& => 'and', + :| => 'or', + :^ => 'xor', + :>> => 'right_shift', + :<< => 'left_shift', + :=~ => 'pattern_match', + :!~ => 'does_not_match', + :~ => 'tilde' + }.fetch(method_name, method_name) + end + + def type_name + @type_name ||= Ruby::Signature::TypeName.new(name: klass.to_sym, namespace: Ruby::Signature::Namespace.new(path: [], absolute: true)) + end + + def class_methods + @class_methods ||= Ruby::Signature::DefinitionBuilder.new(env: env).build_singleton(type_name).methods.select {|_, definition| + definition.implemented_in.name.absolute! == type_name + } + end + + def instance_methods + @instance_methods ||= Ruby::Signature::DefinitionBuilder.new(env: env).build_instance(type_name).methods.select {|_, definition| + definition.implemented_in.name.absolute! == type_name + } + end + end + + path.write TestTemplateBuilder.new(klass).call puts "Created: #{path}" end end