113 lines
4.3 KiB
Swift
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))
|
|
}
|
|
}
|