Add Logiqx deserialization test, fix issues

This commit is contained in:
Matt Nadareski
2023-07-14 00:39:22 -04:00
parent b5fee93a09
commit 034589494d
27 changed files with 84862 additions and 31302 deletions

View File

@@ -4,7 +4,7 @@ using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("archive")]
public class Archive
public class Archive : ItemBase
{
[XmlAttribute("name")]
public string Name { get; set; }

View File

@@ -4,7 +4,7 @@ using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("biosset")]
public class BiosSet
public class BiosSet : ItemBase
{
[XmlAttribute("name")]
public string Name { get; set; }

View File

@@ -20,5 +20,17 @@ namespace SabreTools.Models.Logiqx
/// <remarks>(zip|unzip) "zip"</remarks>
[XmlAttribute("forcepacking")]
public string? ForcePacking { get; set; }
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
[XmlAnyAttribute]
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
/// <remarks>Should be empty</remarks>
[XmlAnyElement]
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endregion
}
}

View File

@@ -16,18 +16,35 @@ namespace SabreTools.Models.Logiqx
[XmlElement("header")]
public Header? Header { get; set; }
[XmlElement("game")]
public Game[]? Game { get; set; }
[XmlElement("game", typeof(Game))]
[XmlElement("machine", typeof(Machine))]
public GameBase[]? Game { get; set; }
[XmlElement("machine")]
public Machine[]? Machine { get; set; }
#region No-Intro Extensions
/// <remarks>Appears after Debug</remarks>
[XmlAttribute(Namespace = "http://www.w3.org/2001/XMLSchema-instance", AttributeName = "schemaLocation")]
public string? SchemaLocation { get; set; }
#endregion
#region RomVault Extensions
/// <remarks>Boolean; Appears after Header</remarks>
[XmlAttribute("dir")]
[XmlElement("dir")]
public Dir[]? Dir { get; set; }
#endregion
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
[XmlAnyAttribute]
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
/// <remarks>Should be empty</remarks>
[XmlAnyElement]
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endregion
}
}

View File

@@ -0,0 +1,12 @@
using System.Xml;
using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("device_ref")]
public class DeviceRef : ItemBase
{
[XmlAttribute("name")]
public string Name { get; set; }
}
}

View File

@@ -9,10 +9,20 @@ namespace SabreTools.Models.Logiqx
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("machine")]
public Game[]? Game { get; set; }
[XmlElement("game", typeof(Game))]
[XmlElement("machine", typeof(Machine))]
public GameBase[]? Game { get; set; }
[XmlAttribute("machine")]
public Machine[]? Machine { get; set; }
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
[XmlAnyAttribute]
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
/// <remarks>Should be empty</remarks>
[XmlAnyElement]
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endregion
}
}

View File

@@ -4,7 +4,7 @@ using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("disk")]
public class Disk
public class Disk : ItemBase
{
[XmlAttribute("name")]
public string Name { get; set; }
@@ -21,5 +21,13 @@ namespace SabreTools.Models.Logiqx
/// <remarks>(baddump|nodump|good|verified) "good"</remarks>
[XmlAttribute("status")]
public string? Status { get; set; }
#region MAME Extensions
/// <remarks>Appears after Status</remarks>
[XmlAttribute("region")]
public string? Region { get; set; }
#endregion
}
}

View File

@@ -0,0 +1,41 @@
using System.Xml;
using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("driver")]
public class Driver : ItemBase
{
/// <remarks>(good|imperfect|preliminary)</remarks>
[XmlAttribute("status")]
public string Status { get; set; }
/// <remarks>(good|imperfect|preliminary)</remarks>
[XmlAttribute("emulation")]
public string Emulation { get; set; }
/// <remarks>(good|imperfect|preliminary)</remarks>
[XmlAttribute("cocktail")]
public string Cocktail { get; set; }
/// <remarks>(supported|unsupported)</remarks>
[XmlAttribute("savestate")]
public string SaveState { get; set; }
/// <remarks>(yes|no) "no"</remarks>
[XmlAttribute("requiresartwork")]
public string? RequiresArtwork { get; set; }
/// <remarks>(yes|no) "no"</remarks>
[XmlAttribute("unofficial")]
public string? Unofficial { get; set; }
/// <remarks>(yes|no) "no"</remarks>
[XmlAttribute("nosoundhardware")]
public string? NoSoundHardware { get; set; }
/// <remarks>(yes|no) "no"</remarks>
[XmlAttribute("incomplete")]
public string? Incomplete { get; set; }
}
}

View File

@@ -1,102 +1,7 @@
using System.Xml;
using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("game")]
public class Game
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("sourcefile")]
public string? SourceFile { get; set; }
/// <remarks>(yes|no) "no"</remarks>
[XmlAttribute("isbios")]
public string? IsBios { get; set; }
[XmlAttribute("cloneof")]
public string? CloneOf { get; set; }
[XmlAttribute("romof")]
public string? RomOf { get; set; }
[XmlAttribute("sampleof")]
public string? SampleOf { get; set; }
[XmlAttribute("board")]
public string? Board { get; set; }
[XmlAttribute("rebuildto")]
public string? RebuildTo { get; set; }
/// <remarks>(no|partial|yes) "no"</remarks>
[XmlAttribute("runnable")]
public string? Runnable { get; set; }
[XmlElement("comment")]
public string[]? Comment { get; set; }
[XmlElement("description")]
public string Description { get; set; }
[XmlElement("year")]
public string? Year { get; set; }
[XmlElement("manufacturer")]
public string? Manufacturer { get; set; }
[XmlElement("publisher")]
public string? Publisher { get; set; }
[XmlElement("category")]
public string? Category { get; set; }
[XmlElement("release")]
public Release[]? Release { get; set; }
[XmlElement("biosset")]
public BiosSet[]? BiosSet { get; set; }
[XmlElement("rom")]
public Rom[]? Rom { get; set; }
[XmlElement("disk")]
public Disk[]? Disk { get; set; }
[XmlElement("sample")]
public Sample[]? Sample { get; set; }
[XmlElement("archive")]
public Archive[]? Archive { get; set; }
#region Aaru Extensions
/// <remarks>Appears after Disk</remarks>
[XmlElement("media")]
public Media[]? Media { get; set; }
#endregion
#region No-Intro Extensions
/// <remarks>Appears after RebuildTo</remarks>
[XmlAttribute("id")]
public string? Id { get; set; }
/// <remarks>Appears after Id</remarks>
[XmlAttribute("cloneofid")]
public string? CloneOfId { get; set; }
#endregion
#region Trurip Extensions
/// <remarks>Appears after Category</remarks>
[XmlElement("trurip")]
public Trurip? Trurip { get; set; }
#endregion
}
public class Game : GameBase { }
}

View File

@@ -0,0 +1,115 @@
using System.Xml;
using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
/// <summary>
/// Base class to unify the various game-like types
/// </summary>
public abstract class GameBase
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("sourcefile")]
public string? SourceFile { get; set; }
/// <remarks>(yes|no) "no"</remarks>
[XmlAttribute("isbios")]
public string? IsBios { get; set; }
[XmlAttribute("cloneof")]
public string? CloneOf { get; set; }
[XmlAttribute("romof")]
public string? RomOf { get; set; }
[XmlAttribute("sampleof")]
public string? SampleOf { get; set; }
[XmlAttribute("board")]
public string? Board { get; set; }
[XmlAttribute("rebuildto")]
public string? RebuildTo { get; set; }
/// <remarks>(no|partial|yes) "no"</remarks>
[XmlAttribute("runnable")]
public string? Runnable { get; set; }
[XmlElement("comment")]
public string[]? Comment { get; set; }
[XmlElement("description")]
public string Description { get; set; }
[XmlElement("year")]
public string? Year { get; set; }
[XmlElement("manufacturer")]
public string? Manufacturer { get; set; }
[XmlElement("publisher")]
public string? Publisher { get; set; }
/// <remarks>No-Intro extension includes more than 1 instance</remarks>
[XmlElement("category")]
public string[]? Category { get; set; }
[XmlElement("release", typeof(Release))]
[XmlElement("biosset", typeof(BiosSet))]
[XmlElement("rom", typeof(Rom))]
[XmlElement("disk", typeof(Disk))]
[XmlElement("media", typeof(Media))] // Aaru extension
[XmlElement("device_ref", typeof(DeviceRef))] // MAME extension
[XmlElement("sample", typeof(Sample))]
[XmlElement("archive", typeof(Archive))]
[XmlElement("driver", typeof(Driver))] // MAME extension
[XmlElement("softwarelist", typeof(SoftwareList))] // MAME extension
public ItemBase[]? Item { get; set; }
#region MAME Extensions
/// <remarks>(yes|no) "no", Appears after IsBios</remarks>
[XmlAttribute("isdevice")]
public string? IsDevice { get; set; }
/// <remarks>(yes|no) "no", Appears after IsDevice</remarks>
[XmlAttribute("ismechanical")]
public string? IsMechanical { get; set; }
#endregion
#region No-Intro Extensions
/// <remarks>Appears after RebuildTo</remarks>
[XmlAttribute("id")]
public string? Id { get; set; }
/// <remarks>Appears after Id</remarks>
[XmlAttribute("cloneofid")]
public string? CloneOfId { get; set; }
#endregion
#region Trurip Extensions
/// <remarks>Appears after Category</remarks>
[XmlElement("trurip")]
public Trurip? Trurip { get; set; }
#endregion
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
[XmlAnyAttribute]
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
/// <remarks>Should be empty</remarks>
[XmlAnyElement]
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endregion
}
}

View File

@@ -6,7 +6,7 @@ namespace SabreTools.Models.Logiqx
[XmlRoot("header")]
public class Header
{
[XmlAttribute("name")]
[XmlElement("name")]
public string Name { get; set; }
[XmlElement("description")]
@@ -61,5 +61,17 @@ namespace SabreTools.Models.Logiqx
public string? Type { get; set; }
#endregion
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
[XmlAnyAttribute]
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
/// <remarks>Should be empty</remarks>
[XmlAnyElement]
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endregion
}
}

View File

@@ -0,0 +1,23 @@
using System.Xml;
using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
/// <summary>
/// Base class to unify the various item types
/// </summary>
public abstract class ItemBase
{
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
[XmlAnyAttribute]
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
/// <remarks>Should be empty</remarks>
[XmlAnyElement]
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endregion
}
}

View File

@@ -1,102 +1,7 @@
using System.Xml;
using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("machine")]
public class Machine
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("sourcefile")]
public string? SourceFile { get; set; }
/// <remarks>(yes|no) "no"</remarks>
[XmlAttribute("isbios")]
public string? IsBios { get; set; }
[XmlAttribute("cloneof")]
public string? CloneOf { get; set; }
[XmlAttribute("romof")]
public string? RomOf { get; set; }
[XmlAttribute("sampleof")]
public string? SampleOf { get; set; }
[XmlAttribute("board")]
public string? Board { get; set; }
[XmlAttribute("rebuildto")]
public string? RebuildTo { get; set; }
/// <remarks>(no|partial|yes) "no"</remarks>
[XmlAttribute("runnable")]
public string? Runnable { get; set; }
[XmlElement("comment")]
public string[]? Comment { get; set; }
[XmlElement("description")]
public string Description { get; set; }
[XmlElement("year")]
public string? Year { get; set; }
[XmlElement("manufacturer")]
public string? Manufacturer { get; set; }
[XmlElement("publisher")]
public string? Publisher { get; set; }
[XmlElement("category")]
public string? Category { get; set; }
[XmlElement("release")]
public Release[]? Release { get; set; }
[XmlElement("biosset")]
public BiosSet[]? BiosSet { get; set; }
[XmlElement("rom")]
public Rom[]? Rom { get; set; }
[XmlElement("disk")]
public Disk[]? Disk { get; set; }
[XmlElement("sample")]
public Sample[]? Sample { get; set; }
[XmlElement("archive")]
public Archive[]? Archive { get; set; }
#region Aaru Extensions
/// <remarks>Appears after Disk</remarks>
[XmlElement("media")]
public Media[]? Media { get; set; }
#endregion
#region No-Intro Extensions
/// <remarks>Appears after RebuildTo</remarks>
[XmlAttribute("id")]
public string? Id { get; set; }
/// <remarks>Appears after Id</remarks>
[XmlAttribute("cloneofid")]
public string? CloneOfId { get; set; }
#endregion
#region Trurip Extensions
/// <remarks>Appears after Category</remarks>
[XmlElement("trurip")]
public Trurip? Trurip { get; set; }
#endregion
}
public class Machine : GameBase { }
}

View File

@@ -4,7 +4,7 @@ using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("media")]
public class Media
public class Media : ItemBase
{
[XmlAttribute("name")]
public string Name { get; set; }

View File

@@ -4,7 +4,7 @@ using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("release")]
public class Release
public class Release : ItemBase
{
[XmlAttribute("name")]
public string Name { get; set; }

View File

@@ -4,7 +4,7 @@ using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("rom")]
public class Rom
public class Rom : ItemBase
{
[XmlAttribute("name")]
public string Name { get; set; }
@@ -79,11 +79,11 @@ namespace SabreTools.Models.Logiqx
/// <remarks>Boolean; Appears after Date</remarks>
[XmlAttribute("inverted")]
public bool? Inverted { get; set; }
public string? Inverted { get; set; }
/// <remarks>Boolean; Appears after Inverted</remarks>
[XmlAttribute("mia")]
public bool? MIA { get; set; }
public string? MIA { get; set; }
#endregion
}

View File

@@ -32,5 +32,17 @@ namespace SabreTools.Models.Logiqx
/// <remarks>(yes|no) "no"</remarks>
[XmlAttribute("locksamplemode")]
public string? LockSampleMode { get; set; }
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
[XmlAnyAttribute]
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
/// <remarks>Should be empty</remarks>
[XmlAnyElement]
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endregion
}
}

View File

@@ -4,7 +4,7 @@ using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("sample")]
public class Sample
public class Sample : ItemBase
{
[XmlAttribute("name")]
public string Name { get; set; }

View File

@@ -0,0 +1,22 @@
using System.Xml;
using System.Xml.Serialization;
namespace SabreTools.Models.Logiqx
{
[XmlRoot("softwarelist")]
public class SoftwareList : ItemBase
{
[XmlAttribute("tag")]
public string Tag { get; set; }
[XmlAttribute("name")]
public string Name { get; set; }
/// <remarks>(original|compatible)</remarks>
[XmlAttribute("status")]
public string Status { get; set; }
[XmlAttribute("filter")]
public string? Filter { get; set; }
}
}

View File

@@ -48,5 +48,17 @@ namespace SabreTools.Models.Logiqx
[XmlElement("relatedto")]
public string? RelatedTo { get; set; }
#region DO NOT USE IN PRODUCTION
/// <remarks>Should be empty</remarks>
[XmlAnyAttribute]
public XmlAttribute[]? ADDITIONAL_ATTRIBUTES { get; set; }
/// <remarks>Should be empty</remarks>
[XmlAnyElement]
public object[]? ADDITIONAL_ELEMENTS { get; set; }
#endregion
}
}

View File

@@ -0,0 +1,7 @@
namespace SabreTools.Serialization
{
/// <summary>
/// XML deserializer for Logiqx-derived metadata files
/// </summary>
public class Logiqx : XmlSerializer<Models.Logiqx.Datafile> { }
}

View File

@@ -429,6 +429,87 @@ namespace SabreTools.Test.Parser
}
}
[Theory]
[InlineData("test-logiqx-files1.xml.gz", 45875)]
[InlineData("test-logiqx-files2.xml", 761)]
public void LogiqxDeserializeTest(string file, long count)
{
// Open the file for reading
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", file);
// Deserialize the file
var dat = Serialization.Logiqx.Deserialize(filename);
// Validate the values
Assert.NotNull(dat?.Game);
Assert.Equal(count, dat.Game.Length);
// Validate we're not missing any attributes or elements
Assert.Null(dat.ADDITIONAL_ATTRIBUTES);
Assert.Null(dat.ADDITIONAL_ELEMENTS);
if (dat.Header != null)
{
var header = dat.Header;
Assert.Null(header.ADDITIONAL_ATTRIBUTES);
Assert.Null(header.ADDITIONAL_ELEMENTS);
if (header.ClrMamePro != null)
{
var cmp = header.ClrMamePro;
Assert.Null(cmp.ADDITIONAL_ATTRIBUTES);
Assert.Null(cmp.ADDITIONAL_ELEMENTS);
}
if (header.RomCenter != null)
{
var rc = header.RomCenter;
Assert.Null(rc.ADDITIONAL_ATTRIBUTES);
Assert.Null(rc.ADDITIONAL_ELEMENTS);
}
}
foreach (var game in dat.Game)
{
Assert.Null(game.ADDITIONAL_ATTRIBUTES);
Assert.Null(game.ADDITIONAL_ELEMENTS);
foreach (var item in game.Item ?? Array.Empty<Models.Logiqx.ItemBase>())
{
Assert.Null(item.ADDITIONAL_ATTRIBUTES);
Assert.Null(item.ADDITIONAL_ELEMENTS);
}
if (game.Trurip != null)
{
var trurip = game.Trurip;
Assert.Null(trurip.ADDITIONAL_ATTRIBUTES);
Assert.Null(trurip.ADDITIONAL_ELEMENTS);
}
}
foreach (var dir in dat.Dir ?? Array.Empty<Models.Logiqx.Dir>())
{
foreach (var game in dir.Game)
{
Assert.Null(game.ADDITIONAL_ATTRIBUTES);
Assert.Null(game.ADDITIONAL_ELEMENTS);
foreach (var item in game.Item ?? Array.Empty<Models.Logiqx.ItemBase>())
{
Assert.Null(item.ADDITIONAL_ATTRIBUTES);
Assert.Null(item.ADDITIONAL_ELEMENTS);
}
if (game.Trurip != null)
{
var trurip = game.Trurip;
Assert.Null(trurip.ADDITIONAL_ATTRIBUTES);
Assert.Null(trurip.ADDITIONAL_ELEMENTS);
}
}
}
}
[Fact]
public void OfflineListDeserializeTest()
{
@@ -692,13 +773,13 @@ namespace SabreTools.Test.Parser
Assert.Empty(dat.ADDITIONAL_ELEMENTS);
if (dat.Credits != null)
Assert.Empty(dat.Credits.ADDITIONAL_ELEMENTS);
if (dat.Dat != null)
Assert.Empty(dat.Dat.ADDITIONAL_ELEMENTS);
if (dat.Emulator != null)
Assert.Empty(dat.Emulator.ADDITIONAL_ELEMENTS);
if (dat.Games != null)
{
Assert.Empty(dat.Games.ADDITIONAL_ELEMENTS);
@@ -709,11 +790,14 @@ namespace SabreTools.Test.Parser
}
}
[Fact]
public void SoftwareListDeserializeTest()
[Theory]
[InlineData("test-softwarelist-files1.xml", 4531)]
[InlineData("test-softwarelist-files2.xml", 2797)]
[InlineData("test-softwarelist-files3.xml", 274)]
public void SoftwareListDeserializeTest(string file, long count)
{
// Open the file for reading
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", "test-softwarelist-files.xml");
string filename = System.IO.Path.Combine(Environment.CurrentDirectory, "TestData", file);
// Deserialize the file
var dat = Serialization.SoftawreList.Deserialize(filename);
@@ -721,7 +805,7 @@ namespace SabreTools.Test.Parser
// Validate the values
Assert.NotNull(dat);
Assert.NotNull(dat.Software);
Assert.Equal(5447, dat.Software.Length);
Assert.Equal(count, dat.Software.Length);
// Validate we're not missing any attributes or elements
Assert.Null(dat.ADDITIONAL_ATTRIBUTES);

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff