| /* |
| * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license |
| * that can be found in the LICENSE file. |
| */ |
| // JVM_ABI_K1_K2_DIFF: KT-63864 |
| // LANGUAGE:-ProhibitComparisonOfIncompatibleEnums |
| // WITH_STDLIB |
| |
| import kotlin.test.* |
| |
| val sb = StringBuilder() |
| |
| enum class EnumA { |
| A, B, C |
| } |
| |
| enum class EnumB { |
| A, B |
| } |
| |
| enum class E { |
| ONE, TWO, THREE |
| } |
| |
| fun produceEntry() = EnumA.A |
| |
| // Check that we fail on comparison of different enum types. |
| fun differentEnums() { |
| sb.appendLine(when (produceEntry()) { |
| EnumB.A -> "EnumB.A" |
| EnumA.A -> "EnumA.A" |
| EnumA.B -> "EnumA.B" |
| else -> "nah" |
| }) |
| } |
| |
| // Nullable subject shouldn't be lowered. |
| fun nullable() { |
| val x: EnumA? = null |
| when(x) { |
| EnumA.A -> sb.appendLine("fail") |
| else -> sb.appendLine("ok") |
| } |
| } |
| |
| // Operator overloading won't trick us! |
| fun operatorOverloading() { |
| operator fun E.contains(other: E): Boolean = false |
| |
| val y = E.ONE |
| when(y) { |
| in E.ONE -> sb.appendLine("Should not reach here") |
| else -> sb.appendLine("ok") |
| } |
| } |
| |
| fun smoke1() { |
| when (produceEntry()) { |
| EnumA.B -> sb.appendLine("error") |
| EnumA.A -> sb.appendLine("ok") |
| EnumA.C -> sb.appendLine("error") |
| } |
| } |
| |
| fun smoke2() { |
| when (produceEntry()) { |
| EnumA.B -> sb.appendLine("error") |
| else -> sb.appendLine("ok") |
| } |
| } |
| |
| fun eA() = EnumA.A |
| |
| fun eB() = EnumA.B |
| |
| |
| fun nestedWhen() { |
| sb.appendLine(when (eA()) { |
| EnumA.A, EnumA.C -> when (eB()) { |
| EnumA.B -> "ok" |
| else -> "nope" |
| } |
| else -> "nope" |
| }) |
| } |
| |
| fun box(): String { |
| differentEnums() |
| nullable() |
| operatorOverloading() |
| smoke1() |
| smoke2() |
| nestedWhen() |
| |
| assertEquals(""" |
| EnumA.A |
| ok |
| ok |
| ok |
| ok |
| ok |
| |
| """.trimIndent(), sb.toString()) |
| return "OK" |
| } |