From ec8908aec0996953fe2977b95dd92b7e368a4bdc Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 25 Nov 2024 20:35:02 -0500 Subject: [PATCH] Update XML writer extensions and add tests --- .../XmlTextWriterExtensionsTests.cs | 242 ++++++++++++++++++ .../Extensions/XmlTextWriterExtensions.cs | 8 +- 2 files changed, 246 insertions(+), 4 deletions(-) create mode 100644 SabreTools.IO.Test/Extensions/XmlTextWriterExtensionsTests.cs diff --git a/SabreTools.IO.Test/Extensions/XmlTextWriterExtensionsTests.cs b/SabreTools.IO.Test/Extensions/XmlTextWriterExtensionsTests.cs new file mode 100644 index 0000000..6961c1f --- /dev/null +++ b/SabreTools.IO.Test/Extensions/XmlTextWriterExtensionsTests.cs @@ -0,0 +1,242 @@ +using System; +using System.IO; +using System.Text; +using System.Xml; +using SabreTools.IO.Extensions; +using Xunit; + +namespace SabreTools.IO.Test.Extensions +{ + public class XmlTextWriterExtensionsTests + { + [Fact] + public void WriteRequiredAttributeString_NullInputThrow_Throws() + { + string expected = ""; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteStartElement("element"); + Assert.Throws(() + => writer.WriteRequiredAttributeString("attr", null, throwOnError: true)); + writer.WriteEndElement(); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(52, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteRequiredAttributeString_NullInputNoThrow_Writes() + { + string expected = ""; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteStartElement("element"); + writer.WriteRequiredAttributeString("attr", null, throwOnError: false); + writer.WriteEndElement(); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(60, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteRequiredAttributeString_ValidInput_Writes() + { + string expected = ""; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteStartElement("element"); + writer.WriteRequiredAttributeString("attr", "val", throwOnError: false); + writer.WriteEndElement(); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(63, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteRequiredElementString_NullInputThrow_Throws() + { + string expected = ""; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + Assert.Throws(() + => writer.WriteRequiredElementString("element", null, throwOnError: true)); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(41, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteRequiredElementString_NullInputNoThrow_Writes() + { + string expected = ""; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteRequiredElementString("element", null, throwOnError: false); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(60, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteRequiredElementString_ValidInput_Writes() + { + string expected = "val"; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteRequiredElementString("element", "val", throwOnError: false); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(63, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteOptionalAttributeString_NullInput_NoWrite() + { + string expected = ""; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteStartElement("element"); + writer.WriteOptionalAttributeString("attr", null); + writer.WriteEndElement(); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(52, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteOptionalAttributeString_EmptyInput_NoWrite() + { + string expected = ""; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteStartElement("element"); + writer.WriteOptionalAttributeString("attr", string.Empty); + writer.WriteEndElement(); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(52, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteOptionalAttributeString_ValidInput_Writes() + { + string expected = ""; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteStartElement("element"); + writer.WriteOptionalAttributeString("attr", "val"); + writer.WriteEndElement(); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(63, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteOptionalElementString_NullInput_NoWrite() + { + string expected = ""; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteOptionalElementString("element", null); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(41, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteOptionalElementString_EmptyInput_NoWrite() + { + string expected = ""; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteOptionalElementString("element", string.Empty); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(41, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + + [Fact] + public void WriteOptionalElementString_ValidInput_Writes() + { + string expected = "val"; + + var stream = new MemoryStream(); + var writer = new XmlTextWriter(stream, Encoding.UTF8); + + writer.WriteStartDocument(); + writer.WriteOptionalElementString("element", "val"); + writer.Flush(); + + // Length includes UTF-8 BOM + Assert.Equal(63, stream.Length); + string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3); + Assert.Equal(expected, actual); + } + } +} \ No newline at end of file diff --git a/SabreTools.IO/Extensions/XmlTextWriterExtensions.cs b/SabreTools.IO/Extensions/XmlTextWriterExtensions.cs index 9f384f0..13d8b15 100644 --- a/SabreTools.IO/Extensions/XmlTextWriterExtensions.cs +++ b/SabreTools.IO/Extensions/XmlTextWriterExtensions.cs @@ -15,7 +15,7 @@ namespace SabreTools.IO.Extensions /// Name of the element /// Value to write in the element /// Indicates if an error should be thrown on a missing required value - public static void WriteRequiredAttributeString(this XmlTextWriter writer, string localName, string value, bool throwOnError = false) + public static void WriteRequiredAttributeString(this XmlTextWriter writer, string localName, string? value, bool throwOnError = false) { // Throw an exception if we are configured to if (value == null && throwOnError) @@ -31,7 +31,7 @@ namespace SabreTools.IO.Extensions /// Name of the element /// Value to write in the element /// Indicates if an error should be thrown on a missing required value - public static void WriteRequiredElementString(this XmlTextWriter writer, string localName, string value, bool throwOnError = false) + public static void WriteRequiredElementString(this XmlTextWriter writer, string localName, string? value, bool throwOnError = false) { // Throw an exception if we are configured to if (value == null && throwOnError) @@ -51,7 +51,7 @@ namespace SabreTools.IO.Extensions /// XmlTextWriter to write out with /// Name of the attribute /// Value to write in the attribute - public static void WriteOptionalAttributeString(this XmlTextWriter writer, string localName, string value) + public static void WriteOptionalAttributeString(this XmlTextWriter writer, string localName, string? value) { if (!string.IsNullOrEmpty(value)) writer.WriteAttributeString(localName, value); @@ -63,7 +63,7 @@ namespace SabreTools.IO.Extensions /// XmlTextWriter to write out with /// Name of the element /// Value to write in the element - public static void WriteOptionalElementString(this XmlTextWriter writer, string localName, string value) + public static void WriteOptionalElementString(this XmlTextWriter writer, string localName, string? value) { if (!string.IsNullOrEmpty(value)) writer.WriteElementString(localName, value);