fun test(case: String, expctedMessage: String?, expectedCause: Throwable?, expectedToString: String, t: Throwable): String {
    val actualMessage = t.message
    if (actualMessage != expctedMessage) return "$case FAIL message: $actualMessage, expcted: $expctedMessage"

    val actualCause = t.cause
    if (actualCause != expectedCause) return "$case FAIL cause: $actualCause, expcted: $expectedCause"

    val actualToString = t.toString()
    if (actualToString != expectedToString) return "$case FAIL toString: $actualToString, expcted: $expectedToString"

    return "OK"
}


fun box(): String {


    var result: String = "FAIL"

    result = test("Throwable()", null, null, "Throwable", Throwable())
    if (result != "OK") return result

    result = test("Throwable(\"aaaa\")", "aaaa", null, "Throwable: aaaa", Throwable("aaaa"))
    if (result != "OK") return result

    var cause = Throwable()
    result = test("Throwable(Throwable())", "Throwable", cause, "Throwable: Throwable", Throwable(cause))
    if (result != "OK") return result

    cause = Throwable("ccc")
    result = test("Throwable(\"bbbb\", Throwable(\"ccc\"))", "bbbb", cause, "Throwable: bbbb", Throwable("bbbb", cause))
    if (result != "OK") return result

    result = test("Throwable(message = null)", null, null, "Throwable", Throwable(message = null))
    if (result != "OK") return result

    result = test("Throwable(cause = null)", null, null, "Throwable", Throwable(cause = null))
    if (result != "OK") return result

    result = test("Throwable(null, null)", null, null, "Throwable", Throwable(null, null))
    if (result != "OK") return result

    result = test("Throwable(\"eee\", null)", "eee", null, "Throwable: eee", Throwable("eee", null))
    if (result != "OK") return result

    cause = Throwable("ddd")
    result = test("Throwable(null, Throwable(\"ddd\"))", null, cause, "Throwable", Throwable(null, cause))
    if (result != "OK") return result

    return "OK"
}
