KT-6942: in JS backed for value equalitity patterns in when generate structural equality check (i.e. Any.equals) instead of referential check (===).

(cherry picked from commit 97228e5)
This commit is contained in:
Alexey Andreev
2016-05-11 13:41:40 +03:00
parent 61290d1225
commit 0e1dde022a
4 changed files with 140 additions and 3 deletions
@@ -0,0 +1,87 @@
package foo
data class A(val bar: Int)
@native class B
fun makeB(): B = js("new Object();")
fun intAgainstInt(x: Int) = when (x) {
1 -> "a"
2 -> "b"
else -> "*"
}
fun intAgainstNullableInt(x: Int?) = when (x) {
1 -> "a"
2 -> "b"
null -> "c"
else -> "*"
}
fun anyAgainstInt(x: Any?) = when (x) {
1 -> "a"
2 -> "b"
else -> "*"
}
fun longAgainstLong(x: Long) = when (x) {
1L -> "a"
2L -> "b"
else -> "*"
}
fun anyAgainstLong(x: Any?) = when (x) {
1L -> "a"
2L -> "b"
null -> "c"
else -> "*"
}
fun anyAgainstAny(x: Any) = when (x) {
A(1) -> "a"
1 -> "b"
else -> "*"
}
fun dynamicAgainstPattern(x: dynamic) = when(x) {
1 -> "a"
"2" -> "b"
else -> "*"
}
fun box(): String {
assertEquals("a", intAgainstInt(1))
assertEquals("b", intAgainstInt(2))
assertEquals("*", intAgainstInt(23))
assertEquals("a", intAgainstNullableInt(1))
assertEquals("b", intAgainstNullableInt(2))
assertEquals("c", intAgainstNullableInt(null))
assertEquals("*", intAgainstNullableInt(23))
assertEquals("a", anyAgainstInt(1))
assertEquals("b", anyAgainstInt(2))
assertEquals("*", anyAgainstInt(A(23)))
assertEquals("a", longAgainstLong(1))
assertEquals("b", longAgainstLong(2))
assertEquals("*", longAgainstLong(23))
assertEquals("a", anyAgainstLong(1L))
assertEquals("b", anyAgainstLong(2L))
assertEquals("c", anyAgainstLong(null))
assertEquals("*", anyAgainstLong(A(23)))
assertEquals("a", anyAgainstAny(A(1)))
assertEquals("b", anyAgainstAny(1))
assertEquals("*", anyAgainstAny(listOf(1)))
assertEquals("a", dynamicAgainstPattern(1))
assertEquals("a", dynamicAgainstPattern(js("1")))
assertEquals("b", dynamicAgainstPattern("2"))
assertEquals("b", dynamicAgainstPattern(js("'2'")))
assertEquals("*", dynamicAgainstPattern(js("{}")))
return "OK"
}