Include the first constant name into `Ractor::IsolationError` message
[ruby.git] / test / ruby / test_const.rb
blobf6b9ea83d3c02dbfb583ce6961e3c2f22c349812
1 # -*- coding: us-ascii -*-
2 # frozen_string_literal: false
3 require 'test/unit'
5 class TestConst < Test::Unit::TestCase
7   Constants_Setup = -> do
8     remove_const :TEST1  if defined? ::TestConst::TEST1
9     remove_const :TEST2  if defined? ::TestConst::TEST2
10     remove_const :Const  if defined? ::TestConst::Const
11     remove_const :Const2 if defined? ::TestConst::Const2
13     TEST1 = 1
14     TEST2 = 2
16     module Const
17       TEST3 = 3
18       TEST4 = 4
19     end
21     module Const2
22       TEST3 = 6
23       TEST4 = 8
24     end
25   end
27   def test_const
28     Constants_Setup.call
30     assert defined?(TEST1)
31     assert_equal 1, TEST1
32     assert defined?(TEST2)
33     assert_equal 2, TEST2
35     self.class.class_eval {
36       include Const
37     }
38     assert defined?(TEST1)
39     assert_equal 1, TEST1
40     assert defined?(TEST2)
41     assert_equal 2, TEST2
42     assert defined?(TEST3)
43     assert_equal 3, TEST3
44     assert defined?(TEST4)
45     assert_equal 4, TEST4
47     self.class.class_eval {
48       include Const2
49     }
50     # STDERR.print "intentionally redefines TEST3, TEST4\n" if $VERBOSE
51     assert defined?(TEST1)
52     assert_equal 1, TEST1
53     assert defined?(TEST2)
54     assert_equal 2, TEST2
55     assert defined?(TEST3)
56     assert_equal 6, TEST3
57     assert defined?(TEST4)
58     assert_equal 8, TEST4
59   end
61   def test_const_access_from_nil
62     assert_raise(TypeError) { eval("nil::Object") }
63     assert_nil eval("defined?(nil::Object)")
65     assert_raise(TypeError) { eval("c = nil; c::Object") }
66     assert_nil eval("c = nil; defined?(c::Object)")
68     assert_raise(TypeError) { eval("sc = Class.new; sc::C = nil; sc::C::Object") }
69     assert_nil eval("sc = Class.new; sc::C = nil; defined?(sc::C::Object)")
70   end
72   def test_redefinition
73     c = Class.new
74     name = "X\u{5b9a 6570}"
75     c.const_set(name, 1)
76     prev_line = __LINE__ - 1
77     assert_warning(<<-WARNING) {c.const_set(name, 2)}
78 #{__FILE__}:#{__LINE__-1}: warning: already initialized constant #{c}::#{name}
79 #{__FILE__}:#{prev_line}: warning: previous definition of #{name} was here
80 WARNING
81   end
83   def test_redefinition_memory_leak
84     code = <<-PRE
85 350000.times { FOO = :BAR }
86 PRE
87     assert_no_memory_leak(%w[-W0 -], '', code, 'redefined constant', timeout: 30)
88   end
90   def test_toplevel_lookup
91     assert_raise(NameError, '[Feature #11547]') {TestConst::Object}
92   end
93 end