diff options
| author | Satoshi Tagomori <tagomoris@gmail.com> | 2025-04-30 13:48:02 +0900 |
|---|---|---|
| committer | Satoshi Tagomori <tagomoris@gmail.com> | 2025-05-11 23:32:50 +0900 |
| commit | 382645d440d5da66a0c04557f3ff2ca226de3a27 (patch) | |
| tree | b7453449930197237e739d0985561b664f51b0f3 /test/ruby/namespace | |
| parent | 49742414f6444960838bb968bab43db27f5872c1 (diff) | |
namespace on read
Diffstat (limited to 'test/ruby/namespace')
28 files changed, 581 insertions, 0 deletions
diff --git a/test/ruby/namespace/a.1_1_0.rb b/test/ruby/namespace/a.1_1_0.rb new file mode 100644 index 0000000000..bf64dbaa62 --- /dev/null +++ b/test/ruby/namespace/a.1_1_0.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class NS_A + VERSION = "1.1.0" + + def yay + "yay #{VERSION}" + end +end + +module NS_B + VERSION = "1.1.0" + + def self.yay + "yay_b1" + end +end diff --git a/test/ruby/namespace/a.1_2_0.rb b/test/ruby/namespace/a.1_2_0.rb new file mode 100644 index 0000000000..6d25c0885d --- /dev/null +++ b/test/ruby/namespace/a.1_2_0.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class NS_A + VERSION = "1.2.0" + + def yay + "yay #{VERSION}" + end +end + +module NS_B + VERSION = "1.2.0" + + def self.yay + "yay_b1" + end +end diff --git a/test/ruby/namespace/a.rb b/test/ruby/namespace/a.rb new file mode 100644 index 0000000000..a6dcd9cd21 --- /dev/null +++ b/test/ruby/namespace/a.rb @@ -0,0 +1,15 @@ +class NS_A + FOO = "foo_a1" + + def yay + "yay_a1" + end +end + +module NS_B + BAR = "bar_b1" + + def self.yay + "yay_b1" + end +end diff --git a/test/ruby/namespace/autoloading.rb b/test/ruby/namespace/autoloading.rb new file mode 100644 index 0000000000..19ec00bcd5 --- /dev/null +++ b/test/ruby/namespace/autoloading.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +autoload :NS_A, File.join(__dir__, 'a.1_1_0') +NS_A.new.yay + +module NS_B + autoload :BAR, File.join(__dir__, 'a') +end diff --git a/test/ruby/namespace/blank.rb b/test/ruby/namespace/blank.rb new file mode 100644 index 0000000000..6d201b0966 --- /dev/null +++ b/test/ruby/namespace/blank.rb @@ -0,0 +1,2 @@ +module Blank1 +end diff --git a/test/ruby/namespace/blank1.rb b/test/ruby/namespace/blank1.rb new file mode 100644 index 0000000000..6d201b0966 --- /dev/null +++ b/test/ruby/namespace/blank1.rb @@ -0,0 +1,2 @@ +module Blank1 +end diff --git a/test/ruby/namespace/blank2.rb b/test/ruby/namespace/blank2.rb new file mode 100644 index 0000000000..ba38c1d6db --- /dev/null +++ b/test/ruby/namespace/blank2.rb @@ -0,0 +1,2 @@ +module Blank2 +end diff --git a/test/ruby/namespace/call_proc.rb b/test/ruby/namespace/call_proc.rb new file mode 100644 index 0000000000..8acf538fc1 --- /dev/null +++ b/test/ruby/namespace/call_proc.rb @@ -0,0 +1,5 @@ +module Bar + def self.caller(proc_value) + proc_value.call + end +end diff --git a/test/ruby/namespace/call_toplevel.rb b/test/ruby/namespace/call_toplevel.rb new file mode 100644 index 0000000000..c311a37028 --- /dev/null +++ b/test/ruby/namespace/call_toplevel.rb @@ -0,0 +1,8 @@ +foo + +#### TODO: this code should be valid, but can't be for now +# module Foo +# def self.wow +# foo +# end +# end diff --git a/test/ruby/namespace/consts.rb b/test/ruby/namespace/consts.rb new file mode 100644 index 0000000000..44a383111b --- /dev/null +++ b/test/ruby/namespace/consts.rb @@ -0,0 +1,147 @@ +class String + STR_CONST1 = 111 + STR_CONST2 = 222 + STR_CONST3 = 333 +end + +class String + STR_CONST1 = 112 + + def self.set0(val) + const_set(:STR_CONST0, val) + end + + def self.remove0 + remove_const(:STR_CONST0) + end + + def refer0 + STR_CONST0 + end + + def refer1 + STR_CONST1 + end + + def refer2 + STR_CONST2 + end + + def refer3 + STR_CONST3 + end +end + +module ForConsts + CONST1 = 111 +end + +TOP_CONST = 10 + +module ForConsts + CONST1 = 112 + CONST2 = 222 + CONST3 = 333 + + def self.refer_all + ForConsts::CONST1 + ForConsts::CONST2 + ForConsts::CONST3 + String::STR_CONST1 + String::STR_CONST2 + String::STR_CONST3 + end + + def self.refer1 + CONST1 + end + + def self.get1 + const_get(:CONST1) + end + + def self.refer2 + CONST2 + end + + def self.get2 + const_get(:CONST2) + end + + def self.refer3 + CONST3 + end + + def self.get3 + const_get(:CONST3) + end + + def self.refer_top_const + TOP_CONST + end + + # for String + class Proxy + def call_str_refer0 + String.new.refer0 + end + + def call_str_get0 + String.const_get(:STR_CONST0) + end + + def call_str_set0(val) + String.set0(val) + end + + def call_str_remove0 + String.remove0 + end + + def call_str_refer1 + String.new.refer1 + end + + def call_str_get1 + String.const_get(:STR_CONST1) + end + + String::STR_CONST2 = 223 + + def call_str_refer2 + String.new.refer2 + end + + def call_str_get2 + String.const_get(:STR_CONST2) + end + + def call_str_set3 + String.const_set(:STR_CONST3, 334) + end + + def call_str_refer3 + String.new.refer3 + end + + def call_str_get3 + String.const_get(:STR_CONST3) + end + + # for Integer + Integer::INT_CONST1 = 1 + + def refer_int_const1 + Integer::INT_CONST1 + end + end +end + +# should not raise errors +ForConsts.refer_all +String::STR_CONST1 +Integer::INT_CONST1 + +# If we execute this sentence once, the constant value will be cached on ISeq inline constant cache. +# And it changes the behavior of ForConsts.refer_consts_directly called from global. +# ForConsts.refer_consts_directly # should not raise errors too diff --git a/test/ruby/namespace/current.rb b/test/ruby/namespace/current.rb new file mode 100644 index 0000000000..4af9a92ddc --- /dev/null +++ b/test/ruby/namespace/current.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +$ns_in_ns = ::Namespace.current + +module CurrentNamespace + def self.in_require + $ns_in_ns + end + + def self.in_method_call + ::Namespace.current + end +end diff --git a/test/ruby/namespace/define_toplevel.rb b/test/ruby/namespace/define_toplevel.rb new file mode 100644 index 0000000000..aa77db3a13 --- /dev/null +++ b/test/ruby/namespace/define_toplevel.rb @@ -0,0 +1,5 @@ +def foo + "foooooooooo" +end + +foo # should not raise errors diff --git a/test/ruby/namespace/global_vars.rb b/test/ruby/namespace/global_vars.rb new file mode 100644 index 0000000000..3764eb0d19 --- /dev/null +++ b/test/ruby/namespace/global_vars.rb @@ -0,0 +1,37 @@ +module LineSplitter + def self.read + $-0 + end + + def self.write(char) + $-0 = char + end +end + +module FieldSplitter + def self.read + $, + end + + def self.write(char) + $, = char + end +end + +module UniqueGvar + def self.read + $used_only_in_ns + end + + def self.write(val) + $used_only_in_ns = val + end + + def self.write_only(val) + $write_only_var_in_ns = val + end + + def self.gvars_in_ns + global_variables + end +end diff --git a/test/ruby/namespace/line_splitter.rb b/test/ruby/namespace/line_splitter.rb new file mode 100644 index 0000000000..2596975ad7 --- /dev/null +++ b/test/ruby/namespace/line_splitter.rb @@ -0,0 +1,9 @@ +module LineSplitter + def self.read + $-0 + end + + def self.write(char) + $-0 = char + end +end diff --git a/test/ruby/namespace/load_path.rb b/test/ruby/namespace/load_path.rb new file mode 100644 index 0000000000..7e5a83ef96 --- /dev/null +++ b/test/ruby/namespace/load_path.rb @@ -0,0 +1,26 @@ +module LoadPathCheck + FIRST_LOAD_PATH = $LOAD_PATH.dup + FIRST_LOAD_PATH_RESPOND_TO_RESOLVE = $LOAD_PATH.respond_to?(:resolve_feature_path) + FIRST_LOADED_FEATURES = $LOADED_FEATURES.dup + + HERE = File.dirname(__FILE__) + + def self.current_load_path + $LOAD_PATH + end + + def self.current_loaded_features + $LOADED_FEATURES + end + + def self.require_blank1 + $LOAD_PATH << HERE + require 'blank1' + end + + def self.require_blank2 + require 'blank2' + end +end + +LoadPathCheck.require_blank1 diff --git a/test/ruby/namespace/ns.rb b/test/ruby/namespace/ns.rb new file mode 100644 index 0000000000..e947e3cdc8 --- /dev/null +++ b/test/ruby/namespace/ns.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +NS1 = Namespace.new +NS1.require_relative('a.1_1_0') + +def yay + NS1::NS_B::yay +end + +yay diff --git a/test/ruby/namespace/open_class_with_include.rb b/test/ruby/namespace/open_class_with_include.rb new file mode 100644 index 0000000000..ad8fd58ea0 --- /dev/null +++ b/test/ruby/namespace/open_class_with_include.rb @@ -0,0 +1,31 @@ +module StringExt + FOO = "foo 1" + def say_foo + "I'm saying " + FOO + end +end + +class String + include StringExt + def say + say_foo + end +end + +module OpenClassWithInclude + def self.say + String.new.say + end + + def self.say_foo + String.new.say_foo + end + + def self.say_with_obj(str) + str.say + end + + def self.refer_foo + String::FOO + end +end diff --git a/test/ruby/namespace/proc_callee.rb b/test/ruby/namespace/proc_callee.rb new file mode 100644 index 0000000000..d30ab5d9f3 --- /dev/null +++ b/test/ruby/namespace/proc_callee.rb @@ -0,0 +1,14 @@ +module Target + def self.foo + "fooooo" + end +end + +module Foo + def self.callee + lambda do + Target.foo + end + end +end + diff --git a/test/ruby/namespace/proc_caller.rb b/test/ruby/namespace/proc_caller.rb new file mode 100644 index 0000000000..8acf538fc1 --- /dev/null +++ b/test/ruby/namespace/proc_caller.rb @@ -0,0 +1,5 @@ +module Bar + def self.caller(proc_value) + proc_value.call + end +end diff --git a/test/ruby/namespace/procs.rb b/test/ruby/namespace/procs.rb new file mode 100644 index 0000000000..a7fe58ceb6 --- /dev/null +++ b/test/ruby/namespace/procs.rb @@ -0,0 +1,64 @@ +class String + FOO = "foo" + def yay + "yay" + end +end + +module ProcLookupTestA + module B + VALUE = 222 + end +end + +module ProcInNS + def self.make_proc_from_block(&b) + b + end + + def self.call_proc(proc_arg) + proc_arg.call + end + + def self.make_str_proc(type) + case type + when :proc_new then Proc.new { String.new.yay } + when :proc_f then proc { String.new.yay } + when :lambda_f then lambda { String.new.yay } + when :lambda_l then ->(){ String.new.yay } + when :block then make_proc_from_block { String.new.yay } + else + raise "invalid type :#{type}" + end + end + + def self.make_const_proc(type) + case type + when :proc_new then Proc.new { ProcLookupTestA::B::VALUE } + when :proc_f then proc { ProcLookupTestA::B::VALUE } + when :lambda_f then lambda { ProcLookupTestA::B::VALUE } + when :lambda_l then ->(){ ProcLookupTestA::B::VALUE } + when :block then make_proc_from_block { ProcLookupTestA::B::VALUE } + else + raise "invalid type :#{type}" + end + end + + def self.make_str_const_proc(type) + case type + when :proc_new then Proc.new { String::FOO } + when :proc_f then proc { String::FOO } + when :lambda_f then lambda { String::FOO } + when :lambda_l then ->(){ String::FOO } + when :block then make_proc_from_block { String::FOO } + else + raise "invalid type :#{type}" + end + end + + CONST_PROC_NEW = Proc.new { [String.new.yay, String::FOO, ProcLookupTestA::B::VALUE.to_s].join(',') } + CONST_PROC_F = proc { [String.new.yay, String::FOO, ProcLookupTestA::B::VALUE.to_s].join(',') } + CONST_LAMBDA_F = lambda { [String.new.yay, String::FOO, ProcLookupTestA::B::VALUE.to_s].join(',') } + CONST_LAMBDA_L = ->() { [String.new.yay, String::FOO, ProcLookupTestA::B::VALUE.to_s].join(',') } + CONST_BLOCK = make_proc_from_block { [String.new.yay, String::FOO, ProcLookupTestA::B::VALUE.to_s].join(',') } +end diff --git a/test/ruby/namespace/raise.rb b/test/ruby/namespace/raise.rb new file mode 100644 index 0000000000..efb67f85c5 --- /dev/null +++ b/test/ruby/namespace/raise.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true + +raise "Yay!" diff --git a/test/ruby/namespace/returns_proc.rb b/test/ruby/namespace/returns_proc.rb new file mode 100644 index 0000000000..bb816e5024 --- /dev/null +++ b/test/ruby/namespace/returns_proc.rb @@ -0,0 +1,12 @@ +module Foo + def self.foo + "fooooo" + end + + def self.callee + lambda do + Foo.foo + end + end +end + diff --git a/test/ruby/namespace/singleton_methods.rb b/test/ruby/namespace/singleton_methods.rb new file mode 100644 index 0000000000..05470932d2 --- /dev/null +++ b/test/ruby/namespace/singleton_methods.rb @@ -0,0 +1,65 @@ +class String + def self.greeting + "Good evening!" + end +end + +class Integer + class << self + def answer + 42 + end + end +end + +class Array + def a + size + end + def self.blank + [] + end + def b + size + end +end + +class Hash + def a + size + end + class << self + def http_200 + {status: 200, body: 'OK'} + end + end + def b + size + end +end + +module SingletonMethods + def self.string_greeing + String.greeting + end + + def self.integer_answer + Integer.answer + end + + def self.array_blank + Array.blank + end + + def self.hash_http_200 + Hash.http_200 + end + + def self.array_instance_methods_return_size(ary) + [ary.a, ary.b] + end + + def self.hash_instance_methods_return_size(hash) + [hash.a, hash.b] + end +end diff --git a/test/ruby/namespace/string_ext.rb b/test/ruby/namespace/string_ext.rb new file mode 100644 index 0000000000..d8c5a3d661 --- /dev/null +++ b/test/ruby/namespace/string_ext.rb @@ -0,0 +1,13 @@ +class String + def yay + "yay" + end +end + +String.new.yay # check this doesn't raise NoMethodError + +module Bar + def self.yay + String.new.yay + end +end diff --git a/test/ruby/namespace/string_ext_caller.rb b/test/ruby/namespace/string_ext_caller.rb new file mode 100644 index 0000000000..b8345d98ed --- /dev/null +++ b/test/ruby/namespace/string_ext_caller.rb @@ -0,0 +1,5 @@ +module Foo + def self.yay + String.new.yay + end +end diff --git a/test/ruby/namespace/string_ext_calling.rb b/test/ruby/namespace/string_ext_calling.rb new file mode 100644 index 0000000000..6467b728dd --- /dev/null +++ b/test/ruby/namespace/string_ext_calling.rb @@ -0,0 +1 @@ +Foo.yay diff --git a/test/ruby/namespace/string_ext_eval_caller.rb b/test/ruby/namespace/string_ext_eval_caller.rb new file mode 100644 index 0000000000..0e6b20c19f --- /dev/null +++ b/test/ruby/namespace/string_ext_eval_caller.rb @@ -0,0 +1,12 @@ +module Baz + def self.yay + eval 'String.new.yay' + end + + def self.yay_with_binding + suffix = ", yay!" + eval 'String.new.yay + suffix', binding + end +end + +Baz.yay # should not raise NeMethodError diff --git a/test/ruby/namespace/top_level.rb b/test/ruby/namespace/top_level.rb new file mode 100644 index 0000000000..90df145578 --- /dev/null +++ b/test/ruby/namespace/top_level.rb @@ -0,0 +1,33 @@ +def yaaay + "yay!" +end + +module Foo + def self.foo + yaaay + end +end + +eval 'def foo; "foo"; end' + +Foo.foo # Should not raise NameError + +foo + +module Bar + def self.bar + foo + end +end + +Bar.bar + +$def_retval_in_namespace = def boooo + "boo" +end + +module Baz + def self.baz + raise "#{$def_retval_in_namespace}" + end +end |
