View test reports →

Coverage Summary for Class: BackStackNavigatorImpl (dev.skymansandy.wiretap.navigation.impl)

Class Class, % Method, % Branch, % Line, % Instruction, %
BackStackNavigatorImpl 100% (1/1) 100% (8/8) 75% (9/12) 100% (14/14) 97.1% (102/105)


 /*
  * Copyright (c) 2026 skymansandy. All rights reserved.
  */
 
 package dev.skymansandy.wiretap.navigation.impl
 
 import androidx.navigation3.runtime.NavBackStack
 import androidx.navigation3.runtime.NavKey
 import dev.skymansandy.wiretap.navigation.api.WiretapNavigator
 import dev.skymansandy.wiretap.navigation.api.WiretapScreen
 
 internal class BackStackNavigatorImpl(
     private val backStack: NavBackStack<NavKey>,
     private val onExit: () -> Unit = {},
 ) : WiretapNavigator {
 
     override fun push(screen: WiretapScreen) {
         backStack.add(screen)
     }
 
     override fun pushDetailPane(screen: WiretapScreen) {
         popUntil { it is WiretapScreen.ListPane }
         backStack.add(screen)
     }
 
     override fun clearDetailPane() {
         popUntil { it is WiretapScreen.ListPane }
     }
 
     override fun pop() {
         if (backStack.size > 1) backStack.removeAt(backStack.lastIndex)
     }
 
     override fun popUntil(predicate: (WiretapScreen) -> Boolean) {
         while (backStack.size > 1) {
             val last = backStack.lastOrNull() as? WiretapScreen ?: break
             if (predicate(last)) break
             backStack.removeAt(backStack.lastIndex)
         }
     }
 
     override fun replaceTop(screen: WiretapScreen) {
         if (backStack.isNotEmpty()) backStack.removeAt(backStack.lastIndex)
         backStack.add(screen)
     }
 
     override fun exit() = onExit()
 }