Update CMP reader/writer and add tests

This commit is contained in:
Matt Nadareski
2024-11-25 21:52:53 -05:00
parent 6ad4872bd4
commit 0d2a2a3b7d
2 changed files with 64 additions and 36 deletions

View File

@@ -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();
}
}
}

View File

@@ -118,7 +118,11 @@ namespace SabreTools.IO.Writers
/// </summary>
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);
}
/// <summary>
/// Write a complete element with content
/// </summary>
public void WriteElementString(string name, string? value)
{
WriteStartElement(name);
WriteString(value);
WriteEndElement();
}
/// <summary>
/// Ensure writing writing null values as empty strings
/// </summary>
/// <param name="name">Name of the element</param>
/// <param name="value">Value to write in the element</param>
/// <param name="throwOnError">Indicates if an error should be thrown on a missing required value</param>
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);
}
/// <summary>
/// Write an element, if the value is not null or empty
/// </summary>
/// <param name="name">Name of the element</param>
/// <param name="value">Value to write in the element</param>
public void WriteOptionalElementString(string name, string? value)
{
if (!string.IsNullOrEmpty(value))
WriteElementString(name, value);
}
/// <summary>
/// Write the start of an attribute node
/// </summary>