// SKIP_JDK6
// TARGET_BACKEND: JVM
// FULL_JDK
// WITH_STDLIB

interface ImmutableCollection<out E> : Collection<E> {
    fun add(element: @UnsafeVariance E): ImmutableCollection<E>
    fun addAll(elements: Collection<@UnsafeVariance E>): ImmutableCollection<E>
    fun remove(element: @UnsafeVariance E): ImmutableCollection<E>
}

class ImmutableCollectionmpl<E> : ImmutableCollection<E> {
    override val size: Int
        get() = throw UnsupportedOperationException()

    override fun contains(element: E): Boolean {
        throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun containsAll(elements: Collection<E>): Boolean {
        throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun isEmpty(): Boolean {
        throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun iterator(): Iterator<E> {
        throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
    }

    override fun add(element: E): ImmutableCollection<E> = this
    override fun addAll(elements: Collection<E>): ImmutableCollection<E> = this
    override fun remove(element: E): ImmutableCollection<E> = this
}

fun box(): String {
    val c = ImmutableCollectionmpl<String>()
    if (c.remove("") !== c) return "fail 1"
    if (c.add("") !== c) return "fail 2"
    if (c.addAll(java.util.ArrayList()) !== c) return "fail 3"

    val method = c.javaClass.methods.single { it.name == "remove" && it.returnType == Boolean::class.javaPrimitiveType }

    try {
        method.invoke(c, "")
        return "fail 4"
    } catch (e: java.lang.reflect.InvocationTargetException) {
        if (e.cause!!.message != "Operation is not supported for read-only collection") return "fail 5: ${e.cause!!.message}"
    }

    return "OK"
}
