Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions src/SmartFormat.Tests/Core/Output/CustomOutputTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System;
using System.Globalization;
using System.Text;
using NUnit.Framework;
using SmartFormat.Core.Extensions;
using SmartFormat.Core.Formatting;
using SmartFormat.Core.Output;
using SmartFormat.ZString;

namespace SmartFormat.Tests.Core.Output;

internal class CustomOutput : IOutput
{
private readonly StringBuilder _sb = new(1000);
private const string OutputFormat = "Format: {0}, Selector {1}, Formatted: {2}";

public override string ToString()
{
return _sb.ToString();
}

public void Write(string text, IFormattingInfo? formattingInfo = null)
{
Write(text.AsSpan(), formattingInfo);
}

public void Write(ReadOnlySpan<char> text, IFormattingInfo? formattingInfo = null)
{
var fi = (FormattingInfo) formattingInfo!;
_sb.AppendFormat(OutputFormat, fi.Format, fi.Selector, text.ToString());
}

public void Write(ZStringBuilder stringBuilder, IFormattingInfo? formattingInfo = null)
{
Write(stringBuilder.AsSpan(), formattingInfo);
}
}

[TestFixture]
internal class CustomOutputTests
{
[Test]
public void CustomOutput_GetsValid_FormattingInfo_Argument()
{
// This test ensures that the IOutput.Write method overloads
// get a valid IFormattingInfo argument.
var smart = Smart.CreateDefaultSmartFormat();
var output = new CustomOutput();
smart.FormatInto(output, CultureInfo.InvariantCulture, "{0:0.0000}", [9m]);
Assert.That(output.ToString(),
Is.EqualTo("Format: 0.0000, Selector 0, Formatted: 9.0000"));
}
}
6 changes: 3 additions & 3 deletions src/SmartFormat.Tests/Core/Output/StringOutputTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ public class StringOutputTests
public void Output_Of_Span()
{
var so = new StringOutput();
so.Write("text".AsSpan(), null!);
so.Write("text".AsSpan(), null);
Assert.That(so.ToString(), Is.EqualTo("text"));
}

[Test]
public void Output_Of_String()
{
var so = new StringOutput(16);
so.Write("text", null!);
so.Write("text", null);
Assert.That(so.ToString(), Is.EqualTo("text"));
}

Expand All @@ -30,7 +30,7 @@ public void Output_Of_ValueStringBuilder()
var so = new StringOutput();
using var sb = ZStringBuilderUtilities.CreateZStringBuilder();
sb.Append("text");
so.Write(sb, null!);
so.Write(sb, null);
Assert.That(so.ToString(), Is.EqualTo("text"));
}
}
4 changes: 2 additions & 2 deletions src/SmartFormat/Core/Formatting/FormattingInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ public void Write(ReadOnlySpan<char> text)
{
if (Alignment == 0)
{
FormatDetails.Output.Write(text);
FormatDetails.Output.Write(text, this);
FormatDetails.Formatter.Evaluator.OnOutputWritten?.Invoke(this,
new Evaluator.OutputWrittenEventArgs(text.ToString()));
return;
Expand All @@ -199,7 +199,7 @@ public void Write(ReadOnlySpan<char> text)
}

// Write the aligned text to the output
FormatDetails.Output.Write(buffer.GetSpan());
FormatDetails.Output.Write(buffer.GetSpan(), this);

FormatDetails.Formatter.Evaluator.OnOutputWritten?.Invoke(this,
new Evaluator.OutputWrittenEventArgs(buffer.ToString()));
Expand Down
13 changes: 12 additions & 1 deletion src/SmartFormat/Core/Output/IOutput.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,32 @@ public interface IOutput
/// <summary>
/// Writes a string to the output.
/// </summary>
/// <remarks>
/// <b>Only implement a call</b> to <see cref="Write(ReadOnlySpan{char}, IFormattingInfo?)"/>
/// using <see cref="MemoryExtensions.AsSpan(string)"/> for '<see paramref="text"/>'.
/// </remarks>
/// <param name="text"></param>
/// <param name="formattingInfo"></param>
[Obsolete("Use Write(ReadOnlySpan<char> text, IFormattingInfo? formattingInfo = null) instead.", false)]
void Write(string text, IFormattingInfo? formattingInfo = null);

/// <summary>
/// Writes a <see cref="ReadOnlySpan{T}"/> text to the output.
/// </summary>
/// <param name="text"></param>
/// <param name="formattingInfo"></param>
// v4: Remove formattingInfo argument? Or make it non-optional and non-nullable?
void Write(ReadOnlySpan<char> text, IFormattingInfo? formattingInfo = null);

/// <summary>
/// Writes text of a <see cref="ZStringBuilder"/> to the output.
/// </summary>
/// <remarks>
/// <b>Only implement a call</b> to <see cref="Write(ReadOnlySpan{char}, IFormattingInfo?)"/>
/// using <see cref="ZStringBuilder.AsSpan()"/> for '<see paramref="stringBuilder"/>'.
/// </remarks>
/// <param name="stringBuilder"></param>
/// <param name="formattingInfo"></param>
[Obsolete("Use Write(ReadOnlySpan<char> text, IFormattingInfo? formattingInfo = null) instead.", false)]
void Write(ZStringBuilder stringBuilder, IFormattingInfo? formattingInfo = null);
}
}
8 changes: 2 additions & 6 deletions src/SmartFormat/Core/Output/StringOutput.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public StringOutput(StringBuilder output)
/// <param name="formattingInfo">This parameter from <see cref="IOutput"/> will not be used here.</param>
public void Write(string text, IFormattingInfo? formattingInfo = null)
{
Output.Append(text);
Write(text.AsSpan(), formattingInfo);
}

/// <summary>
Expand All @@ -77,11 +77,7 @@ public void Write(ReadOnlySpan<char> text, IFormattingInfo? formattingInfo = nul
///<inheritdoc/>
public void Write(ZStringBuilder stringBuilder, IFormattingInfo? formattingInfo = null)
{
#if NETSTANDARD2_1 || NET6_0_OR_GREATER
Output.Append(stringBuilder.AsSpan());
#else
Output.Append(stringBuilder);
#endif
Write(stringBuilder.AsSpan(), formattingInfo);
}

/// <summary>
Expand Down
8 changes: 2 additions & 6 deletions src/SmartFormat/Core/Output/TextWriterOutput.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public TextWriterOutput(TextWriter output)
///<inheritdoc/>
public void Write(string text, IFormattingInfo? formattingInfo = null)
{
Output.Write(text);
Write(text.AsSpan(), formattingInfo);
}

///<inheritdoc/>
Expand All @@ -47,10 +47,6 @@ public void Write(ReadOnlySpan<char> text, IFormattingInfo? formattingInfo = nul
///<inheritdoc/>
public void Write(ZStringBuilder stringBuilder, IFormattingInfo? formattingInfo = null)
{
#if NETSTANDARD2_1 || NET6_0_OR_GREATER
Output.Write(stringBuilder.AsSpan());
#else
Output.Write(stringBuilder.ToString());
#endif
Write(stringBuilder.AsSpan(), formattingInfo);
}
}
4 changes: 2 additions & 2 deletions src/SmartFormat/Core/Output/ZStringOutput.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ public ZStringOutput(ZStringBuilder stringBuilder)
///<inheritdoc/>
public void Write(string text, IFormattingInfo? formattingInfo = null)
{
Output.Append(text);
Write(text.AsSpan(), formattingInfo);
}

///<inheritdoc/>
Expand All @@ -72,7 +72,7 @@ public void Write(ReadOnlySpan<char> text, IFormattingInfo? formattingInfo = nul
///<inheritdoc/>
public void Write(ZStringBuilder stringBuilder, IFormattingInfo? formattingInfo = null)
{
Output.Append(stringBuilder);
Write(stringBuilder.AsSpan(), formattingInfo);
}

/// <summary>
Expand Down