1# -*- coding: us-ascii -*-
2require 'test/unit'
3require_relative 'envutil'
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    c.const_set(:X, 1)
54    assert_output(nil, <<-WARNING) {c.const_set(:X, 2)}
55#{__FILE__}:#{__LINE__-1}: warning: already initialized constant #{c}::X
56#{__FILE__}:#{__LINE__-3}: warning: previous definition of X was here
57WARNING
58    code = <<-PRE
59olderr = $stderr.dup
60$stderr.reopen(File::NULL, "wb")
61350000.times { FOO = :BAR }
62$stderr.reopen(olderr)
63PRE
64    assert_no_memory_leak([], '', code, 'redefined constant')
65  end
66end
67