mirror of
https://github.com/SabreTools/SabreTools.IO.git
synced 2026-09-24 07:35:57 +00:00
Update CMP reader/writer and add tests
This commit is contained in:
60
SabreTools.IO.Test/ReadersWriters/ClrMameProTests.cs
Normal file
60
SabreTools.IO.Test/ReadersWriters/ClrMameProTests.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user