11package org.jetbrains.kotlinx.dataframe.types
22
33import io.kotest.matchers.shouldBe
4- import org.jetbrains.kotlinx.dataframe.DataFrame
54import org.jetbrains.kotlinx.dataframe.impl.commonParent
65import org.jetbrains.kotlinx.dataframe.impl.commonParents
76import org.jetbrains.kotlinx.dataframe.impl.commonType
@@ -165,11 +164,6 @@ class UtilTests {
165164 ) shouldBe typeOf<Collection <Nothing ?>? > ()
166165 }
167166
168- class TypeOut <out T >
169- class TypeIn <in T >
170- class Type <T >
171-
172-
173167 interface UpperBound
174168 interface TypeWithUpperbound1 <T : UpperBound >
175169 interface TestType1 <T : UpperBound > : TypeWithUpperbound1 <T >
@@ -182,34 +176,73 @@ class UtilTests {
182176
183177 val comparableTypeT = TestTypeIn1 ::class .supertypes.first() // Comparable<T>
184178 comparableTypeT.replaceGenericTypeParametersWithUpperbound() shouldBe typeOf<Comparable <Nothing >>()
185-
186-
187- val a1: List <TypeOut <Any >> = listOf (TypeOut <Int >(), TypeOut <DataFrame <* >>())
188- // val a1_: List<Type1<Nothing>> = listOf(Type1<Int>(), Type1<DataFrame<*>>())
189- val a1__: List <TypeOut <* >> = listOf (TypeOut <Int >(), TypeOut <DataFrame <* >>())
190- val a1___: List <TypeOut <out Any >> = listOf (TypeOut <Int >(), TypeOut <DataFrame <* >>())
191-
192- // val a2: List<Type2<Any>> = listOf(Type2<Int>(), Type2<DataFrame<*>>())
193- val a2_: List <TypeIn <Nothing >> = listOf (TypeIn <Int >(), TypeIn <DataFrame <* >>())
194- val a2__: List <TypeIn <* >> = listOf (TypeIn <Int >(), TypeIn <DataFrame <* >>())
195- val a2___: List <TypeIn <in Nothing >> = listOf (TypeIn <Int >(), TypeIn <DataFrame <* >>())
196-
197- val a3: List <Type <out Any >> = listOf (Type <Int >(), Type <DataFrame <* >>())
198- val a3_: List <Type <in Nothing >> = listOf (Type <Int >(), Type <DataFrame <* >>())
199- val a3__: List <Type <* >> = listOf (Type <Int >(), Type <DataFrame <* >>())
200179 }
201180
181+ interface AbstractType <T >
182+
202183 @Test
203184 fun `commonType KTypes test` () {
185+ // TODO issue #471: Type inference incorrect w.r.t. variance
186+ listOf (null ).commonType(false ) shouldBe typeOf<Any ?>()
187+ // listOf(null).commonType(true) shouldBe null
188+ listOf (typeOf<Int >(), typeOf<Any >()).commonType() shouldBe typeOf<Any >()
204189 listOf (typeOf<Int >(), typeOf<List <Any >>()).commonType() shouldBe typeOf<Any >()
205190 listOf (typeOf<Int >(), typeOf<List <Any >? > ()).commonType() shouldBe typeOf<Any ?>()
206191 listOf (typeOf<Int >(), typeOf<Int >()).commonType() shouldBe typeOf<Int >()
207192 listOf (typeOf<Int >(), typeOf<Int ?>()).commonType() shouldBe typeOf<Int ?>()
208193 listOf (typeOf<Int >(), nothingType(true )).commonType() shouldBe typeOf<Int ?>()
209194 listOf (typeOf<Int >(), nothingType(false )).commonType() shouldBe typeOf<Int >()
210- listOf (typeOf<List <Int >>(), typeOf<List <String >>()).commonType(false ) shouldBe typeOf<List <out Comparable <Nothing >>>()
195+ listOf (typeOf<Comparable <Int >>(), typeOf<Comparable <Int >>()).commonType() shouldBe typeOf<Comparable <Int >>()
196+ // listOf(typeOf<Comparable<Int>>(), typeOf<Comparable<String>>()).commonType() shouldBe typeOf<Comparable<*>>()
197+ // listOf(typeOf<List<Int>>(), typeOf<List<String>>()).commonType(false) shouldBe typeOf<List<Comparable<Nothing>>>()
198+ // listOf(typeOf<List<Int>>(), typeOf<List<String>>()).commonType() shouldBe typeOf<List<Comparable<*>>>()
199+ // listOf(typeOf<List<Int>>(), typeOf<Set<String>>()).commonType(false) shouldBe typeOf<Collection<Comparable<Nothing>>>()
200+ // listOf(typeOf<List<Int>>(), typeOf<Set<String>>()).commonType() shouldBe typeOf<Collection<Comparable<*>>>()
201+ // listOf(typeOf<List<Int>>(), typeOf<List<List<Any>>>()).commonType() shouldBe typeOf<List<Any>>()
202+ // listOf(typeOf<List<Int>>(), typeOf<List<List<Any>?>>()).commonType(false) shouldBe typeOf<List<Any?>>()
203+ // listOf(typeOf<List<Int>>(), typeOf<List<List<Any>?>>()).commonType() shouldBe typeOf<List<*>>()
204+ // listOf(typeOf<List<Nothing>>(), typeOf<Set<Nothing>>()).commonType() shouldBe typeOf<Collection<Nothing>>()
205+ listOf (nothingType(false )).commonType() shouldBe nothingType(false )
206+ listOf (nothingType(true )).commonType() shouldBe nothingType(true )
207+ // emptyList<KType>().commonType() shouldBe nothingType(false)
208+ listOf (
209+ typeOf<AbstractType <Int >>(),
210+ typeOf<AbstractType <Int >>()
211+ ).commonType() shouldBe typeOf<AbstractType <Int >>()
212+ // listOf(typeOf<AbstractType<Int>>(), typeOf<AbstractType<Any>>()).commonType() shouldBe typeOf<AbstractType<out Any>>()
213+ // listOf(typeOf<AbstractType<Int>>(), typeOf<AbstractType<in Int>>()).commonType() shouldBe typeOf<AbstractType<in Int>>()
214+ listOf (
215+ typeOf<AbstractType <in Int >>(),
216+ typeOf<AbstractType <in Int >>()
217+ ).commonType() shouldBe typeOf<AbstractType <in Int >>()
218+ // listOf(typeOf<AbstractType<Int>>(), typeOf<AbstractType<out Int>>()).commonType() shouldBe typeOf<AbstractType<out Int>>()
219+ listOf (
220+ typeOf<AbstractType <out Int >>(),
221+ typeOf<AbstractType <out Int >>()
222+ ).commonType() shouldBe typeOf<AbstractType <out Int >>()
223+ // listOf(typeOf<AbstractType<out Int>>(), typeOf<AbstractType<in Int>>()).commonType(useStar = false) shouldBe typeOf<AbstractType<out Any?>>()
224+ // listOf(typeOf<AbstractType<out Int>>(), typeOf<AbstractType<in Int>>()).commonType() shouldBe typeOf<AbstractType<*>>()
225+
226+ listOf (
227+ typeOf<AbstractType <in Int >>(),
228+ typeOf<AbstractType <Any >>()
229+ ).commonType() shouldBe typeOf<AbstractType <in Int >>()
230+
231+ listOf (typeOf<Int >(), typeOf<List <Any >>()).commonType() shouldBe typeOf<Any >()
232+ listOf (typeOf<Int >(), typeOf<List <Any >? > ()).commonType() shouldBe typeOf<Any ?>()
233+ listOf (typeOf<Int >(), typeOf<Int >()).commonType() shouldBe typeOf<Int >()
234+ listOf (typeOf<Int >(), typeOf<Int ?>()).commonType() shouldBe typeOf<Int ?>()
235+ listOf (typeOf<Int >(), nothingType(true )).commonType() shouldBe typeOf<Int ?>()
236+ listOf (typeOf<Int >(), nothingType(false )).commonType() shouldBe typeOf<Int >()
237+ listOf (
238+ typeOf<List <Int >>(),
239+ typeOf<List <String >>()
240+ ).commonType(false ) shouldBe typeOf<List <out Comparable <Nothing >>>()
211241 listOf (typeOf<List <Int >>(), typeOf<List <String >>()).commonType() shouldBe typeOf<List <out Comparable <* >>>()
212- listOf (typeOf<List <Int >>(), typeOf<Set <String >>()).commonType(false ) shouldBe typeOf<Collection <out Comparable <Nothing >>>()
242+ listOf (
243+ typeOf<List <Int >>(),
244+ typeOf<Set <String >>()
245+ ).commonType(false ) shouldBe typeOf<Collection <out Comparable <Nothing >>>()
213246 listOf (typeOf<List <Int >>(), typeOf<Set <String >>()).commonType() shouldBe typeOf<Collection <out Comparable <* >>>()
214247 listOf (typeOf<List <Int >>(), typeOf<List <List <Any >>>()).commonType() shouldBe typeOf<List <out Any >>()
215248 listOf (typeOf<List <Int >>(), typeOf<List <List <Any >? >> ()).commonType(false ) shouldBe typeOf<List <out Any ?>>()
@@ -222,6 +255,7 @@ class UtilTests {
222255
223256 @Test
224257 fun `commonTypeListifyValues test` () {
258+ // TODO issue #471: Type inference incorrect w.r.t. variance
225259 listOf<KType >().commonTypeListifyValues() shouldBe typeOf<Any >()
226260 listOf (typeOf<Int >(), typeOf<Int >()).commonTypeListifyValues() shouldBe typeOf<Int >()
227261 listOf (typeOf<Int >(), typeOf<Int ?>()).commonTypeListifyValues() shouldBe typeOf<Int ?>()
0 commit comments