diff --git a/SabreTools.IO.Test/ReadersWriters/ClrMameProTests.cs b/SabreTools.IO.Test/ReadersWriters/ClrMameProTests.cs
new file mode 100644
index 0000000..a5bed63
--- /dev/null
+++ b/SabreTools.IO.Test/ReadersWriters/ClrMameProTests.cs
@@ -0,0 +1,60 @@
+using System.IO;
+using System.Text;
+using SabreTools.IO.Readers;
+using SabreTools.IO.Writers;
+using Xunit;
+
+namespace SabreTools.IO.Test.ReadersWriters
+{
+ public class ClrMameProTests
+ {
+ [Fact]
+ public void EndToEndTest()
+ {
+ string expected = "header (\n\tstandalone \"value\"\n)\n\n# Comment\n\ngame (\n\titem ( attr \"value\" )\n)";
+
+ // Build and write the CMP file
+ var stream = new MemoryStream();
+ var writer = new ClrMameProWriter(stream, Encoding.UTF8);
+ Assert.True(writer.Quotes);
+
+ writer.WriteStartElement("header");
+ writer.WriteRequiredStandalone("standalone", "value");
+ writer.WriteOptionalStandalone("optstand", null);
+ writer.WriteFullEndElement();
+
+ writer.WriteString("\n\n# Comment\n");
+
+ writer.WriteStartElement("game");
+ writer.WriteStartElement("item");
+ writer.WriteRequiredAttributeString("attr", "value");
+ writer.WriteOptionalAttributeString("optional", null);
+ writer.WriteEndElement();
+ writer.WriteFullEndElement();
+
+ writer.Flush();
+ writer.Dispose();
+
+ // Length includes UTF-8 BOM
+ Assert.Equal(77, stream.Length);
+ string actual = Encoding.UTF8.GetString(stream.ToArray(), 3, (int)stream.Length - 3);
+ Assert.Equal(expected, actual);
+
+ // Parse the CMP file
+ stream.Seek(0, SeekOrigin.Begin);
+ var reader = new ClrMameProReader(stream, Encoding.UTF8);
+ Assert.False(reader.DosCenter);
+ Assert.True(reader.Quotes);
+
+ while (!reader.EndOfStream)
+ {
+ bool hasNext = reader.ReadNextLine();
+ Assert.True(hasNext);
+ Assert.NotNull(reader.CurrentLine);
+ Assert.True(reader.LineNumber >= 0);
+ }
+
+ reader.Dispose();
+ }
+ }
+}
\ No newline at end of file
diff --git a/SabreTools.IO/Writers/ClrMameProWriter.cs b/SabreTools.IO/Writers/ClrMameProWriter.cs
index cd5a9c3..73e3f0b 100644
--- a/SabreTools.IO/Writers/ClrMameProWriter.cs
+++ b/SabreTools.IO/Writers/ClrMameProWriter.cs
@@ -118,7 +118,11 @@ namespace SabreTools.IO.Writers
///
public ClrMameProWriter(Stream stream, Encoding encoding)
{
+#if NET20 || NET35 || NET40
sw = new StreamWriter(stream, encoding);
+#else
+ sw = new StreamWriter(stream, encoding, 1024, leaveOpen: true);
+#endif
Quotes = true;
// Element stack
@@ -167,42 +171,6 @@ namespace SabreTools.IO.Writers
InternalWriteEndElement(true);
}
- ///
- /// Write a complete element with content
- ///
- public void WriteElementString(string name, string? value)
- {
- WriteStartElement(name);
- WriteString(value);
- WriteEndElement();
- }
-
- ///
- /// Ensure writing writing null values as empty strings
- ///
- /// Name of the element
- /// Value to write in the element
- /// Indicates if an error should be thrown on a missing required value
- public void WriteRequiredElementString(string name, string? value, bool throwOnError = false)
- {
- // Throw an exception if we are configured to
- if (value == null && throwOnError)
- throw new ArgumentNullException(nameof(value));
-
- WriteElementString(name, value ?? string.Empty);
- }
-
- ///
- /// Write an element, if the value is not null or empty
- ///
- /// Name of the element
- /// Value to write in the element
- public void WriteOptionalElementString(string name, string? value)
- {
- if (!string.IsNullOrEmpty(value))
- WriteElementString(name, value);
- }
-
///
/// Write the start of an attribute node
///