using System; using System.Linq; using SabreTools.Hashing; using SabreTools.Metadata.DatItems.Formats; using Xunit; namespace SabreTools.Metadata.DatFiles.Test { public partial class DatFileTests { #region ConvertFromMetadata [Fact] public void ConvertFromMetadata_Null() { Data.Models.Metadata.MetadataFile? item = null; DatFile datFile = new Formats.Logiqx(null, useGame: false); datFile.ConvertFromMetadata(item, "filename", indexId: 0, keep: true, statsOnly: false, filterRunner: null); Assert.Equal(0, datFile.Items.DatStatistics.TotalCount); Assert.Equal(0, datFile.ItemsDB.DatStatistics.TotalCount); } [Fact] public void ConvertFromMetadata_Empty() { Data.Models.Metadata.MetadataFile? item = new Data.Models.Metadata.MetadataFile(); DatFile datFile = new Formats.Logiqx(null, useGame: false); datFile.ConvertFromMetadata(item, "filename", indexId: 0, keep: true, statsOnly: false, filterRunner: null); Assert.Equal(0, datFile.Items.DatStatistics.TotalCount); Assert.Equal(0, datFile.ItemsDB.DatStatistics.TotalCount); } [Fact] public void ConvertFromMetadata_FilledHeader() { Data.Models.Metadata.Header? header = CreateMetadataHeader(); Data.Models.Metadata.Machine[]? machines = null; Data.Models.Metadata.MetadataFile? item = new Data.Models.Metadata.MetadataFile { Header = header, Machine = machines, }; DatFile datFile = new Formats.Logiqx(null, useGame: false); datFile.ConvertFromMetadata(item, "filename", indexId: 0, keep: true, statsOnly: false, filterRunner: null); ValidateHeader(datFile.Header); } [Fact] public void ConvertFromMetadata_FilledMachine() { Data.Models.Metadata.Header? header = null; Data.Models.Metadata.Machine machine = CreateMetadataMachine(); Data.Models.Metadata.Machine[]? machines = [machine]; Data.Models.Metadata.MetadataFile? item = new Data.Models.Metadata.MetadataFile { Header = header, Machine = machines, }; DatFile datFile = new Formats.Logiqx(null, useGame: false); datFile.ConvertFromMetadata(item, "filename", indexId: 0, keep: true, statsOnly: false, filterRunner: null); // TODO: Reenable when ItemsDB is used again // DatItems.Machine actualMachine = Assert.Single(datFile.ItemsDB.GetMachines()).Value; // ValidateMachine(actualMachine); // Aggregate for easier validation DatItems.DatItem[] datItems = [.. datFile.Items.SortedKeys .SelectMany(key => datFile.GetItemsForBucket(key))]; Adjuster? adjuster = Array.Find(datItems, item => item is Adjuster) as Adjuster; ValidateAdjuster(adjuster); Archive? archive = Array.Find(datItems, item => item is Archive) as Archive; ValidateArchive(archive); BiosSet? biosSet = Array.Find(datItems, item => item is BiosSet) as BiosSet; ValidateBiosSet(biosSet); Chip? chip = Array.Find(datItems, item => item is Chip) as Chip; ValidateChip(chip); Configuration? configuration = Array.Find(datItems, item => item is Configuration) as Configuration; ValidateConfiguration(configuration); Device? device = Array.Find(datItems, item => item is Device) as Device; ValidateDevice(device); DeviceRef? deviceRef = Array.Find(datItems, item => item is DeviceRef) as DeviceRef; ValidateDeviceRef(deviceRef); DipSwitch? dipSwitch = Array.Find(datItems, item => item is DipSwitch dipSwitch && !dipSwitch.PartSpecified) as DipSwitch; ValidateDipSwitch(dipSwitch); Disk? disk = Array.Find(datItems, item => item is Disk disk && !disk.DiskAreaSpecified && !disk.PartSpecified) as Disk; ValidateDisk(disk); Display? display = Array.Find(datItems, item => item is Display display && display.AspectX is null) as Display; ValidateDisplay(display); Driver? driver = Array.Find(datItems, item => item is Driver) as Driver; ValidateDriver(driver); // All other fields are tested separately Rom? dump = Array.Find(datItems, item => item is Rom rom && rom.OpenMSXMediaType is not null) as Rom; Assert.NotNull(dump); Assert.Equal(Data.Models.Metadata.OpenMSXSubType.Rom, dump.OpenMSXMediaType); Feature? feature = Array.Find(datItems, item => item is Feature) as Feature; ValidateFeature(feature); Info? info = Array.Find(datItems, item => item is Info) as Info; ValidateInfo(info); Input? input = Array.Find(datItems, item => item is Input) as Input; ValidateInput(input); Media? media = Array.Find(datItems, item => item is Media) as Media; ValidateMedia(media); // All other fields are tested separately DipSwitch? partDipSwitch = Array.Find(datItems, item => item is DipSwitch dipSwitch && dipSwitch.PartSpecified) as DipSwitch; Assert.NotNull(partDipSwitch); Part? dipSwitchPart = partDipSwitch.Part; ValidatePart(dipSwitchPart); // All other fields are tested separately Disk? partDisk = Array.Find(datItems, item => item is Disk disk && disk.DiskAreaSpecified && disk.PartSpecified) as Disk; Assert.NotNull(partDisk); ValidateDiskArea(partDisk.DiskArea); ValidatePart(partDisk.Part); PartFeature? partFeature = Array.Find(datItems, item => item is PartFeature) as PartFeature; ValidatePartFeature(partFeature); // All other fields are tested separately Rom? partRom = Array.Find(datItems, item => item is Rom rom && rom.DataAreaSpecified && rom.PartSpecified) as Rom; Assert.NotNull(partRom); DataArea? romDataArea = partRom.DataArea; ValidateDataArea(romDataArea); Part? romPart = partRom.Part; ValidatePart(romPart); Port? port = Array.Find(datItems, item => item is Port) as Port; ValidatePort(port); RamOption? ramOption = Array.Find(datItems, item => item is RamOption) as RamOption; ValidateRamOption(ramOption); Release? release = Array.Find(datItems, item => item is Release) as Release; ValidateRelease(release); Rom? rom = Array.Find(datItems, item => item is Rom rom && !rom.DataAreaSpecified && !rom.PartSpecified && rom.OpenMSXMediaType is null) as Rom; ValidateRom(rom); Sample? sample = Array.Find(datItems, item => item is Sample) as Sample; ValidateSample(sample); SharedFeat? sharedFeat = Array.Find(datItems, item => item is SharedFeat) as SharedFeat; ValidateSharedFeat(sharedFeat); Slot? slot = Array.Find(datItems, item => item is Slot) as Slot; ValidateSlot(slot); SoftwareList? softwareList = Array.Find(datItems, item => item is SoftwareList) as SoftwareList; ValidateSoftwareList(softwareList); Sound? sound = Array.Find(datItems, item => item is Sound) as Sound; ValidateSound(sound); Display? video = Array.Find(datItems, item => item is Display display && display.AspectX is not null) as Display; ValidateVideo(video); } #endregion #region Creation Helpers private static Data.Models.Metadata.Header CreateMetadataHeader() { Data.Models.OfflineList.CanOpen canOpen = new Data.Models.OfflineList.CanOpen { Extension = ["ext"], }; Data.Models.OfflineList.Images images = new Data.Models.OfflineList.Images(); Data.Models.OfflineList.Infos infos = new Data.Models.OfflineList.Infos(); Data.Models.OfflineList.NewDat newDat = new Data.Models.OfflineList.NewDat(); Data.Models.OfflineList.Search search = new Data.Models.OfflineList.Search(); return new Data.Models.Metadata.Header { Author = "author", BiosMode = Data.Models.Metadata.MergingFlag.Merged, Build = "build", CanOpen = canOpen, Category = "category", Comment = "comment", Date = "date", DatVersion = "datversion", Debug = true, Description = "description", Email = "email", EmulatorVersion = "emulatorversion", FileName = "filename", ForceMerging = Data.Models.Metadata.MergingFlag.Merged, ForceNodump = Data.Models.Metadata.NodumpFlag.Required, ForcePacking = Data.Models.Metadata.PackingFlag.Zip, ForceZipping = true, HeaderRow = ["header"], HeaderSkipper = "header", Homepage = "homepage", Id = "id", Images = images, ImFolder = "imfolder", Infos = infos, LockBiosMode = true, LockRomMode = true, LockSampleMode = true, MameConfig = "mameconfig", Name = "name", NewDat = newDat, Notes = "notes", Plugin = "plugin", RefName = "refname", RomMode = Data.Models.Metadata.MergingFlag.Merged, RomTitle = "romtitle", RootDir = "rootdir", SampleMode = Data.Models.Metadata.MergingFlag.Merged, SchemaLocation = "schemalocation", ScreenshotsHeight = "screenshotsheight", ScreenshotsWidth = "screenshotsWidth", Search = search, System = "system", Timestamp = "timestamp", Type = "type", Url = "url", Version = "version", }; } private static Data.Models.Metadata.Machine CreateMetadataMachine() { return new Data.Models.Metadata.Machine { Adjuster = [CreateMetadataAdjuster()], Archive = [CreateMetadataArchive()], BiosSet = [CreateMetadataBiosSet()], Board = "board", Buttons = "buttons", Category = ["category"], Chip = [CreateMetadataChip()], CloneOf = "cloneof", CloneOfId = "cloneofid", Comment = ["comment"], Company = "company", Configuration = [CreateMetadataConfiguration()], Control = "control", CRC = "crc32", Country = "country", Description = "description", Developer = "developer", Device = [CreateMetadataDevice()], DeviceRef = [CreateMetadataDeviceRef()], DipSwitch = [CreateMetadataDipSwitch()], DirName = "dirname", Disk = [CreateMetadataDisk()], DisplayCount = "displaycount", Display = [CreateMetadataDisplay()], DisplayType = "displaytype", Driver = CreateMetadataDriver(), Dump = [CreateMetadataDump()], DuplicateID = "duplicateid", Emulator = "emulator", Enabled = "enabled", Extra = "extra", Favorite = "favorite", Feature = [CreateMetadataFeature()], GenMSXID = "genmsxid", Genre = "genre", History = "history", Id = "id", Im1CRC = HashType.CRC32.ZeroString, Im2CRC = HashType.CRC32.ZeroString, ImageNumber = "imagenumber", Info = [CreateMetadataInfo()], Input = CreateMetadataInput(), IsBios = true, IsDevice = true, IsMechanical = true, Language = "language", Location = "location", Manufacturer = "manufacturer", Media = [CreateMetadataMedia()], Name = "name", Notes = "notes", Part = [CreateMetadataPart()], PlayedCount = "playedcount", PlayedTime = "playedtime", Players = "players", Port = [CreateMetadataPort()], Publisher = "publisher", RamOption = [CreateMetadataRamOption()], Ratings = "ratings", RebuildTo = "rebuildto", RelatedTo = "relatedto", Release = [CreateMetadataRelease()], ReleaseNumber = "releasenumber", Rom = [CreateMetadataRom()], RomOf = "romof", Rotation = "rotation", Runnable = Data.Models.Metadata.Runnable.Yes, Sample = [CreateMetadataSample()], SampleOf = "sampleof", SaveType = "savetype", Score = "score", SharedFeat = [CreateMetadataSharedFeat()], Slot = [CreateMetadataSlot()], SoftwareList = [CreateMetadataSoftwareList()], Sound = CreateMetadataSound(), Source = "source", SourceFile = "sourcefile", SourceRom = "sourcerom", Status = "status", Subgenre = "subgenre", Supported = Data.Models.Metadata.Supported.Yes, System = "system", Tags = "tags", TitleID = "titleid", Url = "url", Video = [CreateMetadataVideo()], Year = "year", }; } private static Data.Models.Metadata.Adjuster CreateMetadataAdjuster() { return new Data.Models.Metadata.Adjuster { Condition = CreateMetadataCondition(), Default = true, Name = "name", }; } private static Data.Models.Metadata.Analog CreateMetadataAnalog() { return new Data.Models.Metadata.Analog { Mask = "mask", }; } private static Data.Models.Metadata.Archive CreateMetadataArchive() { return new Data.Models.Metadata.Archive { Number = "number", CloneTag = "clone", RegParent = "regparent", MergeOf = "mergeof", MergeName = "mergename", Name = "name", NameAlt = "name_alt", Region = "region", Languages = "languages", ShowLang = true, LangChecked = "langchecked", Version1 = "version1", Version2 = "version2", DevStatus = "devstatus", Additional = "additional", Special1 = "special1", Special2 = "special2", Alt = true, GameId1 = "gameid1", GameId2 = "gameid2", Description = "description", Bios = true, Licensed = true, Pirate = true, Physical = true, Complete = true, Adult = true, Dat = true, Listed = true, Private = true, StickyNote = "stickynote", DatterNote = "datternote", Categories = "categories", }; } private static Data.Models.Metadata.BiosSet CreateMetadataBiosSet() { return new Data.Models.Metadata.BiosSet { Default = true, Description = "description", Name = "name", }; } private static Data.Models.Metadata.Chip CreateMetadataChip() { return new Data.Models.Metadata.Chip { Clock = 12345, Flags = "flags", Name = "name", SoundOnly = true, Tag = "tag", ChipType = Data.Models.Metadata.ChipType.CPU, }; } private static Data.Models.Metadata.Configuration CreateMetadataConfiguration() { return new Data.Models.Metadata.Configuration { Condition = CreateMetadataCondition(), ConfLocation = [CreateMetadataConfLocation()], ConfSetting = [CreateMetadataConfSetting()], Mask = "mask", Name = "name", Tag = "tag", }; } private static Data.Models.Metadata.Condition CreateMetadataCondition() { return new Data.Models.Metadata.Condition { Value = "value", Mask = "mask", Relation = Data.Models.Metadata.Relation.Equal, Tag = "tag", }; } private static Data.Models.Metadata.ConfLocation CreateMetadataConfLocation() { return new Data.Models.Metadata.ConfLocation { Inverted = true, Name = "name", Number = 12345, }; } private static Data.Models.Metadata.ConfSetting CreateMetadataConfSetting() { return new Data.Models.Metadata.ConfSetting { Condition = CreateMetadataCondition(), Default = true, Name = "name", Value = "value", }; } private static Data.Models.Metadata.Control CreateMetadataControl() { return new Data.Models.Metadata.Control { Buttons = 12345, KeyDelta = 12345, Maximum = 12345, Minimum = 12345, Player = 12345, ReqButtons = 12345, Reverse = true, Sensitivity = 12345, ControlType = Data.Models.Metadata.ControlType.Lightgun, Ways = "ways", Ways2 = "ways2", Ways3 = "ways3", }; } private static Data.Models.Metadata.Device CreateMetadataDevice() { return new Data.Models.Metadata.Device { Extension = [CreateMetadataExtension()], FixedImage = "fixedimage", Instance = CreateMetadataInstance(), Interface = "interface", Mandatory = true, Tag = "tag", DeviceType = Data.Models.Metadata.DeviceType.PunchTape, }; } private static Data.Models.Metadata.DeviceRef CreateMetadataDeviceRef() { return new Data.Models.Metadata.DeviceRef { Name = "name", }; } private static Data.Models.Metadata.DipLocation CreateMetadataDipLocation() { return new Data.Models.Metadata.DipLocation { Inverted = true, Name = "name", Number = 12345, }; } private static Data.Models.Metadata.DipSwitch CreateMetadataDipSwitch() { return new Data.Models.Metadata.DipSwitch { Condition = CreateMetadataCondition(), Default = true, DipLocation = [CreateMetadataDipLocation()], DipValue = [CreateMetadataDipValue()], Entry = ["entry"], Mask = "mask", Name = "name", Tag = "tag", }; } private static Data.Models.Metadata.DipValue CreateMetadataDipValue() { return new Data.Models.Metadata.DipValue { Condition = CreateMetadataCondition(), Default = true, Name = "name", Value = "value", }; } private static Data.Models.Metadata.DataArea CreateMetadataDataArea() { return new Data.Models.Metadata.DataArea { Endianness = Data.Models.Metadata.Endianness.Big, Name = "name", Rom = [new Data.Models.Metadata.Rom()], Size = 12345, Width = Data.Models.Metadata.Width.Long, }; } private static Data.Models.Metadata.Disk CreateMetadataDisk() { return new Data.Models.Metadata.Disk { Flags = "flags", Index = 12345, MD5 = HashType.MD5.ZeroString, Merge = "merge", Name = "name", Optional = true, Region = "region", SHA1 = HashType.SHA1.ZeroString, Writable = true, }; } private static Data.Models.Metadata.DiskArea CreateMetadataDiskArea() { return new Data.Models.Metadata.DiskArea { Disk = [new Data.Models.Metadata.Disk()], Name = "name", }; } private static Data.Models.Metadata.Display CreateMetadataDisplay() { return new Data.Models.Metadata.Display { AspectX = null, // Null to ensure it is not Video AspectY = null, // Null to ensure it is not Video FlipX = true, HBEnd = 12345, HBStart = 12345, Height = 12345, HTotal = 12345, PixClock = 12345, Refresh = 123.45, Rotate = Data.Models.Metadata.Rotation.East, Tag = "tag", DisplayType = Data.Models.Metadata.DisplayType.Vector, VBEnd = 12345, VBStart = 12345, VTotal = 12345, Width = 12345, }; } private static Data.Models.Metadata.Driver CreateMetadataDriver() { return new Data.Models.Metadata.Driver { Blit = Data.Models.Metadata.Blit.Plain, Cocktail = Data.Models.Metadata.SupportStatus.Good, Color = Data.Models.Metadata.SupportStatus.Good, Emulation = Data.Models.Metadata.SupportStatus.Good, Incomplete = true, NoSoundHardware = true, PaletteSize = "palettesize", RequiresArtwork = true, SaveState = Data.Models.Metadata.Supported.Yes, Sound = Data.Models.Metadata.SupportStatus.Good, Status = Data.Models.Metadata.SupportStatus.Good, Unofficial = true, }; } private static Data.Models.Metadata.Dump CreateMetadataDump() { return new Data.Models.Metadata.Dump { Original = CreateMetadataOriginal(), // The following are searched for in order // For the purposes of this test, only RomKey will be populated // The only difference is what OpenMSXSubType value is applied Rom = new Data.Models.Metadata.Rom(), MegaRom = null, SCCPlusCart = null, }; } private static Data.Models.Metadata.Extension CreateMetadataExtension() { return new Data.Models.Metadata.Extension { Name = "name", }; } private static Data.Models.Metadata.Feature CreateMetadataFeature() { return new Data.Models.Metadata.Feature { Name = "name", Overall = Data.Models.Metadata.FeatureStatus.Imperfect, Status = Data.Models.Metadata.FeatureStatus.Imperfect, FeatureType = Data.Models.Metadata.FeatureType.Protection, Value = "value", }; } private static Data.Models.Metadata.Info CreateMetadataInfo() { return new Data.Models.Metadata.Info { Name = "name", Value = "value", }; } private static Data.Models.Metadata.Input CreateMetadataInput() { return new Data.Models.Metadata.Input { Buttons = 12345, Coins = 12345, Control = [CreateMetadataControl()], ControlAttr = "controlattr", Players = 12345, Service = true, Tilt = true, }; } private static Data.Models.Metadata.Instance CreateMetadataInstance() { return new Data.Models.Metadata.Instance { BriefName = "briefname", Name = "name", }; } private static Data.Models.Metadata.Media CreateMetadataMedia() { return new Data.Models.Metadata.Media { MD5 = HashType.MD5.ZeroString, Name = "name", SHA1 = HashType.SHA1.ZeroString, SHA256 = HashType.SHA256.ZeroString, SpamSum = HashType.SpamSum.ZeroString, }; } private static Data.Models.Metadata.Original CreateMetadataOriginal() { return new Data.Models.Metadata.Original { Content = "content", Value = true, }; } private static Data.Models.Metadata.Part CreateMetadataPart() { return new Data.Models.Metadata.Part { DataArea = [CreateMetadataDataArea()], DiskArea = [CreateMetadataDiskArea()], DipSwitch = [new Data.Models.Metadata.DipSwitch()], Feature = [CreateMetadataFeature()], Interface = "interface", Name = "name", }; } private static Data.Models.Metadata.Port CreateMetadataPort() { return new Data.Models.Metadata.Port { Analog = [CreateMetadataAnalog()], Tag = "tag", }; } private static Data.Models.Metadata.RamOption CreateMetadataRamOption() { return new Data.Models.Metadata.RamOption { Content = "content", Default = true, Name = "name", }; } private static Data.Models.Metadata.Release CreateMetadataRelease() { return new Data.Models.Metadata.Release { Date = "date", Default = true, Language = "language", Name = "name", Region = "region", }; } private static Data.Models.Metadata.ReleaseDetails CreateMetadataReleaseDetails() { return new Data.Models.Metadata.ReleaseDetails { AppendToNumber = "appendtonumber", ArchiveName = "archivename", Category = "category", Comment = "comment", Date = "date", DirName = "dirname", Group = "group", Id = "id", Origin = "origin", OriginalFormat = "originalformat", NfoCRC = "nfocrc", NfoName = "nfoname", NfoSize = "nfosize", Region = "region", RomInfo = "rominfo", Tool = "tool", }; } private static Data.Models.Metadata.Rom CreateMetadataRom() { return new Data.Models.Metadata.Rom { Album = "album", AltRomname = "alt_romname", AltTitle = "alt_title", Artist = "artist", ASRDetectedLang = "asr_detected_lang", ASRDetectedLangConf = "asr_detected_lang_conf", ASRTranscribedLang = "asr_transcribed_lang", Bios = "bios", Bitrate = "bitrate", BitTorrentMagnetHash = "btih", ClothCoverDetectionModuleVersion = "cloth_cover_detection_module_version", CollectionCatalogNumber = "collection-catalog-number", Comment = "comment", CRC16 = HashType.CRC16.ZeroString, CRC32 = HashType.CRC32.ZeroString, CRC64 = HashType.CRC64.ZeroString, Creator = "creator", Date = "date", Dispose = true, Extension = "extension", FileCount = 12345, FileIsAvailable = true, Flags = "flags", Format = "format", Header = "header", Height = "height", hOCRCharToWordhOCRVersion = "hocr_char_to_word_hocr_version", hOCRCharToWordModuleVersion = "hocr_char_to_word_module_version", hOCRFtsTexthOCRVersion = "hocr_fts_text_hocr_version", hOCRFtsTextModuleVersion = "hocr_fts_text_module_version", hOCRPageIndexhOCRVersion = "hocr_pageindex_hocr_version", hOCRPageIndexModuleVersion = "hocr_pageindex_module_version", Inverted = true, LastModifiedTime = "mtime", Length = "length", LoadFlag = Data.Models.Metadata.LoadFlag.Load16Byte, MatrixNumber = "matrix_number", MD2 = HashType.MD2.ZeroString, MD4 = HashType.MD4.ZeroString, MD5 = HashType.MD5.ZeroString, // [Data.Models.Metadata.Rom.OpenMSXMediaType] = null, // Omit due to other test OpenMSXType = "type", Merge = "merge", MIA = true, Name = "name", Offset = "offset", Optional = true, Original = "original", PDFModuleVersion = "pdf_module_version", PreviewImage = "preview-image", Publisher = "publisher", Region = "region", Remark = "remark", RIPEMD128 = HashType.RIPEMD128.ZeroString, RIPEMD160 = HashType.RIPEMD160.ZeroString, Rotation = "rotation", Serial = "serial", SHA1 = HashType.SHA1.ZeroString, SHA256 = HashType.SHA256.ZeroString, SHA384 = HashType.SHA384.ZeroString, SHA512 = HashType.SHA512.ZeroString, Size = 12345, SoundOnly = true, Source = "source", SpamSum = HashType.SpamSum.ZeroString, Start = "start", Status = Data.Models.Metadata.ItemStatus.Good, Summation = "summation", TesseractOCR = "ocr", TesseractOCRConverted = "ocr_converted", TesseractOCRDetectedLang = "ocr_detected_lang", TesseractOCRDetectedLangConf = "ocr_detected_lang_conf", TesseractOCRDetectedScript = "ocr_detected_script", TesseractOCRDetectedScriptConf = "ocr_detected_script_conf", TesseractOCRModuleVersion = "ocr_module_version", TesseractOCRParameters = "ocr_parameters", Title = "title", Track = "track", Value = "value", WhisperASRModuleVersion = "whisper_asr_module_version", WhisperModelHash = "whisper_model_hash", WhisperModelName = "whisper_model_name", WhisperVersion = "whisper_version", Width = "width", WordConfidenceInterval0To10 = "word_conf_0_10", WordConfidenceInterval11To20 = "word_conf_11_20", WordConfidenceInterval21To30 = "word_conf_21_30", WordConfidenceInterval31To40 = "word_conf_31_40", WordConfidenceInterval41To50 = "word_conf_41_50", WordConfidenceInterval51To60 = "word_conf_51_60", WordConfidenceInterval61To70 = "word_conf_61_70", WordConfidenceInterval71To80 = "word_conf_71_80", WordConfidenceInterval81To90 = "word_conf_81_90", WordConfidenceInterval91To100 = "word_conf_91_100", xxHash364 = HashType.XxHash3.ZeroString, xxHash3128 = HashType.XxHash128.ZeroString, }; } private static Data.Models.Metadata.Sample CreateMetadataSample() { return new Data.Models.Metadata.Sample { Name = "name", }; } private static Data.Models.Metadata.Serials CreateMetadataSerials() { return new Data.Models.Metadata.Serials { BoxBarcode = "boxbarcode", BoxSerial = "boxserial", ChipSerial = "chipserial", DigitalSerial1 = "digitalserial1", DigitalSerial2 = "digitalserial2", LockoutSerial = "lockoutserial", MediaSerial1 = "mediaserial1", MediaSerial2 = "mediaserial2", MediaSerial3 = "mediaserial3", MediaStamp = "mediastamp", PCBSerial = "pcbserial", RomChipSerial1 = "romchipserial1", RomChipSerial2 = "romchipserial2", SaveChipSerial = "savechipserial", }; } private static Data.Models.Metadata.SharedFeat CreateMetadataSharedFeat() { return new Data.Models.Metadata.SharedFeat { Name = "name", Value = "value", }; } private static Data.Models.Metadata.Slot CreateMetadataSlot() { return new Data.Models.Metadata.Slot { Name = "name", SlotOption = [CreateMetadataSlotOption()], }; } private static Data.Models.Metadata.SlotOption CreateMetadataSlotOption() { return new Data.Models.Metadata.SlotOption { Default = true, DevName = "devname", Name = "name", }; } private static Data.Models.Metadata.SoftwareList CreateMetadataSoftwareList() { return new Data.Models.Metadata.SoftwareList { Filter = "filter", Name = "name", Status = Data.Models.Metadata.SoftwareListStatus.Original, Tag = "tag", }; } private static Data.Models.Metadata.Sound CreateMetadataSound() { return new Data.Models.Metadata.Sound { Channels = 12345, }; } private static Data.Models.Metadata.SourceDetails CreateMetadataSourceDetails() { return new Data.Models.Metadata.SourceDetails { AppendToNumber = "appendtonumber", Comment1 = "comment1", Comment2 = "comment2", DumpDate = "dumpdate", DumpDateInfo = true, Dumper = "dumper", Id = "id", Link1 = "link1", Link1Public = true, Link2 = "link2", Link2Public = true, Link3 = "link3", Link3Public = true, MediaTitle = "mediatitle", Nodump = true, Origin = "origin", OriginalFormat = "originalformat", Project = "project", Region = "region", ReleaseDate = "releasedate", ReleaseDateInfo = true, RomInfo = "rominfo", Section = "section", Tool = "tool", }; } private static Data.Models.Metadata.Video CreateMetadataVideo() { return new Data.Models.Metadata.Video { AspectX = 12345, AspectY = 12345, Height = 12345, Orientation = Data.Models.Metadata.Rotation.East, Refresh = 123.45, Screen = Data.Models.Metadata.DisplayType.Vector, Width = 12345, }; } #endregion #region Validation Helpers private static void ValidateHeader(DatHeader datHeader) { Assert.Equal("author", datHeader.Author); Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, datHeader.BiosMode); Assert.Equal("build", datHeader.Build); Assert.NotNull(datHeader.CanOpen); Assert.Equal("category", datHeader.Category); Assert.Equal("comment", datHeader.Comment); Assert.Equal("date", datHeader.Date); Assert.Equal("datversion", datHeader.DatVersion); Assert.True(datHeader.Debug); Assert.Equal("description", datHeader.Description); Assert.Equal("email", datHeader.Email); Assert.Equal("emulatorversion", datHeader.EmulatorVersion); Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, datHeader.ForceMerging); Assert.Equal(Data.Models.Metadata.NodumpFlag.Required, datHeader.ForceNodump); Assert.Equal(Data.Models.Metadata.PackingFlag.Zip, datHeader.ForcePacking); Assert.True(datHeader.ForceZipping); Assert.Equal("header", datHeader.HeaderSkipper); Assert.Equal("homepage", datHeader.Homepage); Assert.Equal("id", datHeader.Id); Assert.NotNull(datHeader.Images); Assert.Equal("imfolder", datHeader.ImFolder); Assert.NotNull(datHeader.Infos); Assert.True(datHeader.LockBiosMode); Assert.True(datHeader.LockRomMode); Assert.True(datHeader.LockSampleMode); Assert.Equal("mameconfig", datHeader.MameConfig); Assert.Equal("name", datHeader.Name); Assert.NotNull(datHeader.NewDat); Assert.Equal("notes", datHeader.Notes); Assert.Equal("plugin", datHeader.Plugin); Assert.Equal("refname", datHeader.RefName); Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, datHeader.RomMode); Assert.Equal("romtitle", datHeader.RomTitle); Assert.Equal("rootdir", datHeader.RootDir); Assert.Equal(Data.Models.Metadata.MergingFlag.Merged, datHeader.SampleMode); Assert.Equal("schemalocation", datHeader.SchemaLocation); Assert.Equal("screenshotsheight", datHeader.ScreenshotsHeight); Assert.Equal("screenshotsWidth", datHeader.ScreenshotsWidth); Assert.NotNull(datHeader.Search); Assert.Equal("system", datHeader.System); Assert.Equal("timestamp", datHeader.Timestamp); Assert.Equal("type", datHeader.Type); Assert.Equal("url", datHeader.Url); Assert.Equal("version", datHeader.Version); } #pragma warning disable IDE0051 private static void ValidateMachine(DatItems.Machine machine) { Assert.Equal("board", machine.Board); Assert.Equal("buttons", machine.Buttons); Assert.Equal("cloneof", machine.CloneOf); Assert.Equal("cloneofid", machine.CloneOfId); Assert.Equal("company", machine.Company); Assert.Equal("control", machine.Control); Assert.Equal("country", machine.Country); Assert.Equal("crc32", machine.CRC); Assert.Equal("description", machine.Description); Assert.Equal("developer", machine.Developer); Assert.Equal("dirname", machine.DirName); Assert.Equal("displaycount", machine.DisplayCount); Assert.Equal("displaytype", machine.DisplayType); Assert.Equal("duplicateid", machine.DuplicateID); Assert.Equal("emulator", machine.Emulator); Assert.Equal("enabled", machine.Enabled); Assert.Equal("extra", machine.Extra); Assert.Equal("favorite", machine.Favorite); Assert.Equal("genmsxid", machine.GenMSXID); Assert.Equal("genre", machine.Genre); Assert.Equal("history", machine.History); Assert.Equal("id", machine.Id); Assert.Equal(HashType.CRC32.ZeroString, machine.Im1CRC); Assert.Equal(HashType.CRC32.ZeroString, machine.Im2CRC); Assert.Equal("imagenumber", machine.ImageNumber); Assert.Equal(true, machine.IsBios); Assert.Equal(true, machine.IsDevice); Assert.Equal(true, machine.IsMechanical); Assert.Equal("language", machine.Language); Assert.Equal("location", machine.Location); Assert.Equal("manufacturer", machine.Manufacturer); Assert.Equal("name", machine.Name); Assert.Equal("notes", machine.Notes); Assert.Equal("playedcount", machine.PlayedCount); Assert.Equal("playedtime", machine.PlayedTime); Assert.Equal("players", machine.Players); Assert.Equal("publisher", machine.Publisher); Assert.Equal("ratings", machine.Ratings); Assert.Equal("rebuildto", machine.RebuildTo); Assert.Equal("relatedto", machine.RelatedTo); Assert.Equal("releasenumber", machine.ReleaseNumber); Assert.Equal("romof", machine.RomOf); Assert.Equal("rotation", machine.Rotation); Assert.Equal(Data.Models.Metadata.Runnable.Yes, machine.Runnable); Assert.Equal("sampleof", machine.SampleOf); Assert.Equal("savetype", machine.SaveType); Assert.Equal("score", machine.Score); Assert.Equal("source", machine.Source); Assert.Equal("sourcefile", machine.SourceFile); Assert.Equal("sourcerom", machine.SourceRom); Assert.Equal("status", machine.Status); Assert.Equal("subgenre", machine.Subgenre); Assert.Equal(Data.Models.Metadata.Supported.Yes, machine.Supported); Assert.Equal("system", machine.System); Assert.Equal("tags", machine.Tags); Assert.Equal("titleid", machine.TitleID); Assert.Equal("url", machine.Url); Assert.Equal("year", machine.Year); string[]? categories = machine.Category; Assert.NotNull(categories); string? category = Assert.Single(categories); Assert.Equal("category", category); string[]? comments = machine.Comment; Assert.NotNull(comments); string? comment = Assert.Single(comments); Assert.Equal("comment", comment); } #pragma warning restore IDE0051 private static void ValidateAdjuster(Adjuster? adjuster) { Assert.NotNull(adjuster); Assert.True(adjuster.Default); Assert.Equal("name", adjuster.Name); ValidateCondition(adjuster.Condition); } private static void ValidateAnalog(Analog? analog) { Assert.NotNull(analog); Assert.Equal("mask", analog.Mask); } private static void ValidateArchive(Archive? archive) { Assert.NotNull(archive); Assert.Equal("name", archive.Name); } private static void ValidateBiosSet(BiosSet? biosSet) { Assert.NotNull(biosSet); Assert.True(biosSet.Default); Assert.Equal("description", biosSet.Description); Assert.Equal("name", biosSet.Name); } private static void ValidateChip(Chip? chip) { Assert.NotNull(chip); Assert.Equal(12345, chip.Clock); Assert.Equal("flags", chip.Flags); Assert.Equal("name", chip.Name); Assert.True(chip.SoundOnly); Assert.Equal("tag", chip.Tag); Assert.Equal(Data.Models.Metadata.ChipType.CPU, chip.ChipType); } private static void ValidateCondition(Condition? condition) { Assert.NotNull(condition); Assert.Equal("value", condition.Value); Assert.Equal("mask", condition.Mask); Assert.Equal(Data.Models.Metadata.Relation.Equal, condition.Relation); Assert.Equal("tag", condition.Tag); } private static void ValidateConfiguration(Configuration? configuration) { Assert.NotNull(configuration); Assert.Equal("mask", configuration.Mask); Assert.Equal("name", configuration.Name); Assert.Equal("tag", configuration.Tag); ValidateCondition(configuration.Condition); ConfLocation[]? confLocations = configuration.ConfLocation; Assert.NotNull(confLocations); ConfLocation? confLocation = Assert.Single(confLocations); ValidateConfLocation(confLocation); ConfSetting[]? confSettings = configuration.ConfSetting; Assert.NotNull(confSettings); ConfSetting? confSetting = Assert.Single(confSettings); ValidateConfSetting(confSetting); } private static void ValidateConfLocation(ConfLocation? confLocation) { Assert.NotNull(confLocation); Assert.True(confLocation.Inverted); Assert.Equal("name", confLocation.Name); Assert.Equal(12345, confLocation.Number); } private static void ValidateConfSetting(ConfSetting? confSetting) { Assert.NotNull(confSetting); Assert.True(confSetting.Default); Assert.Equal("name", confSetting.Name); Assert.Equal("value", confSetting.Value); ValidateCondition(confSetting.Condition); } private static void ValidateControl(Control? control) { Assert.NotNull(control); Assert.Equal(12345, control.Buttons); Assert.Equal(12345, control.KeyDelta); Assert.Equal(12345, control.Maximum); Assert.Equal(12345, control.Minimum); Assert.Equal(12345, control.Player); Assert.Equal(12345, control.ReqButtons); Assert.True(control.Reverse); Assert.Equal(12345, control.Sensitivity); Assert.Equal(Data.Models.Metadata.ControlType.Lightgun, control.ControlType); Assert.Equal("ways", control.Ways); Assert.Equal("ways2", control.Ways2); Assert.Equal("ways3", control.Ways3); } private static void ValidateDataArea(DataArea? dataArea) { Assert.NotNull(dataArea); Assert.Equal(Data.Models.Metadata.Endianness.Big, dataArea.Endianness); Assert.Equal("name", dataArea.Name); Assert.Equal(12345, dataArea.Size); Assert.Equal(Data.Models.Metadata.Width.Long, dataArea.Width); } private static void ValidateDevice(Device? device) { Assert.NotNull(device); Assert.Equal("fixedimage", device.FixedImage); Assert.Equal("interface", device.Interface); Assert.Equal(true, device.Mandatory); Assert.Equal("tag", device.Tag); Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.DeviceType); Extension[]? extensions = device.Extension; Assert.NotNull(extensions); Extension? extension = Assert.Single(extensions); ValidateExtension(extension); ValidateInstance(device.Instance); } private static void ValidateDeviceRef(DeviceRef? deviceRef) { Assert.NotNull(deviceRef); Assert.Equal("name", deviceRef.Name); } private static void ValidateDipLocation(DipLocation? dipLocation) { Assert.NotNull(dipLocation); Assert.True(dipLocation.Inverted); Assert.Equal("name", dipLocation.Name); Assert.Equal(12345, dipLocation.Number); } private static void ValidateDipSwitch(DipSwitch? dipSwitch) { Assert.NotNull(dipSwitch); Assert.True(dipSwitch.Default); Assert.Equal("mask", dipSwitch.Mask); Assert.Equal("name", dipSwitch.Name); Assert.Equal("tag", dipSwitch.Tag); ValidateCondition(dipSwitch.Condition); DipLocation[]? dipLocations = dipSwitch.DipLocation; Assert.NotNull(dipLocations); DipLocation? dipLocation = Assert.Single(dipLocations); ValidateDipLocation(dipLocation); DipValue[]? dipValues = dipSwitch.DipValue; Assert.NotNull(dipValues); DipValue? dipValue = Assert.Single(dipValues); ValidateDipValue(dipValue); string[]? entries = dipSwitch.Entry; Assert.NotNull(entries); string entry = Assert.Single(entries); Assert.Equal("entry", entry); } private static void ValidateDipValue(DipValue? dipValue) { Assert.NotNull(dipValue); Assert.True(dipValue.Default); Assert.Equal("name", dipValue.Name); Assert.Equal("value", dipValue.Value); ValidateCondition(dipValue.Condition); } private static void ValidateDisk(Disk? disk) { Assert.NotNull(disk); Assert.Equal("flags", disk.Flags); Assert.Equal(12345, disk.Index); Assert.Equal(HashType.MD5.ZeroString, disk.MD5); Assert.Equal("merge", disk.Merge); Assert.Equal("name", disk.Name); Assert.True(disk.Optional); Assert.Equal("region", disk.Region); Assert.Equal(HashType.SHA1.ZeroString, disk.SHA1); Assert.True(disk.Writable); } private static void ValidateDiskArea(DiskArea? diskArea) { Assert.NotNull(diskArea); Assert.Equal("name", diskArea.Name); } private static void ValidateDisplay(Display? display) { Assert.NotNull(display); Assert.Null(display.AspectX); Assert.Null(display.AspectY); Assert.True(display.FlipX); Assert.Equal(12345, display.HBEnd); Assert.Equal(12345, display.HBStart); Assert.Equal(12345, display.Height); Assert.Equal(12345, display.HTotal); Assert.Equal(12345, display.PixClock); Assert.Equal(123.45, display.Refresh); Assert.Equal(Data.Models.Metadata.Rotation.East, display.Rotate); Assert.Equal("tag", display.Tag); Assert.Equal(Data.Models.Metadata.DisplayType.Vector, display.DisplayType); Assert.Equal(12345, display.VBEnd); Assert.Equal(12345, display.VBStart); Assert.Equal(12345, display.VTotal); Assert.Equal(12345, display.Width); } private static void ValidateDriver(Driver? driver) { Assert.NotNull(driver); Assert.Equal(Data.Models.Metadata.Blit.Plain, driver.Blit); Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Cocktail); Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Color); Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Emulation); Assert.True(driver.Incomplete); Assert.True(driver.NoSoundHardware); Assert.Equal("palettesize", driver.PaletteSize); Assert.True(driver.RequiresArtwork); Assert.Equal(Data.Models.Metadata.Supported.Yes, driver.SaveState); Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Sound); Assert.Equal(Data.Models.Metadata.SupportStatus.Good, driver.Status); Assert.True(driver.Unofficial); } private static void ValidateExtension(Extension? extension) { Assert.NotNull(extension); Assert.Equal("name", extension.Name); } private static void ValidateFeature(Feature? feature) { Assert.NotNull(feature); Assert.Equal("name", feature.Name); Assert.Equal(Data.Models.Metadata.FeatureStatus.Imperfect, feature.Overall); Assert.Equal(Data.Models.Metadata.FeatureStatus.Imperfect, feature.Status); Assert.Equal(Data.Models.Metadata.FeatureType.Protection, feature.FeatureType); Assert.Equal("value", feature.Value); } private static void ValidateInfo(Info? info) { Assert.NotNull(info); Assert.Equal("name", info.Name); Assert.Equal("value", info.Value); } private static void ValidateInput(Input? input) { Assert.NotNull(input); Assert.Equal(12345, input.Buttons); Assert.Equal(12345, input.Coins); Assert.Equal("controlattr", input.ControlAttr); Assert.Equal(12345, input.Players); Assert.True(input.Service); Assert.True(input.Tilt); Control[]? controls = input.Control; Assert.NotNull(controls); Control? control = Assert.Single(controls); ValidateControl(control); } private static void ValidateInstance(Instance? instance) { Assert.NotNull(instance); Assert.Equal("briefname", instance.BriefName); Assert.Equal("name", instance.Name); } private static void ValidateMedia(Media? media) { Assert.NotNull(media); Assert.Equal(HashType.MD5.ZeroString, media.MD5); Assert.Equal("name", media.Name); Assert.Equal(HashType.SHA1.ZeroString, media.SHA1); Assert.Equal(HashType.SHA256.ZeroString, media.SHA256); Assert.Equal(HashType.SpamSum.ZeroString, media.SpamSum); } private static void ValidatePart(Part? part) { Assert.NotNull(part); Assert.Equal("interface", part.Interface); Assert.Equal("name", part.Name); } private static void ValidatePartFeature(PartFeature? partFeature) { Assert.NotNull(partFeature); Assert.Equal("name", partFeature.Name); Assert.Equal(Data.Models.Metadata.FeatureStatus.Imperfect, partFeature.Overall); Assert.Equal(Data.Models.Metadata.FeatureStatus.Imperfect, partFeature.Status); Assert.Equal(Data.Models.Metadata.FeatureType.Protection, partFeature.FeatureType); Assert.Equal("value", partFeature.Value); Part? part = partFeature.Part; ValidatePart(part); } private static void ValidatePort(Port? port) { Assert.NotNull(port); Assert.Equal("tag", port.Tag); Analog[]? dipValues = port.Analog; Assert.NotNull(dipValues); Analog? dipValue = Assert.Single(dipValues); ValidateAnalog(dipValue); } private static void ValidateRamOption(RamOption? ramOption) { Assert.NotNull(ramOption); Assert.Equal("content", ramOption.Content); Assert.True(ramOption.Default); Assert.Equal("name", ramOption.Name); } private static void ValidateRelease(Release? release) { Assert.NotNull(release); Assert.Equal("date", release.Date); Assert.True(release.Default); Assert.Equal("language", release.Language); Assert.Equal("name", release.Name); Assert.Equal("region", release.Region); } private static void ValidateReleaseDetails(ReleaseDetails? releaseDetails) { Assert.NotNull(releaseDetails); Assert.Equal("appendtonumber", releaseDetails.AppendToNumber); Assert.Equal("archivename", releaseDetails.ArchiveName); Assert.Equal("category", releaseDetails.Category); Assert.Equal("comment", releaseDetails.Comment); Assert.Equal("date", releaseDetails.Date); Assert.Equal("dirname", releaseDetails.DirName); Assert.Equal("group", releaseDetails.Group); Assert.Equal("id", releaseDetails.Id); Assert.Equal("nfocrc", releaseDetails.NfoCRC); Assert.Equal("nfoname", releaseDetails.NfoName); Assert.Equal("nfosize", releaseDetails.NfoSize); Assert.Equal("origin", releaseDetails.Origin); Assert.Equal("originalformat", releaseDetails.OriginalFormat); Assert.Equal("region", releaseDetails.Region); Assert.Equal("rominfo", releaseDetails.RomInfo); Assert.Equal("tool", releaseDetails.Tool); } private static void ValidateRom(Rom? rom) { Assert.NotNull(rom); Assert.Equal("album", rom.Album); Assert.Equal("alt_romname", rom.AltRomname); Assert.Equal("alt_title", rom.AltTitle); Assert.Equal("artist", rom.Artist); Assert.Equal("asr_detected_lang", rom.ASRDetectedLang); Assert.Equal("asr_detected_lang_conf", rom.ASRDetectedLangConf); Assert.Equal("asr_transcribed_lang", rom.ASRTranscribedLang); Assert.Equal("bios", rom.Bios); Assert.Equal("bitrate", rom.Bitrate); Assert.Equal("btih", rom.BitTorrentMagnetHash); Assert.Equal("cloth_cover_detection_module_version", rom.ClothCoverDetectionModuleVersion); Assert.Equal("collection-catalog-number", rom.CollectionCatalogNumber); Assert.Equal("comment", rom.Comment); Assert.Equal(HashType.CRC16.ZeroString, rom.CRC16); Assert.Equal(HashType.CRC32.ZeroString, rom.CRC32); Assert.Equal(HashType.CRC64.ZeroString, rom.CRC64); Assert.Equal("creator", rom.Creator); Assert.Equal("date", rom.Date); Assert.True(rom.Dispose); Assert.Equal("extension", rom.Extension); Assert.Equal(12345, rom.FileCount); Assert.True(rom.FileIsAvailable); Assert.Equal("flags", rom.Flags); Assert.Equal("format", rom.Format); Assert.Equal("header", rom.Header); Assert.Equal("height", rom.Height); Assert.Equal("hocr_char_to_word_hocr_version", rom.hOCRCharToWordhOCRVersion); Assert.Equal("hocr_char_to_word_module_version", rom.hOCRCharToWordModuleVersion); Assert.Equal("hocr_fts_text_hocr_version", rom.hOCRFtsTexthOCRVersion); Assert.Equal("hocr_fts_text_module_version", rom.hOCRFtsTextModuleVersion); Assert.Equal("hocr_pageindex_hocr_version", rom.hOCRPageIndexhOCRVersion); Assert.Equal("hocr_pageindex_module_version", rom.hOCRPageIndexModuleVersion); Assert.True(rom.Inverted); Assert.Equal("mtime", rom.LastModifiedTime); Assert.Equal("length", rom.Length); Assert.Equal(Data.Models.Metadata.LoadFlag.Load16Byte, rom.LoadFlag); Assert.Equal("matrix_number", rom.MatrixNumber); Assert.Equal(HashType.MD2.ZeroString, rom.MD2); Assert.Equal(HashType.MD4.ZeroString, rom.MD4); Assert.Equal(HashType.MD5.ZeroString, rom.MD5); Assert.Null(rom.OpenMSXMediaType); // Omit due to other test Assert.Equal("type", rom.OpenMSXType); Assert.Equal("merge", rom.Merge); Assert.True(rom.MIA); Assert.Equal("name", rom.Name); Assert.Equal("offset", rom.Offset); Assert.True(rom.Optional); Assert.Equal("original", rom.OriginalProperty); Assert.Equal("pdf_module_version", rom.PDFModuleVersion); Assert.Equal("preview-image", rom.PreviewImage); Assert.Equal("publisher", rom.Publisher); Assert.Equal("region", rom.Region); Assert.Equal("remark", rom.Remark); Assert.Equal(HashType.RIPEMD128.ZeroString, rom.RIPEMD128); Assert.Equal(HashType.RIPEMD160.ZeroString, rom.RIPEMD160); Assert.Equal("rotation", rom.Rotation); Assert.Equal("serial", rom.Serial); Assert.Equal(HashType.SHA1.ZeroString, rom.SHA1); Assert.Equal(HashType.SHA256.ZeroString, rom.SHA256); Assert.Equal(HashType.SHA384.ZeroString, rom.SHA384); Assert.Equal(HashType.SHA512.ZeroString, rom.SHA512); Assert.Equal(12345, rom.Size); Assert.True(rom.SoundOnly); Assert.Equal("source", rom.SourceProperty); Assert.Equal(HashType.SpamSum.ZeroString, rom.SpamSum); Assert.Equal("start", rom.Start); Assert.Equal(Data.Models.Metadata.ItemStatus.Good, rom.Status); Assert.Equal("summation", rom.Summation); Assert.Equal("ocr", rom.TesseractOCR); Assert.Equal("ocr_converted", rom.TesseractOCRConverted); Assert.Equal("ocr_detected_lang", rom.TesseractOCRDetectedLang); Assert.Equal("ocr_detected_lang_conf", rom.TesseractOCRDetectedLangConf); Assert.Equal("ocr_detected_script", rom.TesseractOCRDetectedScript); Assert.Equal("ocr_detected_script_conf", rom.TesseractOCRDetectedScriptConf); Assert.Equal("ocr_module_version", rom.TesseractOCRModuleVersion); Assert.Equal("ocr_parameters", rom.TesseractOCRParameters); Assert.Equal("title", rom.Title); Assert.Equal("track", rom.Track); Assert.Equal("value", rom.Value); Assert.Equal("whisper_asr_module_version", rom.WhisperASRModuleVersion); Assert.Equal("whisper_model_hash", rom.WhisperModelHash); Assert.Equal("whisper_model_name", rom.WhisperModelName); Assert.Equal("whisper_version", rom.WhisperVersion); Assert.Equal("width", rom.Width); Assert.Equal("word_conf_0_10", rom.WordConfidenceInterval0To10); Assert.Equal("word_conf_11_20", rom.WordConfidenceInterval11To20); Assert.Equal("word_conf_21_30", rom.WordConfidenceInterval21To30); Assert.Equal("word_conf_31_40", rom.WordConfidenceInterval31To40); Assert.Equal("word_conf_41_50", rom.WordConfidenceInterval41To50); Assert.Equal("word_conf_51_60", rom.WordConfidenceInterval51To60); Assert.Equal("word_conf_61_70", rom.WordConfidenceInterval61To70); Assert.Equal("word_conf_71_80", rom.WordConfidenceInterval71To80); Assert.Equal("word_conf_81_90", rom.WordConfidenceInterval81To90); Assert.Equal("word_conf_91_100", rom.WordConfidenceInterval91To100); Assert.Equal(HashType.XxHash3.ZeroString, rom.xxHash364); Assert.Equal(HashType.XxHash128.ZeroString, rom.xxHash3128); } private static void ValidateSample(Sample? sample) { Assert.NotNull(sample); Assert.Equal("name", sample.Name); } private static void ValidateSharedFeat(SharedFeat? sharedFeat) { Assert.NotNull(sharedFeat); Assert.Equal("name", sharedFeat.Name); Assert.Equal("value", sharedFeat.Value); } private static void ValidateSerials(Serials? serials) { Assert.NotNull(serials); Assert.Equal("boxbarcode", serials.BoxBarcode); Assert.Equal("boxserial", serials.BoxSerial); Assert.Equal("chipserial", serials.ChipSerial); Assert.Equal("digitalserial1", serials.DigitalSerial1); Assert.Equal("digitalserial2", serials.DigitalSerial2); Assert.Equal("lockoutserial", serials.LockoutSerial); Assert.Equal("mediaserial1", serials.MediaSerial1); Assert.Equal("mediaserial2", serials.MediaSerial2); Assert.Equal("mediaserial3", serials.MediaSerial3); Assert.Equal("mediastamp", serials.MediaStamp); Assert.Equal("pcbserial", serials.PCBSerial); Assert.Equal("romchipserial1", serials.RomChipSerial1); Assert.Equal("romchipserial2", serials.RomChipSerial2); Assert.Equal("savechipserial", serials.SaveChipSerial); } private static void ValidateSlot(Slot? slot) { Assert.NotNull(slot); Assert.Equal("name", slot.Name); SlotOption[]? slotOptions = slot.SlotOption; Assert.NotNull(slotOptions); SlotOption? slotOption = Assert.Single(slotOptions); ValidateSlotOption(slotOption); } private static void ValidateSlotOption(SlotOption? slotOption) { Assert.NotNull(slotOption); Assert.True(slotOption.Default); Assert.Equal("devname", slotOption.DevName); Assert.Equal("name", slotOption.Name); } private static void ValidateSoftwareList(SoftwareList? softwareList) { Assert.NotNull(softwareList); Assert.Equal("filter", softwareList.Filter); Assert.Equal("name", softwareList.Name); Assert.Equal(Data.Models.Metadata.SoftwareListStatus.Original, softwareList.Status); Assert.Equal("tag", softwareList.Tag); } private static void ValidateSound(Sound? sound) { Assert.NotNull(sound); Assert.Equal(12345, sound.Channels); } private static void ValidateVideo(Display? display) { Assert.NotNull(display); Assert.Equal(12345, display.AspectX); Assert.Equal(12345, display.AspectY); Assert.Equal(Data.Models.Metadata.DisplayType.Vector, display.DisplayType); Assert.Equal(12345, display.Height); Assert.Equal(123.45, display.Refresh); Assert.Equal(12345, display.Width); Assert.Equal(Data.Models.Metadata.Rotation.East, display.Rotate); } #endregion } }