using Xunit; namespace SabreTools.Serialization.CrossModel.Test { public class MessTests { [Fact] public void RoundTripGameTest() { // Get the cross-model serializer var serializer = new Mess(); // Build the data Data.Models.Listxml.Mess m1 = Build(game: true); // Serialize to generic model Data.Models.Metadata.MetadataFile? metadata = serializer.Serialize(m1); Assert.NotNull(metadata); // Serialize back to original model Data.Models.Listxml.Mess? newMess = serializer.Deserialize(metadata); // Validate the data Assert.NotNull(newMess); Assert.Equal("version", newMess.Version); Assert.NotNull(newMess.Game); var newGame = Assert.Single(newMess.Game); Validate(newGame); } [Fact] public void RoundTripMachineTest() { // Get the cross-model serializer var serializer = new Mess(); // Build the data Data.Models.Listxml.Mess m1 = Build(game: false); // Serialize to generic model Data.Models.Metadata.MetadataFile? metadata = serializer.Serialize(m1); Assert.NotNull(metadata); // Serialize back to original model Data.Models.Listxml.Mess? newMess = serializer.Deserialize(metadata); // Validate the data Assert.NotNull(newMess); Assert.Equal("version", newMess.Version); Assert.NotNull(newMess.Game); var newGame = Assert.Single(newMess.Game); Validate(newGame); } /// /// Build model for serialization and deserialization /// private static Data.Models.Listxml.Mess Build(bool game) { var biosset = new Data.Models.Listxml.BiosSet { Name = "name", Description = "description", Default = true, }; var rom = new Data.Models.Listxml.Rom { Name = "name", Bios = "bios", Size = 12345, CRC = "crc32", SHA1 = "sha1", Merge = "merge", Region = "region", Offset = "offset", Status = Data.Models.Metadata.ItemStatus.Good, Optional = true, Dispose = true, SoundOnly = true, }; var disk = new Data.Models.Listxml.Disk { Name = "name", MD5 = "md5", SHA1 = "sha1", Merge = "merge", Region = "region", Index = 12345, Writable = true, Status = Data.Models.Metadata.ItemStatus.Good, Optional = true, }; var deviceref = new Data.Models.Listxml.DeviceRef { Name = "name", }; var sample = new Data.Models.Listxml.Sample { Name = "name", }; var chip = new Data.Models.Listxml.Chip { Name = "name", Tag = "tag", Type = Data.Models.Metadata.ChipType.CPU, SoundOnly = true, Clock = 12345, }; var display = new Data.Models.Listxml.Display { Tag = "tag", Type = Data.Models.Metadata.DisplayType.Vector, Rotate = Data.Models.Metadata.Rotation.East, FlipX = true, Width = 12345, Height = 12345, Refresh = 123.45, PixClock = 12345, HTotal = 12345, HBEnd = 12345, HBStart = 12345, VTotal = 12345, VBEnd = 12345, VBStart = 12345, }; var video = new Data.Models.Listxml.Video { Screen = Data.Models.Metadata.DisplayType.Vector, Orientation = Data.Models.Metadata.Rotation.East, Width = 12345, Height = 12345, AspectX = 12345, AspectY = 12345, Refresh = 123.45, }; var sound = new Data.Models.Listxml.Sound { Channels = 12345, }; var control = new Data.Models.Listxml.Control { Type = Data.Models.Metadata.ControlType.Lightgun, Player = 12345, Buttons = 12345, ReqButtons = 12345, Minimum = 12345, Maximum = 12345, Sensitivity = 12345, KeyDelta = 12345, Reverse = true, Ways = "ways", Ways2 = "ways2", Ways3 = "ways3", }; var input = new Data.Models.Listxml.Input { Service = true, Tilt = true, Players = 12345, ControlAttr = "controlattr", Buttons = 12345, Coins = 12345, Control = [control], }; var condition = new Data.Models.Listxml.Condition { Tag = "tag", Mask = "mask", Relation = Data.Models.Metadata.Relation.Equal, Value = "value", }; var diplocation = new Data.Models.Listxml.DipLocation { Name = "name", Number = 12345, Inverted = true, }; var dipvalue = new Data.Models.Listxml.DipValue { Name = "name", Value = "value", Default = true, Condition = condition, }; var dipswitch = new Data.Models.Listxml.DipSwitch { Name = "name", Tag = "tag", Mask = "mask", Condition = condition, DipLocation = [diplocation], DipValue = [dipvalue], }; var conflocation = new Data.Models.Listxml.ConfLocation { Name = "name", Number = 12345, Inverted = true, }; var confsetting = new Data.Models.Listxml.ConfSetting { Name = "name", Value = "value", Default = true, Condition = condition, }; var configuration = new Data.Models.Listxml.Configuration { Name = "name", Tag = "tag", Mask = "mask", Condition = condition, ConfLocation = [conflocation], ConfSetting = [confsetting], }; var analog = new Data.Models.Listxml.Analog { Mask = "mask", }; var port = new Data.Models.Listxml.Port { Tag = "tag", Analog = [analog], }; var adjuster = new Data.Models.Listxml.Adjuster { Name = "name", Default = true, Condition = condition, }; var driver = new Data.Models.Listxml.Driver { Status = Data.Models.Metadata.SupportStatus.Good, Color = Data.Models.Metadata.SupportStatus.Good, Sound = Data.Models.Metadata.SupportStatus.Good, PaletteSize = "palettesize", Emulation = Data.Models.Metadata.SupportStatus.Good, Cocktail = Data.Models.Metadata.SupportStatus.Good, SaveState = Data.Models.Metadata.Supported.Yes, RequiresArtwork = true, Unofficial = true, NoSoundHardware = true, Incomplete = true, }; var feature = new Data.Models.Listxml.Feature { Type = Data.Models.Metadata.FeatureType.Protection, Status = Data.Models.Metadata.FeatureStatus.Imperfect, Overall = Data.Models.Metadata.FeatureStatus.Imperfect, }; var instance = new Data.Models.Listxml.Instance { Name = "name", BriefName = "briefname", }; var extension = new Data.Models.Listxml.Extension { Name = "name", }; var device = new Data.Models.Listxml.Device { Type = Data.Models.Metadata.DeviceType.PunchTape, Tag = "tag", FixedImage = "fixedimage", Mandatory = true, Interface = "interface", Instance = instance, Extension = [extension], }; var slotOption = new Data.Models.Listxml.SlotOption { Name = "name", DevName = "devname", Default = true, }; var slot = new Data.Models.Listxml.Slot { Name = "name", SlotOption = [slotOption], }; var softwarelist = new Data.Models.Listxml.SoftwareList { Tag = "tag", Name = "name", Status = Data.Models.Metadata.SoftwareListStatus.Original, Filter = "filter", }; var ramoption = new Data.Models.Listxml.RamOption { Name = "name", Default = true, Content = "content", }; Data.Models.Listxml.GameBase gameBase = game ? new Data.Models.Listxml.Game() : new Data.Models.Listxml.Machine(); gameBase.Name = "name"; gameBase.SourceFile = "sourcefile"; gameBase.IsBios = true; gameBase.IsDevice = true; gameBase.IsMechanical = true; gameBase.Runnable = Data.Models.Metadata.Runnable.Yes; gameBase.CloneOf = "cloneof"; gameBase.RomOf = "romof"; gameBase.SampleOf = "sampleof"; gameBase.Description = "description"; gameBase.Year = "year"; gameBase.Manufacturer = "manufacturer"; gameBase.History = "history"; 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 Data.Models.Listxml.Mess { Version = "version", Game = [gameBase], }; } /// /// Validate a GameBase /// private static void Validate(Data.Models.Listxml.GameBase? gb) { Assert.NotNull(gb); Assert.Equal("name", gb.Name); Assert.Equal("sourcefile", gb.SourceFile); Assert.Equal(true, gb.IsBios); Assert.Equal(true, gb.IsDevice); Assert.Equal(true, gb.IsMechanical); Assert.Equal(Data.Models.Metadata.Runnable.Yes, gb.Runnable); Assert.Equal("cloneof", gb.CloneOf); Assert.Equal("romof", gb.RomOf); Assert.Equal("sampleof", gb.SampleOf); Assert.Equal("description", gb.Description); Assert.Equal("year", gb.Year); Assert.Equal("manufacturer", gb.Manufacturer); Assert.Equal("history", 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(Data.Models.Listxml.BiosSet? biosset) { Assert.NotNull(biosset); Assert.Equal("name", biosset.Name); Assert.Equal("description", biosset.Description); Assert.Equal(true, biosset.Default); } /// /// Validate a Rom /// private static void Validate(Data.Models.Listxml.Rom? rom) { Assert.NotNull(rom); Assert.Equal("name", rom.Name); Assert.Equal("bios", rom.Bios); Assert.Equal(12345, rom.Size); Assert.Equal("crc32", rom.CRC); Assert.Equal("sha1", rom.SHA1); Assert.Equal("merge", rom.Merge); Assert.Equal("region", rom.Region); Assert.Equal("offset", rom.Offset); Assert.Equal(Data.Models.Metadata.ItemStatus.Good, rom.Status); Assert.Equal(true, rom.Optional); Assert.Equal(true, rom.Dispose); Assert.Equal(true, rom.SoundOnly); } /// /// Validate a Disk /// private static void Validate(Data.Models.Listxml.Disk? disk) { Assert.NotNull(disk); Assert.Equal("name", disk.Name); Assert.Equal("md5", disk.MD5); Assert.Equal("sha1", disk.SHA1); Assert.Equal("merge", disk.Merge); Assert.Equal("region", disk.Region); Assert.Equal(12345, disk.Index); Assert.Equal(true, disk.Writable); Assert.Equal(Data.Models.Metadata.ItemStatus.Good, disk.Status); Assert.Equal(true, disk.Optional); } /// /// Validate a DeviceRef /// private static void Validate(Data.Models.Listxml.DeviceRef? deviceref) { Assert.NotNull(deviceref); Assert.Equal("name", deviceref.Name); } /// /// Validate a Sample /// private static void Validate(Data.Models.Listxml.Sample? sample) { Assert.NotNull(sample); Assert.Equal("name", sample.Name); } /// /// Validate a Chip /// private static void Validate(Data.Models.Listxml.Chip? chip) { Assert.NotNull(chip); Assert.Equal("name", chip.Name); Assert.Equal("tag", chip.Tag); Assert.Equal(Data.Models.Metadata.ChipType.CPU, chip.Type); Assert.Equal(true, chip.SoundOnly); Assert.Equal(12345, chip.Clock); } /// /// Validate a Display /// private static void Validate(Data.Models.Listxml.Display? display) { Assert.NotNull(display); Assert.Equal("tag", display.Tag); Assert.Equal(Data.Models.Metadata.DisplayType.Vector, display.Type); Assert.Equal(Data.Models.Metadata.Rotation.East, display.Rotate); Assert.Equal(true, display.FlipX); Assert.Equal(12345, display.Width); Assert.Equal(12345, display.Height); Assert.Equal(123.45, display.Refresh); Assert.Equal(12345, display.PixClock); Assert.Equal(12345, display.HTotal); Assert.Equal(12345, display.HBEnd); Assert.Equal(12345, display.HBStart); Assert.Equal(12345, display.VTotal); Assert.Equal(12345, display.VBEnd); Assert.Equal(12345, display.VBStart); } /// /// Validate a Video /// private static void Validate(Data.Models.Listxml.Video? video) { Assert.NotNull(video); Assert.Equal(Data.Models.Metadata.DisplayType.Vector, video.Screen); Assert.Equal(Data.Models.Metadata.Rotation.East, video.Orientation); Assert.Equal(12345, video.Width); Assert.Equal(12345, video.Height); Assert.Equal(12345, video.AspectX); Assert.Equal(12345, video.AspectY); Assert.Equal(123.45, video.Refresh); } /// /// Validate a Sound /// private static void Validate(Data.Models.Listxml.Sound? sound) { Assert.NotNull(sound); Assert.Equal(12345, sound.Channels); } /// /// Validate a Input /// private static void Validate(Data.Models.Listxml.Input? input) { Assert.NotNull(input); Assert.Equal(true, input.Service); Assert.Equal(true, input.Tilt); Assert.Equal(12345, input.Players); Assert.Equal("controlattr", input.ControlAttr); Assert.Equal(12345, input.Buttons); Assert.Equal(12345, input.Coins); Assert.NotNull(input.Control); var control = Assert.Single(input.Control); Validate(control); } /// /// Validate a Control /// private static void Validate(Data.Models.Listxml.Control? control) { Assert.NotNull(control); Assert.Equal(Data.Models.Metadata.ControlType.Lightgun, control.Type); Assert.Equal(12345, control.Player); Assert.Equal(12345, control.Buttons); Assert.Equal(12345, control.ReqButtons); Assert.Equal(12345, control.Minimum); Assert.Equal(12345, control.Maximum); Assert.Equal(12345, control.Sensitivity); Assert.Equal(12345, control.KeyDelta); Assert.Equal(true, control.Reverse); Assert.Equal("ways", control.Ways); Assert.Equal("ways2", control.Ways2); Assert.Equal("ways3", control.Ways3); } /// /// Validate a DipSwitch /// private static void Validate(Data.Models.Listxml.DipSwitch? dipswitch) { Assert.NotNull(dipswitch); Assert.Equal("name", dipswitch.Name); Assert.Equal("tag", dipswitch.Tag); Assert.Equal("mask", 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(Data.Models.Listxml.Condition? condition) { Assert.NotNull(condition); Assert.Equal("tag", condition.Tag); Assert.Equal("mask", condition.Mask); Assert.Equal(Data.Models.Metadata.Relation.Equal, condition.Relation); Assert.Equal("value", condition.Value); } /// /// Validate a DipLocation /// private static void Validate(Data.Models.Listxml.DipLocation? diplocation) { Assert.NotNull(diplocation); Assert.Equal("name", diplocation.Name); Assert.Equal(12345, diplocation.Number); Assert.Equal(true, diplocation.Inverted); } /// /// Validate a DipValue /// private static void Validate(Data.Models.Listxml.DipValue? dipvalue) { Assert.NotNull(dipvalue); Assert.Equal("name", dipvalue.Name); Assert.Equal("value", dipvalue.Value); Assert.Equal(true, dipvalue.Default); Validate(dipvalue.Condition); } /// /// Validate a Configuration /// private static void Validate(Data.Models.Listxml.Configuration? configuration) { Assert.NotNull(configuration); Assert.Equal("name", configuration.Name); Assert.Equal("tag", configuration.Tag); Assert.Equal("mask", 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(Data.Models.Listxml.ConfLocation? conflocation) { Assert.NotNull(conflocation); Assert.Equal("name", conflocation.Name); Assert.Equal(12345, conflocation.Number); Assert.Equal(true, conflocation.Inverted); } /// /// Validate a ConfSetting /// private static void Validate(Data.Models.Listxml.ConfSetting? confsetting) { Assert.NotNull(confsetting); Assert.Equal("name", confsetting.Name); Assert.Equal("value", confsetting.Value); Assert.Equal(true, confsetting.Default); Validate(confsetting.Condition); } /// /// Validate a Port /// private static void Validate(Data.Models.Listxml.Port? port) { Assert.NotNull(port); Assert.Equal("tag", port.Tag); Assert.NotNull(port.Analog); var analog = Assert.Single(port.Analog); Validate(analog); } /// /// Validate a Analog /// private static void Validate(Data.Models.Listxml.Analog? analog) { Assert.NotNull(analog); Assert.Equal("mask", analog.Mask); } /// /// Validate a Adjuster /// private static void Validate(Data.Models.Listxml.Adjuster? adjuster) { Assert.NotNull(adjuster); Assert.Equal("name", adjuster.Name); Assert.Equal(true, adjuster.Default); Validate(adjuster.Condition); } /// /// Validate a Driver /// private static void Validate(Data.Models.Listxml.Driver? driver) { Assert.NotNull(driver); Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Status); Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Color); Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Sound); Assert.Equal("palettesize", driver.PaletteSize); Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Emulation); Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Cocktail); Assert.Equal(Data.Models.Metadata.Supported.Yes, driver.SaveState); Assert.Equal(true, driver.RequiresArtwork); Assert.Equal(true, driver.Unofficial); Assert.Equal(true, driver.NoSoundHardware); Assert.Equal(true, driver.Incomplete); } /// /// Validate a Feature /// private static void Validate(Data.Models.Listxml.Feature? feature) { Assert.NotNull(feature); Assert.Equal(Data.Models.Metadata.FeatureType.Protection, feature.Type); Assert.Equal(Data.Models.Metadata.FeatureStatus.Imperfect, feature.Status); Assert.Equal(Data.Models.Metadata.FeatureStatus.Imperfect, feature.Overall); } /// /// Validate a Device /// private static void Validate(Data.Models.Listxml.Device? device) { Assert.NotNull(device); Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type); Assert.Equal("tag", device.Tag); Assert.Equal("fixedimage", device.FixedImage); Assert.Equal(true, device.Mandatory); Assert.Equal("interface", device.Interface); Validate(device.Instance); Assert.NotNull(device.Extension); var extension = Assert.Single(device.Extension); Validate(extension); } /// /// Validate a Instance /// private static void Validate(Data.Models.Listxml.Instance? instance) { Assert.NotNull(instance); Assert.Equal("name", instance.Name); Assert.Equal("briefname", instance.BriefName); } /// /// Validate a Extension /// private static void Validate(Data.Models.Listxml.Extension? extension) { Assert.NotNull(extension); Assert.Equal("name", extension.Name); } /// /// Validate a Slot /// private static void Validate(Data.Models.Listxml.Slot? slot) { Assert.NotNull(slot); Assert.Equal("name", slot.Name); Assert.NotNull(slot.SlotOption); var slotoption = Assert.Single(slot.SlotOption); Validate(slotoption); } /// /// Validate a SlotOption /// private static void Validate(Data.Models.Listxml.SlotOption? slotoption) { Assert.NotNull(slotoption); Assert.Equal("name", slotoption.Name); Assert.Equal("devname", slotoption.DevName); Assert.Equal(true, slotoption.Default); } /// /// Validate a SoftwareList /// private static void Validate(Data.Models.Listxml.SoftwareList? softwarelist) { Assert.NotNull(softwarelist); Assert.Equal("tag", softwarelist.Tag); Assert.Equal("name", softwarelist.Name); Assert.Equal(Data.Models.Metadata.SoftwareListStatus.Original, softwarelist.Status); Assert.Equal("filter", softwarelist.Filter); } /// /// Validate a RamOption /// private static void Validate(Data.Models.Listxml.RamOption? ramoption) { Assert.NotNull(ramoption); Assert.Equal("name", ramoption.Name); Assert.Equal(true, ramoption.Default); Assert.Equal("content", ramoption.Content); } } }