1# class
2assert_equal 'true',    %q( class C; end
3                            Object.const_defined?(:C) )
4assert_equal 'Class',   %q( class C; end
5                            C.class )
6assert_equal 'C',       %q( class C; end
7                            C.name )
8assert_equal 'C',       %q( class C; end
9                            C.new.class )
10assert_equal 'C',       %q( class C; end
11                            C.new.class.name )
12assert_equal 'Class',   %q( class C; end
13                            C.new.class.class )
14
15# inherited class
16assert_equal 'true',    %q( class A; end
17                            class C < A; end
18                            Object.const_defined?(:C) )
19assert_equal 'Class',   %q( class A; end
20                            class C < A; end
21                            C.class )
22assert_equal 'C',       %q( class A; end
23                            class C < A; end
24                            C.name )
25assert_equal 'C',       %q( class A; end
26                            class C < A; end
27                            C.new.class )
28assert_equal 'C',       %q( class A; end
29                            class C < A; end
30                            C.new.class.name )
31assert_equal 'Class',   %q( class A; end
32                            class C < A; end
33                            C.new.class.class )
34
35# module
36assert_equal 'true',    %q( module M; end
37                            Object.const_defined?(:M) )
38assert_equal 'Module',  %q( module M; end
39                            M.class )
40assert_equal 'M',       %q( module M; end
41                            M.name )
42assert_equal 'C',       %q( module M; end
43                            class C; include M; end
44                            C.new.class )
45
46# nested class
47assert_equal 'A::B',    %q( class A; end
48                            class A::B; end
49                            A::B )
50assert_equal 'A::B',    %q( class A; end
51                            class A::B; end
52                            A::B.name )
53assert_equal 'A::B',    %q( class A; end
54                            class A::B; end
55                            A::B.new.class )
56assert_equal 'Class',   %q( class A; end
57                            class A::B; end
58                            A::B.new.class.class )
59assert_equal 'A::B::C', %q( class A; end
60                            class A::B; end
61                            class A::B::C; end
62                            A::B::C )
63assert_equal 'A::B::C', %q( class A; end
64                            class A::B; end
65                            class A::B::C; end
66                            A::B::C.name )
67assert_equal 'Class',   %q( class A; end
68                            class A::B; end
69                            class A::B::C; end
70                            A::B::C.class )
71assert_equal 'A::B::C', %q( class A; end
72                            class A::B; end
73                            class A::B::C; end
74                            A::B::C.new.class )
75assert_equal 'Class',   %q( class A; end
76                            class A::B; end
77                            class A::B::C; end
78                            A::B::C.new.class.class )
79assert_equal 'A::B2',   %q( class A; end
80                            class A::B; end
81                            class A::B2 < A::B; end
82                            A::B2 )
83assert_equal 'Class',   %q( class A; end
84                            class A::B; end
85                            class A::B2 < A::B; end
86                            A::B2.class )
87
88# reopen
89assert_equal 'true',    %q( class C; end;  c1 = ::C
90                            class C; end;  c2 = ::C
91                            c1.equal?(c2) )
92assert_equal '1',       %q( class C; end
93                            class A; end
94                            begin class C < A; end; rescue TypeError; 1 end )
95assert_equal '1',       %q( class C; end
96                            begin module C; end; rescue TypeError; 1 end )
97assert_equal '1',       %q( C = 1   # [yarv-dev:782]
98                            begin class C; end; rescue TypeError; 1 end )
99assert_equal '1',       %q( C = 1   # [yarv-dev:800]
100                            begin module C; end; rescue TypeError; 1 end )
101
102# colon2, colon3
103assert_equal '1',       %q( class A; end;  A::C = 1;  A::C )
104assert_equal '1',       %q( A = 7;  begin A::C = 7; rescue TypeError; 1 end )
105assert_equal '1',       %q( begin 7::C = 7; rescue TypeError; 1 end )
106assert_equal 'C',       %q( class A; class ::C; end end;  C )
107assert_equal 'Class',   %q( class A; class ::C; end end;  C.class )
108assert_equal 'OK',      %q( class A; ::C = "OK"; end;  C )
109assert_equal 'String',  %q( class A; ::C = "OK"; end;  C.class )
110
111# class/module dup
112assert_equal 'Class',   %q( class C; end;  C.dup.class )
113assert_equal 'Module',  %q( module M; end;  M.dup.class )
114
115
116assert_equal "ok", %q{
117  module Foo
118  end
119
120  begin
121    def foo(&b)
122      Foo.module_eval &b
123    end
124    foo{
125      def bar
126      end
127    }
128    bar()
129  rescue NameError
130    :ok
131  end
132}, '[ruby-core:14378]'
133
134assert_equal '3', %q{
135  $i = 0
136  class C
137    def self.const_missing *args
138      $i+=1
139    end
140  end
141
142  3.times{
143    C::FOO
144  }
145  $i
146}
147
148assert_match /::C\z/, %q{
149  c = nil
150  Module.new{|m| c = class m::C; name; end}
151  c
152}, '[ruby-dev:38456]'
153
154assert_normal_exit %q{
155  s = Symbol.dup
156  class << s
157  end
158  s.allocate.to_s
159}, '[ruby-core:30843]'
160