blob: 7d0f62c2786b1358bc553e5fcc0fe502eb55ee23 [file]
// LANGUAGE: +FullValueClasses
// WITH_STDLIB
val objects = ArrayList<Any>()
fun log(o: Any) {
objects.add(o)
}
sealed value class Sealed {
init {
log(100)
}
}
abstract value class Base(counter: Int): Sealed() {
init {
log(counter)
}
}
value class Successful(val x: Int = 1.also(::log), val y: Int = 2.also(::log)): Base((-1).also(::log).inc()) {
init {
log(3)
}
constructor(x: Long = 4L.also(::log), y: Long = 5L.also(::log)): this(x.also(::log).toInt(), y.also(::log).toInt()) {
log(6)
}
init {
log(7)
}
constructor() : this(8.also(::log)) {
log(9)
}
}
inline fun errorLogging(x: Any): Nothing = try {
error(x)
} finally {
log(x)
}
value class FailingPrimary(val x: Int = errorLogging(10))
value class FailingInit(val x: Int) {
init {
errorLogging(11)
}
}
value class FailingSecondary1(val x: Int) {
constructor(x: Long = errorLogging(12)) : this(x.toInt())
}
value class FailingSecondary2(val x: Int) {
constructor(x: Long) : this(errorLogging(13))
}
inline fun <T> testWithLog(vararg expectedLog: Any?, action: () -> T): Result<T> {
objects.clear()
val result = runCatching { action() }
require(objects == expectedLog.asList()) { "\nExpected:\n${expectedLog.asList().joinToString()}\nGot:\n${objects.joinToString()}" }
return result
}
value class Delegation(val x: Int = 14.also(::log)) : Comparable<Int> by x
fun box(): String {
val successful1 = testWithLog(8, 2, -1, 100, 0, 3, 7, 9) { Successful() }.getOrThrow()
require(successful1.toString() == "Successful(x=8, y=2)") { successful1.toString() }
val successful2 = testWithLog(2, -1, 100, 0, 3, 7) { Successful(x = 100) }.getOrThrow()
require(successful2.toString() == "Successful(x=100, y=2)") { successful2.toString() }
val successful3 = testWithLog(1, -1, 100, 0, 3, 7) { Successful(y = 100) }.getOrThrow()
require(successful3.toString() == "Successful(x=1, y=100)") { successful3.toString() }
val successful4 = testWithLog(-1, 100, 0, 3, 7) { Successful(x = 100, y = 200) }.getOrThrow()
require(successful4.toString() == "Successful(x=100, y=200)") { successful4.toString() }
val successful5 = testWithLog(-1, 100, 0, 3, 7) { Successful(y = 200, x = 100) }.getOrThrow()
require(successful5.toString() == "Successful(x=100, y=200)") { successful5.toString() }
val successful6 = testWithLog(5L, 100L, 5L, -1, 100, 0, 3, 7, 6) { Successful(x = 100L) }.getOrThrow()
require(successful6.toString() == "Successful(x=100, y=5)") { successful6.toString() }
val successful7 = testWithLog(4L, 4L, 100L, -1, 100, 0, 3, 7, 6) { Successful(y = 100L) }.getOrThrow()
require(successful7.toString() == "Successful(x=4, y=100)") { successful7.toString() }
val successful8 = testWithLog(100L, 200L, -1, 100, 0, 3, 7, 6) { Successful(x = 100L, y = 200L) }.getOrThrow()
require(successful8.toString() == "Successful(x=100, y=200)") { successful8.toString() }
val successful9 = testWithLog(100L, 200L, -1, 100, 0, 3, 7, 6) { Successful(y = 200L, x = 100L) }.getOrThrow()
require(successful9.toString() == "Successful(x=100, y=200)") { successful9.toString() }
val failure1 = testWithLog(10) { FailingPrimary() }.exceptionOrNull()
require(failure1?.message == "10") { failure1?.message.toString() }
val notFailure1 = testWithLog { FailingPrimary(10) }.getOrThrow()
require(notFailure1.toString() == "FailingPrimary(x=10)") { notFailure1.toString() }
val failure2 = testWithLog(11) { FailingInit(100) }.exceptionOrNull()
require(failure2?.message == "11") { failure2?.message.toString() }
val failure3 = testWithLog(12) { FailingSecondary1() }.exceptionOrNull()
require(failure3?.message == "12") { failure3?.message.toString() }
val notFailure3 = testWithLog { FailingSecondary1(20) }.getOrThrow()
require(notFailure3.toString() == "FailingSecondary1(x=20)") { notFailure3.toString() }
val failure4 = testWithLog(13) { FailingSecondary2(30L) }.exceptionOrNull()
require(failure4?.message == "13") { failure4?.message.toString() }
val notFailure4 = testWithLog { FailingSecondary2(30) }.getOrThrow()
require(notFailure4.toString() == "FailingSecondary2(x=30)") { notFailure4.toString() }
val delegation = testWithLog(14) { Delegation() }.getOrThrow()
require(delegation.toString() == "Delegation(x=14)") { delegation.toString() }
require(delegation.compareTo(13) > 0)
require(delegation.compareTo(14) == 0)
require(delegation.compareTo(15) < 0)
return "OK"
}