using Xunit; namespace SabreTools.Serialization.CrossModel.Test { public class OfflineListTests { [Fact] public void RoundTripTest() { // Get the cross-model serializer var serializer = new OfflineList(); // Build the data Data.Models.OfflineList.Dat dat = Build(); // Serialize to generic model Data.Models.Metadata.MetadataFile? metadata = serializer.Serialize(dat); Assert.NotNull(metadata); // Serialize back to original model Data.Models.OfflineList.Dat? newDat = serializer.Deserialize(metadata); // Validate the data Assert.NotNull(newDat); Assert.Equal("nonamespaceschemalocation", newDat.NoNamespaceSchemaLocation); Validate(newDat.Configuration); Validate(newDat.Games); Validate(newDat.GUI); } /// /// Build model for serialization and deserialization /// private static Data.Models.OfflineList.Dat Build() { var infos = new Data.Models.OfflineList.Infos { Title = new Data.Models.OfflineList.Title { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, Location = new Data.Models.OfflineList.Location { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, Publisher = new Data.Models.OfflineList.Publisher { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, SourceRom = new Data.Models.OfflineList.SourceRom { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, SaveType = new Data.Models.OfflineList.SaveType { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, RomSize = new Data.Models.OfflineList.RomSize { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, ReleaseNumber = new Data.Models.OfflineList.ReleaseNumber { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, ImageNumber = new Data.Models.OfflineList.ImageNumber { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, LanguageNumber = new Data.Models.OfflineList.LanguageNumber { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, Comment = new Data.Models.OfflineList.Comment { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, RomCRC = new Data.Models.OfflineList.RomCRC { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, Im1CRC = new Data.Models.OfflineList.Im1CRC { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, Im2CRC = new Data.Models.OfflineList.Im2CRC { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, Languages = new Data.Models.OfflineList.Languages { Visible = "visible", InNamingOption = "innamingoption", Default = true, }, }; var canopen = new Data.Models.OfflineList.CanOpen { Extension = ["ext"], }; var daturl = new Data.Models.OfflineList.DatUrl { FileName = "filename", Content = "content", }; var newdat = new Data.Models.OfflineList.NewDat { DatVersionUrl = "datversionurl", DatUrl = daturl, ImUrl = "imurl", }; var find = new Data.Models.OfflineList.Find { Operation = "operation", Value = "value", Content = "content", }; var to = new Data.Models.OfflineList.To { Value = "value", Default = true, Auto = "auto", Find = [find], }; var search = new Data.Models.OfflineList.Search { To = [to], }; var configuration = new Data.Models.OfflineList.Configuration { DatName = "datname", ImFolder = "imfolder", DatVersion = "datversion", System = "system", ScreenshotsWidth = "screenshotswidth", ScreenshotsHeight = "screenshotsheight", Infos = infos, CanOpen = canopen, NewDat = newdat, Search = search, RomTitle = "romtitle", }; var fileromcrc = new Data.Models.OfflineList.FileRomCRC { Extension = "extension", Content = "content", }; var files = new Data.Models.OfflineList.Files { RomCRC = [fileromcrc], }; var game = new Data.Models.OfflineList.Game { ImageNumber = "imagenumber", ReleaseNumber = "releasenumber", Title = "title", SaveType = "savetype", RomSize = 12345, Publisher = "publisher", Location = "location", SourceRom = "sourcerom", Language = "language", Files = files, Im1CRC = "im1crc", Im2CRC = "im2crc", Comment = "comment", DuplicateID = "duplicateid", }; var games = new Data.Models.OfflineList.Games { Game = [game], }; var image = new Data.Models.OfflineList.Image { X = "x", Y = "y", Width = "width", Height = "height", }; var images = new Data.Models.OfflineList.Images { Width = "width", Height = "height", Image = [image], }; var gui = new Data.Models.OfflineList.GUI { Images = images, }; return new Data.Models.OfflineList.Dat { NoNamespaceSchemaLocation = "nonamespaceschemalocation", Configuration = configuration, Games = games, GUI = gui, }; } /// /// Validate a Configuration /// private static void Validate(Data.Models.OfflineList.Configuration? configuration) { Assert.NotNull(configuration); Assert.Equal("datname", configuration.DatName); Assert.Equal("imfolder", configuration.ImFolder); Assert.Equal("datversion", configuration.DatVersion); Assert.Equal("system", configuration.System); Assert.Equal("screenshotswidth", configuration.ScreenshotsWidth); Assert.Equal("screenshotsheight", configuration.ScreenshotsHeight); Validate(configuration.Infos); Validate(configuration.CanOpen); Validate(configuration.NewDat); Validate(configuration.Search); Assert.Equal("romtitle", configuration.RomTitle); } /// /// Validate a Infos /// private static void Validate(Data.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(Data.Models.OfflineList.InfoBase? info) { Assert.NotNull(info); Assert.Equal("visible", info.Visible); Assert.Equal("innamingoption", info.InNamingOption); Assert.Equal(true, info.Default); } /// /// Validate a CanOpen /// private static void Validate(Data.Models.OfflineList.CanOpen? canopen) { Assert.NotNull(canopen); Assert.NotNull(canopen.Extension); string extension = Assert.Single(canopen.Extension); Assert.Equal("ext", extension); } /// /// Validate a NewDat /// private static void Validate(Data.Models.OfflineList.NewDat? newdat) { Assert.NotNull(newdat); Assert.Equal("datversionurl", newdat.DatVersionUrl); Validate(newdat.DatUrl); Assert.Equal("imurl", newdat.ImUrl); } /// /// Validate a DatUrl /// private static void Validate(Data.Models.OfflineList.DatUrl? daturl) { Assert.NotNull(daturl); Assert.Equal("filename", daturl.FileName); Assert.Equal("content", daturl.Content); } /// /// Validate a Search /// private static void Validate(Data.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(Data.Models.OfflineList.To? to) { Assert.NotNull(to); Assert.Equal("value", to.Value); Assert.Equal(true, to.Default); Assert.Equal("auto", to.Auto); Assert.NotNull(to.Find); var find = Assert.Single(to.Find); Validate(find); } /// /// Validate a Find /// private static void Validate(Data.Models.OfflineList.Find? find) { Assert.NotNull(find); Assert.Equal("operation", find.Operation); Assert.Equal("value", find.Value); Assert.Equal("content", find.Content); } /// /// Validate a Games /// private static void Validate(Data.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(Data.Models.OfflineList.Game? game) { Assert.NotNull(game); Assert.Equal("imagenumber", game.ImageNumber); Assert.Equal("releasenumber", game.ReleaseNumber); Assert.Equal("title", game.Title); Assert.Equal("savetype", game.SaveType); Assert.Equal(12345, game.RomSize); Assert.Equal("publisher", game.Publisher); Assert.Equal("location", game.Location); Assert.Equal("sourcerom", game.SourceRom); Assert.Equal("language", game.Language); Validate(game.Files); Assert.Equal("im1crc", game.Im1CRC); Assert.Equal("im2crc", game.Im2CRC); Assert.Equal("comment", game.Comment); Assert.Equal("duplicateid", game.DuplicateID); } /// /// Validate a Files /// private static void Validate(Data.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(Data.Models.OfflineList.FileRomCRC? fileromcrc) { Assert.NotNull(fileromcrc); Assert.Equal("extension", fileromcrc.Extension); Assert.Equal("content", fileromcrc.Content); } /// /// Validate a GUI /// private static void Validate(Data.Models.OfflineList.GUI? gui) { Assert.NotNull(gui); Validate(gui.Images); } /// /// Validate a Images /// private static void Validate(Data.Models.OfflineList.Images? images) { Assert.NotNull(images); Assert.Equal("width", images.Width); Assert.Equal("height", images.Height); Assert.NotNull(images.Image); var image = Assert.Single(images.Image); Validate(image); } /// /// Validate a Image /// private static void Validate(Data.Models.OfflineList.Image? image) { Assert.NotNull(image); Assert.Equal("x", image.X); Assert.Equal("y", image.Y); Assert.Equal("width", image.Width); Assert.Equal("height", image.Height); } } }