Supporting data class for JS backend

This commit is contained in:
Peter Rybin
2014-04-14 04:13:21 +04:00
committed by Zalim Bashorov
parent 535cc3eed8
commit ab81d2e261
13 changed files with 534 additions and 7 deletions
@@ -0,0 +1,24 @@
package foo
data class Dat(val start: String, middle: String, val end: String) {
fun getLabel() : String {
return start + end
}
}
fun assertEquals<T>(expected: T, actual: T) {
if (expected != actual) throw Exception("expected: $expected, actual, $actual")
}
fun assertNotEqual<T>(expected: T, actual: T) {
if (expected == actual) throw Exception("unexpectedly equal: $expected and $actual")
}
fun box(): String {
val d = Dat("max", "-", "min")
assertEquals("maxmin", d.getLabel())
val (p1, p2) = d
assertEquals("max", p1)
assertEquals("min", p2)
return "OK"
}
@@ -0,0 +1,11 @@
package foo
data class Dat(val start: String, middle: String, val end: String)
fun box(): String {
val d1 = Dat("OO", "-", "PS")
val d2: Dat = d1.copy(end = "K", middle = "+")
val d3: Dat = d2.copy(start = "O", middle = "-")
val (p1, p2) = d3
return p1 + p2
}
@@ -0,0 +1,49 @@
package foo
data class Holder<T>(val v: T)
data class Dat(val start: String, val end: String)
data class Dat2(val start: String, val end: String)
class Obj(val start: String, val end: String)
fun assertEquals<T>(expected: T, actual: T) {
if (expected != actual) throw Exception("expected: $expected, actual, $actual")
}
fun assertNotEqual<T>(expected: T, actual: T) {
if (expected == actual) throw Exception("unexpectedly equal: $expected and $actual")
}
fun box(): String {
val d1 = Dat("a", "b")
val d2 = Dat("a", "b")
val d3 = Dat("a", "c")
val otherD1 = Dat2("a", "b")
assertEquals(d1, d1)
assertEquals(d1, d2)
assertNotEqual(d1, d3)
assertNotEqual(d1, otherD1)
var hd1 = Holder(Dat("y", "n"))
var hd2 = Holder(Dat("y", "n"))
var hd3 = Holder(Dat("1", "2"))
assertEquals(hd1, hd1)
assertEquals(hd1, hd2)
assertNotEqual(hd1, hd3)
var ho1 = Holder(Obj("+", "-"))
var ho2 = Holder(Obj("+", "-"))
var ho3 = Holder(Obj("*", "*"))
assertEquals(ho1, ho1)
assertNotEqual(ho1, ho2)
assertNotEqual(ho1, ho3)
return "OK"
}
@@ -0,0 +1,88 @@
package foo
import java.util.ArrayList
data class Holder<T>(val v: T)
data class Dat(val start: String, val end: String)
class Obj(val start: String, val end: String)
fun assertEquals<T>(expected: T, actual: T) {
if (expected != actual) throw Exception("expected: $expected, actual, $actual")
}
fun assertSomeNotEqual<T>(c: Iterable<T>) {
val it = c.iterator()
val first = it.next()
while (it.hasNext()) {
val item: T = it.next()
if (item != first) {
return;
}
}
throw Exception("All elements are the same: $first")
}
fun assertAllEqual<T>(c: Iterable<out T>) {
val it = c.iterator()
val first = it.next()
while (it.hasNext()) {
val item: T = it.next()
assertEquals(first, item)
}
}
val hashCoder: (o: Any) -> Int = { o -> o.hashCode() }
val <T> wrapInH = { (t: T) -> Holder(t) }
fun box(): String {
// Check that same Dat's have the same hashcode.
val sameDs = listOf(Dat("a", "b"), Dat("a", "b"))
assertAllEqual(map(sameDs, hashCoder))
// Check that different Dat's have different hashcodes (at least some of them).
val differentDs = listOf(Dat("a", "b"), Dat("a", "c"), Dat("a", "d"))
assertSomeNotEqual(map(differentDs, hashCoder))
// Check the same on Obj's, which should be always different and with different hashcodes.
val sameOs = listOf(Obj("a", "b"), Obj("a", "b"), Obj("a", "b"))
val differentOs = listOf(Obj("a", "b"), Obj("a", "b"), Obj("a", "b"))
// Obj's are always different.
assertSomeNotEqual(map(sameOs, hashCoder))
assertSomeNotEqual(map(differentOs, hashCoder))
// Both Dat's and Obj's wrapped as Holder should retain their hashcode relations.
val sameHDs = map(sameDs, wrapInH)
assertAllEqual(map(sameHDs, hashCoder))
val differentHDs = map(differentDs, wrapInH)
assertSomeNotEqual(map(differentHDs, hashCoder))
val sameHOs = map(sameOs, wrapInH)
assertSomeNotEqual(map(sameHOs, hashCoder))
val differentHOs = map(differentOs, wrapInH)
assertSomeNotEqual(map(differentHOs, hashCoder))
return "OK"
}
fun listOf<T>(vararg a: T): List<T> {
val list = ArrayList<T>()
for (e in a) {
list.add(e)
}
return list
}
fun map<T, S>(c : Iterable<T>, transform : (T) -> S) : List<S> {
val list = ArrayList<S>()
for (t in c) {
list.add(transform(t))
}
return list
}
@@ -0,0 +1,27 @@
package foo
data class Holder<T>(val v: T)
data class Dat(val start: String, val end: String)
class Obj(val start: String, val end: String)
fun assertEquals<T>(expected: T, actual: T) {
if (expected != actual) throw Exception("expected: $expected, actual, $actual")
}
fun box(): String {
val setD = java.util.HashSet<Holder<Dat>>()
setD.add(Holder(Dat("a", "b")))
setD.add(Holder(Dat("a", "b")))
setD.add(Holder(Dat("a", "b")))
assertEquals(1, setD.size())
val setO = java.util.HashSet<Holder<Obj>>()
setO.add(Holder(Obj("a", "b")))
setO.add(Holder(Obj("a", "b")))
setO.add(Holder(Obj("a", "b")))
assertEquals(3, setO.size())
return "OK"
}
@@ -0,0 +1,27 @@
package foo
data class Holder<T>(val v: T)
data class Dat(val start: String, val end: String)
class Obj(val start: String, val end: String)
fun assertEquals<T>(expected: T, actual: T) {
if (expected != actual) throw Exception("expected: $expected, actual, $actual")
}
fun box(): String {
val d = Dat("a", "b")
assertEquals("Dat(start=a, end=b)", "${d}")
var hd = Holder(Dat("y", "n"))
assertEquals("Holder(v=Dat(start=y, end=n))", "${hd}")
var ho = Holder(Obj("+", "-"))
assertEquals("Holder(v=[object Object])", "${ho}")
return "OK"
}