Files
steipete--codexbar/Tests/CodexBarTests/StorageBreakdownSegmentTests.swift
2026-07-13 12:22:33 +08:00

113 lines
4.3 KiB
Swift

import CodexBarCore
import Foundation
import Testing
@testable import CodexBar
struct StorageBreakdownSegmentTests {
@Test @MainActor
func `folds overflow into eighth segment without losing paths`() {
let components = (1...10).map { index in
ProviderStorageFootprint.Component(path: "/tmp/item-\(index)", totalBytes: Int64(index))
}
let view = StorageBreakdownMenuView(
footprint: Self.footprint(components: components),
width: 310)
#expect(view._segmentNamesForTesting == [
"item-1", "item-2", "item-3", "item-4", "item-5", "item-6", "item-7", "Other (3 items)",
])
#expect(view._segmentBytesForTesting == [1, 2, 3, 4, 5, 6, 7, 27])
#expect(view._overflowNamesForTesting == ["item-8", "item-9", "item-10"])
#expect(view._overflowExpansionHeightForTesting == 68)
#expect(view.copyablePaths == components.map(\.path))
}
@Test @MainActor
func `segment widths fill bar and keep tiny values visible`() {
let components = [
ProviderStorageFootprint.Component(path: "/tmp/large", totalBytes: 1_000_000),
ProviderStorageFootprint.Component(path: "/tmp/tiny", totalBytes: 1),
ProviderStorageFootprint.Component(path: "/tmp/zero", totalBytes: 0),
]
let view = StorageBreakdownMenuView(
footprint: Self.footprint(components: components),
width: 310)
let widths = view._segmentWidthsForTesting(barWidth: 100)
#expect(widths.count == 3)
#expect(abs(widths.reduce(0, +) - 100) < 0.001)
#expect(widths.allSatisfy { $0 >= 2 })
}
@Test @MainActor
func `narrow bar divides width without overflow`() {
let components = (1...8).map { index in
ProviderStorageFootprint.Component(path: "/tmp/item-\(index)", totalBytes: 1)
}
let view = StorageBreakdownMenuView(
footprint: Self.footprint(components: components),
width: 310)
let widths = view._segmentWidthsForTesting(barWidth: 8)
#expect(widths == Array(repeating: 1, count: 8))
#expect(widths.reduce(0, +) == 8)
}
@Test @MainActor
func `zero byte components evenly fill bar`() {
let components = (1...4).map { index in
ProviderStorageFootprint.Component(path: "/tmp/item-\(index)", totalBytes: 0)
}
let view = StorageBreakdownMenuView(
footprint: Self.footprint(components: components),
width: 310)
#expect(view._segmentWidthsForTesting(barWidth: 100) == [25, 25, 25, 25])
}
@Test @MainActor
func `negative component sizes clamp to zero`() {
let components = [
ProviderStorageFootprint.Component(path: "/tmp/negative", totalBytes: -10),
ProviderStorageFootprint.Component(path: "/tmp/positive", totalBytes: 10),
]
let view = StorageBreakdownMenuView(
footprint: Self.footprint(components: components),
width: 310)
#expect(view._segmentBytesForTesting == [0, 10])
#expect(view._segmentWidthsForTesting(barWidth: 100).allSatisfy { $0 >= 2 })
}
@Test @MainActor
func `extreme component sizes still fill exactly one bar`() {
let components = [
ProviderStorageFootprint.Component(path: "/tmp/first", totalBytes: .max),
ProviderStorageFootprint.Component(path: "/tmp/second", totalBytes: .max),
]
let view = StorageBreakdownMenuView(
footprint: Self.footprint(components: components),
width: 310)
let widths = view._segmentWidthsForTesting(barWidth: 100)
#expect(abs(widths.reduce(0, +) - 100) < 0.001)
#expect(widths == [50, 50])
}
private static func footprint(
components: [ProviderStorageFootprint.Component]) -> ProviderStorageFootprint
{
ProviderStorageFootprint(
provider: .claude,
totalBytes: components.reduce(Int64(0)) { partial, component in
let (sum, overflowed) = partial.addingReportingOverflow(max(component.totalBytes, 0))
return overflowed ? .max : sum
},
paths: components.map(\.path),
missingPaths: [],
unreadablePaths: [],
components: components,
updatedAt: Date(timeIntervalSince1970: 0))
}
}