
public inline fun fails(block: () -> Unit): Throwable? {
    var thrown: Throwable? = null
    try {
        block()
    } catch (e: Throwable) {
        thrown = e
    }
    if (thrown == null)
        throw Exception("Expected an exception to be thrown")
    return thrown
}

public inline fun throwIt(msg: String) {
    throw Exception(msg)
}

fun box(): String {
    fails {
        throwIt("oops!")
    }

    var x = 0
    try {
        fails {
            x = 1
        }
    }
    catch (e: Exception) {
        x = 2
    }

    if (x != 2) return "Failed: x==$x"

    return "OK"
}