diff --git a/SabreTools.Serialization.Test/CrossModel/SeparatedValueTests.cs b/SabreTools.Serialization.Test/CrossModel/SeparatedValueTests.cs index 44861e0a..74c766cd 100644 --- a/SabreTools.Serialization.Test/CrossModel/SeparatedValueTests.cs +++ b/SabreTools.Serialization.Test/CrossModel/SeparatedValueTests.cs @@ -116,9 +116,16 @@ namespace SabreTools.Serialization.Test.CrossModel Assert.Equal("XXXXXX", row.GameName); Assert.Equal("XXXXXX", row.GameDescription); Assert.Equal("disk", row.Type); + Assert.Null(row.RomName); Assert.Equal("XXXXXX", row.DiskName); + Assert.Null(row.Size); + Assert.Null(row.CRC); Assert.Equal("XXXXXX", row.MD5); Assert.Equal("XXXXXX", row.SHA1); + Assert.Null(row.SHA256); + Assert.Null(row.SHA384); + Assert.Null(row.SHA512); + Assert.Null(row.SpamSum); Assert.Equal("XXXXXX", row.Status); } @@ -134,11 +141,17 @@ namespace SabreTools.Serialization.Test.CrossModel Assert.Equal("XXXXXX", row.GameName); Assert.Equal("XXXXXX", row.GameDescription); Assert.Equal("media", row.Type); + Assert.Null(row.RomName); Assert.Equal("XXXXXX", row.DiskName); + Assert.Null(row.Size); + Assert.Null(row.CRC); Assert.Equal("XXXXXX", row.MD5); Assert.Equal("XXXXXX", row.SHA1); Assert.Equal("XXXXXX", row.SHA256); + Assert.Null(row.SHA384); + Assert.Null(row.SHA512); Assert.Equal("XXXXXX", row.SpamSum); + Assert.Null(row.Status); } /// diff --git a/SabreTools.Serialization.Test/Deserializers/ArchiveDotOrgTests.cs b/SabreTools.Serialization.Test/Deserializers/ArchiveDotOrgTests.cs index 07e9dee6..853d515b 100644 --- a/SabreTools.Serialization.Test/Deserializers/ArchiveDotOrgTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/ArchiveDotOrgTests.cs @@ -95,5 +95,172 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(file); } } + + [Fact] + public void RoundTripTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.ArchiveDotOrg(); + var serializer = new Serialization.Serializers.ArchiveDotOrg(); + + // Build the data + Models.ArchiveDotOrg.Files files = Build(); + + // Serialize to stream + Stream? actual = serializer.Serialize(files); + Assert.NotNull(actual); + + // Serialize back to original model + Models.ArchiveDotOrg.Files? newFiles = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newFiles); + Assert.NotNull(newFiles.File); + var newFile = Assert.Single(newFiles.File); + Validate(newFile); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.ArchiveDotOrg.Files Build() + { + var file = new Models.ArchiveDotOrg.File + { + Name = "XXXXXX", + Source = "XXXXXX", + BitTorrentMagnetHash = "XXXXXX", + LastModifiedTime = "XXXXXX", + Size = "XXXXXX", + MD5 = "XXXXXX", + CRC32 = "XXXXXX", + SHA1 = "XXXXXX", + FileCount = "XXXXXX", + Format = "XXXXXX", + Original = "XXXXXX", + Summation = "XXXXXX", + MatrixNumber = "XXXXXX", + CollectionCatalogNumber = "XXXXXX", + Publisher = "XXXXXX", + Comment = "XXXXXX", + ASRDetectedLang = "XXXXXX", + ASRDetectedLangConf = "XXXXXX", + ASRTranscribedLang = "XXXXXX", + WhisperASRModuleVersion = "XXXXXX", + WhisperModelHash = "XXXXXX", + WhisperModelName = "XXXXXX", + WhisperVersion = "XXXXXX", + ClothCoverDetectionModuleVersion = "XXXXXX", + hOCRCharToWordhOCRVersion = "XXXXXX", + hOCRCharToWordModuleVersion = "XXXXXX", + hOCRFtsTexthOCRVersion = "XXXXXX", + hOCRFtsTextModuleVersion = "XXXXXX", + hOCRPageIndexhOCRVersion = "XXXXXX", + hOCRPageIndexModuleVersion = "XXXXXX", + TesseractOCR = "XXXXXX", + TesseractOCRConverted = "XXXXXX", + TesseractOCRDetectedLang = "XXXXXX", + TesseractOCRDetectedLangConf = "XXXXXX", + TesseractOCRDetectedScript = "XXXXXX", + TesseractOCRDetectedScriptConf = "XXXXXX", + TesseractOCRModuleVersion = "XXXXXX", + TesseractOCRParameters = "XXXXXX", + PDFModuleVersion = "XXXXXX", + WordConfidenceInterval0To10 = "XXXXXX", + WordConfidenceInterval11To20 = "XXXXXX", + WordConfidenceInterval21To30 = "XXXXXX", + WordConfidenceInterval31To40 = "XXXXXX", + WordConfidenceInterval41To50 = "XXXXXX", + WordConfidenceInterval51To60 = "XXXXXX", + WordConfidenceInterval61To70 = "XXXXXX", + WordConfidenceInterval71To80 = "XXXXXX", + WordConfidenceInterval81To90 = "XXXXXX", + WordConfidenceInterval91To100 = "XXXXXX", + Album = "XXXXXX", + Artist = "XXXXXX", + Bitrate = "XXXXXX", + Creator = "XXXXXX", + Height = "XXXXXX", + Length = "XXXXXX", + PreviewImage = "XXXXXX", + Rotation = "XXXXXX", + Title = "XXXXXX", + Track = "XXXXXX", + Width = "XXXXXX", + }; + + return new Models.ArchiveDotOrg.Files + { + File = [file] + }; + } + + /// + /// Validate a File + /// + private static void Validate(Models.ArchiveDotOrg.File? file) + { + Assert.NotNull(file); + Assert.Equal("XXXXXX", file.Name); + Assert.Equal("XXXXXX", file.Source); + Assert.Equal("XXXXXX", file.BitTorrentMagnetHash); + Assert.Equal("XXXXXX", file.LastModifiedTime); + Assert.Equal("XXXXXX", file.Size); + Assert.Equal("XXXXXX", file.MD5); + Assert.Equal("XXXXXX", file.CRC32); + Assert.Equal("XXXXXX", file.SHA1); + Assert.Equal("XXXXXX", file.FileCount); + Assert.Equal("XXXXXX", file.Format); + Assert.Equal("XXXXXX", file.Original); + Assert.Equal("XXXXXX", file.Summation); + Assert.Equal("XXXXXX", file.MatrixNumber); + Assert.Equal("XXXXXX", file.CollectionCatalogNumber); + Assert.Equal("XXXXXX", file.Publisher); + Assert.Equal("XXXXXX", file.Comment); + Assert.Equal("XXXXXX", file.ASRDetectedLang); + Assert.Equal("XXXXXX", file.ASRDetectedLangConf); + Assert.Equal("XXXXXX", file.ASRTranscribedLang); + Assert.Equal("XXXXXX", file.WhisperASRModuleVersion); + Assert.Equal("XXXXXX", file.WhisperModelHash); + Assert.Equal("XXXXXX", file.WhisperModelName); + Assert.Equal("XXXXXX", file.WhisperVersion); + Assert.Equal("XXXXXX", file.ClothCoverDetectionModuleVersion); + Assert.Equal("XXXXXX", file.hOCRCharToWordhOCRVersion); + Assert.Equal("XXXXXX", file.hOCRCharToWordModuleVersion); + Assert.Equal("XXXXXX", file.hOCRFtsTexthOCRVersion); + Assert.Equal("XXXXXX", file.hOCRFtsTextModuleVersion); + Assert.Equal("XXXXXX", file.hOCRPageIndexhOCRVersion); + Assert.Equal("XXXXXX", file.hOCRPageIndexModuleVersion); + Assert.Equal("XXXXXX", file.TesseractOCR); + Assert.Equal("XXXXXX", file.TesseractOCRConverted); + Assert.Equal("XXXXXX", file.TesseractOCRDetectedLang); + Assert.Equal("XXXXXX", file.TesseractOCRDetectedLangConf); + Assert.Equal("XXXXXX", file.TesseractOCRDetectedScript); + Assert.Equal("XXXXXX", file.TesseractOCRDetectedScriptConf); + Assert.Equal("XXXXXX", file.TesseractOCRModuleVersion); + Assert.Equal("XXXXXX", file.TesseractOCRParameters); + Assert.Equal("XXXXXX", file.PDFModuleVersion); + Assert.Equal("XXXXXX", file.WordConfidenceInterval0To10); + Assert.Equal("XXXXXX", file.WordConfidenceInterval11To20); + Assert.Equal("XXXXXX", file.WordConfidenceInterval21To30); + Assert.Equal("XXXXXX", file.WordConfidenceInterval31To40); + Assert.Equal("XXXXXX", file.WordConfidenceInterval41To50); + Assert.Equal("XXXXXX", file.WordConfidenceInterval51To60); + Assert.Equal("XXXXXX", file.WordConfidenceInterval61To70); + Assert.Equal("XXXXXX", file.WordConfidenceInterval71To80); + Assert.Equal("XXXXXX", file.WordConfidenceInterval81To90); + Assert.Equal("XXXXXX", file.WordConfidenceInterval91To100); + Assert.Equal("XXXXXX", file.Album); + Assert.Equal("XXXXXX", file.Artist); + Assert.Equal("XXXXXX", file.Bitrate); + Assert.Equal("XXXXXX", file.Creator); + Assert.Equal("XXXXXX", file.Height); + Assert.Equal("XXXXXX", file.Length); + Assert.Equal("XXXXXX", file.PreviewImage); + Assert.Equal("XXXXXX", file.Rotation); + Assert.Equal("XXXXXX", file.Title); + Assert.Equal("XXXXXX", file.Track); + Assert.Equal("XXXXXX", file.Width); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/AttractModeTests.cs b/SabreTools.Serialization.Test/Deserializers/AttractModeTests.cs index f9f2e657..ba3b4821 100644 --- a/SabreTools.Serialization.Test/Deserializers/AttractModeTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/AttractModeTests.cs @@ -91,5 +91,148 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(file); } } + + [Fact] + public void RoundTripShortTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.AttractMode(); + var serializer = new Serialization.Serializers.AttractMode(); + + // Build the data + Models.AttractMode.MetadataFile mf = Build(); + + // Serialize to stream + Stream? actual = serializer.Serialize(mf, longHeader: false); + Assert.NotNull(actual); + + // Serialize back to original model + Models.AttractMode.MetadataFile? newMf = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMf); + Validate(newMf.Header, longHeader: false); + Assert.NotNull(newMf.Row); + var newRow = Assert.Single(newMf.Row); + Validate(newRow, longHeader: false); + } + + [Fact] + public void RoundTripLongTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.AttractMode(); + var serializer = new Serialization.Serializers.AttractMode(); + + // Build the data + Models.AttractMode.MetadataFile mf = Build(); + + // Serialize to stream + Stream? actual = serializer.Serialize(mf, longHeader: true); + Assert.NotNull(actual); + + // Serialize back to original model + Models.AttractMode.MetadataFile? newMf = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMf); + Validate(newMf.Header, longHeader: true); + Assert.NotNull(newMf.Row); + var newRow = Assert.Single(newMf.Row); + Validate(newRow, longHeader: true); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.AttractMode.MetadataFile Build() + { + string[] header = ["header"]; + + var row = new Models.AttractMode.Row + { + Name = "XXXXXX", + Title = "XXXXXX", + Emulator = "XXXXXX", + CloneOf = "XXXXXX", + Year = "XXXXXX", + Manufacturer = "XXXXXX", + Category = "XXXXXX", + Players = "XXXXXX", + Rotation = "XXXXXX", + Control = "XXXXXX", + Status = "XXXXXX", + DisplayCount = "XXXXXX", + DisplayType = "XXXXXX", + AltRomname = "XXXXXX", + AltTitle = "XXXXXX", + Extra = "XXXXXX", + Buttons = "XXXXXX", + Favorite = "XXXXXX", + Tags = "XXXXXX", + PlayedCount = "XXXXXX", + PlayedTime = "XXXXXX", + FileIsAvailable = "XXXXXX", + }; + + return new Models.AttractMode.MetadataFile + { + Header = header, + Row = [row], + }; + } + + /// + /// Validate a header + /// + private static void Validate(string[]? header, bool longHeader) + { + Assert.NotNull(header); + if (longHeader) + Assert.True(Serialization.Serializers.AttractMode.HeaderArrayWithRomname.SequenceEqual(header)); + else + Assert.True(Serialization.Serializers.AttractMode.HeaderArrayWithoutRomname.SequenceEqual(header)); + } + + /// + /// Validate a Row + /// + private static void Validate(Models.AttractMode.Row? row, bool longHeader) + { + Assert.NotNull(row); + Assert.Equal("XXXXXX", row.Name); + Assert.Equal("XXXXXX", row.Title); + Assert.Equal("XXXXXX", row.Emulator); + Assert.Equal("XXXXXX", row.CloneOf); + Assert.Equal("XXXXXX", row.Year); + Assert.Equal("XXXXXX", row.Manufacturer); + Assert.Equal("XXXXXX", row.Category); + Assert.Equal("XXXXXX", row.Players); + Assert.Equal("XXXXXX", row.Rotation); + Assert.Equal("XXXXXX", row.Control); + Assert.Equal("XXXXXX", row.Status); + Assert.Equal("XXXXXX", row.DisplayCount); + Assert.Equal("XXXXXX", row.DisplayType); + Assert.Equal("XXXXXX", row.AltRomname); + Assert.Equal("XXXXXX", row.AltTitle); + Assert.Equal("XXXXXX", row.Extra); + Assert.Equal("XXXXXX", row.Buttons); + if (longHeader) + { + Assert.Equal("XXXXXX", row.Favorite); + Assert.Equal("XXXXXX", row.Tags); + Assert.Equal("XXXXXX", row.PlayedCount); + Assert.Equal("XXXXXX", row.PlayedTime); + Assert.Equal("XXXXXX", row.FileIsAvailable); + } + else + { + Assert.Null(row.Favorite); + Assert.Null(row.Tags); + Assert.Null(row.PlayedCount); + Assert.Null(row.PlayedTime); + Assert.Null(row.FileIsAvailable); + } + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/ClrMameProTests.cs b/SabreTools.Serialization.Test/Deserializers/ClrMameProTests.cs index 904f0f6b..0758efbe 100644 --- a/SabreTools.Serialization.Test/Deserializers/ClrMameProTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/ClrMameProTests.cs @@ -91,5 +91,492 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(dat?.Game); Assert.Equal(count, dat.Game.Length); } + + [Fact] + public void RoundTripGameTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.ClrMamePro(); + var serializer = new Serialization.Serializers.ClrMamePro(); + + // Build the data + Models.ClrMamePro.MetadataFile mf = Build(game: true); + + // Serialize to stream + Stream? actual = serializer.Serialize(mf); + Assert.NotNull(actual); + + // Serialize back to original model + Models.ClrMamePro.MetadataFile? newMf = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMf); + Validate(newMf.ClrMamePro); + Assert.NotNull(newMf.Game); + var newGame = Assert.Single(newMf.Game); + Validate(newGame); + } + + [Fact] + public void RoundTripMachineTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.ClrMamePro(); + var serializer = new Serialization.Serializers.ClrMamePro(); + + // Build the data + Models.ClrMamePro.MetadataFile mf = Build(game: false); + + // Serialize to stream + Stream? actual = serializer.Serialize(mf); + Assert.NotNull(actual); + + // Serialize back to original model + Models.ClrMamePro.MetadataFile? newMf = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMf); + Validate(newMf.ClrMamePro); + Assert.NotNull(newMf.Game); + var newGame = Assert.Single(newMf.Game); + Validate(newGame); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.ClrMamePro.MetadataFile Build(bool game) + { + var cmp = new Models.ClrMamePro.ClrMamePro + { + Name = "XXXXXX", + Description = "XXXXXX", + RootDir = "XXXXXX", + Category = "XXXXXX", + Version = "XXXXXX", + Date = "XXXXXX", + Author = "XXXXXX", + Homepage = "XXXXXX", + Url = "XXXXXX", + Comment = "XXXXXX", + Header = "XXXXXX", + Type = "XXXXXX", + ForceMerging = "XXXXXX", + ForceZipping = "XXXXXX", + ForcePacking = "XXXXXX", + }; + + var release = new Models.ClrMamePro.Release + { + Name = "XXXXXX", + Region = "XXXXXX", + Language = "XXXXXX", + Date = "XXXXXX", + Default = "XXXXXX", + }; + + var biosset = new Models.ClrMamePro.BiosSet + { + Name = "XXXXXX", + Description = "XXXXXX", + Default = "XXXXXX", + }; + + var rom = new Models.ClrMamePro.Rom + { + Name = "XXXXXX", + Size = "XXXXXX", + CRC = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + Merge = "XXXXXX", + Status = "XXXXXX", + Flags = "XXXXXX", + Date = "XXXXXX", + SHA256 = "XXXXXX", + SHA384 = "XXXXXX", + SHA512 = "XXXXXX", + SpamSum = "XXXXXX", + xxHash364 = "XXXXXX", + xxHash3128 = "XXXXXX", + Region = "XXXXXX", + Offs = "XXXXXX", + Serial = "XXXXXX", + Header = "XXXXXX", + Inverted = "XXXXXX", + MIA = "XXXXXX", + }; + + var disk = new Models.ClrMamePro.Disk + { + Name = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + Merge = "XXXXXX", + Status = "XXXXXX", + Flags = "XXXXXX", + }; + + var sample = new Models.ClrMamePro.Sample + { + Name = "XXXXXX", + }; + + var archive = new Models.ClrMamePro.Archive + { + Name = "XXXXXX", + }; + + var media = new Models.ClrMamePro.Media + { + Name = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + SHA256 = "XXXXXX", + SpamSum = "XXXXXX", + }; + + var chip = new Models.ClrMamePro.Chip + { + Type = "XXXXXX", + Name = "XXXXXX", + Flags = "XXXXXX", + Clock = "XXXXXX", + }; + + var video = new Models.ClrMamePro.Video + { + Screen = "XXXXXX", + Orientation = "XXXXXX", + X = "XXXXXX", + Y = "XXXXXX", + AspectX = "XXXXXX", + AspectY = "XXXXXX", + Freq = "XXXXXX", + }; + + var sound = new Models.ClrMamePro.Sound + { + Channels = "XXXXXX", + }; + + var input = new Models.ClrMamePro.Input + { + Players = "XXXXXX", + Control = "XXXXXX", + Buttons = "XXXXXX", + Coins = "XXXXXX", + Tilt = "XXXXXX", + Service = "XXXXXX", + }; + + var dipswitch = new Models.ClrMamePro.DipSwitch + { + Name = "XXXXXX", + Entry = ["XXXXXX"], + Default = "XXXXXX", + }; + + var driver = new Models.ClrMamePro.Driver + { + Status = "XXXXXX", + Color = "XXXXXX", + Sound = "XXXXXX", + PaletteSize = "XXXXXX", + Blit = "XXXXXX", + }; + + // TODO: This omits Set, should that have a separate case? + Models.ClrMamePro.GameBase gameBase = game + ? new Models.ClrMamePro.Game() + : new Models.ClrMamePro.Machine(); + gameBase.Name = "XXXXXX"; + gameBase.Description = "XXXXXX"; + gameBase.Year = "XXXXXX"; + gameBase.Manufacturer = "XXXXXX"; + gameBase.Category = "XXXXXX"; + gameBase.CloneOf = "XXXXXX"; + gameBase.RomOf = "XXXXXX"; + gameBase.SampleOf = "XXXXXX"; + gameBase.Release = [release]; + gameBase.BiosSet = [biosset]; + gameBase.Rom = [rom]; + gameBase.Disk = [disk]; + gameBase.Sample = [sample]; + gameBase.Archive = [archive]; + gameBase.Media = [media]; + gameBase.Chip = [chip]; + gameBase.Video = [video]; + gameBase.Sound = sound; + gameBase.Input = input; + gameBase.DipSwitch = [dipswitch]; + gameBase.Driver = driver; + + return new Models.ClrMamePro.MetadataFile + { + ClrMamePro = cmp, + Game = [gameBase], + }; + } + + /// + /// Validate a ClrMamePro + /// + private static void Validate(Models.ClrMamePro.ClrMamePro? cmp) + { + Assert.NotNull(cmp); + Assert.Equal("XXXXXX", cmp.Name); + Assert.Equal("XXXXXX", cmp.Description); + Assert.Equal("XXXXXX", cmp.RootDir); + Assert.Equal("XXXXXX", cmp.Category); + Assert.Equal("XXXXXX", cmp.Version); + Assert.Equal("XXXXXX", cmp.Date); + Assert.Equal("XXXXXX", cmp.Author); + Assert.Equal("XXXXXX", cmp.Homepage); + Assert.Equal("XXXXXX", cmp.Url); + Assert.Equal("XXXXXX", cmp.Comment); + Assert.Equal("XXXXXX", cmp.Header); + Assert.Equal("XXXXXX", cmp.Type); + Assert.Equal("XXXXXX", cmp.ForceMerging); + Assert.Equal("XXXXXX", cmp.ForceZipping); + Assert.Equal("XXXXXX", cmp.ForcePacking); + } + + /// + /// Validate a GameBase + /// + private static void Validate(Models.ClrMamePro.GameBase? gb) + { + Assert.NotNull(gb); + Assert.Equal("XXXXXX", gb.Name); + Assert.Equal("XXXXXX", gb.Description); + Assert.Equal("XXXXXX", gb.Year); + Assert.Equal("XXXXXX", gb.Manufacturer); + Assert.Equal("XXXXXX", gb.Category); + Assert.Equal("XXXXXX", gb.CloneOf); + Assert.Equal("XXXXXX", gb.RomOf); + Assert.Equal("XXXXXX", gb.SampleOf); + + Assert.NotNull(gb.Release); + var release = Assert.Single(gb.Release); + Validate(release); + + 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.Sample); + var sample = Assert.Single(gb.Sample); + Validate(sample); + + Assert.NotNull(gb.Archive); + var archive = Assert.Single(gb.Archive); + Validate(archive); + + Assert.NotNull(gb.Media); + var media = Assert.Single(gb.Media); + Validate(media); + + Assert.NotNull(gb.Chip); + var chip = Assert.Single(gb.Chip); + Validate(chip); + + 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); + + Validate(gb.Driver); + } + + /// + /// Validate a Release + /// + private static void Validate(Models.ClrMamePro.Release? release) + { + Assert.NotNull(release); + Assert.Equal("XXXXXX", release.Name); + Assert.Equal("XXXXXX", release.Region); + Assert.Equal("XXXXXX", release.Language); + Assert.Equal("XXXXXX", release.Date); + Assert.Equal("XXXXXX", release.Default); + } + + /// + /// Validate a BiosSet + /// + private static void Validate(Models.ClrMamePro.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.ClrMamePro.Rom? rom) + { + Assert.NotNull(rom); + Assert.Equal("XXXXXX", rom.Name); + Assert.Equal("XXXXXX", rom.Size); + Assert.Equal("XXXXXX", rom.CRC); + Assert.Equal("XXXXXX", rom.MD5); + Assert.Equal("XXXXXX", rom.SHA1); + Assert.Equal("XXXXXX", rom.Merge); + Assert.Equal("XXXXXX", rom.Status); + Assert.Equal("XXXXXX", rom.Flags); + Assert.Equal("XXXXXX", rom.Date); + Assert.Equal("XXXXXX", rom.SHA256); + Assert.Equal("XXXXXX", rom.SHA384); + Assert.Equal("XXXXXX", rom.SHA512); + Assert.Equal("XXXXXX", rom.SpamSum); + Assert.Equal("XXXXXX", rom.xxHash364); + Assert.Equal("XXXXXX", rom.xxHash3128); + Assert.Equal("XXXXXX", rom.Region); + Assert.Equal("XXXXXX", rom.Offs); + Assert.Equal("XXXXXX", rom.Serial); + Assert.Equal("XXXXXX", rom.Header); + Assert.Equal("XXXXXX", rom.Inverted); + Assert.Equal("XXXXXX", rom.MIA); + } + + /// + /// Validate a Disk + /// + private static void Validate(Models.ClrMamePro.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.Status); + Assert.Equal("XXXXXX", disk.Flags); + } + + /// + /// Validate a Sample + /// + private static void Validate(Models.ClrMamePro.Sample? sample) + { + Assert.NotNull(sample); + Assert.Equal("XXXXXX", sample.Name); + } + + /// + /// Validate a Archive + /// + private static void Validate(Models.ClrMamePro.Archive? archive) + { + Assert.NotNull(archive); + Assert.Equal("XXXXXX", archive.Name); + } + + /// + /// Validate a Media + /// + private static void Validate(Models.ClrMamePro.Media? media) + { + Assert.NotNull(media); + Assert.Equal("XXXXXX", media.Name); + Assert.Equal("XXXXXX", media.MD5); + Assert.Equal("XXXXXX", media.SHA1); + Assert.Equal("XXXXXX", media.SHA256); + Assert.Equal("XXXXXX", media.SpamSum); + } + + /// + /// Validate a Chip + /// + private static void Validate(Models.ClrMamePro.Chip? chip) + { + Assert.NotNull(chip); + Assert.Equal("XXXXXX", chip.Type); + Assert.Equal("XXXXXX", chip.Name); + Assert.Equal("XXXXXX", chip.Flags); + Assert.Equal("XXXXXX", chip.Clock); + } + + /// + /// Validate a Video + /// + private static void Validate(Models.ClrMamePro.Video? video) + { + Assert.NotNull(video); + Assert.Equal("XXXXXX", video.Screen); + Assert.Equal("XXXXXX", video.Orientation); + Assert.Equal("XXXXXX", video.X); + Assert.Equal("XXXXXX", video.Y); + Assert.Equal("XXXXXX", video.AspectX); + Assert.Equal("XXXXXX", video.AspectY); + Assert.Equal("XXXXXX", video.Freq); + } + + /// + /// Validate a Sound + /// + private static void Validate(Models.ClrMamePro.Sound? sound) + { + Assert.NotNull(sound); + Assert.Equal("XXXXXX", sound.Channels); + } + + /// + /// Validate a Input + /// + private static void Validate(Models.ClrMamePro.Input? input) + { + Assert.NotNull(input); + Assert.Equal("XXXXXX", input.Players); + Assert.Equal("XXXXXX", input.Control); + Assert.Equal("XXXXXX", input.Buttons); + Assert.Equal("XXXXXX", input.Coins); + Assert.Equal("XXXXXX", input.Tilt); + Assert.Equal("XXXXXX", input.Service); + } + + /// + /// Validate a DipSwitch + /// + private static void Validate(Models.ClrMamePro.DipSwitch? dipswitch) + { + Assert.NotNull(dipswitch); + Assert.Equal("XXXXXX", dipswitch.Name); + + Assert.NotNull(dipswitch.Entry); + string entry = Assert.Single(dipswitch.Entry); + Assert.Equal("XXXXXX", entry); + + Assert.Equal("XXXXXX", dipswitch.Default); + } + + /// + /// Validate a Driver + /// + private static void Validate(Models.ClrMamePro.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.Blit); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/DosCenterTests.cs b/SabreTools.Serialization.Test/Deserializers/DosCenterTests.cs index 9779886a..775ced59 100644 --- a/SabreTools.Serialization.Test/Deserializers/DosCenterTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/DosCenterTests.cs @@ -93,5 +93,107 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(game.File); } } + + [Fact] + public void RoundTripTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.DosCenter(); + var serializer = new Serialization.Serializers.DosCenter(); + + // Build the data + Models.DosCenter.MetadataFile mf = Build(); + + // Serialize to stream + Stream? actual = serializer.Serialize(mf); + Assert.NotNull(actual); + + // Serialize back to original model + Models.DosCenter.MetadataFile? newMf = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMf); + Validate(newMf.DosCenter); + Assert.NotNull(newMf.Game); + var newGame = Assert.Single(newMf.Game); + Validate(newGame); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.DosCenter.MetadataFile Build() + { + var dc = new Models.DosCenter.DosCenter + { + Name = "XXXXXX", + Description = "XXXXXX", + Version = "XXXXXX", + Date = "XXXXXX", + Author = "XXXXXX", + Homepage = "XXXXXX", + Comment = "XXXXXX", + }; + + var file = new Models.DosCenter.File + { + Name = "XXXXXX", + Size = "XXXXXX", + CRC = "XXXXXX", + Date = "XXXXXX XXXXXX", + }; + + var game = new Models.DosCenter.Game + { + Name = "XXXXXX", + File = [file], + }; + + return new Models.DosCenter.MetadataFile + { + DosCenter = dc, + Game = [game], + }; + } + + /// + /// Validate a DosCenter + /// + private static void Validate(Models.DosCenter.DosCenter? cmp) + { + Assert.NotNull(cmp); + Assert.Equal("XXXXXX", cmp.Name); + Assert.Equal("XXXXXX", cmp.Description); + Assert.Equal("XXXXXX", cmp.Version); + Assert.Equal("XXXXXX", cmp.Date); + Assert.Equal("XXXXXX", cmp.Author); + Assert.Equal("XXXXXX", cmp.Homepage); + Assert.Equal("XXXXXX", cmp.Comment); + } + + /// + /// Validate a Game + /// + private static void Validate(Models.DosCenter.Game? game) + { + Assert.NotNull(game); + Assert.Equal("XXXXXX", game.Name); + + Assert.NotNull(game.File); + var file = Assert.Single(game.File); + Validate(file); + } + + /// + /// Validate a File + /// + private static void Validate(Models.DosCenter.File? rom) + { + Assert.NotNull(rom); + Assert.Equal("XXXXXX", rom.Name); + Assert.Equal("XXXXXX", rom.Size); + Assert.Equal("XXXXXX", rom.CRC); + Assert.Equal("XXXXXX XXXXXX", rom.Date); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/EverdriveSMDBTests.cs b/SabreTools.Serialization.Test/Deserializers/EverdriveSMDBTests.cs index 88162ffd..2858637b 100644 --- a/SabreTools.Serialization.Test/Deserializers/EverdriveSMDBTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/EverdriveSMDBTests.cs @@ -85,5 +85,64 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(dat?.Row); Assert.Equal(count, dat.Row.Length); } + + [Fact] + public void RoundTripTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.EverdriveSMDB(); + var serializer = new Serialization.Serializers.EverdriveSMDB(); + + // Build the data + Models.EverdriveSMDB.MetadataFile mf = Build(); + + // Serialize to stream + Stream? actual = serializer.Serialize(mf); + Assert.NotNull(actual); + + // Serialize back to original model + Models.EverdriveSMDB.MetadataFile? newMf = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMf); + Assert.NotNull(newMf.Row); + var newRow = Assert.Single(newMf.Row); + Validate(newRow); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.EverdriveSMDB.MetadataFile Build() + { + var row = new Models.EverdriveSMDB.Row + { + SHA256 = "XXXXXX", + Name = "XXXXXX", + SHA1 = "XXXXXX", + MD5 = "XXXXXX", + CRC32 = "XXXXXX", + Size = "XXXXXX", + }; + + return new Models.EverdriveSMDB.MetadataFile + { + Row = [row], + }; + } + + /// + /// Validate a Row + /// + private static void Validate(Models.EverdriveSMDB.Row? row) + { + Assert.NotNull(row); + Assert.Equal("XXXXXX", row.SHA256); + Assert.Equal("XXXXXX", row.Name); + Assert.Equal("XXXXXX", row.SHA1); + Assert.Equal("XXXXXX", row.MD5); + Assert.Equal("XXXXXX", row.CRC32); + Assert.Equal("XXXXXX", row.Size); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/HashfileTests.cs b/SabreTools.Serialization.Test/Deserializers/HashfileTests.cs index a53b60bb..d7bda181 100644 --- a/SabreTools.Serialization.Test/Deserializers/HashfileTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/HashfileTests.cs @@ -125,5 +125,331 @@ namespace SabreTools.Serialization.Test.Deserializers throw new ArgumentOutOfRangeException(nameof(hash)); } } + + [Fact] + public void RoundTripSFVTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Hashfile(); + var serializer = new Serialization.Serializers.Hashfile(); + + // Build the data + Models.Hashfile.Hashfile hf = Build(HashType.CRC32); + + // Serialize to stream + Stream? actual = serializer.Serialize(hf, HashType.CRC32); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.CRC32); + + // Validate the data + Assert.NotNull(newHf); + Assert.NotNull(newHf.SFV); + var newSfv = Assert.Single(newHf.SFV); + Validate(newSfv); + } + + [Fact] + public void RoundTripMD2Test() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Hashfile(); + var serializer = new Serialization.Serializers.Hashfile(); + + // Build the data + Models.Hashfile.Hashfile hf = Build(HashType.MD2); + + // Serialize to stream + Stream? actual = serializer.Serialize(hf, HashType.MD2); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.MD2); + + // Validate the data + Assert.NotNull(newHf); + Assert.NotNull(newHf.MD2); + var newMd2 = Assert.Single(newHf.MD2); + Validate(newMd2); + } + + [Fact] + public void RoundTripMD4Test() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Hashfile(); + var serializer = new Serialization.Serializers.Hashfile(); + + // Build the data + Models.Hashfile.Hashfile hf = Build(HashType.MD4); + + // Serialize to stream + Stream? actual = serializer.Serialize(hf, HashType.MD4); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.MD4); + + // Validate the data + Assert.NotNull(newHf); + Assert.NotNull(newHf.MD4); + var newMd4 = Assert.Single(newHf.MD4); + Validate(newMd4); + } + + [Fact] + public void RoundTripMD5Test() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Hashfile(); + var serializer = new Serialization.Serializers.Hashfile(); + + // Build the data + Models.Hashfile.Hashfile hf = Build(HashType.MD5); + + // Serialize to stream + Stream? actual = serializer.Serialize(hf, HashType.MD5); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.MD5); + + // Validate the data + Assert.NotNull(newHf); + Assert.NotNull(newHf.MD5); + var newMd5 = Assert.Single(newHf.MD5); + Validate(newMd5); + } + + [Fact] + public void RoundTripSHA1Test() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Hashfile(); + var serializer = new Serialization.Serializers.Hashfile(); + + // Build the data + Models.Hashfile.Hashfile hf = Build(HashType.SHA1); + + // Serialize to stream + Stream? actual = serializer.Serialize(hf, HashType.SHA1); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.SHA1); + + // Validate the data + Assert.NotNull(newHf); + Assert.NotNull(newHf.SHA1); + var newSha1 = Assert.Single(newHf.SHA1); + Validate(newSha1); + } + + [Fact] + public void RoundTripSHA256Test() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Hashfile(); + var serializer = new Serialization.Serializers.Hashfile(); + + // Build the data + Models.Hashfile.Hashfile hf = Build(HashType.SHA256); + + // Serialize to stream + Stream? actual = serializer.Serialize(hf, HashType.SHA256); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.SHA256); + + // Validate the data + Assert.NotNull(newHf); + Assert.NotNull(newHf.SHA256); + var newSha256 = Assert.Single(newHf.SHA256); + Validate(newSha256); + } + + [Fact] + public void RoundTripSHA384Test() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Hashfile(); + var serializer = new Serialization.Serializers.Hashfile(); + + // Build the data + Models.Hashfile.Hashfile hf = Build(HashType.SHA384); + + // Serialize to stream + Stream? actual = serializer.Serialize(hf, HashType.SHA384); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.SHA384); + + // Validate the data + Assert.NotNull(newHf); + Assert.NotNull(newHf.SHA384); + var newSha384 = Assert.Single(newHf.SHA384); + Validate(newSha384); + } + + [Fact] + public void RoundTripSHA512Test() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Hashfile(); + var serializer = new Serialization.Serializers.Hashfile(); + + // Build the data + Models.Hashfile.Hashfile hf = Build(HashType.SHA512); + + // Serialize to stream + Stream? actual = serializer.Serialize(hf, HashType.SHA512); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.SHA512); + + // Validate the data + Assert.NotNull(newHf); + Assert.NotNull(newHf.SHA512); + var newSha512 = Assert.Single(newHf.SHA512); + Validate(newSha512); + } + + [Fact] + public void RoundTripSpamSumTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Hashfile(); + var serializer = new Serialization.Serializers.Hashfile(); + + // Build the data + Models.Hashfile.Hashfile hf = Build(HashType.SpamSum); + + // Serialize to stream + Stream? actual = serializer.Serialize(hf, HashType.SpamSum); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Hashfile.Hashfile? newHf = deserializer.Deserialize(actual, HashType.SpamSum); + + // Validate the data + Assert.NotNull(newHf); + Assert.NotNull(newHf.SpamSum); + var newSpamsum = Assert.Single(newHf.SpamSum); + Validate(newSpamsum); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.Hashfile.Hashfile Build(HashType hashType) + { + return hashType switch + { + HashType.CRC32 => new Models.Hashfile.Hashfile { SFV = [new Models.Hashfile.SFV { File = "XXXXXX", Hash = "XXXXXX" }] }, + HashType.MD2 => new Models.Hashfile.Hashfile { MD2 = [new Models.Hashfile.MD2 { Hash = "XXXXXX", File = "XXXXXX" }] }, + HashType.MD4 => new Models.Hashfile.Hashfile { MD4 = [new Models.Hashfile.MD4 { Hash = "XXXXXX", File = "XXXXXX" }] }, + HashType.MD5 => new Models.Hashfile.Hashfile { MD5 = [new Models.Hashfile.MD5 { Hash = "XXXXXX", File = "XXXXXX" }] }, + HashType.SHA1 => new Models.Hashfile.Hashfile { SHA1 = [new Models.Hashfile.SHA1 { Hash = "XXXXXX", File = "XXXXXX" }] }, + HashType.SHA256 => new Models.Hashfile.Hashfile { SHA256 = [new Models.Hashfile.SHA256 { Hash = "XXXXXX", File = "XXXXXX" }] }, + HashType.SHA384 => new Models.Hashfile.Hashfile { SHA384 = [new Models.Hashfile.SHA384 { Hash = "XXXXXX", File = "XXXXXX" }] }, + HashType.SHA512 => new Models.Hashfile.Hashfile { SHA512 = [new Models.Hashfile.SHA512 { Hash = "XXXXXX", File = "XXXXXX" }] }, + HashType.SpamSum => new Models.Hashfile.Hashfile { SpamSum = [new Models.Hashfile.SpamSum { Hash = "XXXXXX", File = "XXXXXX" }] }, + _ => throw new ArgumentOutOfRangeException(), + }; + } + + /// + /// Validate a SFV + /// + private static void Validate(Models.Hashfile.SFV? sfv) + { + Assert.NotNull(sfv); + Assert.Equal("XXXXXX", sfv.File); + Assert.Equal("XXXXXX", sfv.Hash); + } + + /// + /// Validate a MD2 + /// + private static void Validate(Models.Hashfile.MD2? md2) + { + Assert.NotNull(md2); + Assert.Equal("XXXXXX", md2.Hash); + Assert.Equal("XXXXXX", md2.File); + } + + /// + /// Validate a MD4 + /// + private static void Validate(Models.Hashfile.MD4? md4) + { + Assert.NotNull(md4); + Assert.Equal("XXXXXX", md4.Hash); + Assert.Equal("XXXXXX", md4.File); + } + + /// + /// Validate a MD5 + /// + private static void Validate(Models.Hashfile.MD5? md5) + { + Assert.NotNull(md5); + Assert.Equal("XXXXXX", md5.Hash); + Assert.Equal("XXXXXX", md5.File); + } + + /// + /// Validate a SHA1 + /// + private static void Validate(Models.Hashfile.SHA1? sha1) + { + Assert.NotNull(sha1); + Assert.Equal("XXXXXX", sha1.Hash); + Assert.Equal("XXXXXX", sha1.File); + } + + /// + /// Validate a SHA256 + /// + private static void Validate(Models.Hashfile.SHA256? sha256) + { + Assert.NotNull(sha256); + Assert.Equal("XXXXXX", sha256.Hash); + Assert.Equal("XXXXXX", sha256.File); + } + + /// + /// Validate a SHA384 + /// + private static void Validate(Models.Hashfile.SHA384? sha384) + { + Assert.NotNull(sha384); + Assert.Equal("XXXXXX", sha384.Hash); + Assert.Equal("XXXXXX", sha384.File); + } + + /// + /// Validate a SHA512 + /// + private static void Validate(Models.Hashfile.SHA512? sha512) + { + Assert.NotNull(sha512); + Assert.Equal("XXXXXX", sha512.Hash); + Assert.Equal("XXXXXX", sha512.File); + } + + /// + /// Validate a SpamSum + /// + private static void Validate(Models.Hashfile.SpamSum? spamsum) + { + Assert.NotNull(spamsum); + Assert.Equal("XXXXXX", spamsum.Hash); + Assert.Equal("XXXXXX", spamsum.File); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/ListromTests.cs b/SabreTools.Serialization.Test/Deserializers/ListromTests.cs index cc46bafc..dfe19681 100644 --- a/SabreTools.Serialization.Test/Deserializers/ListromTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/ListromTests.cs @@ -85,5 +85,199 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(dat?.Set); Assert.Equal(count, dat.Set.Length); } + + [Fact] + public void RoundTripTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Listrom(); + var serializer = new Serialization.Serializers.Listrom(); + + // Build the data + Models.Listrom.MetadataFile mf = Build(); + + // Serialize to stream + Stream? actual = serializer.Serialize(mf); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Listrom.MetadataFile? newMf = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMf); + Assert.NotNull(newMf.Set); + Assert.Equal(2, newMf.Set.Length); + + ValidateDevice(newMf.Set[0]); + ValidateDriver(newMf.Set[1]); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.Listrom.MetadataFile Build() + { + var romGood = new Models.Listrom.Row + { + Name = "XXXXXX", + Size = "12345", + Bad = false, + CRC = Hashing.ZeroHash.CRC32Str, + SHA1 = Hashing.ZeroHash.SHA1Str, + NoGoodDumpKnown = false, + }; + + var romBad = new Models.Listrom.Row + { + Name = "XXXXXX", + Size = "12345", + Bad = true, + CRC = Hashing.ZeroHash.CRC32Str, + SHA1 = Hashing.ZeroHash.SHA1Str, + NoGoodDumpKnown = false, + }; + + var diskGoodMd5 = new Models.Listrom.Row + { + Name = "XXXXXX", + Bad = false, + MD5 = Hashing.ZeroHash.MD5Str, + SHA1 = null, + NoGoodDumpKnown = false, + }; + + var diskGoodSha1 = new Models.Listrom.Row + { + Name = "XXXXXX", + Bad = false, + MD5 = null, + SHA1 = Hashing.ZeroHash.SHA1Str, + NoGoodDumpKnown = false, + }; + + var diskBad = new Models.Listrom.Row + { + Name = "XXXXXX", + Bad = false, + MD5 = Hashing.ZeroHash.MD5Str, + SHA1 = Hashing.ZeroHash.SHA1Str, + NoGoodDumpKnown = true, + }; + + var device = new Models.Listrom.Set() + { + Device = "XXXXXX", + Row = [romGood, romBad], + }; + + var driver = new Models.Listrom.Set() + { + Driver = "XXXXXX", + Row = [diskGoodMd5, diskGoodSha1, diskBad], + }; + + return new Models.Listrom.MetadataFile + { + Set = [device, driver], + }; + } + + /// + /// Validate a Set + /// + private static void ValidateDevice(Models.Listrom.Set? set) + { + Assert.NotNull(set); + Assert.Equal("XXXXXX", set.Device); + + Assert.NotNull(set.Row); + Assert.Equal(2, set.Row.Length); + + ValidateGoodRom(set.Row[0]); + ValidateBadRom(set.Row[1]); + } + + /// + /// Validate a Set + /// + private static void ValidateDriver(Models.Listrom.Set? set) + { + Assert.NotNull(set); + Assert.Equal("XXXXXX", set.Driver); + + Assert.NotNull(set.Row); + Assert.Equal(3, set.Row.Length); + + ValidateGoodMd5Disk(set.Row[0]); + ValidateGoodSha1Disk(set.Row[1]); + ValidateBadDisk(set.Row[2]); + } + + /// + /// Validate a Row + /// + private static void ValidateGoodRom(Models.Listrom.Row? row) + { + Assert.NotNull(row); + Assert.Equal("XXXXXX", row.Name); + Assert.Equal("12345", row.Size); + Assert.False(row.Bad); + Assert.Equal(Hashing.ZeroHash.CRC32Str, row.CRC); + Assert.Equal(Hashing.ZeroHash.SHA1Str, row.SHA1); + Assert.False(row.NoGoodDumpKnown); + } + + /// + /// Validate a Row + /// + private static void ValidateBadRom(Models.Listrom.Row? row) + { + Assert.NotNull(row); + Assert.Equal("XXXXXX", row.Name); + Assert.Equal("12345", row.Size); + Assert.True(row.Bad); + Assert.Equal(Hashing.ZeroHash.CRC32Str, row.CRC); + Assert.Equal(Hashing.ZeroHash.SHA1Str, row.SHA1); + Assert.False(row.NoGoodDumpKnown); + } + + /// + /// Validate a Row + /// + private static void ValidateGoodMd5Disk(Models.Listrom.Row? row) + { + Assert.NotNull(row); + Assert.Equal("XXXXXX", row.Name); + Assert.False(row.Bad); + Assert.Equal(Hashing.ZeroHash.MD5Str, row.MD5); + Assert.Null(row.SHA1); + Assert.False(row.NoGoodDumpKnown); + } + + /// + /// Validate a Row + /// + private static void ValidateGoodSha1Disk(Models.Listrom.Row? row) + { + Assert.NotNull(row); + Assert.Equal("XXXXXX", row.Name); + Assert.False(row.Bad); + Assert.Null(row.MD5); + Assert.Equal(Hashing.ZeroHash.SHA1Str, row.SHA1); + Assert.False(row.NoGoodDumpKnown); + } + + /// + /// Validate a Row + /// + private static void ValidateBadDisk(Models.Listrom.Row? row) + { + Assert.NotNull(row); + Assert.Equal("XXXXXX", row.Name); + Assert.False(row.Bad); + Assert.Null(row.MD5); + Assert.Null(row.SHA1); + Assert.True(row.NoGoodDumpKnown); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/ListxmlTests.cs b/SabreTools.Serialization.Test/Deserializers/ListxmlTests.cs index fe2de07a..2dc1a276 100644 --- a/SabreTools.Serialization.Test/Deserializers/ListxmlTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/ListxmlTests.cs @@ -86,5 +86,878 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(dat?.Game); Assert.Equal(count, dat.Game.Length); } + + [Fact] + public void RoundTripGameTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Listxml(); + var serializer = new Serialization.Serializers.Listxml(); + + // Build the data + Models.Listxml.Mame mame = Build(game: true); + + // Serialize to stream + Stream? actual = serializer.Serialize(mame); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Listxml.Mame? newMame = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMame); + Assert.Equal("XXXXXX", newMame.Build); + Assert.Equal("XXXXXX", newMame.Debug); + Assert.Equal("XXXXXX", newMame.MameConfig); + + Assert.NotNull(newMame.Game); + var newGame = Assert.Single(newMame.Game); + Validate(newGame); + } + + [Fact] + public void RoundTripMachineTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Listxml(); + var serializer = new Serialization.Serializers.Listxml(); + + // Build the data + Models.Listxml.Mame mame = Build(game: false); + + // Serialize to stream + Stream? actual = serializer.Serialize(mame); + Assert.NotNull(actual); + + // Serialize back to original model + Models.Listxml.Mame? newMame = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMame); + Assert.Equal("XXXXXX", newMame.Build); + Assert.Equal("XXXXXX", newMame.Debug); + Assert.Equal("XXXXXX", newMame.MameConfig); + + Assert.NotNull(newMame.Game); + var newGame = Assert.Single(newMame.Game); + Validate(newGame); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.Listxml.Mame 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.Mame + { + Build = "XXXXXX", + Debug = "XXXXXX", + MameConfig = "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/Deserializers/LogiqxTests.cs b/SabreTools.Serialization.Test/Deserializers/LogiqxTests.cs index 66d99d18..f716ec05 100644 --- a/SabreTools.Serialization.Test/Deserializers/LogiqxTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/LogiqxTests.cs @@ -86,5 +86,545 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(dat?.Game); Assert.Equal(count, dat.Game.Length); } + + [Fact] + public void RoundTripGameTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Logiqx(); + var serializer = new Serialization.Serializers.Logiqx(); + + // Build the data + Models.Logiqx.Datafile df = Build(game: true); + + // Serialize to stream + Stream? metadata = serializer.Serialize(df); + Assert.NotNull(metadata); + + // Serialize back to original model + Models.Logiqx.Datafile? newDf = deserializer.Deserialize(metadata); + + // Validate the data + Assert.NotNull(newDf); + Assert.Equal("XXXXXX", newDf.Build); + Assert.Equal("XXXXXX", newDf.Debug); + Assert.Equal("XXXXXX", newDf.SchemaLocation); + Validate(newDf.Header); + + Assert.NotNull(newDf.Game); + var newGame = Assert.Single(newDf.Game); + Validate(newGame); + + // TODO: Unsupported + Assert.Null(newDf.Dir); + } + + [Fact] + public void RoundTripMachineTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.Logiqx(); + var serializer = new Serialization.Serializers.Logiqx(); + + // Build the data + Models.Logiqx.Datafile df = Build(game: false); + + // Serialize to stream + Stream? metadata = serializer.Serialize(df); + Assert.NotNull(metadata); + + // Serialize back to original model + Models.Logiqx.Datafile? newDf = deserializer.Deserialize(metadata); + + // Validate the data + Assert.NotNull(newDf); + Assert.Equal("XXXXXX", newDf.Build); + Assert.Equal("XXXXXX", newDf.Debug); + Assert.Equal("XXXXXX", newDf.SchemaLocation); + Validate(newDf.Header); + + Assert.NotNull(newDf.Game); + var newGame = Assert.Single(newDf.Game); + Validate(newGame); + + // TODO: Unsupported + Assert.Null(newDf.Dir); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.Logiqx.Datafile Build(bool game) + { + var clrmamepro = new Models.Logiqx.ClrMamePro + { + Header = "XXXXXX", + ForceMerging = "XXXXXX", + ForceNodump = "XXXXXX", + ForcePacking = "XXXXXX", + }; + + var romcenter = new Models.Logiqx.RomCenter + { + Plugin = "XXXXXX", + RomMode = "XXXXXX", + BiosMode = "XXXXXX", + SampleMode = "XXXXXX", + LockRomMode = "XXXXXX", + LockBiosMode = "XXXXXX", + LockSampleMode = "XXXXXX", + }; + + var header = new Models.Logiqx.Header + { + Id = "XXXXXX", + Name = "XXXXXX", + Description = "XXXXXX", + RootDir = "XXXXXX", + Category = "XXXXXX", + Version = "XXXXXX", + Date = "XXXXXX", + Author = "XXXXXX", + Email = "XXXXXX", + Homepage = "XXXXXX", + Url = "XXXXXX", + Comment = "XXXXXX", + Type = "XXXXXX", + ClrMamePro = clrmamepro, + RomCenter = romcenter, + }; + + var trurip = new Models.Logiqx.Trurip + { + TitleID = "XXXXXX", + Publisher = "XXXXXX", + Developer = "XXXXXX", + Year = "XXXXXX", + Genre = "XXXXXX", + Subgenre = "XXXXXX", + Ratings = "XXXXXX", + Score = "XXXXXX", + Players = "XXXXXX", + Enabled = "XXXXXX", + CRC = "XXXXXX", + Source = "XXXXXX", + CloneOf = "XXXXXX", + RelatedTo = "XXXXXX", + }; + + var release = new Models.Logiqx.Release + { + Name = "XXXXXX", + Region = "XXXXXX", + Language = "XXXXXX", + Date = "XXXXXX", + Default = "XXXXXX", + }; + + var biosset = new Models.Logiqx.BiosSet + { + Name = "XXXXXX", + Description = "XXXXXX", + Default = "XXXXXX", + }; + + var rom = new Models.Logiqx.Rom + { + Name = "XXXXXX", + Size = "XXXXXX", + CRC = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + SHA256 = "XXXXXX", + SHA384 = "XXXXXX", + SHA512 = "XXXXXX", + SpamSum = "XXXXXX", + xxHash364 = "XXXXXX", + xxHash3128 = "XXXXXX", + Merge = "XXXXXX", + Status = "XXXXXX", + Serial = "XXXXXX", + Header = "XXXXXX", + Date = "XXXXXX", + Inverted = "XXXXXX", + MIA = "XXXXXX", + }; + + var disk = new Models.Logiqx.Disk + { + Name = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + Merge = "XXXXXX", + Status = "XXXXXX", + Region = "XXXXXX", + }; + + var media = new Models.Logiqx.Media + { + Name = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + SHA256 = "XXXXXX", + SpamSum = "XXXXXX", + }; + + var deviceRef = new Models.Logiqx.DeviceRef + { + Name = "XXXXXX", + }; + + var sample = new Models.Logiqx.Sample + { + Name = "XXXXXX", + }; + + var archive = new Models.Logiqx.Archive + { + Name = "XXXXXX", + }; + + var driver = new Models.Logiqx.Driver + { + Status = "XXXXXX", + Emulation = "XXXXXX", + Cocktail = "XXXXXX", + SaveState = "XXXXXX", + RequiresArtwork = "XXXXXX", + Unofficial = "XXXXXX", + NoSoundHardware = "XXXXXX", + Incomplete = "XXXXXX", + }; + + var softwarelist = new Models.Logiqx.SoftwareList + { + Tag = "XXXXXX", + Name = "XXXXXX", + Status = "XXXXXX", + Filter = "XXXXXX", + }; + + Models.Logiqx.GameBase gameBase = game + ? new Models.Logiqx.Game() + : new Models.Logiqx.Machine(); + gameBase.Name = "XXXXXX"; + gameBase.SourceFile = "XXXXXX"; + gameBase.IsBios = "XXXXXX"; + gameBase.IsDevice = "XXXXXX"; + gameBase.IsMechanical = "XXXXXX"; + gameBase.CloneOf = "XXXXXX"; + gameBase.RomOf = "XXXXXX"; + gameBase.SampleOf = "XXXXXX"; + gameBase.Board = "XXXXXX"; + gameBase.RebuildTo = "XXXXXX"; + gameBase.Id = "XXXXXX"; + gameBase.CloneOfId = "XXXXXX"; + gameBase.Runnable = "XXXXXX"; + gameBase.Comment = ["XXXXXX"]; + gameBase.Description = "XXXXXX"; + gameBase.Year = "XXXXXX"; + gameBase.Manufacturer = "XXXXXX"; + gameBase.Publisher = "XXXXXX"; + gameBase.Category = ["XXXXXX"]; + gameBase.Trurip = trurip; + gameBase.Release = [release]; + gameBase.BiosSet = [biosset]; + gameBase.Rom = [rom]; + gameBase.Disk = [disk]; + gameBase.Media = [media]; + gameBase.DeviceRef = [deviceRef]; + gameBase.Sample = [sample]; + gameBase.Archive = [archive]; + gameBase.Driver = driver; + gameBase.SoftwareList = [softwarelist]; + + return new Models.Logiqx.Datafile + { + Build = "XXXXXX", + Debug = "XXXXXX", + SchemaLocation = "XXXXXX", + Header = header, + Game = [gameBase], + // Dir = [dir], // TODO: Unsupported + }; + } + + /// + /// Validate a Header + /// + private static void Validate(Models.Logiqx.Header? header) + { + Assert.NotNull(header); + Assert.Equal("XXXXXX", header.Id); + Assert.Equal("XXXXXX", header.Name); + Assert.Equal("XXXXXX", header.Description); + Assert.Equal("XXXXXX", header.RootDir); + Assert.Equal("XXXXXX", header.Category); + Assert.Equal("XXXXXX", header.Version); + Assert.Equal("XXXXXX", header.Date); + Assert.Equal("XXXXXX", header.Author); + Assert.Equal("XXXXXX", header.Email); + Assert.Equal("XXXXXX", header.Homepage); + Assert.Equal("XXXXXX", header.Url); + Assert.Equal("XXXXXX", header.Comment); + Assert.Equal("XXXXXX", header.Type); + Validate(header.ClrMamePro); + Validate(header.RomCenter); + } + + /// + /// Validate a ClrMamePro + /// + private static void Validate(Models.Logiqx.ClrMamePro? cmp) + { + Assert.NotNull(cmp); + Assert.Equal("XXXXXX", cmp.Header); + Assert.Equal("XXXXXX", cmp.ForceMerging); + Assert.Equal("XXXXXX", cmp.ForceNodump); + Assert.Equal("XXXXXX", cmp.ForcePacking); + } + + /// + /// Validate a RomCenter + /// + private static void Validate(Models.Logiqx.RomCenter? rc) + { + Assert.NotNull(rc); + Assert.Equal("XXXXXX", rc.Plugin); + Assert.Equal("XXXXXX", rc.RomMode); + Assert.Equal("XXXXXX", rc.BiosMode); + Assert.Equal("XXXXXX", rc.SampleMode); + Assert.Equal("XXXXXX", rc.LockRomMode); + Assert.Equal("XXXXXX", rc.LockBiosMode); + Assert.Equal("XXXXXX", rc.LockSampleMode); + } + + /// + /// Validate a GameBase + /// + private static void Validate(Models.Logiqx.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.CloneOf); + Assert.Equal("XXXXXX", gb.RomOf); + Assert.Equal("XXXXXX", gb.SampleOf); + Assert.Equal("XXXXXX", gb.Board); + Assert.Equal("XXXXXX", gb.RebuildTo); + Assert.Equal("XXXXXX", gb.Id); + Assert.Equal("XXXXXX", gb.CloneOfId); + Assert.Equal("XXXXXX", gb.Runnable); + + Assert.NotNull(gb.Comment); + string comment = Assert.Single(gb.Comment); + Assert.Equal("XXXXXX", comment); + + Assert.Equal("XXXXXX", gb.Description); + Assert.Equal("XXXXXX", gb.Year); + Assert.Equal("XXXXXX", gb.Manufacturer); + Assert.Equal("XXXXXX", gb.Publisher); + + Assert.NotNull(gb.Category); + string category = Assert.Single(gb.Category); + Assert.Equal("XXXXXX", category); + + Validate(gb.Trurip); + + Assert.NotNull(gb.Release); + var release = Assert.Single(gb.Release); + Validate(release); + + 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.Media); + var media = Assert.Single(gb.Media); + Validate(media); + + 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.Archive); + var archive = Assert.Single(gb.Archive); + Validate(archive); + + Validate(gb.Driver); + + Assert.NotNull(gb.SoftwareList); + var softwarelist = Assert.Single(gb.SoftwareList); + Validate(softwarelist); + } + + /// + /// Validate a Trurip + /// + private static void Validate(Models.Logiqx.Trurip? trurip) + { + Assert.NotNull(trurip); + Assert.Equal("XXXXXX", trurip.TitleID); + Assert.Equal("XXXXXX", trurip.Publisher); + Assert.Equal("XXXXXX", trurip.Developer); + Assert.Equal("XXXXXX", trurip.Year); + Assert.Equal("XXXXXX", trurip.Genre); + Assert.Equal("XXXXXX", trurip.Subgenre); + Assert.Equal("XXXXXX", trurip.Ratings); + Assert.Equal("XXXXXX", trurip.Score); + Assert.Equal("XXXXXX", trurip.Players); + Assert.Equal("XXXXXX", trurip.Enabled); + Assert.Equal("XXXXXX", trurip.CRC); + Assert.Equal("XXXXXX", trurip.Source); + Assert.Equal("XXXXXX", trurip.CloneOf); + Assert.Equal("XXXXXX", trurip.RelatedTo); + } + + /// + /// Validate a Release + /// + private static void Validate(Models.Logiqx.Release? release) + { + Assert.NotNull(release); + Assert.Equal("XXXXXX", release.Name); + Assert.Equal("XXXXXX", release.Region); + Assert.Equal("XXXXXX", release.Language); + Assert.Equal("XXXXXX", release.Date); + Assert.Equal("XXXXXX", release.Default); + } + + /// + /// Validate a BiosSet + /// + private static void Validate(Models.Logiqx.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.Logiqx.Rom? rom) + { + Assert.NotNull(rom); + Assert.Equal("XXXXXX", rom.Name); + Assert.Equal("XXXXXX", rom.Size); + Assert.Equal("XXXXXX", rom.CRC); + Assert.Equal("XXXXXX", rom.MD5); + Assert.Equal("XXXXXX", rom.SHA1); + Assert.Equal("XXXXXX", rom.SHA256); + Assert.Equal("XXXXXX", rom.SHA384); + Assert.Equal("XXXXXX", rom.SHA512); + Assert.Equal("XXXXXX", rom.SpamSum); + Assert.Equal("XXXXXX", rom.xxHash364); + Assert.Equal("XXXXXX", rom.xxHash3128); + Assert.Equal("XXXXXX", rom.Merge); + Assert.Equal("XXXXXX", rom.Status); + Assert.Equal("XXXXXX", rom.Serial); + Assert.Equal("XXXXXX", rom.Header); + Assert.Equal("XXXXXX", rom.Date); + Assert.Equal("XXXXXX", rom.Inverted); + Assert.Equal("XXXXXX", rom.MIA); + } + + /// + /// Validate a Disk + /// + private static void Validate(Models.Logiqx.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.Status); + Assert.Equal("XXXXXX", disk.Region); + } + + /// + /// Validate a Media + /// + private static void Validate(Models.Logiqx.Media? media) + { + Assert.NotNull(media); + Assert.Equal("XXXXXX", media.Name); + Assert.Equal("XXXXXX", media.MD5); + Assert.Equal("XXXXXX", media.SHA1); + Assert.Equal("XXXXXX", media.SHA256); + Assert.Equal("XXXXXX", media.SpamSum); + } + + /// + /// Validate a DeviceRef + /// + private static void Validate(Models.Logiqx.DeviceRef? deviceref) + { + Assert.NotNull(deviceref); + Assert.Equal("XXXXXX", deviceref.Name); + } + + /// + /// Validate a Sample + /// + private static void Validate(Models.Logiqx.Sample? sample) + { + Assert.NotNull(sample); + Assert.Equal("XXXXXX", sample.Name); + } + + /// + /// Validate a Archive + /// + private static void Validate(Models.Logiqx.Archive? archive) + { + Assert.NotNull(archive); + Assert.Equal("XXXXXX", archive.Name); + } + + /// + /// Validate a Driver + /// + private static void Validate(Models.Logiqx.Driver? driver) + { + Assert.NotNull(driver); + Assert.Equal("XXXXXX", driver.Status); + 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 SoftwareList + /// + private static void Validate(Models.Logiqx.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); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/M1Tests.cs b/SabreTools.Serialization.Test/Deserializers/M1Tests.cs index d76b7af1..dddd55ca 100644 --- a/SabreTools.Serialization.Test/Deserializers/M1Tests.cs +++ b/SabreTools.Serialization.Test/Deserializers/M1Tests.cs @@ -69,5 +69,872 @@ namespace SabreTools.Serialization.Test.Deserializers var actual = deserializer.Deserialize(data); Assert.Null(actual); } + + [Fact] + public void RoundTripGameTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.M1(); + var serializer = new Serialization.Serializers.M1(); + + // Build the data + Models.Listxml.M1 m1 = Build(game: true); + + // Serialize to generic model + Stream? metadata = serializer.Serialize(m1); + Assert.NotNull(metadata); + + // Serialize to stream + Models.Listxml.M1? newM1 = deserializer.Deserialize(metadata); + + // Validate the data + Assert.NotNull(newM1); + Assert.Equal("XXXXXX", newM1.Version); + + Assert.NotNull(newM1.Game); + var newGame = Assert.Single(newM1.Game); + Validate(newGame); + } + + [Fact] + public void RoundTripMachineTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.M1(); + var serializer = new Serialization.Serializers.M1(); + + // Build the data + Models.Listxml.M1 m1 = Build(game: false); + + // Serialize to generic model + Stream? metadata = serializer.Serialize(m1); + Assert.NotNull(metadata); + + // Serialize to stream + Models.Listxml.M1? newM1 = deserializer.Deserialize(metadata); + + // Validate the data + Assert.NotNull(newM1); + Assert.Equal("XXXXXX", newM1.Version); + + Assert.NotNull(newM1.Game); + var newGame = Assert.Single(newM1.Game); + Validate(newGame); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.Listxml.M1 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.M1 + { + 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/Deserializers/OfflineListTests.cs b/SabreTools.Serialization.Test/Deserializers/OfflineListTests.cs index ce138ef0..8f5e9524 100644 --- a/SabreTools.Serialization.Test/Deserializers/OfflineListTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/OfflineListTests.cs @@ -85,5 +85,449 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(dat?.Games?.Game); Assert.Equal(count, dat.Games.Game.Length); } + + [Fact] + public void RoundTripTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.OfflineList(); + var serializer = new Serialization.Serializers.OfflineList(); + + // Build the data + Models.OfflineList.Dat dat = Build(); + + // Serialize to stream + Stream? metadata = serializer.Serialize(dat); + Assert.NotNull(metadata); + + // Serialize back to original model + Models.OfflineList.Dat? newDat = deserializer.Deserialize(metadata); + + // Validate the data + Assert.NotNull(newDat); + Assert.Equal("XXXXXX", newDat.NoNamespaceSchemaLocation); + Validate(newDat.Configuration); + Validate(newDat.Games); + Validate(newDat.GUI); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.OfflineList.Dat Build() + { + var infos = new Models.OfflineList.Infos + { + Title = new Models.OfflineList.Title + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + Location = new Models.OfflineList.Location + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + Publisher = new Models.OfflineList.Publisher + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + SourceRom = new Models.OfflineList.SourceRom + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + SaveType = new Models.OfflineList.SaveType + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + RomSize = new Models.OfflineList.RomSize + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + ReleaseNumber = new Models.OfflineList.ReleaseNumber + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + ImageNumber = new Models.OfflineList.ImageNumber + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + LanguageNumber = new Models.OfflineList.LanguageNumber + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + Comment = new Models.OfflineList.Comment + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + RomCRC = new Models.OfflineList.RomCRC + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + Im1CRC = new Models.OfflineList.Im1CRC + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + Im2CRC = new Models.OfflineList.Im2CRC + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + Languages = new Models.OfflineList.Languages + { + Visible = "XXXXXX", + InNamingOption = "XXXXXX", + Default = "XXXXXX", + }, + }; + + var canopen = new Models.OfflineList.CanOpen + { + Extension = ["XXXXXX"], + }; + + var daturl = new Models.OfflineList.DatUrl + { + FileName = "XXXXXX", + Content = "XXXXXX", + }; + + var newdat = new Models.OfflineList.NewDat + { + DatVersionUrl = "XXXXXX", + DatUrl = daturl, + ImUrl = "XXXXXX", + }; + + var find = new Models.OfflineList.Find + { + Operation = "XXXXXX", + Value = "XXXXXX", + Content = "XXXXXX", + }; + + var to = new Models.OfflineList.To + { + Value = "XXXXXX", + Default = "XXXXXX", + Auto = "XXXXXX", + Find = [find], + }; + + var search = new Models.OfflineList.Search + { + To = [to], + }; + + var configuration = new Models.OfflineList.Configuration + { + DatName = "XXXXXX", + ImFolder = "XXXXXX", + DatVersion = "XXXXXX", + System = "XXXXXX", + ScreenshotsWidth = "XXXXXX", + ScreenshotsHeight = "XXXXXX", + Infos = infos, + CanOpen = canopen, + NewDat = newdat, + Search = search, + RomTitle = "XXXXXX", + }; + + var fileromcrc = new Models.OfflineList.FileRomCRC + { + Extension = "XXXXXX", + Content = "XXXXXX", + }; + + var files = new Models.OfflineList.Files + { + RomCRC = [fileromcrc], + }; + + var game = new Models.OfflineList.Game + { + ImageNumber = "XXXXXX", + ReleaseNumber = "XXXXXX", + Title = "XXXXXX", + SaveType = "XXXXXX", + RomSize = "XXXXXX", + Publisher = "XXXXXX", + Location = "XXXXXX", + SourceRom = "XXXXXX", + Language = "XXXXXX", + Files = files, + Im1CRC = "XXXXXX", + Im2CRC = "XXXXXX", + Comment = "XXXXXX", + DuplicateID = "XXXXXX", + }; + + var games = new Models.OfflineList.Games + { + Game = [game], + }; + + var image = new Models.OfflineList.Image + { + X = "XXXXXX", + Y = "XXXXXX", + Width = "XXXXXX", + Height = "XXXXXX", + }; + + var images = new Models.OfflineList.Images + { + Width = "XXXXXX", + Height = "XXXXXX", + Image = [image], + }; + + var gui = new Models.OfflineList.GUI + { + Images = images, + }; + + return new Models.OfflineList.Dat + { + NoNamespaceSchemaLocation = "XXXXXX", + Configuration = configuration, + Games = games, + GUI = gui, + }; + } + + /// + /// Validate a Configuration + /// + private static void Validate(Models.OfflineList.Configuration? configuration) + { + Assert.NotNull(configuration); + Assert.Equal("XXXXXX", configuration.DatName); + Assert.Equal("XXXXXX", configuration.ImFolder); + Assert.Equal("XXXXXX", configuration.DatVersion); + Assert.Equal("XXXXXX", configuration.System); + Assert.Equal("XXXXXX", configuration.ScreenshotsWidth); + Assert.Equal("XXXXXX", configuration.ScreenshotsHeight); + Validate(configuration.Infos); + Validate(configuration.CanOpen); + Validate(configuration.NewDat); + Validate(configuration.Search); + Assert.Equal("XXXXXX", configuration.RomTitle); + } + + /// + /// Validate a Infos + /// + private static void Validate(Models.OfflineList.Infos? infos) + { + Assert.NotNull(infos); + Validate(infos.Title); + Validate(infos.Location); + Validate(infos.Publisher); + Validate(infos.SourceRom); + Validate(infos.SaveType); + Validate(infos.RomSize); + Validate(infos.ReleaseNumber); + Validate(infos.ImageNumber); + Validate(infos.LanguageNumber); + Validate(infos.Comment); + Validate(infos.RomCRC); + Validate(infos.Im1CRC); + Validate(infos.Im2CRC); + Validate(infos.Languages); + } + + /// + /// Validate a InfoBase + /// + private static void Validate(Models.OfflineList.InfoBase? info) + { + Assert.NotNull(info); + Assert.Equal("XXXXXX", info.Visible); + Assert.Equal("XXXXXX", info.InNamingOption); + Assert.Equal("XXXXXX", info.Default); + } + + /// + /// Validate a CanOpen + /// + private static void Validate(Models.OfflineList.CanOpen? canopen) + { + Assert.NotNull(canopen); + Assert.NotNull(canopen.Extension); + string extension = Assert.Single(canopen.Extension); + Assert.Equal("XXXXXX", extension); + } + + /// + /// Validate a NewDat + /// + private static void Validate(Models.OfflineList.NewDat? newdat) + { + Assert.NotNull(newdat); + Assert.Equal("XXXXXX", newdat.DatVersionUrl); + Validate(newdat.DatUrl); + Assert.Equal("XXXXXX", newdat.ImUrl); + } + + /// + /// Validate a DatUrl + /// + private static void Validate(Models.OfflineList.DatUrl? daturl) + { + Assert.NotNull(daturl); + Assert.Equal("XXXXXX", daturl.FileName); + Assert.Equal("XXXXXX", daturl.Content); + } + + /// + /// Validate a Search + /// + private static void Validate(Models.OfflineList.Search? search) + { + Assert.NotNull(search); + Assert.NotNull(search.To); + var to = Assert.Single(search.To); + Validate(to); + } + + /// + /// Validate a To + /// + private static void Validate(Models.OfflineList.To? to) + { + Assert.NotNull(to); + Assert.Equal("XXXXXX", to.Value); + Assert.Equal("XXXXXX", to.Default); + Assert.Equal("XXXXXX", to.Auto); + + Assert.NotNull(to.Find); + var find = Assert.Single(to.Find); + Validate(find); + } + + /// + /// Validate a Find + /// + private static void Validate(Models.OfflineList.Find? find) + { + Assert.NotNull(find); + Assert.Equal("XXXXXX", find.Operation); + Assert.Equal("XXXXXX", find.Value); + Assert.Equal("XXXXXX", find.Content); + } + + /// + /// Validate a Games + /// + private static void Validate(Models.OfflineList.Games? games) + { + Assert.NotNull(games); + Assert.NotNull(games.Game); + var game = Assert.Single(games.Game); + Validate(game); + } + + /// + /// Validate a Game + /// + private static void Validate(Models.OfflineList.Game? game) + { + Assert.NotNull(game); + Assert.Equal("XXXXXX", game.ImageNumber); + Assert.Equal("XXXXXX", game.ReleaseNumber); + Assert.Equal("XXXXXX", game.Title); + Assert.Equal("XXXXXX", game.SaveType); + Assert.Equal("XXXXXX", game.RomSize); + Assert.Equal("XXXXXX", game.Publisher); + Assert.Equal("XXXXXX", game.Location); + Assert.Equal("XXXXXX", game.SourceRom); + Assert.Equal("XXXXXX", game.Language); + Validate(game.Files); + Assert.Equal("XXXXXX", game.Im1CRC); + Assert.Equal("XXXXXX", game.Im2CRC); + Assert.Equal("XXXXXX", game.Comment); + Assert.Equal("XXXXXX", game.DuplicateID); + } + + /// + /// Validate a Files + /// + private static void Validate(Models.OfflineList.Files? files) + { + Assert.NotNull(files); + Assert.NotNull(files.RomCRC); + var fileromcrc = Assert.Single(files.RomCRC); + Validate(fileromcrc); + } + + /// + /// Validate a FileRomCRC + /// + private static void Validate(Models.OfflineList.FileRomCRC? fileromcrc) + { + Assert.NotNull(fileromcrc); + Assert.Equal("XXXXXX", fileromcrc.Extension); + Assert.Equal("XXXXXX", fileromcrc.Content); + } + + /// + /// Validate a GUI + /// + private static void Validate(Models.OfflineList.GUI? gui) + { + Assert.NotNull(gui); + Validate(gui.Images); + } + + /// + /// Validate a Images + /// + private static void Validate(Models.OfflineList.Images? images) + { + Assert.NotNull(images); + Assert.Equal("XXXXXX", images.Width); + Assert.Equal("XXXXXX", images.Height); + + Assert.NotNull(images.Image); + var image = Assert.Single(images.Image); + Validate(image); + } + + /// + /// Validate a Image + /// + private static void Validate(Models.OfflineList.Image? image) + { + Assert.NotNull(image); + Assert.Equal("XXXXXX", image.X); + Assert.Equal("XXXXXX", image.Y); + Assert.Equal("XXXXXX", image.Width); + Assert.Equal("XXXXXX", image.Height); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/OpenMSXTests.cs b/SabreTools.Serialization.Test/Deserializers/OpenMSXTests.cs index 368fbd33..a8444c51 100644 --- a/SabreTools.Serialization.Test/Deserializers/OpenMSXTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/OpenMSXTests.cs @@ -86,5 +86,155 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(dat.Software); Assert.Equal(count, dat.Software.Length); } + + [Fact] + public void RoundTripTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.OpenMSX(); + var serializer = new Serialization.Serializers.OpenMSX(); + + // Build the data + Models.OpenMSX.SoftwareDb sdb = Build(); + + // Serialize to stream + Stream? metadata = serializer.Serialize(sdb); + Assert.NotNull(metadata); + + // Serialize back to original model + Models.OpenMSX.SoftwareDb? newSdb = deserializer.Deserialize(metadata); + + // Validate the data + Assert.NotNull(newSdb); + Assert.Equal("XXXXXX", newSdb.Timestamp); + + Assert.NotNull(newSdb.Software); + var software = Assert.Single(newSdb.Software); + Validate(software); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.OpenMSX.SoftwareDb Build() + { + var original = new Models.OpenMSX.Original + { + Value = "XXXXXX", + Content = "XXXXXX", + }; + + var rom = new Models.OpenMSX.Rom + { + Start = "XXXXXX", + Type = "XXXXXX", + Hash = "XXXXXX", + Remark = "XXXXXX", + }; + + var dump_rom = new Models.OpenMSX.Dump + { + Original = original, + Rom = rom, + }; + + var megarom = new Models.OpenMSX.MegaRom + { + Start = "XXXXXX", + Type = "XXXXXX", + Hash = "XXXXXX", + Remark = "XXXXXX", + }; + + var dump_megarom = new Models.OpenMSX.Dump + { + Original = original, + Rom = megarom, + }; + + var sccpluscart = new Models.OpenMSX.SCCPlusCart + { + Start = "XXXXXX", + Type = "XXXXXX", + Hash = "XXXXXX", + Remark = "XXXXXX", + }; + + var dump_sccpluscart = new Models.OpenMSX.Dump + { + Original = original, + Rom = sccpluscart, + }; + + var software = new Models.OpenMSX.Software + { + Title = "XXXXXX", + GenMSXID = "XXXXXX", + System = "XXXXXX", + Company = "XXXXXX", + Year = "XXXXXX", + Country = "XXXXXX", + Dump = [dump_rom, dump_megarom, dump_sccpluscart], + }; + + return new Models.OpenMSX.SoftwareDb + { + Timestamp = "XXXXXX", + Software = [software], + }; + } + + /// + /// Validate a Software + /// + private static void Validate(Models.OpenMSX.Software? software) + { + Assert.NotNull(software); + Assert.Equal("XXXXXX", software.Title); + Assert.Equal("XXXXXX", software.GenMSXID); + Assert.Equal("XXXXXX", software.System); + Assert.Equal("XXXXXX", software.Company); + Assert.Equal("XXXXXX", software.Year); + Assert.Equal("XXXXXX", software.Country); + + Assert.NotNull(software.Dump); + Assert.Equal(3, software.Dump.Length); + foreach (var dump in software.Dump) + { + Validate(dump); + } + } + + /// + /// Validate a Dump + /// + private static void Validate(Models.OpenMSX.Dump? dump) + { + Assert.NotNull(dump); + Validate(dump.Original); + Validate(dump.Rom); + } + + /// + /// Validate a Original + /// + private static void Validate(Models.OpenMSX.Original? original) + { + Assert.NotNull(original); + Assert.Equal("XXXXXX", original.Value); + Assert.Equal("XXXXXX", original.Content); + } + + /// + /// Validate a RomBase + /// + private static void Validate(Models.OpenMSX.RomBase? rombase) + { + Assert.NotNull(rombase); + Assert.Equal("XXXXXX", rombase.Start); + Assert.Equal("XXXXXX", rombase.Type); + Assert.Equal("XXXXXX", rombase.Hash); + Assert.Equal("XXXXXX", rombase.Remark); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/RomCenterTests.cs b/SabreTools.Serialization.Test/Deserializers/RomCenterTests.cs index 0a700a70..d6ae59e5 100644 --- a/SabreTools.Serialization.Test/Deserializers/RomCenterTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/RomCenterTests.cs @@ -85,5 +85,152 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(dat?.Games?.Rom); Assert.Equal(count, dat.Games.Rom.Length); } + + [Fact] + public void RoundTripTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.RomCenter(); + var serializer = new Serialization.Serializers.RomCenter(); + + // Build the data + Models.RomCenter.MetadataFile mf = Build(); + + // Serialize to stream + Stream? metadata = serializer.Serialize(mf); + Assert.NotNull(metadata); + + // Serialize back to original model + Models.RomCenter.MetadataFile? newMf = deserializer.Deserialize(metadata); + + // Validate the data + Assert.NotNull(newMf); + Validate(newMf.Credits); + Validate(newMf.Dat); + Validate(newMf.Emulator); + Validate(newMf.Games); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.RomCenter.MetadataFile Build() + { + var credits = new Models.RomCenter.Credits + { + Author = "XXXXXX", + Version = "XXXXXX", + Email = "XXXXXX", + Homepage = "XXXXXX", + Url = "XXXXXX", + Date = "XXXXXX", + Comment = "XXXXXX", + }; + + var dat = new Models.RomCenter.Dat + { + Version = "XXXXXX", + Plugin = "XXXXXX", + Split = "XXXXXX", + Merge = "XXXXXX", + }; + + var emulator = new Models.RomCenter.Emulator + { + RefName = "XXXXXX", + Version = "XXXXXX", + }; + + var rom = new Models.RomCenter.Rom + { + ParentName = "XXXXXX", + ParentDescription = "XXXXXX", + GameName = "XXXXXX", + GameDescription = "XXXXXX", + RomName = "XXXXXX", + RomCRC = "XXXXXX", + RomSize = "XXXXXX", + RomOf = "XXXXXX", + MergeName = "XXXXXX", + }; + + var games = new Models.RomCenter.Games + { + Rom = [rom], + }; + + return new Models.RomCenter.MetadataFile + { + Credits = credits, + Dat = dat, + Emulator = emulator, + Games = games, + }; + } + + /// + /// Validate a Credits + /// + private static void Validate(Models.RomCenter.Credits? credits) + { + Assert.NotNull(credits); + Assert.Equal("XXXXXX", credits.Author); + Assert.Equal("XXXXXX", credits.Version); + Assert.Equal("XXXXXX", credits.Email); + Assert.Equal("XXXXXX", credits.Homepage); + Assert.Equal("XXXXXX", credits.Url); + Assert.Equal("XXXXXX", credits.Date); + Assert.Equal("XXXXXX", credits.Comment); + } + + /// + /// Validate a Dat + /// + private static void Validate(Models.RomCenter.Dat? dat) + { + Assert.NotNull(dat); + Assert.Equal("XXXXXX", dat.Version); + Assert.Equal("XXXXXX", dat.Plugin); + Assert.Equal("XXXXXX", dat.Split); + Assert.Equal("XXXXXX", dat.Merge); + } + + /// + /// Validate a Emulator + /// + private static void Validate(Models.RomCenter.Emulator? emulator) + { + Assert.NotNull(emulator); + Assert.Equal("XXXXXX", emulator.RefName); + Assert.Equal("XXXXXX", emulator.Version); + } + + /// + /// Validate a Games + /// + private static void Validate(Models.RomCenter.Games? games) + { + Assert.NotNull(games); + Assert.NotNull(games.Rom); + var rom = Assert.Single(games.Rom); + Validate(rom); + } + + /// + /// Validate a Rom + /// + private static void Validate(Models.RomCenter.Rom? rom) + { + Assert.NotNull(rom); + Assert.Equal("XXXXXX", rom.ParentName); + Assert.Equal("XXXXXX", rom.ParentDescription); + Assert.Equal("XXXXXX", rom.GameName); + Assert.Equal("XXXXXX", rom.GameDescription); + Assert.Equal("XXXXXX", rom.RomName); + Assert.Equal("XXXXXX", rom.RomCRC); + Assert.Equal("XXXXXX", rom.RomSize); + Assert.Equal("XXXXXX", rom.RomOf); + Assert.Equal("XXXXXX", rom.MergeName); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/SeparatedValueTests.cs b/SabreTools.Serialization.Test/Deserializers/SeparatedValueTests.cs index af8ceed3..9628b8ea 100644 --- a/SabreTools.Serialization.Test/Deserializers/SeparatedValueTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/SeparatedValueTests.cs @@ -90,5 +90,239 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(dat?.Row); Assert.Equal(count, dat.Row.Length); } + + [Fact] + public void RoundTripShortTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.SeparatedValue(); + var serializer = new Serialization.Serializers.SeparatedValue(); + + // Build the data + Models.SeparatedValue.MetadataFile mf = Build(); + + // Serialize to stream + Stream? actual = Serialization.Serializers.SeparatedValue.SerializeStream(mf, longHeader: false); + Assert.NotNull(actual); + + // Serialize back to original model + Models.SeparatedValue.MetadataFile? newMf = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMf); + Validate(newMf.Header, longHeader: false); + Assert.NotNull(newMf.Row); + Assert.Equal(3, newMf.Row.Length); + + ValidateDisk(newMf.Row[0], longHeader: false); + ValidateMedia(newMf.Row[1], longHeader: false); + ValidateRom(newMf.Row[2], longHeader: false); + } + + [Fact] + public void RoundTripLongTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.SeparatedValue(); + var serializer = new Serialization.Serializers.SeparatedValue(); + + // Build the data + Models.SeparatedValue.MetadataFile mf = Build(); + + // Serialize to stream + Stream? actual = Serialization.Serializers.SeparatedValue.SerializeStream(mf, longHeader: true); + Assert.NotNull(actual); + + // Serialize back to original model + Models.SeparatedValue.MetadataFile? newMf = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newMf); + Validate(newMf.Header, longHeader: true); + Assert.NotNull(newMf.Row); + Assert.Equal(3, newMf.Row.Length); + + ValidateDisk(newMf.Row[0], longHeader: true); + ValidateMedia(newMf.Row[1], longHeader: true); + ValidateRom(newMf.Row[2], longHeader: true); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.SeparatedValue.MetadataFile Build() + { + string[] header = ["header"]; + + var disk = new Models.SeparatedValue.Row + { + FileName = "XXXXXX", + InternalName = "XXXXXX", + Description = "XXXXXX", + GameName = "XXXXXX", + GameDescription = "XXXXXX", + Type = "disk", + DiskName = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + Status = "XXXXXX", + }; + + var media = new Models.SeparatedValue.Row + { + FileName = "XXXXXX", + InternalName = "XXXXXX", + Description = "XXXXXX", + GameName = "XXXXXX", + GameDescription = "XXXXXX", + Type = "media", + DiskName = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + SHA256 = "XXXXXX", + SpamSum = "XXXXXX", + }; + + var rom = new Models.SeparatedValue.Row + { + FileName = "XXXXXX", + InternalName = "XXXXXX", + Description = "XXXXXX", + GameName = "XXXXXX", + GameDescription = "XXXXXX", + Type = "rom", + RomName = "XXXXXX", + Size = "XXXXXX", + CRC = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + SHA256 = "XXXXXX", + SHA384 = "XXXXXX", + SHA512 = "XXXXXX", + SpamSum = "XXXXXX", + Status = "XXXXXX", + }; + + return new Models.SeparatedValue.MetadataFile + { + Header = header, + Row = [disk, media, rom], + }; + } + + /// + /// Validate a header + /// + private static void Validate(string[]? header, bool longHeader) + { + Assert.NotNull(header); + if (longHeader) + Assert.True(Serialization.Serializers.SeparatedValue.HeaderArrayExtended.SequenceEqual(header)); + else + Assert.True(Serialization.Serializers.SeparatedValue.HeaderArrayStandard.SequenceEqual(header)); + } + + /// + /// Validate a Row + /// + private static void ValidateDisk(Models.SeparatedValue.Row? row, bool longHeader) + { + Assert.NotNull(row); + Assert.Equal("XXXXXX", row.FileName); + Assert.Equal("XXXXXX", row.InternalName); + Assert.Equal("XXXXXX", row.Description); + Assert.Equal("XXXXXX", row.GameName); + Assert.Equal("XXXXXX", row.GameDescription); + Assert.Equal("disk", row.Type); + Assert.NotNull(row.RomName); Assert.Empty(row.RomName); + Assert.Equal("XXXXXX", row.DiskName); + Assert.NotNull(row.Size); Assert.Empty(row.Size); + Assert.NotNull(row.CRC); Assert.Empty(row.CRC); + Assert.Equal("XXXXXX", row.MD5); + Assert.Equal("XXXXXX", row.SHA1); + Assert.NotNull(row.CRC); Assert.Empty(row.CRC); + if (longHeader) + { + Assert.NotNull(row.SHA384); Assert.Empty(row.SHA384); + Assert.NotNull(row.SHA512); Assert.Empty(row.SHA512); + Assert.NotNull(row.SpamSum); Assert.Empty(row.SpamSum); + } + else + { + Assert.Null(row.SHA384); + Assert.Null(row.SHA512); + Assert.Null(row.SpamSum); + } + Assert.Equal("XXXXXX", row.Status); + } + + /// + /// Validate a Row + /// + private static void ValidateMedia(Models.SeparatedValue.Row? row, bool longHeader) + { + Assert.NotNull(row); + Assert.Equal("XXXXXX", row.FileName); + Assert.Equal("XXXXXX", row.InternalName); + Assert.Equal("XXXXXX", row.Description); + Assert.Equal("XXXXXX", row.GameName); + Assert.Equal("XXXXXX", row.GameDescription); + Assert.Equal("media", row.Type); + Assert.NotNull(row.RomName); Assert.Empty(row.RomName); + Assert.Equal("XXXXXX", row.DiskName); + Assert.NotNull(row.Size); Assert.Empty(row.Size); + Assert.NotNull(row.CRC); Assert.Empty(row.CRC); + Assert.Equal("XXXXXX", row.MD5); + Assert.Equal("XXXXXX", row.SHA1); + Assert.Equal("XXXXXX", row.SHA256); + if (longHeader) + { + Assert.NotNull(row.SHA384); Assert.Empty(row.SHA384); + Assert.NotNull(row.SHA512); Assert.Empty(row.SHA512); + Assert.Equal("XXXXXX", row.SpamSum); + } + else + { + Assert.Null(row.SHA384); + Assert.Null(row.SHA512); + Assert.Null(row.SpamSum); + } + Assert.NotNull(row.Status); Assert.Empty(row.Status); + } + + /// + /// Validate a Row + /// + private static void ValidateRom(Models.SeparatedValue.Row? row, bool longHeader) + { + Assert.NotNull(row); + Assert.Equal("XXXXXX", row.FileName); + Assert.Equal("XXXXXX", row.InternalName); + Assert.Equal("XXXXXX", row.Description); + Assert.Equal("XXXXXX", row.GameName); + Assert.Equal("XXXXXX", row.GameDescription); + Assert.Equal("rom", row.Type); + Assert.Equal("XXXXXX", row.RomName); + Assert.NotNull(row.DiskName); + Assert.Empty(row.DiskName); + Assert.Equal("XXXXXX", row.Size); + Assert.Equal("XXXXXX", row.CRC); + Assert.Equal("XXXXXX", row.MD5); + Assert.Equal("XXXXXX", row.SHA1); + Assert.Equal("XXXXXX", row.SHA256); + if (longHeader) + { + Assert.Equal("XXXXXX", row.SHA384); + Assert.Equal("XXXXXX", row.SHA512); + Assert.Equal("XXXXXX", row.SpamSum); + } + else + { + Assert.Null(row.SHA384); + Assert.Null(row.SHA512); + Assert.Null(row.SpamSum); + } + Assert.Equal("XXXXXX", row.Status); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Deserializers/SoftwareListTests.cs b/SabreTools.Serialization.Test/Deserializers/SoftwareListTests.cs index bf2a3dc7..b1063f29 100644 --- a/SabreTools.Serialization.Test/Deserializers/SoftwareListTests.cs +++ b/SabreTools.Serialization.Test/Deserializers/SoftwareListTests.cs @@ -88,5 +88,309 @@ namespace SabreTools.Serialization.Test.Deserializers Assert.NotNull(dat.Software); Assert.Equal(count, dat.Software.Length); } + + [Fact] + public void RoundTripTest() + { + // Get the serializer and deserializer + var deserializer = new Serialization.Deserializers.SoftwareList(); + var serializer = new Serialization.Serializers.SoftwareList(); + + // Build the data + Models.SoftwareList.SoftwareList sl = Build(); + + // Serialize to stream + Stream? actual = serializer.Serialize(sl); + Assert.NotNull(actual); + + // Serialize back to original model + Models.SoftwareList.SoftwareList? newSl = deserializer.Deserialize(actual); + + // Validate the data + Assert.NotNull(newSl); + Assert.Equal("XXXXXX", newSl.Name); + Assert.Equal("XXXXXX", newSl.Description); + Assert.Equal("XXXXXX", newSl.Notes); + + Assert.NotNull(newSl.Software); + var newSoftware = Assert.Single(newSl.Software); + Validate(newSoftware); + } + + /// + /// Build model for serialization and deserialization + /// + private static Models.SoftwareList.SoftwareList Build() + { + var info = new Models.SoftwareList.Info + { + Name = "XXXXXX", + Value = "XXXXXX", + }; + + var sharedfeat = new Models.SoftwareList.SharedFeat + { + Name = "XXXXXX", + Value = "XXXXXX", + }; + + var feature = new Models.SoftwareList.Feature + { + Name = "XXXXXX", + Value = "XXXXXX", + }; + + var rom = new Models.SoftwareList.Rom + { + Name = "XXXXXX", + Size = "XXXXXX", + Length = "XXXXXX", + CRC = "XXXXXX", + SHA1 = "XXXXXX", + Offset = "XXXXXX", + Value = "XXXXXX", + Status = "XXXXXX", + LoadFlag = "XXXXXX", + }; + + var dataarea = new Models.SoftwareList.DataArea + { + Name = "XXXXXX", + Size = "XXXXXX", + Width = "XXXXXX", + Endianness = "XXXXXX", + Rom = [rom], + }; + + var disk = new Models.SoftwareList.Disk + { + Name = "XXXXXX", + MD5 = "XXXXXX", + SHA1 = "XXXXXX", + Status = "XXXXXX", + Writeable = "XXXXXX", + }; + + var diskarea = new Models.SoftwareList.DiskArea + { + Name = "XXXXXX", + Disk = [disk], + }; + + var dipvalue = new Models.SoftwareList.DipValue + { + Name = "XXXXXX", + Value = "XXXXXX", + Default = "XXXXXX", + }; + + var dipswitch = new Models.SoftwareList.DipSwitch + { + Name = "XXXXXX", + Tag = "XXXXXX", + Mask = "XXXXXX", + DipValue = [dipvalue], + }; + + var part = new Models.SoftwareList.Part + { + Name = "XXXXXX", + Interface = "XXXXXX", + Feature = [feature], + DataArea = [dataarea], + DiskArea = [diskarea], + DipSwitch = [dipswitch], + }; + + var software = new Models.SoftwareList.Software + { + Name = "XXXXXX", + CloneOf = "XXXXXX", + Supported = "XXXXXX", + Description = "XXXXXX", + Year = "XXXXXX", + Publisher = "XXXXXX", + Notes = "XXXXXX", + Info = [info], + SharedFeat = [sharedfeat], + Part = [part], + }; + + return new Models.SoftwareList.SoftwareList + { + Name = "XXXXXX", + Description = "XXXXXX", + Notes = "XXXXXX", + Software = [software], + }; + } + + /// + /// Validate a Software + /// + private static void Validate(Models.SoftwareList.Software? software) + { + Assert.NotNull(software); + Assert.Equal("XXXXXX", software.Name); + Assert.Equal("XXXXXX", software.CloneOf); + Assert.Equal("XXXXXX", software.Supported); + Assert.Equal("XXXXXX", software.Description); + Assert.Equal("XXXXXX", software.Year); + Assert.Equal("XXXXXX", software.Publisher); + Assert.Equal("XXXXXX", software.Notes); + + Assert.NotNull(software.Info); + var info = Assert.Single(software.Info); + Validate(info); + + Assert.NotNull(software.SharedFeat); + var sharedfeat = Assert.Single(software.SharedFeat); + Validate(sharedfeat); + + Assert.NotNull(software.Part); + var part = Assert.Single(software.Part); + Validate(part); + } + + /// + /// Validate a Info + /// + private static void Validate(Models.SoftwareList.Info? info) + { + Assert.NotNull(info); + Assert.Equal("XXXXXX", info.Name); + Assert.Equal("XXXXXX", info.Value); + } + + /// + /// Validate a SharedFeat + /// + private static void Validate(Models.SoftwareList.SharedFeat? sharedfeat) + { + Assert.NotNull(sharedfeat); + Assert.Equal("XXXXXX", sharedfeat.Name); + Assert.Equal("XXXXXX", sharedfeat.Value); + } + + /// + /// Validate a Part + /// + private static void Validate(Models.SoftwareList.Part? part) + { + Assert.NotNull(part); + Assert.Equal("XXXXXX", part.Name); + Assert.Equal("XXXXXX", part.Interface); + + Assert.NotNull(part.Feature); + var feature = Assert.Single(part.Feature); + Validate(feature); + + Assert.NotNull(part.DataArea); + var dataarea = Assert.Single(part.DataArea); + Validate(dataarea); + + Assert.NotNull(part.DiskArea); + var diskarea = Assert.Single(part.DiskArea); + Validate(diskarea); + + Assert.NotNull(part.DipSwitch); + var dipswitch = Assert.Single(part.DipSwitch); + Validate(dipswitch); + } + + /// + /// Validate a Feature + /// + private static void Validate(Models.SoftwareList.Feature? feature) + { + Assert.NotNull(feature); + Assert.Equal("XXXXXX", feature.Name); + Assert.Equal("XXXXXX", feature.Value); + } + + /// + /// Validate a DataArea + /// + private static void Validate(Models.SoftwareList.DataArea? dataarea) + { + Assert.NotNull(dataarea); + Assert.Equal("XXXXXX", dataarea.Name); + Assert.Equal("XXXXXX", dataarea.Size); + Assert.Equal("XXXXXX", dataarea.Width); + Assert.Equal("XXXXXX", dataarea.Endianness); + + Assert.NotNull(dataarea.Rom); + var rom = Assert.Single(dataarea.Rom); + Validate(rom); + } + + /// + /// Validate a Rom + /// + private static void Validate(Models.SoftwareList.Rom? rom) + { + Assert.NotNull(rom); + Assert.Equal("XXXXXX", rom.Name); + Assert.Equal("XXXXXX", rom.Size); + Assert.Equal("XXXXXX", rom.Length); + Assert.Equal("XXXXXX", rom.CRC); + Assert.Equal("XXXXXX", rom.SHA1); + Assert.Equal("XXXXXX", rom.Offset); + Assert.Equal("XXXXXX", rom.Value); + Assert.Equal("XXXXXX", rom.Status); + Assert.Equal("XXXXXX", rom.LoadFlag); + } + + /// + /// Validate a DiskArea + /// + private static void Validate(Models.SoftwareList.DiskArea? diskarea) + { + Assert.NotNull(diskarea); + Assert.Equal("XXXXXX", diskarea.Name); + + Assert.NotNull(diskarea.Disk); + var disk = Assert.Single(diskarea.Disk); + Validate(disk); + } + + /// + /// Validate a Disk + /// + private static void Validate(Models.SoftwareList.Disk? disk) + { + Assert.NotNull(disk); + Assert.Equal("XXXXXX", disk.Name); + Assert.Equal("XXXXXX", disk.MD5); + Assert.Equal("XXXXXX", disk.SHA1); + Assert.Equal("XXXXXX", disk.Status); + Assert.Equal("XXXXXX", disk.Writeable); + } + + /// + /// Validate a DipSwitch + /// + private static void Validate(Models.SoftwareList.DipSwitch? dipswitch) + { + Assert.NotNull(dipswitch); + Assert.Equal("XXXXXX", dipswitch.Name); + Assert.Equal("XXXXXX", dipswitch.Tag); + Assert.Equal("XXXXXX", dipswitch.Mask); + + Assert.NotNull(dipswitch.DipValue); + var dipvalue = Assert.Single(dipswitch.DipValue); + Validate(dipvalue); + } + + /// + /// Validate a DipValue + /// + private static void Validate(Models.SoftwareList.DipValue? dipvalue) + { + Assert.NotNull(dipvalue); + Assert.Equal("XXXXXX", dipvalue.Name); + Assert.Equal("XXXXXX", dipvalue.Value); + Assert.Equal("XXXXXX", dipvalue.Default); + } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Serializers/AttractModeTests.cs b/SabreTools.Serialization.Test/Serializers/AttractModeTests.cs index 40c6c732..28cbab8d 100644 --- a/SabreTools.Serialization.Test/Serializers/AttractModeTests.cs +++ b/SabreTools.Serialization.Test/Serializers/AttractModeTests.cs @@ -1,5 +1,4 @@ using System.IO; -using SabreTools.Hashing; using SabreTools.Serialization.Serializers; using Xunit; @@ -22,59 +21,5 @@ namespace SabreTools.Serialization.Test.Serializers Stream? actual = serializer.Serialize(null); Assert.Null(actual); } - - [Fact] - public void SerializeStream_Valid_Filled() - { - // Create the object for serialization - var dat = Build(); - - // Deserialize the file - var actual = AttractMode.SerializeStream(dat); - actual?.Seek(0, SeekOrigin.Begin); - - // Validate the values - Assert.NotNull(actual); - string? actualHash = HashTool.GetStreamHash(actual, HashType.SHA1); - Assert.NotNull(actualHash); - Assert.Equal("21e2e21306dca19a580fde4e273f63a063c2d117", actualHash); - } - - private static Models.AttractMode.MetadataFile Build() - { - string[] header = ["header"]; - - var row = new Models.AttractMode.Row - { - Name = "XXXXXX", - Title = "XXXXXX", - Emulator = "XXXXXX", - CloneOf = "XXXXXX", - Year = "XXXXXX", - Manufacturer = "XXXXXX", - Category = "XXXXXX", - Players = "XXXXXX", - Rotation = "XXXXXX", - Control = "XXXXXX", - Status = "XXXXXX", - DisplayCount = "XXXXXX", - DisplayType = "XXXXXX", - AltRomname = "XXXXXX", - AltTitle = "XXXXXX", - Extra = "XXXXXX", - Buttons = "XXXXXX", - Favorite = "XXXXXX", - Tags = "XXXXXX", - PlayedCount = "XXXXXX", - PlayedTime = "XXXXXX", - FileIsAvailable = "XXXXXX", - }; - - return new Models.AttractMode.MetadataFile - { - Header = header, - Row = [row], - }; - } } } \ No newline at end of file diff --git a/SabreTools.Serialization.Test/Serializers/OpenMSXTests.cs b/SabreTools.Serialization.Test/Serializers/OpenMSXTests.cs index 2c9a8067..c70d089b 100644 --- a/SabreTools.Serialization.Test/Serializers/OpenMSXTests.cs +++ b/SabreTools.Serialization.Test/Serializers/OpenMSXTests.cs @@ -1,6 +1,4 @@ -using System; using System.IO; -using SabreTools.Hashing; using SabreTools.Serialization.Serializers; using Xunit; @@ -23,79 +21,5 @@ namespace SabreTools.Serialization.Test.Serializers Stream? actual = serializer.Serialize(null); Assert.Null(actual); } - - [Fact] - public void SerializeStream_Valid_Filled() - { - // Create the object for serialization - var dat = Build(); - - // Deserialize the file - var actual = OpenMSX.SerializeStream(dat); - actual?.Seek(0, SeekOrigin.Begin); - - // Validate the values - Assert.NotNull(actual); - string? actualHash = HashTool.GetStreamHash(actual, HashType.SHA1); - Assert.NotNull(actualHash); - Assert.Equal("285864811c15ad0f3b18c605c62ae3907f3e2f27", actualHash); - } - - private static Models.OpenMSX.SoftwareDb Build() - { - 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() { Original = original, Rom = rom }, - new() { Rom = megaRom }, - new() { 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 = [software], - }; - } } } \ No newline at end of file diff --git a/SabreTools.Serialization/Deserializers/AttractMode.cs b/SabreTools.Serialization/Deserializers/AttractMode.cs index fa0cc481..d9923a59 100644 --- a/SabreTools.Serialization/Deserializers/AttractMode.cs +++ b/SabreTools.Serialization/Deserializers/AttractMode.cs @@ -95,6 +95,11 @@ namespace SabreTools.Serialization.Deserializers AltTitle = reader.Line[14], Extra = reader.Line[15], Buttons = reader.Line[16], + Favorite = reader.Line[17], + Tags = reader.Line[18], + PlayedCount = reader.Line[19], + PlayedTime = reader.Line[20], + FileIsAvailable = reader.Line[21], }; } diff --git a/SabreTools.Serialization/Serializers/SeparatedValue.cs b/SabreTools.Serialization/Serializers/SeparatedValue.cs index ab66b235..2fc1b288 100644 --- a/SabreTools.Serialization/Serializers/SeparatedValue.cs +++ b/SabreTools.Serialization/Serializers/SeparatedValue.cs @@ -7,6 +7,49 @@ namespace SabreTools.Serialization.Serializers { public class SeparatedValue : BaseBinarySerializer { + #region Constants + + public static readonly string[] HeaderArrayStandard = + [ + "File Name", + "Internal Name", + "Description", + "Game Name", + "Game Description", + "Type", + "Rom Name", + "Disk Name", + "Size", + "CRC", + "MD5", + "SHA1", + "SHA256", + "Status", + ]; + + public static readonly string[] HeaderArrayExtended = + [ + "File Name", + "Internal Name", + "Description", + "Game Name", + "Game Description", + "Type", + "Rom Name", + "Disk Name", + "Size", + "CRC", + "MD5", + "SHA1", + "SHA256", + "SHA384", + "SHA512", + "SpamSum", + "Status", + ]; + + #endregion + #region IByteSerializer /// @@ -110,51 +153,7 @@ namespace SabreTools.Serialization.Serializers /// True if the long variant of the row should be written, false otherwise private static void WriteHeader(SeparatedValueWriter writer, bool longHeader) { - string[] headerArray; - if (longHeader) - { - headerArray = - [ - "File Name", - "Internal Name", - "Description", - "Game Name", - "Game Description", - "Type", - "Rom Name", - "Disk Name", - "Size", - "CRC", - "MD5", - "SHA1", - "SHA256", - "SHA384", - "SHA512", - "SpamSum", - "Status", - ]; - } - else - { - headerArray = - [ - "File Name", - "Internal Name", - "Description", - "Game Name", - "Game Description", - "Type", - "Rom Name", - "Disk Name", - "Size", - "CRC", - "MD5", - "SHA1", - "SHA256", - "Status", - ]; - } - + string[] headerArray = longHeader ? HeaderArrayExtended : HeaderArrayStandard; writer.WriteHeader(headerArray); writer.Flush(); }