Coverage Summary for Class: LogStackTraceStartResolver (kr.open.library.simple_ui.core.logcat.internal.extractor)

Class Method, % Branch, % Line, % Instruction, %
LogStackTraceStartResolver 100% (3/3) 75% (6/8) 100% (19/19) 98.8% (85/86)
LogStackTraceStartResolver$Companion
Total 100% (3/3) 75% (6/8) 100% (19/19) 98.8% (85/86)


 package kr.open.library.simple_ui.core.logcat.internal.extractor
 
 /**
  * 스택 트레이스 탐색 시작 지점을 계산하는 헬퍼입니다.
  *
  * Resolves the starting index for stack trace scanning.
  * <br><br>
  * 내부 프레임 이후부터 탐색하도록 시작 인덱스를 계산합니다.
  *
  * @param internalPrefixes 내부 프레임으로 간주할 패키지 접두사 목록.
  * @param additionalPrefixes 추가로 포함할 내부 프레임 접두사 목록.
  * @param fallbackStartIndex 내부 프레임을 찾지 못했을 때 사용할 기본 시작 인덱스.
  */
 internal class LogStackTraceStartResolver(
     internalPrefixes: List<String> = listOf(
         LogStackTraceConstants.LOGCAT_INTERNAL_PREFIX,
     ),
     additionalPrefixes: Set<String> = emptySet(),
     private val fallbackStartIndex: Int = LogStackTraceConstants.DEFAULT_FALLBACK_START_INDEX,
 ) {
     private val startPrefixes: List<String> = (internalPrefixes + additionalPrefixes)
         .filter { it.isNotBlank() }
         .distinct()
 
     /**
      * 스택 트레이스 배열에서 탐색 시작 인덱스를 계산합니다.
      *
      * Computes the start index for scanning the stack trace.
      * <br><br>
      * 스택 탐색 시작 위치를 반환합니다.
      *
      * @param stackTrace 현재 스레드의 스택 트레이스 배열.
      */
     fun resolve(stackTrace: Array<StackTraceElement>): Int {
         if (stackTrace.isEmpty()) return 0
 
         val lastIndex = stackTrace.lastIndex
         val internalEnd = findInternalEndIndex(stackTrace)
         return (internalEnd + 1)
             .coerceAtLeast(fallbackStartIndex)
             .coerceAtMost(lastIndex)
     }
 
     /**
      * 내부 패키지 프레임의 마지막 인덱스를 찾습니다.
      *
      * Finds the last index of frames that belong to internal prefixes.
      * <br><br>
      * 내부 패키지에 해당하는 마지막 인덱스를 반환합니다.
      *
      * @param stackTrace 현재 스레드의 스택 트레이스 배열.
      */
     private fun findInternalEndIndex(stackTrace: Array<StackTraceElement>): Int {
         var last = -1
         for (i in 0..stackTrace.lastIndex) {
             val className = stackTrace[i].className
             if (startPrefixes.any { prefix -> className.startsWith(prefix) }) {
                 last = i
             }
         }
         return last
     }
 
     private companion object
 }