package com.example.aiapp import java.time.OffsetDateTime import kotlin.test.Test import kotlin.test.assertEquals class SessionUsageTest { @Test fun `usage snapshots stay with the session's machine and provider`() { val claude = snapshot("machine", "claude", null) val codex = snapshot("machine", "codex", "codex") val reserve = snapshot("machine", "codex", "gpt-reserve") val elsewhere = snapshot("other", "codex", "codex") assertEquals( listOf(codex, reserve), usageSnapshotsFor( listOf(claude, codex, reserve, elsewhere), machine = "machine", provider = "codex", ), ) } @Test fun `a session without a meter has no usage snapshots`() { assertEquals( emptyList(), usageSnapshotsFor( listOf(snapshot("machine", "claude", null)), machine = "machine", provider = null, ), ) } @Test fun `the model selects its named pool and other models use the generic pool`() { val generic = snapshot("machine", "codex", "codex") val spark = snapshot( "machine", "codex", "codex_bengalfox", limitName = "GPT-5.3-Codex-Spark", ) val reserve = snapshot("machine", "codex", "base_model_inference", limitName = "gpt-reserve") val pools = listOf(generic, spark, reserve) assertEquals(spark, usagePoolFor(pools, "gpt-5.3-codex-spark")) assertEquals(reserve, usagePoolFor(pools, "gpt-5.6-luna")) assertEquals(generic, usagePoolFor(pools, "gpt-6-astra")) } @Test fun `the bar uses the shortest reported cycle`() { val weekly = window("Weekly", 10_080) val hourly = window("5-hour window", 300) assertEquals(hourly, shortestUsageWindow(listOf(weekly, hourly))) assertEquals(null, shortestUsageWindow(listOf(window("unknown", null)))) } @Test fun `the time cursor follows elapsed time through the window`() { val now = OffsetDateTime.parse("2026-09-17T12:00:00Z") assertEquals( 0.4f, usageWindowElapsedFraction( window("5-hour window", 300, "2026-09-17T15:00:00Z"), now, ), ) } @Test fun `the time cursor clamps at the window ends`() { val now = OffsetDateTime.parse("2026-09-17T12:00:00Z") assertEquals( 0f, usageWindowElapsedFraction( window("5-hour window", 300, "2026-09-17T18:00:00Z"), now, ), ) assertEquals( 1f, usageWindowElapsedFraction( window("5-hour window", 300, "2026-09-17T11:00:00Z"), now, ), ) } @Test fun `the time cursor is absent without a usable duration and reset time`() { val now = OffsetDateTime.parse("2026-09-17T12:00:00Z") assertEquals(null, usageWindowElapsedFraction(window("unknown", null), now)) assertEquals(null, usageWindowElapsedFraction(window("not running", 300), now)) assertEquals( null, usageWindowElapsedFraction(window("unreadable", 300, "not a timestamp"), now), ) assertEquals(null, usageWindowElapsedFraction(window("zero", 0), now)) } private fun snapshot( machine: String, provider: String, limitId: String?, limitName: String? = null, ) = UsageSnapshot( provider = provider, machine = machine, machineName = machine, limitId = limitId, limitName = limitName, state = "ok", detail = null, windows = emptyList(), ) private fun window(label: String, durationMinutes: Long?, resetsAt: String? = null) = UsageWindow( kind = "test", label = label, percent = 12.0, durationMinutes = durationMinutes, resetsAt = resetsAt, active = false, ) }