1# -*- coding: us-ascii -*- 2# frozen_string_literal: false 3require 'test/unit' 4 5class TestConst < Test::Unit::TestCase 6 TEST1 = 1 7 TEST2 = 2 8 9 module Const 10 TEST3 = 3 11 TEST4 = 4 12 end 13 14 module Const2 15 TEST3 = 6 16 TEST4 = 8 17 end 18 19 def test_const 20 assert defined?(TEST1) 21 assert_equal 1, TEST1 22 assert defined?(TEST2) 23 assert_equal 2, TEST2 24 25 self.class.class_eval { 26 include Const 27 } 28 assert defined?(TEST1) 29 assert_equal 1, TEST1 30 assert defined?(TEST2) 31 assert_equal 2, TEST2 32 assert defined?(TEST3) 33 assert_equal 3, TEST3 34 assert defined?(TEST4) 35 assert_equal 4, TEST4 36 37 self.class.class_eval { 38 include Const2 39 } 40 # STDERR.print "intentionally redefines TEST3, TEST4\n" if $VERBOSE 41 assert defined?(TEST1) 42 assert_equal 1, TEST1 43 assert defined?(TEST2) 44 assert_equal 2, TEST2 45 assert defined?(TEST3) 46 assert_equal 6, TEST3 47 assert defined?(TEST4) 48 assert_equal 8, TEST4 49 end 50 51 def test_redefinition 52 c = Class.new 53 name = "X\u{5b9a 6570}" 54 c.const_set(name, 1) 55 prev_line = __LINE__ - 1 56 assert_warning(<<-WARNING) {c.const_set(name, 2)} 57#{__FILE__}:#{__LINE__-1}: warning: already initialized constant #{c}::#{name} 58#{__FILE__}:#{prev_line}: warning: previous definition of #{name} was here 59WARNING 60 end 61 62 def test_redefinition_memory_leak 63 code = <<-PRE 64350000.times { FOO = :BAR } 65PRE 66 assert_no_memory_leak(%w[-W0 -], '', code, 'redefined constant', timeout: 30) 67 end 68 69 def test_toplevel_lookup 70 assert_raise(NameError, '[Feature #11547]') {TestConst::Object} 71 end 72end 73