1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package test.exceptions
import kotlin.test.*
import test.collections.assertArrayNotSameButEquals
import java.io.PrintWriter
import java.io.*
import java.nio.charset.Charset
class ExceptionJVMTest {
@Test fun printStackTraceOnRuntimeException() {
assertPrintStackTrace(RuntimeException("Crikey!"))
assertPrintStackTraceStream(RuntimeException("Crikey2"))
}
@Test fun printStackTraceOnError() {
assertPrintStackTrace(Error("Oh dear"))
assertPrintStackTraceStream(Error("Oh dear2"))
}
fun assertPrintStackTrace(t: Throwable) {
val buffer = StringWriter()
val writer = PrintWriter(buffer)
t.printStackTrace(writer)
comparePrintedThrowableResult(t, buffer.buffer)
}
fun assertPrintStackTraceStream(t: Throwable) {
val byteBuffer = ByteArrayOutputStream()
PrintStream(byteBuffer).use {
t.printStackTrace(it)
}
val stream = PrintStream(byteBuffer)
stream.use {
t.printStackTrace(stream)
}
val bytes = assertNotNull(byteBuffer.toByteArray())
val content = bytes.toString(Charset.defaultCharset())
comparePrintedThrowableResult(t, content)
}
private fun comparePrintedThrowableResult(throwable: Throwable, printedThrowable: CharSequence) {
val stackTrace = throwable.stackTrace
val lines = printedThrowable.lines()
assertEquals(throwable.toString(), lines[0])
stackTrace.forEachIndexed { index, frame ->
assertTrue(lines.any { frame.toString() in it }, "frame at index $index is not found in the printed message")
}
}
@Test fun changeStackTrace() {
val exception = RuntimeException("Fail")
var stackTrace = exception.stackTrace
stackTrace = stackTrace.dropLast(1).toTypedArray()
exception.stackTrace = stackTrace
assertArrayNotSameButEquals(stackTrace, exception.stackTrace)
}
}
|