diff --git a/src/Spectre.Console.Ansi.Tests/AnsiWriterTests.cs b/src/Spectre.Console.Ansi.Tests/AnsiWriterTests.cs index 8739cebdd..887af4849 100644 --- a/src/Spectre.Console.Ansi.Tests/AnsiWriterTests.cs +++ b/src/Spectre.Console.Ansi.Tests/AnsiWriterTests.cs @@ -77,6 +77,19 @@ public void Should_Write_Correct_Ansi() // Then fixture.Output.ShouldBe("\e[4D"); } + + [Fact] + public void Should_Not_Write_Ansi_For_Zero_Steps() + { + // Given + var fixture = new AnsiFixture(); + + // When + fixture.Writer.CursorLeft(0); + + // Then + fixture.Output.ShouldBeEmpty(); + } } public sealed class CursorBackward @@ -93,6 +106,19 @@ public void Should_Write_Correct_Ansi() // Then fixture.Output.ShouldBe("\e[4D"); } + + [Fact] + public void Should_Not_Write_Ansi_For_Zero_Steps() + { + // Given + var fixture = new AnsiFixture(); + + // When + fixture.Writer.CursorBackward(0); + + // Then + fixture.Output.ShouldBeEmpty(); + } } public sealed class CursorRight @@ -109,6 +135,19 @@ public void Should_Write_Correct_Ansi() // Then fixture.Output.ShouldBe("\e[4C"); } + + [Fact] + public void Should_Not_Write_Ansi_For_Zero_Steps() + { + // Given + var fixture = new AnsiFixture(); + + // When + fixture.Writer.CursorRight(0); + + // Then + fixture.Output.ShouldBeEmpty(); + } } public sealed class CursorForward @@ -125,6 +164,19 @@ public void Should_Write_Correct_Ansi() // Then fixture.Output.ShouldBe("\e[4C"); } + + [Fact] + public void Should_Not_Write_Ansi_For_Zero_Steps() + { + // Given + var fixture = new AnsiFixture(); + + // When + fixture.Writer.CursorForward(0); + + // Then + fixture.Output.ShouldBeEmpty(); + } } public sealed class CursorDown @@ -141,6 +193,19 @@ public void Should_Write_Correct_Ansi() // Then fixture.Output.ShouldBe("\e[4B"); } + + [Fact] + public void Should_Not_Write_Ansi_For_Zero_Steps() + { + // Given + var fixture = new AnsiFixture(); + + // When + fixture.Writer.CursorDown(0); + + // Then + fixture.Output.ShouldBeEmpty(); + } } public sealed class CursorUp @@ -157,6 +222,19 @@ public void Should_Write_Correct_Ansi() // Then fixture.Output.ShouldBe("\e[4A"); } + + [Fact] + public void Should_Not_Write_Ansi_For_Zero_Steps() + { + // Given + var fixture = new AnsiFixture(); + + // When + fixture.Writer.CursorUp(0); + + // Then + fixture.Output.ShouldBeEmpty(); + } } public sealed class CursorPosition @@ -391,6 +469,19 @@ public void Should_Write_Correct_Ansi() // Then fixture.Output.ShouldBe("\e[4Z"); } + + [Fact] + public void Should_Not_Write_Ansi_For_Zero_Tabs() + { + // Given + var fixture = new AnsiFixture(); + + // When + fixture.Writer.CursorBackwardTabulation(0); + + // Then + fixture.Output.ShouldBeEmpty(); + } } public sealed class CursorHorizontalTabulation @@ -407,6 +498,19 @@ public void Should_Write_Correct_Ansi() // Then fixture.Output.ShouldBe("\e[4I"); } + + [Fact] + public void Should_Not_Write_Ansi_For_Zero_Tabs() + { + // Given + var fixture = new AnsiFixture(); + + // When + fixture.Writer.CursorHorizontalTabulation(0); + + // Then + fixture.Output.ShouldBeEmpty(); + } } public sealed class CursorNextLine @@ -423,6 +527,19 @@ public void Should_Write_Correct_Ansi() // Then fixture.Output.ShouldBe("\e[4E"); } + + [Fact] + public void Should_Not_Write_Ansi_For_Zero_Lines() + { + // Given + var fixture = new AnsiFixture(); + + // When + fixture.Writer.CursorNextLine(0); + + // Then + fixture.Output.ShouldBeEmpty(); + } } public sealed class CursorPreviousLine @@ -439,6 +556,19 @@ public void Should_Write_Correct_Ansi() // Then fixture.Output.ShouldBe("\e[4F"); } + + [Fact] + public void Should_Not_Write_Ansi_For_Zero_Lines() + { + // Given + var fixture = new AnsiFixture(); + + // When + fixture.Writer.CursorPreviousLine(0); + + // Then + fixture.Output.ShouldBeEmpty(); + } } public sealed class Index diff --git a/src/Spectre.Console.Ansi/AnsiWriter.cs b/src/Spectre.Console.Ansi/AnsiWriter.cs index 53f303461..41c5a6c7d 100644 --- a/src/Spectre.Console.Ansi/AnsiWriter.cs +++ b/src/Spectre.Console.Ansi/AnsiWriter.cs @@ -351,6 +351,11 @@ public AnsiWriter CursorHome() /// The same instance so that multiple calls can be chained. public AnsiWriter CursorUp(int steps) { + if (steps == 0) + { + return this; + } + return WriteCsi(steps, 'A'); } @@ -367,6 +372,11 @@ public AnsiWriter CursorUp(int steps) /// The same instance so that multiple calls can be chained. public AnsiWriter CursorDown(int steps) { + if (steps == 0) + { + return this; + } + return WriteCsi(steps, 'B'); } @@ -397,6 +407,11 @@ public AnsiWriter CursorRight(int steps) /// The same instance so that multiple calls can be chained. public AnsiWriter CursorForward(int steps) { + if (steps == 0) + { + return this; + } + return WriteCsi(steps, 'C'); } @@ -427,6 +442,11 @@ public AnsiWriter CursorLeft(int steps) /// The same instance so that multiple calls can be chained. public AnsiWriter CursorBackward(int steps) { + if (steps == 0) + { + return this; + } + return WriteCsi(steps, 'D'); } @@ -607,6 +627,11 @@ public AnsiWriter ClearScrollback() /// The same instance so that multiple calls can be chained. public AnsiWriter CursorBackwardTabulation(int tabs = 1) { + if (tabs == 0) + { + return this; + } + return WriteCsi(tabs, 'Z'); } @@ -621,6 +646,11 @@ public AnsiWriter CursorBackwardTabulation(int tabs = 1) /// The same instance so that multiple calls can be chained. public AnsiWriter CursorHorizontalTabulation(int tabs = 1) { + if (tabs == 0) + { + return this; + } + return WriteCsi(tabs, 'I'); } @@ -635,6 +665,11 @@ public AnsiWriter CursorHorizontalTabulation(int tabs = 1) /// The same instance so that multiple calls can be chained. public AnsiWriter CursorNextLine(int lines = 1) { + if (lines == 0) + { + return this; + } + return WriteCsi(lines, 'E'); } @@ -649,6 +684,11 @@ public AnsiWriter CursorNextLine(int lines = 1) /// The same instance so that multiple calls can be chained. public AnsiWriter CursorPreviousLine(int lines = 1) { + if (lines == 0) + { + return this; + } + return WriteCsi(lines, 'F'); }