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