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 ///