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');
}