Implement tests map generator and refactor folder structure to spec tests linking
This commit is contained in:
+25
@@ -0,0 +1,25 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Non-exhaustive when, without bound value, without else branch.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): String = <!NO_ELSE_IN_WHEN!>when<!> {
|
||||
value_1 == 1 -> ""
|
||||
value_1 == 2 -> ""
|
||||
value_1 == 3 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int): String = <!NO_ELSE_IN_WHEN!>when<!> {
|
||||
value_1 == 1 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(): Int = <!NO_ELSE_IN_WHEN!>when<!> {}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: Non-exhaustive when, with bound value, without else branch.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
|
||||
1 -> ""
|
||||
2 -> ""
|
||||
3 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
|
||||
1 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Int): Int = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 3
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Non-exhaustive when using boolean values.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Boolean): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
true -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Boolean): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
false -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Boolean): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: Boolean): String = <!NO_ELSE_IN_WHEN!>when<!> {
|
||||
value_1 == true -> ""
|
||||
value_1 == false -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 5
|
||||
* DISCUSSION: maybe use const propagation here?
|
||||
* ISSUES: KT-25265
|
||||
*/
|
||||
fun case_5(value_1: Boolean): String {
|
||||
val trueValue = true
|
||||
val falseValue = false
|
||||
|
||||
return <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
|
||||
trueValue -> ""
|
||||
falseValue -> ""
|
||||
}
|
||||
}
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 6
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Non-exhaustive when using subclasses of the sealed class.
|
||||
* HELPERS: sealedClasses
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: SealedClass): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
is SealedChild1 -> ""
|
||||
is SealedChild2 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: SealedClass): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
is SealedChild1, is SealedChild2 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: SealedClassMixed): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2 -> ""
|
||||
SealedMixedChildObject1 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: SealedClassMixed): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
SealedMixedChildObject1, is SealedMixedChild2, is SealedMixedChild1 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: SealedClassMixed): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2 -> ""
|
||||
is SealedMixedChild3 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: SealedClassMixed): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(value_1: SealedClassSingleWithObject): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
|
||||
|
||||
// TESTCASE NUMBER: 8
|
||||
fun case_8(value_1: SealedClassEmpty): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) { }
|
||||
|
||||
// TESTCASE NUMBER: 9
|
||||
fun case_9(value_1: Number): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
|
||||
is Byte -> ""
|
||||
is Double -> ""
|
||||
is Float -> ""
|
||||
is Int -> ""
|
||||
is Long -> ""
|
||||
is Short -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 10
|
||||
* DISCUSSION: maybe make exhaustive without else?
|
||||
*/
|
||||
fun case_10(value_1: Any): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
|
||||
<!USELESS_IS_CHECK!>is Any<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 11
|
||||
fun case_11(value_1: SealedClass): String = <!NO_ELSE_IN_WHEN!>when<!> {
|
||||
value_1 is SealedChild1 -> ""
|
||||
value_1 is SealedChild2 -> ""
|
||||
value_1 is SealedChild3 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 12
|
||||
fun case_12(value_1: SealedClassMixed): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2 -> ""
|
||||
is SealedMixedChild3 -> ""
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 7
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Non-exhaustive when using enum values.
|
||||
* HELPERS: enumClasses
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: EnumClass): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
EnumClass.EAST -> ""
|
||||
EnumClass.SOUTH -> ""
|
||||
EnumClass.NORTH -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: EnumClass): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
EnumClass.EAST, EnumClass.SOUTH, EnumClass.NORTH -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: EnumClass): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
EnumClass.EAST -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: EnumClass): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: EnumClassSingle): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 6
|
||||
* DISCUSSION: maybe use const propagation here?
|
||||
* ISSUES: KT-25265
|
||||
*/
|
||||
fun case_6(value_1: EnumClass): String {
|
||||
val west = EnumClass.WEST
|
||||
|
||||
return <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
|
||||
EnumClass.EAST -> ""
|
||||
EnumClass.SOUTH -> ""
|
||||
EnumClass.NORTH -> ""
|
||||
west -> ""
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 7
|
||||
* DISCUSSION
|
||||
* ISSUES: KT-26044
|
||||
*/
|
||||
fun case_7(value_1: EnumClassEmpty): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) { }
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 8
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Non-exhaustive when using nullable boolean values.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Boolean?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
true -> ""
|
||||
false -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Boolean?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
true -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Boolean?): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) { }
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 8
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: Non-exhaustive when using subclasses of the nullable sealed class.
|
||||
* HELPERS: sealedClasses
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: SealedClass?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
is SealedChild1 -> ""
|
||||
is SealedChild2 -> ""
|
||||
is SealedChild3 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2 -> ""
|
||||
SealedMixedChildObject1 -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
null, is SealedMixedChild1, is SealedMixedChild2, SealedMixedChildObject1 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2 -> ""
|
||||
is SealedMixedChild3 -> ""
|
||||
SealedMixedChildObject1 -> ""
|
||||
SealedMixedChildObject2 -> ""
|
||||
SealedMixedChildObject3 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2 -> ""
|
||||
is SealedMixedChild3 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: SealedClassMixed?): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {}
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2-> ""
|
||||
is SealedMixedChild3 -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 8
|
||||
fun case_8(value_1: SealedClassMixed?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
SealedMixedChildObject1 -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 9
|
||||
* DISCUSSION: maybe make exhaustive without else?
|
||||
*/
|
||||
fun case_9(value_1: Any?): String = <!NO_ELSE_IN_WHEN!>when<!> (value_1) {
|
||||
is Any -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 10
|
||||
* DISCUSSION
|
||||
* ISSUES: KT-26044
|
||||
*/
|
||||
fun case_10(value: SealedClassEmpty): String = <!NO_ELSE_IN_WHEN!>when<!> (value) {}
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 8
|
||||
* NUMBER: 3
|
||||
* DESCRIPTION: Non-exhaustive when using nullable enum values.
|
||||
* HELPERS: enumClasses
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: EnumClass?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
EnumClass.EAST -> ""
|
||||
EnumClass.SOUTH -> ""
|
||||
EnumClass.NORTH -> ""
|
||||
EnumClass.WEST -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: EnumClass?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
EnumClass.EAST -> ""
|
||||
EnumClass.SOUTH -> ""
|
||||
EnumClass.NORTH -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: EnumClass?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
EnumClass.EAST, null, EnumClass.SOUTH, EnumClass.NORTH -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: EnumClassSingle): Int = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: EnumClassSingle?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
EnumClassSingle.EVERYTHING -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: EnumClassSingle?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
null -> ""
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Exhaustive when, without bound value, with else branch.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): String = when {
|
||||
value_1 == 0 -> ""
|
||||
value_1 > 0 && value_1 <= 10 -> ""
|
||||
value_1 > 10 && value_1 <= 100 -> ""
|
||||
value_1 > 100 -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(): String = when {
|
||||
true -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(): String = when {
|
||||
else -> ""
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: Exhaustive when, with bound value, with else branch.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): String = when (value_1) {
|
||||
0 -> ""
|
||||
1 -> ""
|
||||
2 -> ""
|
||||
3 -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Boolean): String = when (value_1) {
|
||||
true -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 3
|
||||
* NOTE: for a potential bound value constant analysis.
|
||||
*/
|
||||
fun case_3(): String = when (true) {
|
||||
true -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: Int): String = when(value_1) {
|
||||
else -> ""
|
||||
}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 1
|
||||
* NUMBER: 3
|
||||
* DESCRIPTION: Exhaustive when, with bound value (sealed, enum, boolean), with redundant else branch.
|
||||
* HELPERS: enumClasses, sealedClasses
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: EnumClass): String = when (value_1) {
|
||||
EnumClass.EAST -> ""
|
||||
EnumClass.NORTH -> ""
|
||||
EnumClass.SOUTH -> ""
|
||||
EnumClass.WEST -> ""
|
||||
<!REDUNDANT_ELSE_IN_WHEN!>else<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: EnumClass?): String = when (value_1) {
|
||||
EnumClass.EAST -> ""
|
||||
EnumClass.NORTH -> ""
|
||||
EnumClass.SOUTH -> ""
|
||||
EnumClass.WEST -> ""
|
||||
null -> ""
|
||||
<!REDUNDANT_ELSE_IN_WHEN!>else<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Boolean): String = when (value_1) {
|
||||
true -> ""
|
||||
false -> ""
|
||||
<!REDUNDANT_ELSE_IN_WHEN!>else<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: Boolean?): String = when (value_1) {
|
||||
true -> ""
|
||||
false -> ""
|
||||
null -> ""
|
||||
<!REDUNDANT_ELSE_IN_WHEN!>else<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: SealedClass): String = when (value_1) {
|
||||
is SealedChild1 -> ""
|
||||
is SealedChild2 -> ""
|
||||
is SealedChild3 -> ""
|
||||
<!REDUNDANT_ELSE_IN_WHEN!>else<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: SealedClass?): String = when (value_1) {
|
||||
is SealedChild1 -> ""
|
||||
is SealedChild2 -> ""
|
||||
is SealedChild3 -> ""
|
||||
null -> ""
|
||||
<!REDUNDANT_ELSE_IN_WHEN!>else<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(value_1: SealedClassSingle): String = when (value_1) {
|
||||
<!USELESS_IS_CHECK!>is SealedClassSingle<!> -> ""
|
||||
<!REDUNDANT_ELSE_IN_WHEN!>else<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 8
|
||||
fun case_8(value_1: SealedClassSingle?): String = when (value_1) {
|
||||
is SealedClassSingle -> ""
|
||||
null -> ""
|
||||
<!REDUNDANT_ELSE_IN_WHEN!>else<!> -> ""
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 3
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Exhaustive when using boolean values.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Boolean): String = when (value_1) {
|
||||
true -> ""
|
||||
false -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Boolean): String = when (value_1) {
|
||||
true && false && ((true || false)) || true && !!!false && !!!true -> ""
|
||||
true && false && ((true || false)) || true && !!!false -> ""
|
||||
}
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 6
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Exhaustive when using subclasses of the sealed class.
|
||||
* HELPERS: sealedClasses
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: SealedClass): Int = when (value_1) {
|
||||
is SealedChild1 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.number
|
||||
is SealedChild2 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.e1 + <!DEBUG_INFO_SMARTCAST!>value_1<!>.e2
|
||||
is SealedChild3 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.m1 + <!DEBUG_INFO_SMARTCAST!>value_1<!>.m2
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: SealedClass): String = when (value_1) {
|
||||
<!USELESS_IS_CHECK!>is SealedClass<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: SealedClassWithMethods): String = when (value_1) {
|
||||
is SealedWithMethodsChild1 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.m1()
|
||||
is SealedWithMethodsChild2 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.m2()
|
||||
is SealedWithMethodsChild3 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.m3()
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: SealedClassWithObjects): String = when (value_1) {
|
||||
SealedWithObjectsChild1 -> ""
|
||||
SealedWithObjectsChild2 -> ""
|
||||
SealedWithObjectsChild3 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: SealedClassMixed): String = when (value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2 -> ""
|
||||
is SealedMixedChild3 -> ""
|
||||
SealedMixedChildObject1 -> ""
|
||||
SealedMixedChildObject2 -> ""
|
||||
SealedMixedChildObject3 -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 6
|
||||
* DISCUSSION: is it correct that objects can be checked using the type checking operator?
|
||||
*/
|
||||
fun case_6(value_1: SealedClassMixed): String = when (value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2 -> ""
|
||||
is SealedMixedChild3 -> ""
|
||||
is SealedMixedChildObject1 -> ""
|
||||
is SealedMixedChildObject2 -> ""
|
||||
is SealedMixedChildObject3 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(value_1: SealedClassEmpty): String = when (value_1) {
|
||||
else -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 8
|
||||
* UNEXPECTED BEHAVIOUR: must be exhaustive
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_8(value: SealedClass?): String = <!NO_ELSE_IN_WHEN!>when<!> (value) {
|
||||
is SealedChild1, !is SealedChild3?, <!USELESS_IS_CHECK!>is SealedChild3?<!> -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 9
|
||||
* UNEXPECTED BEHAVIOUR: must be exhaustive
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_9(value: SealedClass?): String = <!NO_ELSE_IN_WHEN!>when<!> (value) {
|
||||
is SealedChild1, !is SealedChild3 -> ""
|
||||
<!USELESS_IS_CHECK!>is SealedChild3?<!> -> ""
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 7
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Exhaustive when using enum values.
|
||||
* HELPERS: enumClasses
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(dir: EnumClass): String = when (dir) {
|
||||
EnumClass.EAST -> ""
|
||||
EnumClass.NORTH -> ""
|
||||
EnumClass.SOUTH -> ""
|
||||
EnumClass.WEST -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: EnumClassSingle): String = when (value_1) {
|
||||
EnumClassSingle.EVERYTHING -> ""
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 8
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Exhaustive when using nullable boolean values.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Boolean?): String = when (value_1) {
|
||||
true -> ""
|
||||
false -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Boolean?): String = when (value_1) {
|
||||
true && false && ((true || false)) || true && !!!false && !!!true -> ""
|
||||
true && false && ((true || false)) || true && !!!false -> ""
|
||||
null -> ""
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 8
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: Exhaustive when using enum values.
|
||||
* HELPERS: enumClasses
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: EnumClass?): String = when (value_1) {
|
||||
EnumClass.EAST -> ""
|
||||
EnumClass.NORTH -> ""
|
||||
EnumClass.SOUTH -> ""
|
||||
EnumClass.WEST -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: EnumClassSingle?): String = when (value_1) {
|
||||
EnumClassSingle.EVERYTHING -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 3
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-26044
|
||||
*/
|
||||
fun case_3(value_1: EnumClassEmpty?): String = <!NO_ELSE_IN_WHEN!>when<!>(value_1) {
|
||||
null -> ""
|
||||
}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression, exhaustive-when-expressions -> paragraph 2 -> sentence 8
|
||||
* NUMBER: 3
|
||||
* DESCRIPTION: Exhaustive when using subclasses of the nullable sealed class.
|
||||
* HELPERS: sealedClasses
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: SealedClass?): Int = when (value_1) {
|
||||
is SealedChild1 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.number
|
||||
is SealedChild2 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.e1 + <!DEBUG_INFO_SMARTCAST!>value_1<!>.e2
|
||||
is SealedChild3 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.m1 + <!DEBUG_INFO_SMARTCAST!>value_1<!>.m2
|
||||
null -> 0
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: SealedClass?): String = when (value_1) {
|
||||
is SealedClass -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: SealedClassWithMethods?): String = when (value_1) {
|
||||
is SealedWithMethodsChild1 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.m1()
|
||||
is SealedWithMethodsChild2 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.m2()
|
||||
is SealedWithMethodsChild3 -> <!DEBUG_INFO_SMARTCAST!>value_1<!>.m3()
|
||||
null -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: SealedClassWithObjects?): String = when (value_1) {
|
||||
SealedWithObjectsChild1 -> ""
|
||||
SealedWithObjectsChild2 -> ""
|
||||
SealedWithObjectsChild3 -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: SealedClassMixed?): String = when (value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2 -> ""
|
||||
is SealedMixedChild3 -> ""
|
||||
SealedMixedChildObject1 -> ""
|
||||
SealedMixedChildObject2 -> ""
|
||||
SealedMixedChildObject3 -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 6
|
||||
* DISCUSSION: is it correct that objects can be checked using the type checking operator?
|
||||
*/
|
||||
fun case_6(value_1: SealedClassMixed?): String = when (value_1) {
|
||||
is SealedMixedChild1 -> ""
|
||||
is SealedMixedChild2 -> ""
|
||||
is SealedMixedChild3 -> ""
|
||||
is SealedMixedChildObject1 -> ""
|
||||
is SealedMixedChildObject2 -> ""
|
||||
is SealedMixedChildObject3 -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 7
|
||||
* UNEXPECTED BEHAVIOUR: must be exhaustive
|
||||
* ISSUES: KT-26044
|
||||
*/
|
||||
fun case_7(value: SealedClassEmpty?): String = <!NO_ELSE_IN_WHEN!>when<!> (value) {
|
||||
null -> ""
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
/*
|
||||
* This file is generated by {@link org.jetbrains.kotlin.spec.tasks.generateTests}. DO NOT MODIFY MANUALLY.
|
||||
* This file is used in the HTML version of the Kotlin Specification (https://kotlin.github.io/kotlin-spec) to show tests coverage for sentences.
|
||||
*
|
||||
* Content format:
|
||||
*
|
||||
* {paragraphNumber}
|
||||
* {testType: neg|pos}: {sentenceNumber}-{numberOfTests|testPathToAnotherSection}, ...
|
||||
*/
|
||||
|
||||
2
|
||||
neg: 1-2, 3-1, 8-3, 6-1, 7-1
|
||||
pos: 1-3, 3-1, 8-3, 6-1, 7-1
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 2 -> sentence 3
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Empty when with bound value.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int) {
|
||||
when (<!UNUSED_EXPRESSION!>value_1<!>) {}
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 2 -> sentence 3
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: Empty when without bound value.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1() {
|
||||
when {}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 3 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: Forbidden break and continue in the control structure body of when.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): String {
|
||||
while (true) {
|
||||
when {
|
||||
value_1 == 1 -> <!BREAK_OR_CONTINUE_IN_WHEN!>break<!>
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int): String {
|
||||
while (true) {
|
||||
when {
|
||||
value_1 == 1 -> <!BREAK_OR_CONTINUE_IN_WHEN!>continue<!>
|
||||
}
|
||||
}
|
||||
|
||||
<!UNREACHABLE_CODE!>return ""<!>
|
||||
}
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 3 -> sentence 2
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: When with non-boolean value in the when condition.
|
||||
* HELPERS: typesProvider
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int, value_2: String, value_3: TypesProvider): String {
|
||||
when {
|
||||
<!TYPE_MISMATCH!>.012f / value_1<!> -> return ""
|
||||
<!TYPE_MISMATCH!>"$value_2..."<!> -> return ""
|
||||
<!CONSTANT_EXPECTED_TYPE_MISMATCH!>'-'<!> -> return ""
|
||||
<!TYPE_MISMATCH!>{}<!> -> return ""
|
||||
<!TYPE_MISMATCH!>value_3.getAny()<!> -> return ""
|
||||
<!TYPE_MISMATCH!>-10..-1<!> -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 3 -> sentence 2
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: When without bound value, forbidden comma in the when condition.
|
||||
* HELPERS: typesProvider, classes
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: TypesProvider) {
|
||||
when {
|
||||
getBoolean()<!COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT!>,<!> value_1.getBoolean() -> return
|
||||
value_1.getBoolean() && getBoolean()<!COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT!>,<!> getLong() == 1000L -> return
|
||||
<!TYPE_MISMATCH!>Out<Int>()<!><!COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT!>,<!> <!TYPE_MISMATCH!>getLong()<!><!COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT!>,<!> <!TYPE_MISMATCH!>{}<!><!COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT!>,<!> <!TYPE_MISMATCH!>Any()<!><!COMMA_IN_WHEN_CONDITION_WITHOUT_ARGUMENT!>,<!> throw Exception() -> return
|
||||
}
|
||||
|
||||
<!UNREACHABLE_CODE!>return<!>
|
||||
}
|
||||
+319
@@ -0,0 +1,319 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION -DEBUG_INFO_SMARTCAST
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 3 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: When without bound value, various expressions in the control structure body.
|
||||
* HELPERS: typesProvider, classes, functions
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int) {
|
||||
when {
|
||||
value_1 == 1 -> true
|
||||
value_1 == 2 -> 100
|
||||
value_1 == 3 -> -.09f
|
||||
value_1 == 4 -> '.'
|
||||
value_1 == 5 -> "..."
|
||||
value_1 == 6 -> null
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int, value_2: Byte, value_3: TypesProvider) {
|
||||
when {
|
||||
value_1 == 1 -> -.09 % 10L
|
||||
value_1 == 3 -> value_2 / -5
|
||||
value_1 == 2 -> value_3.getChar() - 11 + 90
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Int, value_2: Boolean, value_3: Long) {
|
||||
when {
|
||||
value_1 == 1 -> value_2
|
||||
value_1 == 2 -> !value_2
|
||||
value_1 == 3 -> getBoolean() && value_2
|
||||
value_1 == 5 -> getChar() != 'a'
|
||||
value_1 == 6 -> Out<Int>() === getAny()
|
||||
value_1 == 7 -> value_3 <= 11
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: Int, value_2: String, value_3: String) {
|
||||
when {
|
||||
value_1 == 1 -> "..." + value_2 + "" + "$value_3" + "..."
|
||||
value_1 == 2 -> value_2 + getString()
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: Int, value_2: Int, value_3: Boolean?) {
|
||||
when {
|
||||
value_1 == 1 -> when {
|
||||
value_2 > 1000 -> "1"
|
||||
value_2 > 100 -> "2"
|
||||
else -> "3"
|
||||
}
|
||||
value_1 == 2 -> when {
|
||||
value_2 > 1000 -> "1"
|
||||
value_2 > 100 -> "2"
|
||||
}
|
||||
value_1 == 3 -> when {}
|
||||
value_1 == 4 -> when (value_3) {
|
||||
true -> "1"
|
||||
false -> "2"
|
||||
null -> "3"
|
||||
}
|
||||
value_1 == 5 -> when (value_3) {
|
||||
true -> "1"
|
||||
false -> "2"
|
||||
}
|
||||
value_1 == 6 -> when (value_3) {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: Int, value_2: Int, value_3: Boolean?) = when {
|
||||
value_1 == 1 -> when {
|
||||
value_2 > 1000 -> 1
|
||||
value_2 > 100 -> 2
|
||||
else -> 3
|
||||
}
|
||||
else -> when (value_3) {
|
||||
true -> 1
|
||||
false -> 2
|
||||
null -> 3
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(value_1: Int, value_2: Int, value_3: Boolean?) {
|
||||
when {
|
||||
value_1 == 1 -> if (value_2 > 1000) "1"
|
||||
value_1 == 2 -> if (value_2 > 1000) "1"
|
||||
else "2"
|
||||
value_1 == 3 -> if (value_2 < 100) "1"
|
||||
else if (value_2 < 10) "2"
|
||||
else "4"
|
||||
value_1 == 4 -> if (value_3 == null) "1"
|
||||
else if (value_3) "2"
|
||||
else if (!value_3) "3"
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 8
|
||||
fun case_8(value_1: Int, value_2: Int) = when {
|
||||
value_1 == 1 -> if (value_2 > 1000) "1"
|
||||
else "2"
|
||||
else -> if (value_2 < 100) "1"
|
||||
else if (value_2 < 10) "2"
|
||||
else "4"
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 9
|
||||
fun case_9(value_1: Int, value_2: String, value_3: String) = when {
|
||||
value_1 == 1 -> <!IMPLICIT_CAST_TO_ANY!>try { 4 } catch (e: Exception) { 5 }<!>
|
||||
value_1 == 2 -> <!IMPLICIT_CAST_TO_ANY!>try { throw Exception() } catch (e: Exception) { value_2 }<!>
|
||||
else -> <!IMPLICIT_CAST_TO_ANY!>try { throw Exception() } catch (e: Exception) { {value_3} } finally { }<!>
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 10
|
||||
fun case_10(value_1: Int, value_2: String?, value_3: String?) {
|
||||
when {
|
||||
value_1 == 1 -> value_2 ?: true
|
||||
value_1 == 2 -> value_2 ?: value_3 ?: true
|
||||
value_1 == 3 -> value_2!! <!USELESS_ELVIS!>?: true<!>
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 11
|
||||
fun case_11(value_1: Int) {
|
||||
when {
|
||||
value_1 == 1 -> 1..10
|
||||
value_1 == 2 -> -100L..100L
|
||||
value_1 == 3 -> -getInt()..getLong()
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 12
|
||||
fun case_12(value_1: Int, value_2: Collection<Int>, value_3: Collection<Int>?) {
|
||||
when {
|
||||
value_1 == 1 -> value_2 as List<Int>
|
||||
value_1 == 2 -> value_2 as? List<Int>
|
||||
value_1 == 3 -> value_3 <!UNCHECKED_CAST!>as? MutableMap<Int, Int><!>
|
||||
value_1 == 4 -> (value_2 <!UNCHECKED_CAST!>as? Map<Int, Int><!>) as MutableMap<Int, Int>
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 13
|
||||
fun case_13(value_1: Int, value_2: Int, value_3: Int, value_4: Boolean) {
|
||||
var mutablevalue_2 = value_2
|
||||
var mutablevalue_3 = value_3
|
||||
|
||||
when {
|
||||
value_1 == 1 -> ++mutablevalue_2
|
||||
value_1 == 2 -> --mutablevalue_3
|
||||
value_1 == 3 -> !value_4
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 14
|
||||
fun case_14(value_1: Int, value_2: Int, value_3: Int, value_4: Boolean?) {
|
||||
var mutablevalue_2 = value_2
|
||||
var mutablevalue_3 = value_3
|
||||
|
||||
when {
|
||||
value_1 == 1 -> <!UNUSED_CHANGED_VALUE!>mutablevalue_2++<!>
|
||||
value_1 == 2 -> <!UNUSED_CHANGED_VALUE!>mutablevalue_3--<!>
|
||||
value_1 == 3 -> value_4!!
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 15
|
||||
fun case_15(value_1: Int, value_2: List<Int>, value_3: List<List<List<List<Int>>>>) {
|
||||
when {
|
||||
value_1 == 1 -> value_2[0]
|
||||
value_1 == 2 -> value_3[0][-4][1][-1]
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 16
|
||||
fun case_16(value_1: Int, value_2: Class, value_3: Class?, value_4: Int) {
|
||||
fun __fun_1(): () -> Unit { return fun() { } }
|
||||
|
||||
when {
|
||||
value_1 == 1 -> funWithoutArgs()
|
||||
value_1 == 2 -> __fun_1()()
|
||||
value_1 == 3 -> value_2.fun_2(value_4)
|
||||
value_1 == 4 -> value_3?.fun_2(value_4)
|
||||
value_1 == 5 -> value_3!!.fun_2(value_4)
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 17
|
||||
fun case_17(value_1: Int, value_2: Class, value_3: Class?) {
|
||||
when {
|
||||
value_1 == 1 -> value_2.prop_1
|
||||
value_1 == 2 -> value_3?.prop_1
|
||||
value_1 == 3 -> value_2::prop_1.get()
|
||||
value_1 == 4 -> value_3!!::prop_3.get()
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 18
|
||||
fun case_18(value_1: Int) {
|
||||
val fun_1 = fun(): Int { return 0 }
|
||||
|
||||
when {
|
||||
value_1 == 1 -> fun() {}
|
||||
value_1 == 2 -> fun(): Int { return 0 }
|
||||
value_1 == 3 -> fun(): () -> Unit { return fun() {} }
|
||||
value_1 == 4 -> fun_1
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 19
|
||||
fun case_19(value_1: Int): () -> Any {
|
||||
val lambda_1 = { 0 }
|
||||
|
||||
return when {
|
||||
value_1 == 1 -> lambda_1
|
||||
value_1 == 2 -> { { {} } }
|
||||
else -> { -> (Int)
|
||||
{ arg: Int -> { { println(arg) } } }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 20
|
||||
fun case_20(value_1: Int) {
|
||||
val object_1 = object {
|
||||
val prop_1 = 1
|
||||
}
|
||||
|
||||
when {
|
||||
value_1 == 1 -> object {}
|
||||
value_1 == 2 -> object {
|
||||
private fun fun_1() { }
|
||||
val prop_1 = 1
|
||||
}
|
||||
value_1 == 3 -> object_1
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 21
|
||||
class A {
|
||||
val prop_1 = 1
|
||||
val lambda_1 = { 1 }
|
||||
fun fun_1(): Int { return 1 }
|
||||
|
||||
fun case_21(value_1: Int) {
|
||||
when {
|
||||
value_1 == 1 -> this
|
||||
value_1 == 2 -> ((this))
|
||||
value_1 == 3 -> this::prop_1.get()
|
||||
value_1 == 4 -> this.prop_1
|
||||
value_1 == 5 -> this.lambda_1()
|
||||
value_1 == 6 -> this::lambda_1.get()()
|
||||
value_1 == 7 -> this.fun_1()
|
||||
value_1 == 8 -> this::fun_1.invoke()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 22
|
||||
fun case_22(value_1: Int) {
|
||||
when {
|
||||
value_1 == 1 -> throw Exception()
|
||||
value_1 == 2 -> throw throw throw Exception()
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 23
|
||||
fun case_23(value_1: Int) {
|
||||
fun r_1() {
|
||||
when {
|
||||
value_1 == 1 -> return
|
||||
value_1 == 2 -> <!UNREACHABLE_CODE!>return return<!> return
|
||||
}
|
||||
}
|
||||
|
||||
fun r_2(): List<Int>? {
|
||||
when {
|
||||
value_1 == 1 -> return listOf(0, 1, 2)
|
||||
value_1 == 2 -> return null
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 24
|
||||
fun case_24(value_1: Int) {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
when {
|
||||
value_1 == 1 -> continue@loop1
|
||||
value_1 == 2 -> continue@loop2
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 25
|
||||
fun case_25(value_1: Int) {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
when {
|
||||
value_1 == 1 -> break@loop1
|
||||
value_1 == 2 -> break@loop2
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+122
@@ -0,0 +1,122 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 3 -> sentence 2
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: When without bound value, various boolean values in the when condition.
|
||||
* HELPERS: typesProvider, enumClasses, sealedClasses, classes
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Boolean, value_2: Long): Int {
|
||||
return when {
|
||||
value_1 -> 1
|
||||
getBoolean() && value_1 -> 2
|
||||
getChar() != 'a' -> 3
|
||||
Out<Int>() === getAny() -> 4
|
||||
value_2 <= 11 -> 5
|
||||
!value_1 -> 6
|
||||
else -> 7
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 2
|
||||
* NOTE: for a potential analysys of exhaustiveness by enums in whens without a bound value.
|
||||
*/
|
||||
fun case_2(value_1: EnumClass) {
|
||||
when {
|
||||
value_1 == EnumClass.NORTH -> {}
|
||||
value_1 == EnumClass.SOUTH -> {}
|
||||
value_1 == EnumClass.WEST -> {}
|
||||
value_1 == EnumClass.EAST -> {}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 3
|
||||
* NOTE: for a potential analysys of exhaustiveness by enums in whens without a bound value.
|
||||
*/
|
||||
fun case_3(value_1: Boolean) {
|
||||
when {
|
||||
value_1 == true -> return
|
||||
value_1 == false -> return
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 4
|
||||
* NOTE: for a potential mark the code after the true branch as unreacable.
|
||||
*/
|
||||
fun case_4(value_1: Boolean) {
|
||||
when {
|
||||
false -> return
|
||||
true -> return
|
||||
value_1 -> return
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 5
|
||||
* NOTE: for a potential const propagation.
|
||||
*/
|
||||
fun case_5(value_1: Boolean) {
|
||||
val value_2 = false
|
||||
val value_3 = false || !!!false || false
|
||||
|
||||
when {
|
||||
value_3 -> return
|
||||
value_2 -> return
|
||||
value_1 -> return
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: Any) {
|
||||
when {
|
||||
value_1 is Nothing -> {}
|
||||
value_1 is Int -> {}
|
||||
value_1 is Boolean -> {}
|
||||
value_1 is String -> {}
|
||||
value_1 is Number -> {}
|
||||
value_1 is Float -> {}
|
||||
<!USELESS_IS_CHECK!>value_1 is Any<!> -> {}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 7
|
||||
* NOTE: for a potential analysys of exhaustiveness by enums in whens without a bound value.
|
||||
*/
|
||||
fun case_7(value_1: Any) {
|
||||
when {
|
||||
value_1 !is Number -> {}
|
||||
value_1 is Float -> {}
|
||||
<!USELESS_IS_CHECK!>value_1 is Number<!> -> {}
|
||||
<!USELESS_IS_CHECK!>value_1 is Any<!> -> {}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 8
|
||||
* NOTE: for a potential analysys of exhaustiveness by enums in whens without a bound value.
|
||||
*/
|
||||
fun case_8(value_1: SealedClass) {
|
||||
when {
|
||||
value_1 is SealedChild1 -> {}
|
||||
value_1 is SealedChild2 -> {}
|
||||
value_1 is SealedChild3 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 9
|
||||
fun case_9(value_1: Int, value_2: IntRange) {
|
||||
when {
|
||||
value_1 in -10..100L -> {}
|
||||
value_1 in value_2 -> {}
|
||||
value_1 !in listOf(0, 1, 2) -> {}
|
||||
}
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 3 -> sentence 2
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: 'When' without bound value and only one 'else' branch.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1() = when {
|
||||
else -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(): String {
|
||||
when {
|
||||
else -> return ""
|
||||
}
|
||||
}
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 3 -> sentence 2
|
||||
* NUMBER: 3
|
||||
* DESCRIPTION: 'When' without bound value and with Nothing in condition (subtype of Boolean).
|
||||
* DISCUSSION
|
||||
* ISSUES: KT-25948
|
||||
* HELPERS: typesProvider
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(<!UNUSED_PARAMETER!>value_1<!>: TypesProvider) {
|
||||
when {
|
||||
return -> <!UNREACHABLE_CODE!>return<!>
|
||||
<!UNREACHABLE_CODE!>return == return -> return<!>
|
||||
<!UNREACHABLE_CODE!>return return return -> return<!>
|
||||
<!UNREACHABLE_CODE!>return != 10L -> return<!>
|
||||
<!UNREACHABLE_CODE!>return || return && return -> return<!>
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(<!UNUSED_PARAMETER!>value_1<!>: TypesProvider) {
|
||||
when {
|
||||
throw Exception() -> <!UNREACHABLE_CODE!>return<!>
|
||||
<!UNREACHABLE_CODE!>(throw Exception()) == (throw Exception()) -> return<!>
|
||||
<!UNREACHABLE_CODE!>(throw Exception()) && (throw Exception()) || (throw Exception()) -> return<!>
|
||||
<!UNREACHABLE_CODE!>(throw Exception()) == 10L -> return<!>
|
||||
<!UNREACHABLE_CODE!>throw throw throw throw Exception() -> return<!>
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(<!UNUSED_PARAMETER!>value_1<!>: TypesProvider) {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
loop3@ while (true) {
|
||||
when {
|
||||
break@loop1 <!UNREACHABLE_CODE!>== break@loop2<!> -> <!UNREACHABLE_CODE!>return<!>
|
||||
<!UNREACHABLE_CODE!>break@loop2 || break@loop1 && break@loop3 -> return<!>
|
||||
<!UNREACHABLE_CODE!>break@loop2 != 10L -> return<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(<!UNUSED_PARAMETER!>value_1<!>: TypesProvider): String {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
loop3@ while (true) {
|
||||
when {
|
||||
continue@loop1 <!UNREACHABLE_CODE!>== continue@loop2<!> -> <!UNREACHABLE_CODE!>return ""<!>
|
||||
<!UNREACHABLE_CODE!>continue@loop2 || continue@loop1 && continue@loop3 -> return ""<!>
|
||||
<!UNREACHABLE_CODE!>continue@loop2 != 10L -> return ""<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: Nothing, <!UNUSED_PARAMETER!>value_2<!>: TypesProvider): String {
|
||||
when {
|
||||
value_1 -> <!UNREACHABLE_CODE!>return ""<!>
|
||||
<!UNREACHABLE_CODE!>value_2.getNothing() -> return ""<!>
|
||||
<!UNREACHABLE_CODE!>getNothing() -> return ""<!>
|
||||
<!UNREACHABLE_CODE!>value_1 && (getNothing() == value_2.getNothing()) -> return ""<!>
|
||||
}
|
||||
|
||||
<!UNREACHABLE_CODE!>return ""<!>
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(<!UNUSED_PARAMETER!>value_1<!>: TypesProvider, <!UNUSED_PARAMETER!>value_2<!>: Nothing) {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
loop3@ while (true) {
|
||||
when {
|
||||
continue@loop1 <!UNREACHABLE_CODE!>== throw throw throw throw Exception()<!> -> <!UNREACHABLE_CODE!>return<!>
|
||||
<!UNREACHABLE_CODE!>(return return return return) || break@loop1 && break@loop3 -> return<!>
|
||||
<!UNREACHABLE_CODE!>continue@loop1 != 10L && (return return) == continue@loop1 -> return<!>
|
||||
<!UNREACHABLE_CODE!>return continue@loop1 -> return<!>
|
||||
<!UNREACHABLE_CODE!>(throw break@loop1) && break@loop3 -> return<!>
|
||||
<!UNREACHABLE_CODE!>(throw getNothing()) && value_1.getNothing() -> return<!>
|
||||
<!UNREACHABLE_CODE!>return return return value_2 -> return<!>
|
||||
<!UNREACHABLE_CODE!>getNothing() != 10L && (return return) == value_2 -> return<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 5 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' without bound value and with 'else' branch not in the last position.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(<!UNUSED_PARAMETER!>value_1<!>: Int): String = when {
|
||||
<!ELSE_MISPLACED_IN_WHEN!>else<!> -> ""
|
||||
<!UNREACHABLE_CODE!>value_1 == 1 -> ""<!>
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int): String = when {
|
||||
value_1 == 1 -> ""
|
||||
<!ELSE_MISPLACED_IN_WHEN!>else<!> -> ""
|
||||
<!UNREACHABLE_CODE!>value_1 == 2 -> ""<!>
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(): String {
|
||||
when {
|
||||
<!ELSE_MISPLACED_IN_WHEN!>else<!> -> return ""
|
||||
<!UNREACHABLE_CODE!>else -> return ""<!>
|
||||
}
|
||||
|
||||
<!UNREACHABLE_CODE!>return ""<!>
|
||||
}
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 5 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' without bound value and with else branch in the last position.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): String {
|
||||
when {
|
||||
value_1 == 1 -> return ""
|
||||
value_1 == 2 -> return ""
|
||||
else -> return ""
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int): String = when {
|
||||
value_1 == 1 -> ""
|
||||
value_1 == 2 -> ""
|
||||
else -> ""
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 6 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' with bound value and not allowed break and continue expression (without labels) in the control structure body.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): Int {
|
||||
while (true) {
|
||||
when (value_1) {
|
||||
1 -> return 1
|
||||
2 -> <!BREAK_OR_CONTINUE_IN_WHEN!>break<!>
|
||||
}
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int): Int {
|
||||
while (true) {
|
||||
when (value_1) {
|
||||
1 -> <!BREAK_OR_CONTINUE_IN_WHEN!>continue<!>
|
||||
2 -> return 1
|
||||
}
|
||||
}
|
||||
|
||||
<!UNREACHABLE_CODE!>return 0<!>
|
||||
}
|
||||
+322
@@ -0,0 +1,322 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 6 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' with bound value and with different variants of expressions in the control structure body.
|
||||
* HELPERS: typesProvider, classes, functions
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int) {
|
||||
when (value_1) {
|
||||
1 -> true
|
||||
2 -> 100
|
||||
3 -> -.09f
|
||||
4 -> '.'
|
||||
5 -> "..."
|
||||
6 -> null
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int, value_2: Byte, value_3: TypesProvider) {
|
||||
when (value_1) {
|
||||
1 -> -.09 % 10L
|
||||
3 -> value_2 / -5
|
||||
2 -> value_3.getChar() - 11 + 90
|
||||
4 -> 100
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Int, value_2: Boolean, value_3: Long) {
|
||||
when (value_1) {
|
||||
1 -> value_2
|
||||
2 -> !value_2
|
||||
3 -> getBoolean() && value_2
|
||||
5 -> getChar() != 'a'
|
||||
6 -> getList() === getAny()
|
||||
7 -> value_3 <= 11
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: Int, value_2: String, value_3: String) {
|
||||
when (value_1) {
|
||||
1 -> "..." + value_2 + "" + "$value_3" + "..."
|
||||
2 -> value_2 + getString()
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: Int, value_2: Int, value_3: Boolean?) {
|
||||
when (value_1) {
|
||||
1 -> when (value_3) {
|
||||
value_2 > 1000 -> "1"
|
||||
value_2 > 100 -> "2"
|
||||
else -> "3"
|
||||
}
|
||||
2 -> when (value_3) {
|
||||
value_2 > 1000 -> "1"
|
||||
value_2 > 100 -> "2"
|
||||
}
|
||||
3 -> when (value_3) {}
|
||||
4 -> when (value_3) {
|
||||
true -> "1"
|
||||
false -> "2"
|
||||
null -> "3"
|
||||
}
|
||||
5 -> when (value_3) {
|
||||
true -> "1"
|
||||
false -> "2"
|
||||
}
|
||||
6 -> when (value_3) {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: Int, value_2: Int, value_3: Boolean?) = when (value_1) {
|
||||
1 -> when (value_3) {
|
||||
value_2 > 1000 -> 1
|
||||
value_2 > 100 -> 2
|
||||
else -> 3
|
||||
}
|
||||
else -> when (value_3) {
|
||||
true -> 1
|
||||
false -> 2
|
||||
null -> 3
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(value_1: Int, value_2: Int, value_3: Boolean?) {
|
||||
when (value_1) {
|
||||
1 -> if (value_2 > 1000) "1"
|
||||
2 -> if (value_2 > 1000) "1"
|
||||
else "2"
|
||||
3 -> if (value_2 < 100) "1"
|
||||
else if (value_2 < 10) "2"
|
||||
else "4"
|
||||
4 -> if (value_3 == null) "1"
|
||||
else if (<!DEBUG_INFO_SMARTCAST!>value_3<!>) "2"
|
||||
else if (!<!DEBUG_INFO_SMARTCAST!>value_3<!>) "3"
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 8
|
||||
fun case_8(value_1: Int, value_2: Int) = when (value_1) {
|
||||
1 -> if (value_2 > 1000) "1"
|
||||
else "2"
|
||||
else -> if (value_2 < 100) "1"
|
||||
else if (value_2 < 10) "2"
|
||||
else "4"
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 9
|
||||
fun case_9(value_1: Int, value_2: String, value_3: String): Any {
|
||||
return when (value_1) {
|
||||
1 -> try { 4 } catch (e: Exception) { 5 }
|
||||
2 -> try { throw Exception() } catch (e: Exception) { value_2 }
|
||||
else -> try { throw Exception() } catch (e: Exception) { {value_3} } finally { }
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 10
|
||||
fun case_10(value_1: Int, value_2: String?, value_3: String?) {
|
||||
when (value_1) {
|
||||
1 -> value_2 ?: true
|
||||
2 -> value_2 ?: value_3 ?: true
|
||||
3 -> value_2!! <!USELESS_ELVIS!>?: true<!>
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 11
|
||||
fun case_11(value_1: Int) {
|
||||
when (value_1) {
|
||||
1 -> 1..10
|
||||
2 -> -100L..100L
|
||||
3 -> -getInt()..getLong()
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 12
|
||||
fun case_12(value_1: Int, value_2: Collection<Int>, value_3: Collection<Int>?) {
|
||||
when (value_1) {
|
||||
1 -> value_2 as List<Int>
|
||||
2 -> value_2 as? List<Int>
|
||||
3 -> value_3 <!UNCHECKED_CAST!>as? MutableMap<Int, Int><!>
|
||||
4 -> (value_2 <!UNCHECKED_CAST!>as? Map<Int, Int><!>) as MutableMap<Int, Int>
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 13
|
||||
fun case_13(value_1: Int, value_2: Int, value_3: Int, value_4: Boolean) {
|
||||
var mutableValue1 = value_2
|
||||
var mutableValue2 = value_3
|
||||
|
||||
when (value_1) {
|
||||
1 -> ++mutableValue1
|
||||
2 -> --mutableValue2
|
||||
3 -> !value_4
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 14
|
||||
fun case_14(value_1: Int, value_2: Int, value_3: Int, value_4: Boolean?) {
|
||||
var mutableValue1 = value_2
|
||||
var mutableValue2 = value_3
|
||||
|
||||
when (value_1) {
|
||||
1 -> <!UNUSED_CHANGED_VALUE!>mutableValue1++<!>
|
||||
2 -> <!UNUSED_CHANGED_VALUE!>mutableValue2--<!>
|
||||
3 -> value_4!!
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 15
|
||||
fun case_15(value_1: Int, value_2: List<Int>, value_3: List<List<List<List<Int>>>>) {
|
||||
when (value_1) {
|
||||
1 -> value_2[0]
|
||||
2 -> value_3[0][-4][1][-1]
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 16
|
||||
fun case_16(value_1: Int, value_2: Class, value_3: Class?, value_4: Int) {
|
||||
fun __fun_1(): () -> Unit { return fun() { } }
|
||||
|
||||
when (value_1) {
|
||||
1 -> funWithoutArgs()
|
||||
2 -> __fun_1()()
|
||||
3 -> value_2.fun_2(value_4)
|
||||
4 -> value_3?.fun_2(value_4)
|
||||
5 -> value_3!!.fun_2(value_4)
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 17
|
||||
fun case_17(value_1: Int, value_2: Class, value_3: Class?) {
|
||||
when (value_1) {
|
||||
1 -> value_2.prop_1
|
||||
2 -> value_3?.prop_1
|
||||
3 -> value_2::prop_1.get()
|
||||
4 -> value_3!!::prop_3.get()
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 18
|
||||
fun case_18(value_1: Int) {
|
||||
val fun_1 = fun(): Int { return 0 }
|
||||
|
||||
when (value_1) {
|
||||
1 -> fun() {}
|
||||
2 -> fun(): Int { return 1 }
|
||||
3 -> fun(): () -> Unit { return fun() {} }
|
||||
4 -> fun_1
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 19
|
||||
fun case_19(value_1: Int): Any {
|
||||
val lambda_1 = { 0 }
|
||||
|
||||
return when (value_1) {
|
||||
1 -> lambda_1
|
||||
2 -> { { {} } }
|
||||
else -> { -> (Int)
|
||||
{ arg: Int -> { { println(arg) } } }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 20
|
||||
fun case_20(value_1: Int) {
|
||||
val object_1 = object {
|
||||
val prop_1 = 1
|
||||
}
|
||||
|
||||
when (value_1) {
|
||||
1 -> object {}
|
||||
2 -> object {
|
||||
private fun fun_1() { }
|
||||
val prop_1 = 1
|
||||
}
|
||||
3 -> object_1
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 21
|
||||
class A {
|
||||
val prop_1 = 1
|
||||
val lambda_1 = { 1 }
|
||||
fun fun_1(): Int { return 1 }
|
||||
|
||||
fun case_21(value_1: Int) {
|
||||
when (value_1) {
|
||||
1 -> this
|
||||
2 -> ((this))
|
||||
3 -> this::prop_1.get()
|
||||
4 -> this.prop_1
|
||||
5 -> this.lambda_1()
|
||||
6 -> this::lambda_1.get()()
|
||||
7 -> this.fun_1()
|
||||
8 -> this::fun_1.invoke()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 22
|
||||
fun case_22(value_1: Int) {
|
||||
when (value_1) {
|
||||
1 -> throw Exception()
|
||||
2 -> throw throw throw Exception()
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 23
|
||||
fun case_23(value_1: Int) {
|
||||
fun r_1() {
|
||||
when (value_1) {
|
||||
1 -> return
|
||||
2 -> <!UNREACHABLE_CODE!>return return<!> return
|
||||
}
|
||||
}
|
||||
|
||||
fun r_2(): List<Int>? {
|
||||
when (value_1) {
|
||||
1 -> return listOf(0, 1, 2)
|
||||
2 -> return null
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 24
|
||||
fun case_24(value_1: Int) {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
when (value_1) {
|
||||
1 -> continue@loop1
|
||||
2 -> continue@loop2
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 25
|
||||
fun case_25(value_1: Int) {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
when (value_1) {
|
||||
1 -> break@loop1
|
||||
2 -> break@loop2
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' with bound value and type test condition (without companion object in classes), but without type checking operator.
|
||||
* HELPERS: classes
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Any): String {
|
||||
when (value_1) {
|
||||
<!NO_COMPANION_OBJECT!>EmptyClass<!> -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Any): String {
|
||||
when (value_1) {
|
||||
<!NO_COMPANION_OBJECT!>Any<!> -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Any): String {
|
||||
when (value_1) {
|
||||
<!NO_COMPANION_OBJECT!>Nothing<!> -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 1
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: 'When' with bound value and type test condition on the non-type operand of the type checking operator.
|
||||
* HELPERS: classes
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Any, <!UNUSED_PARAMETER!>value_2<!>: Int): String {
|
||||
when (value_1) {
|
||||
is <!UNRESOLVED_REFERENCE!>value_2<!> -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 3
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' with bound value and 'when condition' with range expression, but without containment checking operator.
|
||||
* HELPERS: typesProvider
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int, value_2: TypesProvider): String {
|
||||
when (value_1) {
|
||||
<!INCOMPATIBLE_TYPES!>-1000L..100<!> -> return ""
|
||||
<!INCOMPATIBLE_TYPES!>value_2.getInt()..getLong()<!> -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 3
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: 'When' with bound value and 'when condition' with contains operator and type without defined contains operator.
|
||||
* HELPERS: classes
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int, value_2: EmptyClass, value_3: Int, value_4: Any): String {
|
||||
when (value_1) {
|
||||
<!TYPE_MISMATCH_IN_RANGE, UNRESOLVED_REFERENCE_WRONG_RECEIVER!>in<!> value_2 -> return ""
|
||||
<!TYPE_MISMATCH_IN_RANGE, UNRESOLVED_REFERENCE_WRONG_RECEIVER!>in<!> value_3 -> return ""
|
||||
<!TYPE_MISMATCH_IN_RANGE, UNRESOLVED_REFERENCE_WRONG_RECEIVER!>in<!> value_4 -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 2
|
||||
* DISCUSSION
|
||||
* ISSUES: KT-25948
|
||||
*/
|
||||
fun case_2(value_1: Int, value_3: Nothing) {
|
||||
when (value_1) {
|
||||
<!OVERLOAD_RESOLUTION_AMBIGUITY, TYPE_MISMATCH_IN_RANGE, UNREACHABLE_CODE!>in<!> value_3 -> <!UNREACHABLE_CODE!>{}<!>
|
||||
<!UNREACHABLE_CODE!><!OVERLOAD_RESOLUTION_AMBIGUITY, TYPE_MISMATCH_IN_RANGE!>in<!> throw Exception() -> {}<!>
|
||||
<!UNREACHABLE_CODE!><!OVERLOAD_RESOLUTION_AMBIGUITY, TYPE_MISMATCH_IN_RANGE!>in<!> return -> {}<!>
|
||||
}
|
||||
}
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VALUE -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 5
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' with bound value and non-expressions in 'when condition'.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int, value_2: List<Int>): String {
|
||||
when (value_1) {
|
||||
<!EXPRESSION_EXPECTED!>while (false) {}<!> -> return ""
|
||||
<!EXPRESSION_EXPECTED!>do {} while (false)<!> -> return ""
|
||||
<!EXPRESSION_EXPECTED!>for (value in value_2) {}<!> -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: Int): String {
|
||||
var value_2: Int
|
||||
var value_3 = 10
|
||||
|
||||
when (value_1) {
|
||||
<!ASSIGNMENT_IN_EXPRESSION_CONTEXT!>value_2 = 10<!> -> return ""
|
||||
<!ASSIGNMENT_IN_EXPRESSION_CONTEXT!>value_3 %= 10<!> -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 5
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: 'When' with bound value and not allowed break and continue expression (without labels) in 'when condition'.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): String {
|
||||
while (true) {
|
||||
when (value_1) {
|
||||
<!BREAK_OR_CONTINUE_IN_WHEN!>break<!><!UNREACHABLE_CODE!><!> -> <!UNREACHABLE_CODE!>return ""<!>
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int): String {
|
||||
while (true) {
|
||||
when (value_1) {
|
||||
<!BREAK_OR_CONTINUE_IN_WHEN!>continue<!><!UNREACHABLE_CODE!><!> -> <!UNREACHABLE_CODE!>return ""<!>
|
||||
}
|
||||
}
|
||||
|
||||
<!UNREACHABLE_CODE!>return ""<!>
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
// !DIAGNOSTICS: -UNUSED_EXPRESSION
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 7
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' with bound value and with else branch not in the last position.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): String = when (value_1) {
|
||||
<!ELSE_MISPLACED_IN_WHEN!>else<!> -> ""
|
||||
<!UNREACHABLE_CODE!>1 -> ""<!>
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int): String = when (value_1) {
|
||||
1 -> ""
|
||||
<!ELSE_MISPLACED_IN_WHEN!>else<!> -> ""
|
||||
<!UNREACHABLE_CODE!>2 -> ""<!>
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Int): String {
|
||||
when (value_1) {
|
||||
<!ELSE_MISPLACED_IN_WHEN!>else<!> -> return ""
|
||||
<!UNREACHABLE_CODE!>else -> return ""<!>
|
||||
}
|
||||
|
||||
<!UNREACHABLE_CODE!>return ""<!>
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' with bound value and type test condition.
|
||||
* HELPERS: classes, objects
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Any): String {
|
||||
when (value_1) {
|
||||
is Int -> return ""
|
||||
is Float -> return ""
|
||||
is Double -> return ""
|
||||
is String -> return ""
|
||||
is Char -> return ""
|
||||
is Boolean -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Any?): String = when (value_1) {
|
||||
is Int? -> "" // if value is null then this branch will be executed
|
||||
is Float -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Any?): String = when (value_1) {
|
||||
is Any -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: Any): String = when (value_1) {
|
||||
<!USELESS_IS_CHECK!>is Any<!USELESS_NULLABLE_CHECK!>?<!><!> -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 5
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_5(value_1: Any?): String = when (value_1) {
|
||||
is Double -> ""
|
||||
is Int? -> "" // if value is null then this branch will be executed
|
||||
is String -> ""
|
||||
is Float? -> "" // redundant nullable type check
|
||||
is Char -> ""
|
||||
is Boolean -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: Any): String {
|
||||
when (value_1) {
|
||||
is EmptyObject -> return ""
|
||||
is ClassWithCompanionObject.Companion -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 1
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: 'When' with bound value and type test condition (invert type checking operator).
|
||||
* HELPERS: classes, sealedClasses, objects
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: SealedClass) = when (value_1) {
|
||||
!is SealedChild1 -> {}
|
||||
!is SealedChild2 -> {}
|
||||
!is SealedChild3 -> {}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 2
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_2(value_1: SealedClass?): String = when (value_1) {
|
||||
!is SealedChild2 -> "" // including null
|
||||
<!USELESS_IS_CHECK!>is SealedChild2<!> -> ""
|
||||
null -> "" // redundant
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: SealedClass?): String = when (value_1) {
|
||||
!is SealedChild2? -> "" // null isn't included
|
||||
is SealedChild2 -> ""
|
||||
null -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 4
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_4(value_1: SealedClass?) {
|
||||
when (value_1) {
|
||||
!is SealedChild2 -> {} // including null
|
||||
<!USELESS_IS_CHECK!>is SealedChild2?<!> -> {} // redundant nullable type check
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: Any): String {
|
||||
when (value_1) {
|
||||
is EmptyObject -> return ""
|
||||
!is ClassWithCompanionObject.Companion -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 1
|
||||
* NUMBER: 3
|
||||
* DESCRIPTION: 'When' with bound value and enumaration of type test conditions.
|
||||
* HELPERS: classes, sealedClasses, objects
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Any) = when (value_1) {
|
||||
is Int -> {}
|
||||
is Float, is Char, is Boolean -> {}
|
||||
is String -> {}
|
||||
else -> {}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Any?) = when (value_1) {
|
||||
is Float, is Char, is SealedClass? -> "" // if value is null then this branch will be executed
|
||||
is Double, is Boolean, is ClassWithCompanionObject.Companion -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 3
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_3(value_1: Any?) = when (value_1) {
|
||||
is Float, is Char, is Int? -> "" // if value is null then this branch will be executed
|
||||
is SealedChild2, is Boolean?, is String -> "" // redundant nullable type check
|
||||
else -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 4
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_4(value_1: Any?) = when (value_1) {
|
||||
is Float, is Char?, is Int? -> "" // double nullable type check in the one branch
|
||||
is SealedChild1, is Boolean, is String -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 5
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_5(value_1: Any?): String {
|
||||
when (value_1) {
|
||||
is Float, is Char?, is Int -> return ""
|
||||
is Double, is EmptyObject, is String -> return ""
|
||||
null -> return "" // null-check redundant
|
||||
else -> return ""
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 6
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_6(value_1: Any?): String {
|
||||
when (value_1) {
|
||||
is Float, is Char?, null, is Int -> return "" // double nullable type check in the one branch
|
||||
is Double, is EmptyObject, is String -> return ""
|
||||
else -> return ""
|
||||
}
|
||||
}
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 1
|
||||
* NUMBER: 4
|
||||
* DESCRIPTION: 'When' with bound value and enumaration of type test conditions (with invert type checking operator).
|
||||
* HELPERS: sealedClasses
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: SealedClass): String = when (value_1) {
|
||||
is SealedChild1, !is SealedChild3 -> ""
|
||||
<!USELESS_IS_CHECK!>is SealedChild3<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: SealedClass) = when (value_1) {
|
||||
!is SealedChild1, !is SealedChild2, !is SealedChild3 -> {}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: SealedClass): String = when (value_1) {
|
||||
is SealedChild2, !is SealedChild2 -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: SealedClass): String = when (value_1) {
|
||||
!is SealedChild1, <!USELESS_IS_CHECK!>is SealedChild1<!> -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: Any?): String = when (value_1) {
|
||||
is SealedChild3, !is SealedChild3? -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 6
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_6(value_1: Any?): String = when (value_1) {
|
||||
is Boolean?, !is SealedChild3 -> "" // double nullable type check in the one branch
|
||||
<!USELESS_IS_CHECK!>is SealedChild3<!> -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 7
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-22996
|
||||
*/
|
||||
fun case_7(value_1: Any?): String = when (value_1) {
|
||||
is Number?, null, !is SealedChild3 -> "" // triple nullable type check in the one branch
|
||||
else -> ""
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 3
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' with bound value and containment operator.
|
||||
* HELPERS: typesProvider, classes
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int, value_2: Int, value_3: Short): String {
|
||||
when (value_1) {
|
||||
in Long.MIN_VALUE..-100 -> return ""
|
||||
in -99..0 -> return ""
|
||||
!in 100.toByte()..value_2 -> return ""
|
||||
in value_2..value_3 -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int, value_2: List<IntArray>, value_3: Class) = when (value_1) {
|
||||
in value_2[0] -> ""
|
||||
!in listOf(0, 1, 2, 3, 4) -> ""
|
||||
!in value_3.getIntArray() -> ""
|
||||
else -> ""
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 3
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: 'When' with bound value and enumeration of the containment operators.
|
||||
* HELPERS: typesProvider, classes
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int, value_2: Int, value_3: Short): String {
|
||||
when (value_1) {
|
||||
in Long.MIN_VALUE..-100, in -99..0 -> return ""
|
||||
!in 100.toByte()..value_2, in value_2..value_3 -> return ""
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int, value_2: List<IntArray>, value_3: Class) = when (value_1) {
|
||||
!in value_2[0], !in listOf(0, 1, 2, 3, 4), !in value_3.getIntArray() -> ""
|
||||
else -> ""
|
||||
}
|
||||
+286
@@ -0,0 +1,286 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 5
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' with enumeration of the different variants of expressions in 'when condition'.
|
||||
* HELPERS: typesProvider, classes, functions
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Any?) {
|
||||
when (value_1) {
|
||||
true -> {}
|
||||
100 -> {}
|
||||
-.09f -> {}
|
||||
'.' -> {}
|
||||
"..." -> {}
|
||||
null -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Number, value_2: Int) {
|
||||
when (value_1) {
|
||||
-.09 % 10L -> {}
|
||||
value_2 / -5 -> {}
|
||||
getByte() - 11 + 90 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Boolean, value_2: Boolean, value_3: Long) {
|
||||
when (value_1) {
|
||||
value_2 -> {}
|
||||
!value_2 -> {}
|
||||
getBoolean() && value_2 -> {}
|
||||
getChar() != 'a' -> {}
|
||||
getList() === getAny() -> {}
|
||||
value_3 <= 11 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: String, value_2: String, value_3: String) {
|
||||
when (value_1) {
|
||||
"..." + value_2 + "" + "$value_3" + "..." -> {}
|
||||
value_2 + getString() -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: Int, value_2: Int, value_3: Boolean?) {
|
||||
when (value_1) {
|
||||
when {
|
||||
value_2 > 1000 -> 1
|
||||
value_2 > 100 -> 2
|
||||
else -> 3
|
||||
} -> {}
|
||||
when (value_3) {
|
||||
true -> 1
|
||||
false -> 2
|
||||
null -> 3
|
||||
} -> {}
|
||||
when (value_3!!) {
|
||||
true -> 1
|
||||
false -> 2
|
||||
} -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: Int, value_2: Int) {
|
||||
when (value_1) {
|
||||
if (value_2 > 1000) 1
|
||||
else 2 -> {}
|
||||
if (value_2 < 100) 1
|
||||
else if (value_2 < 10) 2
|
||||
else 3 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(value_1: Any, value_2: String, value_3: String) {
|
||||
when (value_1) {
|
||||
try { 4 } catch (e: Exception) { 5 } -> {}
|
||||
try { throw Exception() } catch (e: Exception) { value_2 } -> {}
|
||||
try { throw Exception() } catch (e: Exception) { {value_3} } finally { } -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 8
|
||||
fun case_8(value_1: Int, value_2: Int?, value_3: Int?) {
|
||||
when (value_1) {
|
||||
value_2 ?: 0 -> {}
|
||||
value_2 ?: value_3 ?: 0 -> {}
|
||||
value_2!! <!USELESS_ELVIS!>?: 0<!> -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 9
|
||||
fun case_9(value_1: Any) {
|
||||
when (value_1) {
|
||||
1..10 -> {}
|
||||
-100L..100L -> {}
|
||||
-getInt()..getLong() -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 10
|
||||
fun case_10(value_1: Collection<Int>, value_2: Collection<Int>, value_3: Collection<Int>?) {
|
||||
when (value_1) {
|
||||
value_2 as List<Int> -> {}
|
||||
value_2 <!USELESS_CAST!>as? List<Int><!> -> {}
|
||||
value_3 <!UNCHECKED_CAST!>as? MutableMap<Int, Int><!> -> {}
|
||||
(value_2 <!UNCHECKED_CAST!>as? Map<Int, Int><!>) as MutableMap<Int, Int> -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 11
|
||||
fun case_11(value_1: Any, value_2: Int, value_3: Int, value_4: Boolean) {
|
||||
var mutableValue1 = value_2
|
||||
var mutableValue2 = value_3
|
||||
|
||||
when (value_1) {
|
||||
++mutableValue1 -> {}
|
||||
--mutableValue2 -> {}
|
||||
!value_4 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 12
|
||||
fun case_12(value_1: Int, value_2: Int, value_3: Int, value_4: Int?) {
|
||||
var mutableValue1 = value_2
|
||||
var mutableValue2 = value_3
|
||||
|
||||
when (value_1) {
|
||||
<!UNUSED_CHANGED_VALUE!>mutableValue1++<!> -> {}
|
||||
<!UNUSED_CHANGED_VALUE!>mutableValue2--<!> -> {}
|
||||
value_4!! -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 13
|
||||
fun case_13(value_1: Int, value_2: List<Int>, value_3: List<List<List<List<Int>>>>) {
|
||||
when (value_1) {
|
||||
value_2[0] -> {}
|
||||
value_3[0][-4][1][-1] -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 14
|
||||
fun case_14(value_1: Any, value_2: Class, value_3: Class?, value_4: Int) {
|
||||
fun __fun_1(): () -> Any { return fun() { } }
|
||||
|
||||
when (value_1) {
|
||||
funWithoutArgs() -> {}
|
||||
__fun_1()() -> {}
|
||||
value_2.fun_2(value_4) -> {}
|
||||
value_3?.fun_2(value_4) -> {}
|
||||
value_3!!.fun_2(value_4) -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 15
|
||||
fun case_15(value_1: Int, value_2: Class, value_3: Class?) {
|
||||
when (value_1) {
|
||||
value_2.prop_1 -> {}
|
||||
value_3?.prop_2 -> {}
|
||||
value_2::prop_1.get() -> {}
|
||||
value_3!!::prop_3.get() -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 16
|
||||
fun case_16(value_1: () -> Any): Any {
|
||||
val fun_1 = fun() { return }
|
||||
|
||||
return when (value_1) {
|
||||
fun() {} -> {}
|
||||
fun() { return } -> {}
|
||||
fun(): () -> Unit { return fun() {} } -> {}
|
||||
fun_1 -> {}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 17
|
||||
fun case_17(value_1: () -> Any) {
|
||||
val lambda_1 = { 0 }
|
||||
|
||||
when (value_1) {
|
||||
lambda_1 -> {}
|
||||
{ { {} } } -> {}
|
||||
{ -> (Int)
|
||||
{ arg: Int -> { { println(arg) } } }
|
||||
} -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 18
|
||||
fun case_18(value_1: Any) {
|
||||
val object_1 = object {
|
||||
val prop_1 = 1
|
||||
}
|
||||
|
||||
when (value_1) {
|
||||
object {} -> {}
|
||||
object {
|
||||
private fun fun_1() { }
|
||||
val prop_1 = 1
|
||||
} -> {}
|
||||
object_1 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 19
|
||||
class A {
|
||||
val prop_1 = 1
|
||||
val lambda_1 = { 1 }
|
||||
fun fun_1(): Int { return 1 }
|
||||
|
||||
fun case_19(value_1: Any) {
|
||||
when (value_1) {
|
||||
this -> {}
|
||||
((this)) -> {}
|
||||
this::prop_1.get() -> {}
|
||||
this.prop_1 -> {}
|
||||
this.lambda_1() -> {}
|
||||
this::lambda_1.get()() -> {}
|
||||
this.fun_1() -> {}
|
||||
this::fun_1.invoke() -> {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 20
|
||||
fun case_20(value_1: Nothing) {
|
||||
when (value_1) {
|
||||
<!UNREACHABLE_CODE!>throw Exception() -> {}<!>
|
||||
<!UNREACHABLE_CODE!>throw throw throw Exception() -> {}<!>
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 21
|
||||
fun case_21(value_1: Nothing) {
|
||||
fun f1() {
|
||||
when (value_1) {
|
||||
<!UNREACHABLE_CODE!>return -> 1<!>
|
||||
<!UNREACHABLE_CODE!>return return return -> 2<!>
|
||||
}
|
||||
}
|
||||
|
||||
fun f2(): List<Int>? {
|
||||
when (value_1) {
|
||||
<!UNREACHABLE_CODE!>return listOf(0, 1, 2) -> 1<!>
|
||||
<!UNREACHABLE_CODE!>return null -> 2<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 22
|
||||
fun case_22(value_1: Nothing) {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
when (value_1) {
|
||||
<!UNREACHABLE_CODE!>continue@loop1 -> 1<!>
|
||||
<!UNREACHABLE_CODE!>continue@loop2 -> 2<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 23
|
||||
fun case_23(value_1: Nothing) {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
when (value_1) {
|
||||
<!UNREACHABLE_CODE!>break@loop1 -> 1<!>
|
||||
<!UNREACHABLE_CODE!>break@loop2 -> 2<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+263
@@ -0,0 +1,263 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 5
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: 'When' with different variants of the arithmetic expressions (additive expression and multiplicative expression) in 'when condition'.
|
||||
* HELPERS: typesProvider, classes, functions
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Any?) {
|
||||
when (value_1) {
|
||||
true, 100, -.09f -> {}
|
||||
'.', "...", null -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Number, value_2: Int) {
|
||||
when (value_1) {
|
||||
-.09 % 10L, value_2 / -5, getByte() - 11 + 90 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Boolean, value_2: Boolean, value_3: Long) {
|
||||
when (value_1) {
|
||||
value_2, !value_2, getBoolean() && value_2, getChar() != 'a' -> {}
|
||||
getList() === getAny(), value_3 <= 11 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: String, value_2: String, value_3: String) {
|
||||
when (value_1) {
|
||||
"..." + value_2 + "" + "$value_3" + "...", value_2 + getString() -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: Int, value_2: Int, value_3: Boolean?) {
|
||||
when (value_1) {
|
||||
when {
|
||||
value_2 > 1000 -> 1
|
||||
value_2 > 100 -> 2
|
||||
else -> 3
|
||||
}, when (value_3) {
|
||||
true -> 1
|
||||
false -> 2
|
||||
null -> 3
|
||||
}, when (value_3!!) {
|
||||
true -> 1
|
||||
false -> 2
|
||||
} -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: Int, value_2: Int) {
|
||||
when (value_1) {
|
||||
if (value_2 > 1000) 1 else 2, if (value_2 < 100) 1 else if (value_2 < 10) 2 else 3 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(value_1: Any, value_2: String, value_3: String) {
|
||||
when (value_1) {
|
||||
try { 4 } catch (e: Exception) { 5 }, try { throw Exception() } catch (e: Exception) { value_2 }, try { throw Exception() } catch (e: Exception) { {value_3} } finally { } -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 8
|
||||
fun case_8(value_1: Int, value_2: Int?, value_3: Int?) {
|
||||
when (value_1) {
|
||||
value_2 ?: 0, value_2 ?: value_3 ?: 0, value_2!! <!USELESS_ELVIS!>?: 0<!> -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 9
|
||||
fun case_9(value_1: Any) {
|
||||
when (value_1) {
|
||||
1..10, -100L..100L, -getInt()..getLong() -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 10
|
||||
fun case_10(value_1: Collection<Int>, value_2: Collection<Int>, value_3: Collection<Int>?) {
|
||||
when (value_1) {
|
||||
value_2 as List<Int>, value_2 <!USELESS_CAST!>as? List<Int><!> -> {}
|
||||
value_3 <!UNCHECKED_CAST!>as? MutableMap<Int, Int><!>, (value_2 <!UNCHECKED_CAST!>as? Map<Int, Int><!>) as MutableMap<Int, Int> -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 11
|
||||
fun case_11(value_1: Any, value_2: Int, value_3: Int, value_4: Boolean) {
|
||||
var mutableValue1 = value_2
|
||||
var mutableValue2 = value_3
|
||||
|
||||
when (value_1) {
|
||||
++mutableValue1, --mutableValue2, !value_4 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 12
|
||||
fun case_12(value_1: Int, value_2: Int, value_3: Int, value_4: Int?) {
|
||||
var mutableValue1 = value_2
|
||||
var mutableValue2 = value_3
|
||||
|
||||
when (value_1) {
|
||||
<!UNUSED_CHANGED_VALUE!>mutableValue1++<!>, <!UNUSED_CHANGED_VALUE!>mutableValue2--<!>, value_4!! -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 13
|
||||
fun case_13(value_1: Int, value_2: List<Int>, value_3: List<List<List<List<Int>>>>) {
|
||||
when (value_1) {
|
||||
value_2[0], value_3[0][-4][1][-1] -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 14
|
||||
fun case_14(value_1: Any, value_2: Class, value_3: Class?, value_4: Int) {
|
||||
fun __fun_1(): () -> Unit { return fun() { } }
|
||||
|
||||
when (value_1) {
|
||||
funWithoutArgs(), __fun_1()(), value_2.fun_2(value_4) -> {}
|
||||
value_3?.fun_2(value_4), value_3!!.fun_2(value_4) -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 15
|
||||
fun case_15(value_1: Int, value_2: Class, value_3: Class?) {
|
||||
when (value_1) {
|
||||
value_2.prop_1, value_3?.prop_2 -> {}
|
||||
value_2::prop_1.get(), value_3!!::prop_3.get() -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 16
|
||||
fun case_16(value_1: () -> Any): Any {
|
||||
val fun_1 = fun() { return }
|
||||
|
||||
return when (value_1) {
|
||||
fun() {}, fun() { return }, fun(): () -> Unit { return fun() {} }, fun_1 -> {}
|
||||
else -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 17
|
||||
fun case_17(value_1: () -> Any) {
|
||||
val lambda_1 = { 0 }
|
||||
|
||||
when (value_1) {
|
||||
lambda_1, { { {} } }, { -> (Int)
|
||||
{ arg: Int -> { { println(arg) } } } } -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 18
|
||||
fun case_18(value_1: Any) {
|
||||
val object_1 = object {
|
||||
val prop_1 = 1
|
||||
}
|
||||
|
||||
when (value_1) {
|
||||
object {}, object {
|
||||
private fun fun_1() { }
|
||||
val prop_1 = 1
|
||||
}, object_1 -> {}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 19
|
||||
class A {
|
||||
val prop_1 = 1
|
||||
val lambda_1 = { 1 }
|
||||
fun fun_1(): Int { return 1 }
|
||||
|
||||
fun case_19(value_1: Any) {
|
||||
when (value_1) {
|
||||
this, ((this)), this::prop_1.get() -> {}
|
||||
this.prop_1, this.lambda_1() -> {}
|
||||
this::lambda_1.get()(), this.fun_1(), this::fun_1.invoke() -> {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 20
|
||||
fun case_20(value_1: Nothing) {
|
||||
when (value_1) {
|
||||
<!UNREACHABLE_CODE!>throw Exception(), throw throw throw Exception() -> {}<!>
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 21
|
||||
fun case_21(value_1: Nothing) {
|
||||
fun f1() {
|
||||
when (value_1) {
|
||||
<!UNREACHABLE_CODE!>return, return return return -> 2<!>
|
||||
}
|
||||
}
|
||||
|
||||
fun f2(): List<Int>? {
|
||||
when (value_1) {
|
||||
<!UNREACHABLE_CODE!>return listOf(0, 1, 2), return null -> 2<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 22
|
||||
fun case_22(value_1: Nothing) {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
when (value_1) {
|
||||
<!UNREACHABLE_CODE!>continue@loop1, continue@loop2 -> 2<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 23
|
||||
fun case_23(value_1: Nothing) {
|
||||
loop1@ while (true) {
|
||||
loop2@ while (true) {
|
||||
when (value_1) {
|
||||
<!UNREACHABLE_CODE!>break@loop1, break@loop2 -> 2<!>
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 24
|
||||
fun case_24(value_1: Nothing?) = when (<!DEBUG_INFO_CONSTANT!>value_1<!>) {
|
||||
throw Exception()<!UNREACHABLE_CODE!><!>, <!UNREACHABLE_CODE!>return ""<!> -> <!UNREACHABLE_CODE!>""<!>
|
||||
<!UNREACHABLE_CODE!>null, return return return "", throw throw throw Exception() -> ""<!>
|
||||
<!UNREACHABLE_CODE!>else -> ""<!>
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 25
|
||||
* DISCUSSION
|
||||
* ISSUES: KT-25948
|
||||
*/
|
||||
fun case_25(value_1: Boolean) = when (value_1) {
|
||||
true -> {}
|
||||
throw Exception()<!UNREACHABLE_CODE!><!>, <!UNREACHABLE_CODE!>return<!> -> <!UNREACHABLE_CODE!>{}<!>
|
||||
<!UNREACHABLE_CODE!>false, return return return, throw throw throw Exception() -> {}<!>
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 26
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-26045
|
||||
*/
|
||||
fun case_26(value_1: Int?, value_2: Class, value_3: Class?) {
|
||||
when (value_1) {
|
||||
value_2.prop_1, <!DUPLICATE_LABEL_IN_WHEN!>value_3?.prop_1<!> -> {}
|
||||
10 -> {}
|
||||
}
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 7 -> sentence 7
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' with bound value and else branch.
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int?) = when (value_1) {
|
||||
0 -> ""
|
||||
1 -> ""
|
||||
2 -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Any) = when (value_1) {
|
||||
is Int -> ""
|
||||
is Boolean -> ""
|
||||
is String -> ""
|
||||
else -> ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Int) = when (value_1) {
|
||||
in -10..10 -> ""
|
||||
in 11..1000 -> ""
|
||||
in 1000..Int.MAX_VALUE -> ""
|
||||
else -> ""
|
||||
}
|
||||
+143
@@ -0,0 +1,143 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 9 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' least upper bound of the types check (when exhaustive via else branch).
|
||||
* HELPERS: classes, checkType
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): String {
|
||||
val whenValue = when {
|
||||
value_1 == 0 -> ClassLevel2()
|
||||
value_1 > 0 && value_1 <= 10 -> ClassLevel3()
|
||||
value_1 > 10 && value_1 <= 100 -> ClassLevel4()
|
||||
else -> ClassLevel5()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel5>() }
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel5>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int): String {
|
||||
val whenValue = when (value_1) {
|
||||
0 -> ClassLevel2()
|
||||
1 -> ClassLevel3()
|
||||
2 -> ClassLevel4()
|
||||
else -> ClassLevel5()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel5>() }
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel5>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Int): String {
|
||||
val whenValue = when {
|
||||
value_1 == 0 -> <!IMPLICIT_CAST_TO_ANY!>1 + 1<!>
|
||||
value_1 == 1 -> <!IMPLICIT_CAST_TO_ANY!>1 + 1L<!>
|
||||
value_1 == 2 -> <!IMPLICIT_CAST_TO_ANY!>1 + -.122<!>
|
||||
value_1 == 3 -> <!IMPLICIT_CAST_TO_ANY!>1 + -.000f<!>
|
||||
value_1 == 4 -> <!IMPLICIT_CAST_TO_ANY!>1 + 10.toShort()<!>
|
||||
else -> <!IMPLICIT_CAST_TO_ANY!>1 + 10.toByte()<!>
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Long>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Double>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Float>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Short>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Byte>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<Long>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<Double>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<Float>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<Short>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<Byte>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: Int): String {
|
||||
val whenValue = when (value_1) {
|
||||
0 -> <!IMPLICIT_CAST_TO_ANY!>1 + 1<!>
|
||||
1 -> <!IMPLICIT_CAST_TO_ANY!>1 + 1L<!>
|
||||
2 -> <!IMPLICIT_CAST_TO_ANY!>1 + -.122<!>
|
||||
3 -> <!IMPLICIT_CAST_TO_ANY!>1 + -.000f<!>
|
||||
4 -> <!IMPLICIT_CAST_TO_ANY!>1 + 10.toShort()<!>
|
||||
else -> <!IMPLICIT_CAST_TO_ANY!>1 + 10.toByte()<!>
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Long>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Double>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Float>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Short>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Byte>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<Long>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<Double>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<Float>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<Short>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<Byte>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: Int): String {
|
||||
val whenValue = when {
|
||||
value_1 == 0 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
value_1 > 0 && value_1 <= 10 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
value_1 > 10 && value_1 <= 100 -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
else -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><String>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><() -> Unit>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<String>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<() -> Unit>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: Int): String {
|
||||
val whenValue = when (value_1) {
|
||||
0 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
1 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
2 -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
else -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><String>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><() -> Unit>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<String>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<() -> Unit>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 9 -> sentence 1
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: 'When' least upper bound of the types check (when exhaustive via enum).
|
||||
* HELPERS: classes, enumClasses, checkType
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: EnumClass): String {
|
||||
val whenValue = when (value_1) {
|
||||
EnumClass.EAST -> ClassLevel2()
|
||||
EnumClass.NORTH -> ClassLevel3()
|
||||
EnumClass.SOUTH -> ClassLevel4()
|
||||
EnumClass.WEST -> ClassLevel5()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel5>() }
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel5>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: EnumClass?): String {
|
||||
val whenValue = when (value_1) {
|
||||
EnumClass.EAST -> ClassLevel2()
|
||||
EnumClass.NORTH -> ClassLevel3()
|
||||
EnumClass.SOUTH -> ClassLevel4()
|
||||
EnumClass.WEST -> ClassLevel5()
|
||||
null -> ClassLevel6()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel5>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel6>() }
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel5>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel6>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: EnumClass): String {
|
||||
val whenValue = when (value_1) {
|
||||
EnumClass.EAST -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
EnumClass.NORTH -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
EnumClass.SOUTH -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
EnumClass.WEST -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><String>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><() -> Unit>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<String>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<() -> Unit>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: EnumClass?): String {
|
||||
val whenValue = when (value_1) {
|
||||
EnumClass.EAST -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
EnumClass.NORTH -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
EnumClass.SOUTH -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
EnumClass.WEST -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
null -> <!IMPLICIT_CAST_TO_ANY!>false<!>
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><String>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><() -> Unit>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<String>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<() -> Unit>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
+78
@@ -0,0 +1,78 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 9 -> sentence 1
|
||||
* NUMBER: 3
|
||||
* DESCRIPTION: 'When' least upper bound of the types check (when exhaustive via boolean bound value).
|
||||
* HELPERS: classes, checkType
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Boolean): String {
|
||||
val whenValue = when (value_1) {
|
||||
true -> ClassLevel2()
|
||||
false -> ClassLevel3()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Boolean?): String {
|
||||
val whenValue = when (value_1) {
|
||||
true -> ClassLevel2()
|
||||
false -> ClassLevel3()
|
||||
null -> ClassLevel4()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Boolean): String {
|
||||
val whenValue = when (value_1) {
|
||||
true -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
false -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><String>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<String>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: Boolean?): String {
|
||||
val whenValue = when (value_1) {
|
||||
true -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
false -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
null -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
}
|
||||
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><String>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><() -> Unit>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<String>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<() -> Unit>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
+173
@@ -0,0 +1,173 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (NEGATIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 9 -> sentence 1
|
||||
* NUMBER: 4
|
||||
* DESCRIPTION: 'When' least upper bound of the types check (when exhaustive via sealed class).
|
||||
* HELPERS: classes, sealedClasses, checkType
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: SealedClass): String {
|
||||
val whenValue = when (value_1) {
|
||||
is SealedChild1 -> ClassLevel2()
|
||||
is SealedChild2 -> ClassLevel3()
|
||||
is SealedChild3 -> ClassLevel4()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: SealedClass?): String {
|
||||
val whenValue = when (value_1) {
|
||||
is SealedChild1 -> ClassLevel2()
|
||||
is SealedChild2 -> ClassLevel3()
|
||||
is SealedChild3 -> ClassLevel4()
|
||||
null -> ClassLevel5()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel5>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
checkSubtype<ClassLevel5>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: SealedClass): String {
|
||||
val whenValue = when (value_1) {
|
||||
is SealedChild1 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
is SealedChild2 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
is SealedChild3 -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><String>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<String>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: SealedClass?): String {
|
||||
val whenValue = when (value_1) {
|
||||
is SealedChild1 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
is SealedChild2 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
is SealedChild3 -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
null -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><String>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><() -> Unit>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<String>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<() -> Unit>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: SealedClassWithObjects): String {
|
||||
val whenValue = when (value_1) {
|
||||
SealedWithObjectsChild1 -> ClassLevel2()
|
||||
SealedWithObjectsChild2 -> ClassLevel3()
|
||||
SealedWithObjectsChild3 -> ClassLevel4()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: SealedClassWithObjects?): String {
|
||||
val whenValue = when (value_1) {
|
||||
SealedWithObjectsChild1 -> ClassLevel2()
|
||||
SealedWithObjectsChild2 -> ClassLevel3()
|
||||
SealedWithObjectsChild3 -> ClassLevel4()
|
||||
null -> ClassLevel5()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel5>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
checkSubtype<ClassLevel5>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(value_1: SealedClassWithObjects): String {
|
||||
val whenValue = when (value_1) {
|
||||
SealedWithObjectsChild1 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
SealedWithObjectsChild2 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
SealedWithObjectsChild3 -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><String>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<String>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 8
|
||||
fun case_8(value_1: SealedClassWithObjects?): String {
|
||||
val whenValue = when (value_1) {
|
||||
SealedWithObjectsChild1 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
SealedWithObjectsChild2 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
SealedWithObjectsChild3 -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
null -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Int>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><String>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><() -> Unit>() }
|
||||
checkSubtype<Int>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<String>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<() -> Unit>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 9
|
||||
fun case_9(value_1: SealedClassWithObjects?): String {
|
||||
val whenValue = when (value_1) {
|
||||
is SealedClassWithObjects -> ClassLevel2()
|
||||
else -> ClassLevel3()
|
||||
}
|
||||
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel5>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel4>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel3>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><ClassLevel1>() }
|
||||
checkSubtype<ClassLevel5>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel4>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
checkSubtype<ClassLevel3>(<!TYPE_MISMATCH!>whenValue<!>)
|
||||
|
||||
return ""
|
||||
}
|
||||
+115
@@ -0,0 +1,115 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 9 -> sentence 1
|
||||
* NUMBER: 1
|
||||
* DESCRIPTION: 'When' least upper bound of the types check (when exhaustive via else branch).
|
||||
* HELPERS: classes, checkType
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Int): String {
|
||||
val whenValue = when {
|
||||
value_1 == 0 -> ClassLevel2()
|
||||
value_1 > 0 && value_1 <= 10 -> ClassLevel3()
|
||||
value_1 > 10 && value_1 <= 100 -> ClassLevel4()
|
||||
else -> ClassLevel5()
|
||||
}
|
||||
|
||||
whenValue checkType { check<ClassLevel2>() }
|
||||
checkSubtype<ClassLevel1>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Int): String {
|
||||
val whenValue = when (value_1) {
|
||||
0 -> ClassLevel2()
|
||||
1 -> ClassLevel3()
|
||||
2 -> ClassLevel4()
|
||||
else -> ClassLevel5()
|
||||
}
|
||||
|
||||
whenValue checkType { check<ClassLevel2>() }
|
||||
checkSubtype<ClassLevel1>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 3
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-25268
|
||||
*/
|
||||
fun case_3(value_1: Int): String {
|
||||
val whenValue = when {
|
||||
value_1 == 0 -> <!IMPLICIT_CAST_TO_ANY!>1 + 1<!>
|
||||
value_1 == 1 -> <!IMPLICIT_CAST_TO_ANY!>1 + 1L<!>
|
||||
value_1 == 2 -> <!IMPLICIT_CAST_TO_ANY!>1 + -.122<!>
|
||||
value_1 == 3 -> <!IMPLICIT_CAST_TO_ANY!>1 + -.000f<!>
|
||||
value_1 == 4 -> <!IMPLICIT_CAST_TO_ANY!>1 + 10.toShort()<!>
|
||||
else -> <!IMPLICIT_CAST_TO_ANY!>1 + 10.toShort()<!>
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Number>() } // unexpected behaviour!
|
||||
checkSubtype<Number>(<!TYPE_MISMATCH!>whenValue<!>) // unexpected behaviour!
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
/*
|
||||
* TESTCASE NUMBER: 4
|
||||
* UNEXPECTED BEHAVIOUR
|
||||
* ISSUES: KT-25268
|
||||
*/
|
||||
fun case_4(value_1: Int): String {
|
||||
val whenValue = when (value_1) {
|
||||
0 -> <!IMPLICIT_CAST_TO_ANY!>1 + 1<!>
|
||||
1 -> <!IMPLICIT_CAST_TO_ANY!>1 + 1L<!>
|
||||
2 -> <!IMPLICIT_CAST_TO_ANY!>1 + -.122<!>
|
||||
3 -> <!IMPLICIT_CAST_TO_ANY!>1 + -.000f<!>
|
||||
4 -> <!IMPLICIT_CAST_TO_ANY!>1 + 10.toShort()<!>
|
||||
else -> <!IMPLICIT_CAST_TO_ANY!>1 + 10.toByte()<!>
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
whenValue checkType { <!TYPE_MISMATCH!>check<!><Number>() } // unexpected behaviour!
|
||||
checkSubtype<Number>(<!TYPE_MISMATCH!>whenValue<!>) // unexpected behaviour!
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: Int): String {
|
||||
val whenValue = when {
|
||||
value_1 == 0 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
value_1 > 0 && value_1 <= 10 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
value_1 > 10 && value_1 <= 100 -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
else -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
checkSubtype<Any>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: Int): String {
|
||||
val whenValue = when (value_1) {
|
||||
0 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
1 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
2 -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
else -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
checkSubtype<Any>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 9 -> sentence 1
|
||||
* NUMBER: 2
|
||||
* DESCRIPTION: 'When' least upper bound of the types check (when exhaustive via enum).
|
||||
* HELPERS: classes, enumClasses, checkType
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: EnumClass): String {
|
||||
val whenValue = when (value_1) {
|
||||
EnumClass.EAST -> ClassLevel2()
|
||||
EnumClass.NORTH -> ClassLevel3()
|
||||
EnumClass.SOUTH -> ClassLevel4()
|
||||
EnumClass.WEST -> ClassLevel5()
|
||||
}
|
||||
|
||||
whenValue checkType { check<ClassLevel2>() }
|
||||
checkSubtype<ClassLevel1>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: EnumClass?): String {
|
||||
val whenValue = when (value_1) {
|
||||
EnumClass.EAST -> ClassLevel2()
|
||||
EnumClass.NORTH -> ClassLevel3()
|
||||
EnumClass.SOUTH -> ClassLevel4()
|
||||
EnumClass.WEST -> ClassLevel5()
|
||||
null -> ClassLevel6()
|
||||
}
|
||||
|
||||
whenValue checkType { check<ClassLevel2>() }
|
||||
checkSubtype<ClassLevel1>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: EnumClass): String {
|
||||
val whenValue = when (value_1) {
|
||||
EnumClass.EAST -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
EnumClass.NORTH -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
EnumClass.SOUTH -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
EnumClass.WEST -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
checkSubtype<Any>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: EnumClass?): String {
|
||||
val whenValue = when (value_1) {
|
||||
EnumClass.EAST -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
EnumClass.NORTH -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
EnumClass.SOUTH -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
EnumClass.WEST -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
null -> <!IMPLICIT_CAST_TO_ANY!>false<!>
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
checkSubtype<Any>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
+69
@@ -0,0 +1,69 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 9 -> sentence 1
|
||||
* NUMBER: 3
|
||||
* DESCRIPTION: 'When' least upper bound of the types check (when exhaustive via boolean bound value).
|
||||
* HELPERS: classes, checkType
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: Boolean): String {
|
||||
val whenValue = when (value_1) {
|
||||
true -> ClassLevel2()
|
||||
false -> ClassLevel3()
|
||||
}
|
||||
|
||||
whenValue checkType { check<ClassLevel2>() }
|
||||
checkSubtype<ClassLevel1>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: Boolean?): String {
|
||||
val whenValue = when (value_1) {
|
||||
true -> ClassLevel2()
|
||||
false -> ClassLevel3()
|
||||
null -> ClassLevel4()
|
||||
}
|
||||
|
||||
whenValue checkType { check<ClassLevel2>() }
|
||||
checkSubtype<ClassLevel1>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: Boolean): String {
|
||||
val whenValue = when (value_1) {
|
||||
true -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
false -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
checkSubtype<Any>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: Boolean?): String {
|
||||
val whenValue = when (value_1) {
|
||||
true -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
false -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
null -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
checkSubtype<Any>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
|
||||
+139
@@ -0,0 +1,139 @@
|
||||
// SKIP_TXT
|
||||
|
||||
/*
|
||||
* KOTLIN DIAGNOSTICS SPEC TEST (POSITIVE)
|
||||
*
|
||||
* SPEC VERSION: 0.1-draft
|
||||
* PLACE: expressions, when-expression -> paragraph 9 -> sentence 1
|
||||
* NUMBER: 4
|
||||
* DESCRIPTION: 'When' least upper bound of the types check (when exhaustive via sealed class).
|
||||
* HELPERS: classes, sealedClasses, checkType
|
||||
*/
|
||||
|
||||
// TESTCASE NUMBER: 1
|
||||
fun case_1(value_1: SealedClass): String {
|
||||
val whenValue = when (value_1) {
|
||||
is SealedChild1 -> ClassLevel2()
|
||||
is SealedChild2 -> ClassLevel3()
|
||||
is SealedChild3 -> ClassLevel4()
|
||||
}
|
||||
|
||||
whenValue checkType { check<ClassLevel2>() }
|
||||
checkSubtype<ClassLevel1>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 2
|
||||
fun case_2(value_1: SealedClass?): String {
|
||||
val whenValue = when (value_1) {
|
||||
is SealedChild1 -> ClassLevel2()
|
||||
is SealedChild2 -> ClassLevel3()
|
||||
is SealedChild3 -> ClassLevel4()
|
||||
null -> ClassLevel5()
|
||||
}
|
||||
|
||||
whenValue checkType { check<ClassLevel2>() }
|
||||
checkSubtype<ClassLevel1>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
fun case_3(value_1: SealedClass): String {
|
||||
val whenValue = when (value_1) {
|
||||
is SealedChild1 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
is SealedChild2 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
is SealedChild3 -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
checkSubtype<Any>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 4
|
||||
fun case_4(value_1: SealedClass?): String {
|
||||
val whenValue = when (value_1) {
|
||||
is SealedChild1 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
is SealedChild2 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
is SealedChild3 -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
null -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
checkSubtype<Any>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
fun case_5(value_1: SealedClassWithObjects): String {
|
||||
val whenValue = when (value_1) {
|
||||
SealedWithObjectsChild1 -> ClassLevel2()
|
||||
SealedWithObjectsChild2 -> ClassLevel3()
|
||||
SealedWithObjectsChild3 -> ClassLevel4()
|
||||
}
|
||||
|
||||
whenValue checkType { check<ClassLevel2>() }
|
||||
checkSubtype<ClassLevel1>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 6
|
||||
fun case_6(value_1: SealedClassWithObjects?): String {
|
||||
val whenValue = when (value_1) {
|
||||
SealedWithObjectsChild1 -> ClassLevel2()
|
||||
SealedWithObjectsChild2 -> ClassLevel3()
|
||||
SealedWithObjectsChild3 -> ClassLevel4()
|
||||
null -> ClassLevel5()
|
||||
}
|
||||
|
||||
whenValue checkType { check<ClassLevel2>() }
|
||||
checkSubtype<ClassLevel1>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(value_1: SealedClassWithObjects): String {
|
||||
val whenValue = when (value_1) {
|
||||
SealedWithObjectsChild1 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
SealedWithObjectsChild2 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
SealedWithObjectsChild3 -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
checkSubtype<Any>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 8
|
||||
fun case_8(value_1: SealedClassWithObjects?): String {
|
||||
val whenValue = when (value_1) {
|
||||
SealedWithObjectsChild1 -> <!IMPLICIT_CAST_TO_ANY!>10<!>
|
||||
SealedWithObjectsChild2 -> <!IMPLICIT_CAST_TO_ANY!>""<!>
|
||||
SealedWithObjectsChild3 -> <!IMPLICIT_CAST_TO_ANY!>object<!> {}
|
||||
null -> {<!IMPLICIT_CAST_TO_ANY!>{}<!>}
|
||||
}
|
||||
|
||||
whenValue checkType { check<Any>() }
|
||||
checkSubtype<Any>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 9
|
||||
fun case_9(value_1: SealedClassWithObjects): String {
|
||||
val whenValue = when (value_1) {
|
||||
<!USELESS_IS_CHECK!>is SealedClassWithObjects<!> -> 10
|
||||
}
|
||||
|
||||
whenValue checkType { check<Int>() }
|
||||
checkSubtype<Int>(whenValue)
|
||||
|
||||
return ""
|
||||
}
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* This file is generated by {@link org.jetbrains.kotlin.spec.tasks.generateTests}. DO NOT MODIFY MANUALLY.
|
||||
* This file is used in the HTML version of the Kotlin Specification (https://kotlin.github.io/kotlin-spec) to show tests coverage for sentences.
|
||||
*
|
||||
* Content format:
|
||||
*
|
||||
* {paragraphNumber}
|
||||
* {testType: neg|pos}: {sentenceNumber}-{numberOfTests|testPathToAnotherSection}, ...
|
||||
*/
|
||||
|
||||
9
|
||||
neg: 1-4
|
||||
pos: 1-4
|
||||
7
|
||||
neg: 1-2, 3-2, 5-2, 7-1
|
||||
pos: 1-4, 3-2, 5-2, 7-1
|
||||
6
|
||||
neg: 1-1
|
||||
pos: 1-1
|
||||
3
|
||||
neg: 2-2, 1-1
|
||||
pos: 2-3, 1-1
|
||||
2
|
||||
pos: 3-2
|
||||
5
|
||||
neg: 1-1
|
||||
pos: 1-1
|
||||
Reference in New Issue
Block a user