package com.example.aiapp import kotlin.test.Test import kotlin.test.assertEquals class SessionOrderTest { @Test fun `running sessions keep the order their agents were turned on in`() { val first = session("first", status = "running", started = 10.0, lastActivity = 900.0) val second = session("second", status = "awaitingInput", started = 20.0, lastActivity = 20.0) val third = session("third", status = "waiting", started = 30.0, lastActivity = 500.0) assertEquals( listOf("first", "second", "third"), sessionsInListOrder(listOf(third, second, first)).map { it.id }, ) } @Test fun `a session started again joins the bottom of the running group`() { val old = session("old", status = "idle", started = 10.0, lastActivity = 10.0) val restarted = session("restarted", status = "idle", started = 99.0, lastActivity = 99.0) assertEquals( listOf("old", "restarted"), sessionsInListOrder(listOf(restarted, old)).map { it.id }, ) } @Test fun `stopped sessions come after the running ones, most recent first`() { val running = session("running", status = "idle", started = 100.0, lastActivity = 100.0) val stale = session("stale", status = "exited", started = 1.0, lastActivity = 5.0) val recent = session("recent", status = "exited", started = 2.0, lastActivity = 50.0) assertEquals( listOf("running", "recent", "stale"), sessionsInListOrder(listOf(stale, recent, running)).map { it.id }, ) } /** * A session whose process nobody could ask about still has one, so it stays where it was rather * than dropping into the stopped group the moment a machine goes quiet. */ @Test fun `a session of unknown state is one of the running ones`() { val unknown = session("unknown", status = "unknown", started = 10.0, lastActivity = 10.0) val stopped = session("stopped", status = "exited", started = 5.0, lastActivity = 999.0) assertEquals( listOf("unknown", "stopped"), sessionsInListOrder(listOf(stopped, unknown)).map { it.id }, ) } private fun session(id: String, status: String, started: Double, lastActivity: Double) = SessionSummary( id = id, machine = "machine", machineName = "machine", provider = "echo", title = id, model = null, keepsOwnTranscript = false, ownTranscriptName = null, permissionMode = null, effort = null, takesEffort = false, imported = false, notify = true, autoResume = false, autoResumeMessage = DEFAULT_RESUME_MESSAGE, resumeAt = null, cwd = null, contextTokens = null, contextLimit = null, params = emptyMap(), maxImageEdge = null, usageProvider = null, status = status, lastActivity = lastActivity, started = started, backgroundTasks = 0, ) }