1require 'test/unit'
2require_relative 'envutil'
3
4class TestVariable < Test::Unit::TestCase
5  class Gods
6    @@rule = "Uranus"
7    def ruler0
8      @@rule
9    end
10
11    def self.ruler1		# <= per method definition style
12      @@rule
13    end
14    class << self			# <= multiple method definition style
15      def ruler2
16	@@rule
17      end
18    end
19  end
20
21  module Olympians
22    @@rule ="Zeus"
23    def ruler3
24      @@rule
25    end
26  end
27
28  class Titans < Gods
29    @@rule = "Cronus"			# modifies @@rule in Gods
30    include Olympians
31    def ruler4
32      @@rule
33    end
34  end
35
36  def test_variable
37    assert_instance_of(Fixnum, $$)
38
39    # read-only variable
40    assert_raise(NameError) do
41      $$ = 5
42    end
43    assert_normal_exit("$*=0; $*", "[ruby-dev:36698]")
44
45    foobar = "foobar"
46    $_ = foobar
47    assert_equal(foobar, $_)
48
49    assert_equal("Cronus", Gods.new.ruler0)
50    assert_equal("Cronus", Gods.ruler1)
51    assert_equal("Cronus", Gods.ruler2)
52    assert_equal("Cronus", Titans.ruler1)
53    assert_equal("Cronus", Titans.ruler2)
54    atlas = Titans.new
55    assert_equal("Cronus", atlas.ruler0)
56    assert_equal("Zeus", atlas.ruler3)
57    assert_equal("Cronus", atlas.ruler4)
58    assert_nothing_raised do
59      class << Gods
60        defined?(@@rule) && @@rule
61      end
62    end
63  end
64
65  def test_local_variables
66    lvar = 1
67    assert_instance_of(Symbol, local_variables[0], "[ruby-dev:34008]")
68  end
69
70  def test_local_variables2
71    x = 1
72    proc do |y|
73      assert_equal([:x, :y], local_variables.sort)
74    end.call
75  end
76
77  def test_local_variables3
78    x = 1
79    proc do |y|
80      1.times do |z|
81        assert_equal([:x, :y, :z], local_variables.sort)
82      end
83    end.call
84  end
85
86  def test_global_variable_0
87    assert_in_out_err(["-e", "$0='t'*1000;print $0"], "", /\At+\z/, [])
88  end
89
90  def test_global_variable_poped
91    assert_nothing_raised { eval("$foo; 1") }
92  end
93
94  def test_constant_poped
95    assert_nothing_raised { eval("TestVariable::Gods; 1") }
96  end
97end
98