diff --git a/Sources/TerminalProgress/ProgressBar.swift b/Sources/TerminalProgress/ProgressBar.swift index 8928f078..b5d7acfd 100644 --- a/Sources/TerminalProgress/ProgressBar.swift +++ b/Sources/TerminalProgress/ProgressBar.swift @@ -235,7 +235,7 @@ extension ProgressBar { if config.showProgressBar, total > 0, allowProgress { let usedWidth = components.joined(separator: " ").count + 45 let remainingWidth = max(config.width - usedWidth, 1) - let barLength = state.finished ? remainingWidth : Int(Int64(remainingWidth) * value / total) + let barLength = min(remainingWidth, state.finished ? remainingWidth : Int(Int64(remainingWidth) * value / total)) let barPaddingLength = remainingWidth - barLength let bar = "\(String(repeating: config.theme.bar, count: barLength))\(String(repeating: " ", count: barPaddingLength))" components.append("|\(bar)|") diff --git a/Tests/TerminalProgressTests/ProgressBarTests.swift b/Tests/TerminalProgressTests/ProgressBarTests.swift index 7232abf8..ea470d1f 100644 --- a/Tests/TerminalProgressTests/ProgressBarTests.swift +++ b/Tests/TerminalProgressTests/ProgressBarTests.swift @@ -738,6 +738,17 @@ final class ProgressBarTests: XCTestCase { XCTAssertEqual(output, "⠋ Task [0s]") } + func testProgressBarSizeExceedsTotal() async throws { + let config = try ProgressConfig( + description: "Task", + showProgressBar: true, + totalSize: 50 + ) + let progress = ProgressBar(config: config) + progress.set(size: 100) + let _ = progress.draw() + } + func testItemsName() async throws { let config = try ProgressConfig( description: "Task",