// IGNORE_BACKEND: WASM
// WASM_MUTE_REASON: STDLIB_ASSERT
// IGNORE_BACKEND: JS_IR
// IGNORE_BACKEND: JS_IR_ES6
// See related issue: https://youtrack.jetbrains.com/issue/KT-59059/Native-Assert-does-not-evaluate-argument-value-when-disabled
// IGNORE_IR_DESERIALIZATION_TEST: JS_IR
// ^^^ Assertions not supported for JS.
// ASSERTIONS_MODE: always-disable
// WITH_STDLIB

@file:Suppress("OPT_IN_USAGE_ERROR") // ExperimentalNativeApi is defined only in Native

fun checkTrue(): Boolean {
    var hit = false
    val l = { hit = true; true }
    assert(l())
    return hit
}

fun checkTrueWithMessage(): Boolean {
    var hit = false
    val l = { hit = true; true }
    assert(l()) { "BOOYA!" }
    return hit
}

fun checkFalse(): Boolean {
    var hit = false
    val l = { hit = true; false }
    assert(l())
    return hit
}

fun checkFalseWithMessage(): Boolean {
    var hit = false
    val l = { hit = true; false }
    assert(l()) { "BOOYA!" }
    return hit
}

fun box(): String {
    if (checkTrue()) return "FAIL 0"
    if (checkTrueWithMessage()) return "FAIL 1"
    if (checkFalse()) return "FAIL 2"
    if (checkFalseWithMessage()) return "FAIL 3"

    return "OK"
}
