Add OpenMSX serialization test

This commit is contained in:
Matt Nadareski
2023-07-17 15:56:44 -04:00
parent 9b98e33c26
commit de2db1516b
2 changed files with 147 additions and 0 deletions

View File

@@ -60,5 +60,64 @@ namespace SabreTools.Serialization
return default; return default;
} }
} }
/// <summary>
/// Serializes the defined type to an XML file
/// </summary>
/// <param name="obj">Data to serialize</param>
/// <param name="path">Path to the file to serialize to</param>
/// <returns>True on successful serialization, false otherwise</returns>
public static bool SerializeToFile(T? obj, string path)
{
try
{
using var stream = SerializeToStream(obj);
if (stream == null)
return false;
using var fs = File.OpenWrite(path);
stream.CopyTo(fs);
return true;
}
catch
{
// TODO: Handle logging the exception
return false;
}
}
/// <summary>
/// Serializes the defined type to a stream
/// </summary>
/// <param name="obj">Data to serialize</param>
/// <returns>Stream containing serialized data on success, null otherwise</returns>
public static Stream? SerializeToStream(T? obj)
{
try
{
// If the object is null
if (obj == null)
return null;
// Setup the serializer and the reader
var serializer = new XmlSerializer(typeof(T));
var settings = new XmlWriterSettings
{
CheckCharacters = false,
};
var stream = new MemoryStream();
var streamWriter = new StreamWriter(stream);
var xmlWriter = XmlWriter.Create(streamWriter, settings);
// Perform the deserialization and return
serializer.Serialize(xmlWriter, obj);
return stream;
}
catch
{
// TODO: Handle logging the exception
return null;
}
}
} }
} }

View File

@@ -0,0 +1,88 @@
using System;
using Xunit;
namespace SabreTools.Test.Parser
{
public class SerializationTests
{
[Fact]
public void OpenMSXSeserializeTest()
{
// Create the object for serialization
var dat = GenerateOpenMSX();
// Deserialize the file
var stream = Serialization.OpenMSX.SerializeToStream(dat) as System.IO.MemoryStream;
// Validate the values
Assert.NotNull(stream);
byte[] hash = System.Security.Cryptography.SHA1.Create().ComputeHash(stream.GetBuffer());
string hashstr = BitConverter.ToString(hash).Replace("-", string.Empty);
Assert.Equal("195D11C8A93D73F9FBF1ECD8166D80D7BB1B0974", hashstr);
}
#region Payload Generators
/// <summary>
/// Generate a consistent OpenMSX SoftwareDb for testing
/// </summary>
private static Models.OpenMSX.SoftwareDb GenerateOpenMSX()
{
var original = new Models.OpenMSX.Original
{
Value = false,
Content = "Original Name",
};
var rom = new Models.OpenMSX.Rom
{
Start = "0x0000",
Type = "Game",
Hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709",
Remark = "Comment",
};
var megaRom = new Models.OpenMSX.MegaRom
{
Start = "0x1000",
Type = "Software",
Hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709",
Remark = "Comment",
};
var sccPlusCart = new Models.OpenMSX.SCCPlusCart
{
Start = "0x2000",
Type = "Utility",
Hash = "da39a3ee5e6b4b0d3255bfef95601890afd80709",
Remark = "Comment",
};
var dump = new Models.OpenMSX.Dump[]
{
new Models.OpenMSX.Dump { Original = original, Rom = rom },
new Models.OpenMSX.Dump { Rom = megaRom },
new Models.OpenMSX.Dump { Rom = sccPlusCart },
};
var software = new Models.OpenMSX.Software
{
Title = "Software Title",
GenMSXID = "00000", // Not required
System = "MSX 2",
Company = "Imaginary Company, Inc.",
Year = "19xx",
Country = "Imaginaria",
Dump = dump,
};
return new Models.OpenMSX.SoftwareDb
{
Timestamp = "1234567890",
Software = new Models.OpenMSX.Software[] { software },
};
}
#endregion
}
}