@@ -11,49 +11,197 @@ public class KotlinMetadataTests : ClassFileFixture
1111 [ Test ]
1212 public void PublicKotlinClassFile ( )
1313 {
14- var meta = GetMetadataForClassFile ( "PublicClass.class" ) ;
14+ var klass_meta = GetClassMetadata ( "PublicClass.class" ) ;
1515
16- Assert . AreEqual ( KotlinMetadataKind . Class , meta . Kind ) ;
16+ Assert . AreEqual ( KotlinClassVisibility . Public , klass_meta . Visibility ) ;
17+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
18+ }
1719
18- var klass_meta = meta . AsClassMetadata ( ) ;
20+ [ Test ]
21+ public void PrivateKotlinClassFile ( )
22+ {
23+ var klass_meta = GetClassMetadata ( "PrivateClass.class" ) ;
1924
20- Assert . True ( klass_meta . Flags . HasFlag ( KotlinClassFlags . Public ) ) ;
25+ Assert . AreEqual ( KotlinClassVisibility . Private , klass_meta . Visibility ) ;
26+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
2127 }
2228
2329 [ Test ]
24- public void PrivateKotlinClassFile ( )
30+ public void InternalKotlinClassFile ( )
2531 {
26- var meta = GetMetadataForClassFile ( "PrivateClass .class" ) ;
32+ var klass_meta = GetClassMetadata ( "InternalClass .class" ) ;
2733
28- Assert . AreEqual ( KotlinMetadataKind . Class , meta . Kind ) ;
34+ Assert . AreEqual ( KotlinClassVisibility . Internal , klass_meta . Visibility ) ;
35+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
36+ }
2937
30- var klass_meta = meta . AsClassMetadata ( ) ;
38+ [ Test ]
39+ public void ProtectedKotlinClassFile ( )
40+ {
41+ var klass_meta = GetClassMetadata ( "PublicClass$ProtectedClass.class" ) ;
3142
32- Assert . True ( klass_meta . Flags . HasFlag ( KotlinClassFlags . Private ) ) ;
43+ Assert . AreEqual ( KotlinClassVisibility . Protected , klass_meta . Visibility ) ;
44+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
3345 }
3446
3547 [ Test ]
36- public void InternalKotlinClassFile ( )
48+ public void SealedClassFile ( )
3749 {
38- var meta = GetMetadataForClassFile ( "InternalClass .class" ) ;
50+ var klass_meta = GetClassMetadata ( "SealedClass .class" ) ;
3951
40- Assert . AreEqual ( KotlinMetadataKind . Class , meta . Kind ) ;
52+ Assert . AreEqual ( KotlinClassInheritability . Sealed , klass_meta . Inheritability ) ;
53+ }
4154
42- var klass_meta = meta . AsClassMetadata ( ) ;
55+ [ Test ]
56+ public void Interface ( )
57+ {
58+ var klass_meta = GetClassMetadata ( "MyInterface.class" ) ;
4359
44- Assert . True ( klass_meta . Flags . HasFlag ( KotlinClassFlags . Internal ) ) ;
60+ Assert . AreEqual ( KotlinClassVisibility . Public , klass_meta . Visibility ) ;
61+ Assert . AreEqual ( KotlinClassInheritability . Abstract , klass_meta . Inheritability ) ;
62+ Assert . AreEqual ( KotlinClassType . Interface , klass_meta . ObjectType ) ;
63+
64+ Assert . AreEqual ( 2 , klass_meta . Functions . Count ) ;
65+ Assert . AreEqual ( 2 , klass_meta . Properties . Count ) ;
4566 }
4667
4768 [ Test ]
48- public void ProtectedKotlinClassFile ( )
69+ public void InterfaceDefaultImpls ( )
4970 {
50- var meta = GetMetadataForClassFile ( "PublicClass$ProtectedClass .class" ) ;
71+ var meta = GetMetadataForClassFile ( "MyInterface$DefaultImpls .class" ) ;
5172
52- Assert . AreEqual ( KotlinMetadataKind . Class , meta . Kind ) ;
73+ Assert . AreEqual ( KotlinMetadataKind . SyntheticClass , meta . Kind ) ;
74+
75+ // TODO: We don't support SyntheticClass yet
76+ }
5377
54- var klass_meta = meta . AsClassMetadata ( ) ;
78+ [ Test ]
79+ public void InterfaceInheritingInterface ( )
80+ {
81+ var klass_meta = GetClassMetadata ( "MyInterface2.class" ) ;
82+
83+ Assert . AreEqual ( KotlinClassVisibility . Public , klass_meta . Visibility ) ;
84+ Assert . AreEqual ( KotlinClassInheritability . Abstract , klass_meta . Inheritability ) ;
85+ Assert . AreEqual ( KotlinClassType . Interface , klass_meta . ObjectType ) ;
86+
87+ Assert . AreEqual ( 0 , klass_meta . Functions . Count ) ;
88+ Assert . AreEqual ( 2 , klass_meta . Properties . Count ) ;
89+ Assert . AreEqual ( "MyInterface;" , klass_meta . SuperTypes [ 0 ] . ClassName ) ;
90+ }
91+
92+ [ Test ]
93+ public void ClassInheritingInterface ( )
94+ {
95+ var klass_meta = GetClassMetadata ( "MyInterfaceChild.class" ) ;
96+
97+ Assert . AreEqual ( KotlinClassVisibility . Public , klass_meta . Visibility ) ;
98+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
99+
100+ Assert . AreEqual ( 1 , klass_meta . Functions . Count ) ;
101+ Assert . AreEqual ( 1 , klass_meta . Properties . Count ) ;
102+ Assert . AreEqual ( "MyInterface;" , klass_meta . SuperTypes [ 0 ] . ClassName ) ;
103+ }
55104
56- Assert . True ( klass_meta . Flags . HasFlag ( KotlinClassFlags . Protected ) ) ;
105+ [ Test ]
106+ public void DataClass ( )
107+ {
108+ var klass_meta = GetClassMetadata ( "DataClass.class" ) ;
109+
110+ Assert . AreEqual ( KotlinClassVisibility . Public , klass_meta . Visibility ) ;
111+ Assert . True ( klass_meta . Flags . HasFlag ( KotlinClassFlags . IsData ) ) ;
112+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
113+
114+ Assert . AreEqual ( 1 , klass_meta . Constructors . Count ) ;
115+ Assert . AreEqual ( 6 , klass_meta . Functions . Count ) ;
116+ Assert . AreEqual ( 3 , klass_meta . Properties . Count ) ;
117+ }
118+
119+ [ Test ]
120+ public void EnumClassFile ( )
121+ {
122+ var klass_meta = GetClassMetadata ( "EnumClass.class" ) ;
123+
124+ Assert . AreEqual ( KotlinClassVisibility . Public , klass_meta . Visibility ) ;
125+ Assert . AreEqual ( KotlinClassType . EnumClass , klass_meta . ObjectType ) ;
126+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
127+
128+ Assert . AreEqual ( 1 , klass_meta . Constructors . Count ) ;
129+ Assert . AreEqual ( 4 , klass_meta . EnumEntries . Count ) ;
130+ }
131+
132+ [ Test ]
133+ public void EnumClassWithInterfaces ( )
134+ {
135+ var klass_meta = GetClassMetadata ( "EnumClassWithInterfaces.class" ) ;
136+
137+ Assert . AreEqual ( KotlinClassVisibility . Public , klass_meta . Visibility ) ;
138+ Assert . AreEqual ( KotlinClassType . EnumClass , klass_meta . ObjectType ) ;
139+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
140+
141+ Assert . AreEqual ( 1 , klass_meta . Constructors . Count ) ;
142+ Assert . AreEqual ( 1 , klass_meta . Functions . Count ) ;
143+ Assert . AreEqual ( 2 , klass_meta . EnumEntries . Count ) ;
144+
145+ Assert . AreEqual ( "PLUS" , klass_meta . EnumEntries [ 0 ] ) ;
146+ Assert . AreEqual ( "TIMES" , klass_meta . EnumEntries [ 1 ] ) ;
147+
148+ Assert . AreEqual ( 2 , klass_meta . SuperTypes . Count ) ;
149+
150+ Assert . AreEqual ( "kotlin/Enum" , klass_meta . SuperTypes [ 0 ] . ClassName ) ;
151+ Assert . AreEqual ( "EnumClassWithInterfacesInterface;" , klass_meta . SuperTypes [ 1 ] . ClassName ) ;
152+ }
153+
154+ [ Test ]
155+ public void EnumClassWithFunction ( )
156+ {
157+ var klass_meta = GetClassMetadata ( "EnumClassWithInterfaces$PLUS.class" ) ;
158+
159+ Assert . AreEqual ( KotlinClassVisibility . Public , klass_meta . Visibility ) ;
160+ Assert . AreEqual ( KotlinClassType . EnumEntry , klass_meta . ObjectType ) ;
161+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
162+
163+ Assert . AreEqual ( 1 , klass_meta . Functions . Count ) ;
164+ Assert . AreEqual ( 1 , klass_meta . SuperTypes . Count ) ;
165+
166+ Assert . AreEqual ( "EnumClassWithInterfaces;" , klass_meta . SuperTypes [ 0 ] . ClassName ) ;
167+ }
168+
169+ [ Test ]
170+ public void InlineClass ( )
171+ {
172+ var klass_meta = GetClassMetadata ( "InlineClass.class" ) ;
173+
174+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
175+ Assert . True ( klass_meta . Flags . HasFlag ( KotlinClassFlags . IsInlineClass ) ) ;
176+ }
177+
178+ [ Test ]
179+ public void Object ( )
180+ {
181+ var klass_meta = GetClassMetadata ( "Object.class" ) ;
182+
183+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
184+
185+ // One would expect this to be "Object" but it doesn't seem to be
186+ Assert . AreEqual ( KotlinClassType . Class , klass_meta . ObjectType ) ;
187+ }
188+
189+ [ Test ]
190+ public void CompanionObject ( )
191+ {
192+ var klass_meta = GetClassMetadata ( "CompanionObject$Companion.class" ) ;
193+
194+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
195+ Assert . AreEqual ( KotlinClassType . CompanionObject , klass_meta . ObjectType ) ;
196+ }
197+
198+ [ Test ]
199+ public void KotlinExtensionMethods ( )
200+ {
201+ var klass_meta = GetClassMetadata ( "ExtensionMethods.class" ) ;
202+
203+ Assert . AreEqual ( KotlinClassInheritability . Final , klass_meta . Inheritability ) ;
204+ Assert . AreEqual ( KotlinClassVisibility . Public , klass_meta . Visibility ) ;
57205 }
58206
59207 private KotlinMetadata GetMetadataForClassFile ( string file )
@@ -68,6 +216,18 @@ private KotlinMetadata GetMetadataForClassFile (string file)
68216
69217 return meta ;
70218 }
219+
220+ private KotlinClass GetClassMetadata ( string file )
221+ {
222+ var meta = GetMetadataForClassFile ( file ) ;
223+
224+ Assert . AreEqual ( KotlinMetadataKind . Class , meta . Kind ) ;
225+
226+ Assert . AreEqual ( "1.0.3" , meta . ByteCodeVersion . ToString ( ) ) ;
227+ Assert . AreEqual ( "1.1.15" , meta . MetadataVersion . ToString ( ) ) ;
228+
229+ return meta . AsClassMetadata ( ) ;
230+ }
71231 }
72232}
73233
0 commit comments