Refactored tests for switch optimization of When expression

This commit is contained in:
Denis Zharkov
2014-04-09 12:29:53 +04:00
committed by Evgeny Gerashchenko
parent 95345a9bd4
commit 3bc1c45fde
8 changed files with 173 additions and 83 deletions
@@ -1,77 +0,0 @@
fun foo1(x : Int) : Int {
return when ((x % 10)*100) {
700,800,900 -> 3
100,200,300 -> 1
400,500,600 -> 2
else -> 4
}
}
fun foo2(x : Short) : Int {
when ((x % 10).toShort()) {
1.toShort(),2.toShort(),3.toShort() -> return 1
7.toShort(),8.toShort(),9.toShort() -> return 3
4.toShort(),5.toShort(),6.toShort() -> return 2
}
return 4
}
fun foo3(x : Char) : Int {
when (x) {
'5' -> return 2
'6' -> return 2
'7' -> return 3
'8' -> return 3
'9' -> return 3
'1' -> return 1
'2' -> return 1
'3' -> return 1
'4' -> return 2
}
return 4
}
fun foo4(x : Byte) : Int {
return when ((x % 10).toByte()) {
1.toByte() -> 1
2.toByte() -> 1
3.toByte() -> 1
4.toByte() -> 2
5.toByte() -> 2
6.toByte() -> 2
7.toByte() -> 3
8.toByte() -> 3
9.toByte() -> 3
else -> 4
}
}
fun test(foo : (Int) -> Int, name : String) : String {
val foo0 = foo(10)
var result = if (foo0 == 4) "" else "$name[10/$foo0/4]"
for (i in 11..19) {
val shouldBe = (i-11) / 3 + 1
val fooI = foo(i)
if (fooI != shouldBe) {
result += "$name[$i/$fooI/$shouldBe]"
}
}
return result
}
fun box(): String {
val testResult = test({x -> foo1(x)}, "foo1") +
test({x -> foo2(x.toShort())}, "foo2") +
test({x -> foo3((x % 10 + '0'.toInt()).toChar())}, "foo3") +
test({x -> foo4(x.toByte())}, "foo4")
if (testResult != "") return testResult
return "OK"
}
@@ -0,0 +1,15 @@
fun foo(x: Int): Int {
return when (x) {
1, 2, 3 -> 1
4, 5, 6 -> 2
7, 8, 9 -> 3
else -> 4
}
}
fun box(): String {
var result = (0..10).map(::foo).makeString()
if (result != "4, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4") return result
return "OK"
}
@@ -0,0 +1,18 @@
import java.util.ArrayList
fun sparse(x: Int): Int {
return when ((x % 4) * 100) {
100 -> 1
200 -> 2
300 -> 3
else -> 4
}
}
fun box(): String {
var result = (0..3).map(::sparse).makeString()
if (result != "4, 1, 2, 3") return "sparse:" + result
return "OK"
}
@@ -0,0 +1,34 @@
fun exhaustive(x: Int): Int {
var r: Int
when (x) {
1 -> r = 1
2 -> r = 2
3 -> r = 3
else -> r = 4
}
return r
}
fun nonExhaustive(x: Int): Int {
var r: Int = 4
when (x) {
1 -> r = 1
2 -> r = 2
3 -> r = 3
}
return r
}
fun box(): String {
var result = (0..3).map(::exhaustive).makeString()
if (result != "4, 1, 2, 3") return "exhaustive:" + result
result = (0..3).map(::nonExhaustive).makeString()
if (result != "4, 1, 2, 3") return "non-exhaustive:" + result
return "OK"
}
@@ -0,0 +1,56 @@
fun intFoo(x: Int): Int {
return when (x) {
1 -> 5
2 -> 6
3 -> 7
else -> 8
}
}
fun shortFoo(x: Short): Int {
return when (x) {
1.toShort() -> 5
2.toShort() -> 6
3.toShort() -> 7
else -> 8
}
}
fun byteFoo(x: Byte): Int {
return when (x) {
1.toByte() -> 5
2.toByte() -> 6
3.toByte() -> 7
else -> 8
}
}
fun charFoo(x: Char): Int {
return when (x) {
'a' -> 5
'b' -> 6
'c' -> 7
else -> 8
}
}
fun box(): String {
var result = (1..4).map(::intFoo).makeString()
if (result != "5, 6, 7, 8") return "int:" + result
result = (1.toShort()..4.toShort()).map(::shortFoo).makeString()
if (result != "5, 6, 7, 8") return "short:" + result
result = (1.toByte()..4.toByte()).map(::byteFoo).makeString()
if (result != "5, 6, 7, 8") return "byte:" + result
result = ('a'..'d').map(::charFoo).makeString()
if (result != "5, 6, 7, 8") return "int:" + result
return "OK"
}
@@ -0,0 +1,15 @@
fun foo(x: Int): Int {
return when (x) {
2 -> 6
1 -> 5
3 -> 7
else -> 8
}
}
fun box(): String {
var result = (0..3).map(::foo).makeString()
if (result != "8, 5, 6, 7") return "unordered:" + result
return "OK"
}