diff --git a/SabreTools.Serialization.Test/Deserializers/MessTests.cs b/SabreTools.Serialization.Test/Deserializers/MessTests.cs new file mode 100644 index 00000000..0bfa01ad --- /dev/null +++ b/SabreTools.Serialization.Test/Deserializers/MessTests.cs @@ -0,0 +1,940 @@ +using System.IO; +using System.Linq; +using SabreTools.Serialization.Deserializers; +using Xunit; + +namespace SabreTools.Serialization.Test.Deserializers +{ + public class MessTests + { + [Fact] + public void NullArray_Null() + { + byte[]? data = null; + int offset = 0; + var deserializer = new Mess(); + + var actual = deserializer.Deserialize(data, offset); + Assert.Null(actual); + } + + [Fact] + public void EmptyArray_Null() + { + byte[]? data = []; + int offset = 0; + var deserializer = new Mess(); + + var actual = deserializer.Deserialize(data, offset); + Assert.Null(actual); + } + + [Fact] + public void InvalidArray_Null() + { + byte[]? data = [.. Enumerable.Repeat(0xFF, 1024)]; + int offset = 0; + var deserializer = new Mess(); + + var actual = deserializer.Deserialize(data, offset); + Assert.Null(actual); + } + + [Fact] + public void NullStream_Null() + { + Stream? data = null; + var deserializer = new Mess(); + + var actual = deserializer.Deserialize(data); + Assert.Null(actual); + } + + [Fact] + public void EmptyStream_Null() + { + Stream? data = new MemoryStream([]); + var deserializer = new Mess(); + + var actual = deserializer.Deserialize(data); + Assert.Null(actual); + } + + [Fact] + public void InvalidStream_Null() + { + Stream? data = new MemoryStream([.. Enumerable.Repeat(0xFF, 1024)]); + var deserializer = new Mess(); + + var actual = deserializer.Deserialize(data); + Assert.Null(actual); + } + + [Fact] + public void RoundTripGameTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Mess(); + var serializer = new Serialization.Serializers.Mess(); + + // Build the data + Models.Listxml.Mess m1 = Build(game: true); + + // Serialize to generic model + Stream? metadata = serializer.Serialize(m1); + Assert.NotNull(metadata); + + // Serialize to stream + Models.Listxml.Mess? newMess = deserializer.Deserialize(metadata); + + // Validate the data + Assert.NotNull(newMess); + Assert.Equal("XXXXXX", newMess.Version); + + Assert.NotNull(newMess.Game); + var newGame = Assert.Single(newMess.Game); + Validate(newGame); + } + + [Fact] + public void RoundTripMachineTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Mess(); + var serializer = new Serialization.Serializers.Mess(); + + // Build the data + Models.Listxml.Mess m1 = Build(game: false); + + // Serialize to generic model + Stream? metadata = serializer.Serialize(m1); + Assert.NotNull(metadata); + + // Serialize to stream + Models.Listxml.Mess? newMess = deserializer.Deserialize(metadata); + + // Validate the data + Assert.NotNull(newMess); + Assert.Equal("XXXXXX", newMess.Version); + + Assert.NotNull(newMess.Game); + var newGame = Assert.Single(newMess.Game); + Validate(newGame); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.Listxml.Mess Build(bool game) + { + var biosset = new Models.Listxml.BiosSet + { + Name = "XXXXXX", + Description = "XXXXXX", + Default = "XXXXXX", + }; + + var rom = new Models.Listxml.Rom + { + Name = "XXXXXX", + Bios = "XXXXXX", + Size = "XXXXXX", + CRC = "XXXXXX", + SHA1 = "XXXXXX", + Merge = "XXXXXX", + Region = "XXXXXX", + Offset = "XXXXXX", + Status = "XXXXXX", + Optional = "XXXXXX", + Dispose = "XXXXXX", + SoundOnly = "XXXXXX", + }; + + var disk = new Models.Listxml.Disk + { + Name = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + Merge = "XXXXXX", + Region = "XXXXXX", + Index = "XXXXXX", + Writable = "XXXXXX", + Status = "XXXXXX", + Optional = "XXXXXX", + }; + + var deviceref = new Models.Listxml.DeviceRef + { + Name = "XXXXXX", + }; + + var sample = new Models.Listxml.Sample + { + Name = "XXXXXX", + }; + + var chip = new Models.Listxml.Chip + { + Name = "XXXXXX", + Tag = "XXXXXX", + Type = "XXXXXX", + SoundOnly = "XXXXXX", + Clock = "XXXXXX", + }; + + var display = new Models.Listxml.Display + { + Tag = "XXXXXX", + Type = "XXXXXX", + Rotate = "XXXXXX", + FlipX = "XXXXXX", + Width = "XXXXXX", + Height = "XXXXXX", + Refresh = "XXXXXX", + PixClock = "XXXXXX", + HTotal = "XXXXXX", + HBEnd = "XXXXXX", + HBStart = "XXXXXX", + VTotal = "XXXXXX", + VBEnd = "XXXXXX", + VBStart = "XXXXXX", + }; + + var video = new Models.Listxml.Video + { + Screen = "XXXXXX", + Orientation = "XXXXXX", + Width = "XXXXXX", + Height = "XXXXXX", + AspectX = "XXXXXX", + AspectY = "XXXXXX", + Refresh = "XXXXXX", + }; + + var sound = new Models.Listxml.Sound + { + Channels = "XXXXXX", + }; + + var control = new Models.Listxml.Control + { + Type = "XXXXXX", + Player = "XXXXXX", + Buttons = "XXXXXX", + ReqButtons = "XXXXXX", + Minimum = "XXXXXX", + Maximum = "XXXXXX", + Sensitivity = "XXXXXX", + KeyDelta = "XXXXXX", + Reverse = "XXXXXX", + Ways = "XXXXXX", + Ways2 = "XXXXXX", + Ways3 = "XXXXXX", + }; + + var input = new Models.Listxml.Input + { + Service = "XXXXXX", + Tilt = "XXXXXX", + Players = "XXXXXX", + //ControlAttr = "XXXXXX", // Mututally exclusive with input.Control + Buttons = "XXXXXX", + Coins = "XXXXXX", + Control = [control], + }; + + var condition = new Models.Listxml.Condition + { + Tag = "XXXXXX", + Mask = "XXXXXX", + Relation = "XXXXXX", + Value = "XXXXXX", + }; + + var diplocation = new Models.Listxml.DipLocation + { + Name = "XXXXXX", + Number = "XXXXXX", + Inverted = "XXXXXX", + }; + + var dipvalue = new Models.Listxml.DipValue + { + Name = "XXXXXX", + Value = "XXXXXX", + Default = "XXXXXX", + Condition = condition, + }; + + var dipswitch = new Models.Listxml.DipSwitch + { + Name = "XXXXXX", + Tag = "XXXXXX", + Mask = "XXXXXX", + Condition = condition, + DipLocation = [diplocation], + DipValue = [dipvalue], + }; + + var conflocation = new Models.Listxml.ConfLocation + { + Name = "XXXXXX", + Number = "XXXXXX", + Inverted = "XXXXXX", + }; + + var confsetting = new Models.Listxml.ConfSetting + { + Name = "XXXXXX", + Value = "XXXXXX", + Default = "XXXXXX", + Condition = condition, + }; + + var configuration = new Models.Listxml.Configuration + { + Name = "XXXXXX", + Tag = "XXXXXX", + Mask = "XXXXXX", + Condition = condition, + ConfLocation = [conflocation], + ConfSetting = [confsetting], + }; + + var analog = new Models.Listxml.Analog + { + Mask = "XXXXXX", + }; + + var port = new Models.Listxml.Port + { + Tag = "XXXXXX", + Analog = [analog], + }; + + var adjuster = new Models.Listxml.Adjuster + { + Name = "XXXXXX", + Default = "XXXXXX", + Condition = condition, + }; + + var driver = new Models.Listxml.Driver + { + Status = "XXXXXX", + Color = "XXXXXX", + Sound = "XXXXXX", + PaletteSize = "XXXXXX", + Emulation = "XXXXXX", + Cocktail = "XXXXXX", + SaveState = "XXXXXX", + RequiresArtwork = "XXXXXX", + Unofficial = "XXXXXX", + NoSoundHardware = "XXXXXX", + Incomplete = "XXXXXX", + }; + + var feature = new Models.Listxml.Feature + { + Type = "XXXXXX", + Status = "XXXXXX", + Overall = "XXXXXX", + }; + + var instance = new Models.Listxml.Instance + { + Name = "XXXXXX", + BriefName = "XXXXXX", + }; + + var extension = new Models.Listxml.Extension + { + Name = "XXXXXX", + }; + + var device = new Models.Listxml.Device + { + Type = "XXXXXX", + Tag = "XXXXXX", + FixedImage = "XXXXXX", + Mandatory = "XXXXXX", + Interface = "XXXXXX", + Instance = instance, + Extension = [extension], + }; + + var slotOption = new Models.Listxml.SlotOption + { + Name = "XXXXXX", + DevName = "XXXXXX", + Default = "XXXXXX", + }; + + var slot = new Models.Listxml.Slot + { + Name = "XXXXXX", + SlotOption = [slotOption], + }; + + var softwarelist = new Models.Listxml.SoftwareList + { + Tag = "XXXXXX", + Name = "XXXXXX", + Status = "XXXXXX", + Filter = "XXXXXX", + }; + + var ramoption = new Models.Listxml.RamOption + { + Name = "XXXXXX", + Default = "XXXXXX", + Content = "XXXXXX", + }; + + Models.Listxml.GameBase gameBase = game + ? new Models.Listxml.Game() + : new Models.Listxml.Machine(); + gameBase.Name = "XXXXXX"; + gameBase.SourceFile = "XXXXXX"; + gameBase.IsBios = "XXXXXX"; + gameBase.IsDevice = "XXXXXX"; + gameBase.IsMechanical = "XXXXXX"; + gameBase.Runnable = "XXXXXX"; + gameBase.CloneOf = "XXXXXX"; + gameBase.RomOf = "XXXXXX"; + gameBase.SampleOf = "XXXXXX"; + gameBase.Description = "XXXXXX"; + gameBase.Year = "XXXXXX"; + gameBase.Manufacturer = "XXXXXX"; + gameBase.History = "XXXXXX"; + gameBase.BiosSet = [biosset]; + gameBase.Rom = [rom]; + gameBase.Disk = [disk]; + gameBase.DeviceRef = [deviceref]; + gameBase.Sample = [sample]; + gameBase.Chip = [chip]; + gameBase.Display = [display]; + gameBase.Video = [video]; + gameBase.Sound = sound; + gameBase.Input = input; + gameBase.DipSwitch = [dipswitch]; + gameBase.Configuration = [configuration]; + gameBase.Port = [port]; + gameBase.Adjuster = [adjuster]; + gameBase.Driver = driver; + gameBase.Feature = [feature]; + gameBase.Device = [device]; + gameBase.Slot = [slot]; + gameBase.SoftwareList = [softwarelist]; + gameBase.RamOption = [ramoption]; + + return new Models.Listxml.Mess + { + Version = "XXXXXX", + Game = [gameBase], + }; + } + + /// + /// Validate a GameBase + /// + private static void Validate(Models.Listxml.GameBase? gb) + { + Assert.NotNull(gb); + Assert.Equal("XXXXXX", gb.Name); + Assert.Equal("XXXXXX", gb.SourceFile); + Assert.Equal("XXXXXX", gb.IsBios); + Assert.Equal("XXXXXX", gb.IsDevice); + Assert.Equal("XXXXXX", gb.IsMechanical); + Assert.Equal("XXXXXX", gb.Runnable); + Assert.Equal("XXXXXX", gb.CloneOf); + Assert.Equal("XXXXXX", gb.RomOf); + Assert.Equal("XXXXXX", gb.SampleOf); + Assert.Equal("XXXXXX", gb.Description); + Assert.Equal("XXXXXX", gb.Year); + Assert.Equal("XXXXXX", gb.Manufacturer); + Assert.Equal("XXXXXX", gb.History); + + Assert.NotNull(gb.BiosSet); + var biosset = Assert.Single(gb.BiosSet); + Validate(biosset); + + Assert.NotNull(gb.Rom); + var rom = Assert.Single(gb.Rom); + Validate(rom); + + Assert.NotNull(gb.Disk); + var disk = Assert.Single(gb.Disk); + Validate(disk); + + Assert.NotNull(gb.DeviceRef); + var deviceref = Assert.Single(gb.DeviceRef); + Validate(deviceref); + + Assert.NotNull(gb.Sample); + var sample = Assert.Single(gb.Sample); + Validate(sample); + + Assert.NotNull(gb.Chip); + var chip = Assert.Single(gb.Chip); + Validate(chip); + + Assert.NotNull(gb.Display); + var display = Assert.Single(gb.Display); + Validate(display); + + Assert.NotNull(gb.Video); + var video = Assert.Single(gb.Video); + Validate(video); + + Validate(gb.Sound); + Validate(gb.Input); + + Assert.NotNull(gb.DipSwitch); + var dipswitch = Assert.Single(gb.DipSwitch); + Validate(dipswitch); + + Assert.NotNull(gb.Configuration); + var configuration = Assert.Single(gb.Configuration); + Validate(configuration); + + Assert.NotNull(gb.Port); + var port = Assert.Single(gb.Port); + Validate(port); + + Assert.NotNull(gb.Adjuster); + var adjuster = Assert.Single(gb.Adjuster); + Validate(adjuster); + + Validate(gb.Driver); + + Assert.NotNull(gb.Feature); + var feature = Assert.Single(gb.Feature); + Validate(feature); + + Assert.NotNull(gb.Device); + var device = Assert.Single(gb.Device); + Validate(device); + + Assert.NotNull(gb.Slot); + var slot = Assert.Single(gb.Slot); + Validate(slot); + + Assert.NotNull(gb.SoftwareList); + var softwarelist = Assert.Single(gb.SoftwareList); + Validate(softwarelist); + + Assert.NotNull(gb.RamOption); + var ramoption = Assert.Single(gb.RamOption); + Validate(ramoption); + } + + /// + /// Validate a BiosSet + /// + private static void Validate(Models.Listxml.BiosSet? biosset) + { + Assert.NotNull(biosset); + Assert.Equal("XXXXXX", biosset.Name); + Assert.Equal("XXXXXX", biosset.Description); + Assert.Equal("XXXXXX", biosset.Default); + } + + /// + /// Validate a Rom + /// + private static void Validate(Models.Listxml.Rom? rom) + { + Assert.NotNull(rom); + Assert.Equal("XXXXXX", rom.Name); + Assert.Equal("XXXXXX", rom.Bios); + Assert.Equal("XXXXXX", rom.Size); + Assert.Equal("XXXXXX", rom.CRC); + Assert.Equal("XXXXXX", rom.SHA1); + Assert.Equal("XXXXXX", rom.Merge); + Assert.Equal("XXXXXX", rom.Region); + Assert.Equal("XXXXXX", rom.Offset); + Assert.Equal("XXXXXX", rom.Status); + Assert.Equal("XXXXXX", rom.Optional); + Assert.Equal("XXXXXX", rom.Dispose); + Assert.Equal("XXXXXX", rom.SoundOnly); + } + + /// + /// Validate a Disk + /// + private static void Validate(Models.Listxml.Disk? disk) + { + Assert.NotNull(disk); + Assert.Equal("XXXXXX", disk.Name); + Assert.Equal("XXXXXX", disk.MD5); + Assert.Equal("XXXXXX", disk.SHA1); + Assert.Equal("XXXXXX", disk.Merge); + Assert.Equal("XXXXXX", disk.Region); + Assert.Equal("XXXXXX", disk.Index); + Assert.Equal("XXXXXX", disk.Writable); + Assert.Equal("XXXXXX", disk.Status); + Assert.Equal("XXXXXX", disk.Optional); + } + + /// + /// Validate a DeviceRef + /// + private static void Validate(Models.Listxml.DeviceRef? deviceref) + { + Assert.NotNull(deviceref); + Assert.Equal("XXXXXX", deviceref.Name); + } + + /// + /// Validate a Sample + /// + private static void Validate(Models.Listxml.Sample? sample) + { + Assert.NotNull(sample); + Assert.Equal("XXXXXX", sample.Name); + } + + /// + /// Validate a Chip + /// + private static void Validate(Models.Listxml.Chip? chip) + { + Assert.NotNull(chip); + Assert.Equal("XXXXXX", chip.Name); + Assert.Equal("XXXXXX", chip.Tag); + Assert.Equal("XXXXXX", chip.Type); + Assert.Equal("XXXXXX", chip.SoundOnly); + Assert.Equal("XXXXXX", chip.Clock); + } + + /// + /// Validate a Display + /// + private static void Validate(Models.Listxml.Display? display) + { + Assert.NotNull(display); + Assert.Equal("XXXXXX", display.Tag); + Assert.Equal("XXXXXX", display.Type); + Assert.Equal("XXXXXX", display.Rotate); + Assert.Equal("XXXXXX", display.FlipX); + Assert.Equal("XXXXXX", display.Width); + Assert.Equal("XXXXXX", display.Height); + Assert.Equal("XXXXXX", display.Refresh); + Assert.Equal("XXXXXX", display.PixClock); + Assert.Equal("XXXXXX", display.HTotal); + Assert.Equal("XXXXXX", display.HBEnd); + Assert.Equal("XXXXXX", display.HBStart); + Assert.Equal("XXXXXX", display.VTotal); + Assert.Equal("XXXXXX", display.VBEnd); + Assert.Equal("XXXXXX", display.VBStart); + } + + /// + /// Validate a Video + /// + private static void Validate(Models.Listxml.Video? video) + { + Assert.NotNull(video); + Assert.Equal("XXXXXX", video.Screen); + Assert.Equal("XXXXXX", video.Orientation); + Assert.Equal("XXXXXX", video.Width); + Assert.Equal("XXXXXX", video.Height); + Assert.Equal("XXXXXX", video.AspectX); + Assert.Equal("XXXXXX", video.AspectY); + Assert.Equal("XXXXXX", video.Refresh); + } + + /// + /// Validate a Sound + /// + private static void Validate(Models.Listxml.Sound? sound) + { + Assert.NotNull(sound); + Assert.Equal("XXXXXX", sound.Channels); + } + + /// + /// Validate a Input + /// + private static void Validate(Models.Listxml.Input? input) + { + Assert.NotNull(input); + Assert.Equal("XXXXXX", input.Service); + Assert.Equal("XXXXXX", input.Tilt); + Assert.Equal("XXXXXX", input.Players); + //Assert.Equal("XXXXXX", input.ControlAttr); // Mututally exclusive with input.Control + Assert.Equal("XXXXXX", input.Buttons); + Assert.Equal("XXXXXX", input.Coins); + + Assert.NotNull(input.Control); + var control = Assert.Single(input.Control); + Validate(control); + } + + /// + /// Validate a Control + /// + private static void Validate(Models.Listxml.Control? control) + { + Assert.NotNull(control); + Assert.Equal("XXXXXX", control.Type); + Assert.Equal("XXXXXX", control.Player); + Assert.Equal("XXXXXX", control.Buttons); + Assert.Equal("XXXXXX", control.ReqButtons); + Assert.Equal("XXXXXX", control.Minimum); + Assert.Equal("XXXXXX", control.Maximum); + Assert.Equal("XXXXXX", control.Sensitivity); + Assert.Equal("XXXXXX", control.KeyDelta); + Assert.Equal("XXXXXX", control.Reverse); + Assert.Equal("XXXXXX", control.Ways); + Assert.Equal("XXXXXX", control.Ways2); + Assert.Equal("XXXXXX", control.Ways3); + } + + /// + /// Validate a DipSwitch + /// + private static void Validate(Models.Listxml.DipSwitch? dipswitch) + { + Assert.NotNull(dipswitch); + Assert.Equal("XXXXXX", dipswitch.Name); + Assert.Equal("XXXXXX", dipswitch.Tag); + Assert.Equal("XXXXXX", dipswitch.Mask); + Validate(dipswitch.Condition); + + Assert.NotNull(dipswitch.DipLocation); + var diplocation = Assert.Single(dipswitch.DipLocation); + Validate(diplocation); + + Assert.NotNull(dipswitch.DipValue); + var dipvalue = Assert.Single(dipswitch.DipValue); + Validate(dipvalue); + } + + /// + /// Validate a Condition + /// + private static void Validate(Models.Listxml.Condition? condition) + { + Assert.NotNull(condition); + Assert.Equal("XXXXXX", condition.Tag); + Assert.Equal("XXXXXX", condition.Mask); + Assert.Equal("XXXXXX", condition.Relation); + Assert.Equal("XXXXXX", condition.Value); + } + + /// + /// Validate a DipLocation + /// + private static void Validate(Models.Listxml.DipLocation? diplocation) + { + Assert.NotNull(diplocation); + Assert.Equal("XXXXXX", diplocation.Name); + Assert.Equal("XXXXXX", diplocation.Number); + Assert.Equal("XXXXXX", diplocation.Inverted); + } + + /// + /// Validate a DipValue + /// + private static void Validate(Models.Listxml.DipValue? dipvalue) + { + Assert.NotNull(dipvalue); + Assert.Equal("XXXXXX", dipvalue.Name); + Assert.Equal("XXXXXX", dipvalue.Value); + Assert.Equal("XXXXXX", dipvalue.Default); + Validate(dipvalue.Condition); + } + + /// + /// Validate a Configuration + /// + private static void Validate(Models.Listxml.Configuration? configuration) + { + Assert.NotNull(configuration); + Assert.Equal("XXXXXX", configuration.Name); + Assert.Equal("XXXXXX", configuration.Tag); + Assert.Equal("XXXXXX", configuration.Mask); + Validate(configuration.Condition); + + Assert.NotNull(configuration.ConfLocation); + var conflocation = Assert.Single(configuration.ConfLocation); + Validate(conflocation); + + Assert.NotNull(configuration.ConfSetting); + var confsetting = Assert.Single(configuration.ConfSetting); + Validate(confsetting); + } + + /// + /// Validate a ConfLocation + /// + private static void Validate(Models.Listxml.ConfLocation? conflocation) + { + Assert.NotNull(conflocation); + Assert.Equal("XXXXXX", conflocation.Name); + Assert.Equal("XXXXXX", conflocation.Number); + Assert.Equal("XXXXXX", conflocation.Inverted); + } + + /// + /// Validate a ConfSetting + /// + private static void Validate(Models.Listxml.ConfSetting? confsetting) + { + Assert.NotNull(confsetting); + Assert.Equal("XXXXXX", confsetting.Name); + Assert.Equal("XXXXXX", confsetting.Value); + Assert.Equal("XXXXXX", confsetting.Default); + Validate(confsetting.Condition); + } + + /// + /// Validate a Port + /// + private static void Validate(Models.Listxml.Port? port) + { + Assert.NotNull(port); + Assert.Equal("XXXXXX", port.Tag); + + Assert.NotNull(port.Analog); + var analog = Assert.Single(port.Analog); + Validate(analog); + } + + /// + /// Validate a Analog + /// + private static void Validate(Models.Listxml.Analog? analog) + { + Assert.NotNull(analog); + Assert.Equal("XXXXXX", analog.Mask); + } + + /// + /// Validate a Adjuster + /// + private static void Validate(Models.Listxml.Adjuster? adjuster) + { + Assert.NotNull(adjuster); + Assert.Equal("XXXXXX", adjuster.Name); + Assert.Equal("XXXXXX", adjuster.Default); + Validate(adjuster.Condition); + } + + /// + /// Validate a Driver + /// + private static void Validate(Models.Listxml.Driver? driver) + { + Assert.NotNull(driver); + Assert.Equal("XXXXXX", driver.Status); + Assert.Equal("XXXXXX", driver.Color); + Assert.Equal("XXXXXX", driver.Sound); + Assert.Equal("XXXXXX", driver.PaletteSize); + Assert.Equal("XXXXXX", driver.Emulation); + Assert.Equal("XXXXXX", driver.Cocktail); + Assert.Equal("XXXXXX", driver.SaveState); + Assert.Equal("XXXXXX", driver.RequiresArtwork); + Assert.Equal("XXXXXX", driver.Unofficial); + Assert.Equal("XXXXXX", driver.NoSoundHardware); + Assert.Equal("XXXXXX", driver.Incomplete); + } + + /// + /// Validate a Feature + /// + private static void Validate(Models.Listxml.Feature? feature) + { + Assert.NotNull(feature); + Assert.Equal("XXXXXX", feature.Type); + Assert.Equal("XXXXXX", feature.Status); + Assert.Equal("XXXXXX", feature.Overall); + } + + /// + /// Validate a Device + /// + private static void Validate(Models.Listxml.Device? device) + { + Assert.NotNull(device); + Assert.Equal("XXXXXX", device.Type); + Assert.Equal("XXXXXX", device.Tag); + Assert.Equal("XXXXXX", device.FixedImage); + Assert.Equal("XXXXXX", device.Mandatory); + Assert.Equal("XXXXXX", device.Interface); + Validate(device.Instance); + + Assert.NotNull(device.Extension); + var extension = Assert.Single(device.Extension); + Validate(extension); + } + + /// + /// Validate a Instance + /// + private static void Validate(Models.Listxml.Instance? instance) + { + Assert.NotNull(instance); + Assert.Equal("XXXXXX", instance.Name); + Assert.Equal("XXXXXX", instance.BriefName); + } + + /// + /// Validate a Extension + /// + private static void Validate(Models.Listxml.Extension? extension) + { + Assert.NotNull(extension); + Assert.Equal("XXXXXX", extension.Name); + } + + /// + /// Validate a Slot + /// + private static void Validate(Models.Listxml.Slot? slot) + { + Assert.NotNull(slot); + Assert.Equal("XXXXXX", slot.Name); + + Assert.NotNull(slot.SlotOption); + var slotoption = Assert.Single(slot.SlotOption); + Validate(slotoption); + } + + /// + /// Validate a SlotOption + /// + private static void Validate(Models.Listxml.SlotOption? slotoption) + { + Assert.NotNull(slotoption); + Assert.Equal("XXXXXX", slotoption.Name); + Assert.Equal("XXXXXX", slotoption.DevName); + Assert.Equal("XXXXXX", slotoption.Default); + } + + /// + /// Validate a SoftwareList + /// + private static void Validate(Models.Listxml.SoftwareList? softwarelist) + { + Assert.NotNull(softwarelist); + Assert.Equal("XXXXXX", softwarelist.Tag); + Assert.Equal("XXXXXX", softwarelist.Name); + Assert.Equal("XXXXXX", softwarelist.Status); + Assert.Equal("XXXXXX", softwarelist.Filter); + } + + /// + /// Validate a RamOption + /// + private static void Validate(Models.Listxml.RamOption? ramoption) + { + Assert.NotNull(ramoption); + Assert.Equal("XXXXXX", ramoption.Name); + Assert.Equal("XXXXXX", ramoption.Default); + Assert.Equal("XXXXXX", ramoption.Content); + } + } +} \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Serializers/MessTests.cs b/SabreTools.Serialization.Test/Serializers/MessTests.cs new file mode 100644 index 00000000..f6e1b6bb --- /dev/null +++ b/SabreTools.Serialization.Test/Serializers/MessTests.cs @@ -0,0 +1,25 @@ +using System.IO; +using SabreTools.Serialization.Serializers; +using Xunit; + +namespace SabreTools.Serialization.Test.Serializers +{ + public class MessTests + { + [Fact] + public void SerializeArray_Null_Null() + { + var serializer = new Mess(); + byte[]? actual = serializer.SerializeArray(null); + Assert.Null(actual); + } + + [Fact] + public void SerializeStream_Null_Null() + { + var serializer = new Mess(); + Stream? actual = serializer.Serialize(null); + Assert.Null(actual); + } + } +} \ No newline at end of file diff --git a/SabreTools.Serialization/CrossModel/Mess.Deserializer.cs b/SabreTools.Serialization/CrossModel/Mess.Deserializer.cs new file mode 100644 index 00000000..2156fac5 --- /dev/null +++ b/SabreTools.Serialization/CrossModel/Mess.Deserializer.cs @@ -0,0 +1,36 @@ +using System; +using SabreTools.Serialization.Interfaces; + +namespace SabreTools.Serialization.CrossModel +{ + public partial class Mess : IModelSerializer + { + /// + public Models.Listxml.Mess? Deserialize(Models.Metadata.MetadataFile? obj) + { + if (obj == null) + return null; + + var header = obj.Read(Models.Metadata.MetadataFile.HeaderKey); + var m1 = header != null ? ConvertMessFromInternalModel(header) : new Models.Listxml.Mess(); + + var machines = obj.Read(Models.Metadata.MetadataFile.MachineKey); + if (machines != null && machines.Length > 0) + m1.Game = Array.ConvertAll(machines, Listxml.ConvertMachineFromInternalModel); + + return m1; + } + + /// + /// Convert from to + /// + private static Models.Listxml.Mess ConvertMessFromInternalModel(Models.Metadata.Header item) + { + var m1 = new Models.Listxml.Mess + { + Version = item.ReadString(Models.Metadata.Header.VersionKey), + }; + return m1; + } + } +} diff --git a/SabreTools.Serialization/CrossModel/Mess.Serializer.cs b/SabreTools.Serialization/CrossModel/Mess.Serializer.cs new file mode 100644 index 00000000..4afcb57f --- /dev/null +++ b/SabreTools.Serialization/CrossModel/Mess.Serializer.cs @@ -0,0 +1,40 @@ +using System; +using SabreTools.Serialization.Interfaces; + +namespace SabreTools.Serialization.CrossModel +{ + public partial class Mess : IModelSerializer + { + /// + public Models.Metadata.MetadataFile? Serialize(Models.Listxml.Mess? item) + { + if (item == null) + return null; + + var metadataFile = new Models.Metadata.MetadataFile + { + [Models.Metadata.MetadataFile.HeaderKey] = ConvertHeaderToInternalModel(item), + }; + + if (item?.Game != null && item.Game.Length > 0) + { + metadataFile[Models.Metadata.MetadataFile.MachineKey] + = Array.ConvertAll(item.Game, Listxml.ConvertMachineToInternalModel); + } + + return metadataFile; + } + + /// + /// Convert from to + /// + private static Models.Metadata.Header ConvertHeaderToInternalModel(Models.Listxml.Mess item) + { + var header = new Models.Metadata.Header + { + [Models.Metadata.Header.VersionKey] = item.Version, + }; + return header; + } + } +} diff --git a/SabreTools.Serialization/Deserializers/Mess.cs b/SabreTools.Serialization/Deserializers/Mess.cs new file mode 100644 index 00000000..27668bb8 --- /dev/null +++ b/SabreTools.Serialization/Deserializers/Mess.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Deserializers +{ + public class Mess : XmlFile + { + // All logic taken care of in the base class + } +} diff --git a/SabreTools.Serialization/Serializers/Mess.cs b/SabreTools.Serialization/Serializers/Mess.cs new file mode 100644 index 00000000..b9a11f92 --- /dev/null +++ b/SabreTools.Serialization/Serializers/Mess.cs @@ -0,0 +1,7 @@ +namespace SabreTools.Serialization.Serializers +{ + public class Mess : XmlFile + { + // All logic taken care of in the base class + } +}