All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.mockk.impl.verify.VerificationHelpers.kt Maven / Gradle / Ivy

package io.mockk.impl.verify

import io.mockk.Invocation
import io.mockk.RecordedCall
import io.mockk.StackElement
import io.mockk.impl.InternalPlatform
import io.mockk.impl.stub.StubRepository

object VerificationHelpers {
    fun formatCalls(calls: List): String {
        return calls.mapIndexed { idx, call ->
            "${idx + 1}) $call"
        }.joinToString("\n")
    }

    fun stackTraces(calls: List): String {
        return calls.mapIndexed { idx, call ->
            val prefix = "${idx + 1})"
            "$prefix ${stackTrace(prefix.length + 1, call.callStack)}"
        }.joinToString("\n\n")
    }

    fun stackTrace(prefix: Int, stackTrace: List): String {
        fun columnSize(block: StackElement.() -> String) =
            stackTrace.map(block).map { it.length }.max() ?: 0

        fun StackElement.fileLine() =
            "($fileName:$line)${if (nativeMethod) "N" else ""}"

        fun spaces(n: Int) = if (n < 0) "" else (1..n).map { " " }.joinToString("")
        fun columnRight(s: String, sz: Int) = spaces(sz - s.length) + s
        fun columnLeft(s: String, sz: Int) = s + spaces(sz - s.length)


        val maxClassNameLen = columnSize { className }
        val maxMethodLen = columnSize { methodName }
        val maxThirdColumn = columnSize { fileLine() }

        return stackTrace.map {
            spaces(prefix) +
                    columnRight(it.className, maxClassNameLen) + "." +
                    columnLeft(it.methodName, maxMethodLen) + " " +
                    columnLeft(it.fileLine(), maxThirdColumn)
        }.joinToString("\n").substring(prefix)
    }


    fun List.allInvocations(stubRepo: StubRepository) =
        this.map { InternalPlatform.ref(it.matcher.self) }
            .distinct()
            .map { it.value }
            .flatMap { stubRepo.stubFor(it).allRecordedCalls() }
            .sortedBy { it.timestamp }

    fun reportCalls(calls: List, allCalls: List): String {
        return "\n\nMatchers: \n" + calls.map { it.matcher.toString() }.joinToString("\n") +
                "\n\nCalls:\n" +
                formatCalls(allCalls) +
                "\n\nStack traces:\n" +
                stackTraces(allCalls)
    }
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy