mirror of
https://github.com/anomalyco/opencode.git
synced 2026-07-23 18:55:37 -04:00
9e0d3976e1
Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: James Long <longster@gmail.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: runvip <164729189+runvip@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com> Co-authored-by: Adam <2363879+adamdotdevin@users.noreply.github.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: Simon Klee <hello@simonklee.dk> Co-authored-by: Jay <air@live.ca> Co-authored-by: David Hill <1879069+iamdavidhill@users.noreply.github.com>
87 lines
2.9 KiB
TypeScript
87 lines
2.9 KiB
TypeScript
import { expect, test } from "bun:test"
|
|
import { classifySessionSwitch } from "../timeline/session-tab-switch-metrics"
|
|
|
|
test("counts source and blank samples before the destination is observed", () => {
|
|
const result = classifySessionSwitch([
|
|
{ observedAtMs: 16, destination: [], source: ["source"], hasVisibleRows: true, last: false },
|
|
{ observedAtMs: 32, destination: [], source: [], hasVisibleRows: false, last: false },
|
|
{ observedAtMs: 48, destination: ["destination"], source: [], hasVisibleRows: true, last: true, bottomErrorPx: 0 },
|
|
{ observedAtMs: 64, destination: ["destination"], source: [], hasVisibleRows: true, last: true, bottomErrorPx: 0 },
|
|
{ observedAtMs: 80, destination: ["destination"], source: [], hasVisibleRows: true, last: true, bottomErrorPx: 0 },
|
|
])
|
|
|
|
expect(result.blankSamples).toBe(1)
|
|
expect(result.sourceSamples).toBe(1)
|
|
expect(result.unknownSamples).toBe(0)
|
|
expect(result.firstDestinationObservedMs).toBe(48)
|
|
expect(result.stableObservedMs).toBe(80)
|
|
})
|
|
|
|
test("does not classify mixed source and destination content as correct", () => {
|
|
const result = classifySessionSwitch([
|
|
{
|
|
observedAtMs: 16,
|
|
destination: ["destination"],
|
|
source: ["source"],
|
|
hasVisibleRows: true,
|
|
last: true,
|
|
bottomErrorPx: 0,
|
|
},
|
|
{ observedAtMs: 32, destination: ["destination"], source: [], hasVisibleRows: true, last: true, bottomErrorPx: 0 },
|
|
{ observedAtMs: 48, destination: ["destination"], source: [], hasVisibleRows: true, last: true, bottomErrorPx: 0 },
|
|
{ observedAtMs: 64, destination: ["destination"], source: [], hasVisibleRows: true, last: true, bottomErrorPx: 0 },
|
|
])
|
|
|
|
expect(result.firstCorrectObservedMs).toBe(32)
|
|
expect(result.stableObservedMs).toBe(64)
|
|
})
|
|
|
|
test("reports missing correctness without throwing", () => {
|
|
const result = classifySessionSwitch([
|
|
{
|
|
observedAtMs: 16,
|
|
destination: ["destination"],
|
|
source: ["source"],
|
|
hasVisibleRows: true,
|
|
last: true,
|
|
bottomErrorPx: 0,
|
|
},
|
|
])
|
|
|
|
expect(result.firstDestinationObservedMs).toBe(16)
|
|
expect(result.firstCorrectObservedMs).toBeNull()
|
|
expect(result.stableObservedMs).toBeNull()
|
|
})
|
|
|
|
test("requires an explicitly tracked part to be visible", () => {
|
|
const result = classifySessionSwitch([
|
|
{
|
|
observedAtMs: 16,
|
|
destination: ["destination"],
|
|
source: [],
|
|
hasVisibleRows: true,
|
|
last: true,
|
|
requiredPartVisible: false,
|
|
bottomErrorPx: 0,
|
|
},
|
|
])
|
|
|
|
expect(result.firstCorrectObservedMs).toBeNull()
|
|
})
|
|
|
|
test("can measure content correctness without requiring a bottom anchor", () => {
|
|
const result = classifySessionSwitch([
|
|
{
|
|
observedAtMs: 16,
|
|
destination: ["destination"],
|
|
source: [],
|
|
hasVisibleRows: true,
|
|
last: true,
|
|
requiredPartVisible: true,
|
|
bottomAnchorRequired: false,
|
|
},
|
|
])
|
|
|
|
expect(result.firstCorrectObservedMs).toBe(16)
|
|
})
|