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