From c623c2b1f631dcc4583eaa444bd5cff554f52190 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Fri, 3 Apr 2026 18:50:04 -0400 Subject: [PATCH] Make Serials more complete --- .../MetadataExtensions.cs | 2 + SabreTools.Data.Models/Metadata/Serials.cs | 151 ++++++++++++++---- .../DatFileTests.FromMetadata.cs | 47 ++++-- .../DatFileTests.ToMetadata.cs | 28 ++-- .../Formats/Serials.cs | 84 ++++++++++ SabreTools.Metadata.Filter/FilterObject.cs | 43 +++++ .../DictionaryBaseExtensions.cs | 5 + .../NoIntroDatabaseTests.cs | 56 +++---- 8 files changed, 330 insertions(+), 86 deletions(-) diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 10623ed1..a4d63a29 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -180,6 +180,8 @@ namespace SabreTools.Data.Extensions return ramOption.Clone() as RamOption; else if (self is Release release) return release.Clone() as Release; + else if (self is Serials serials) + return serials.Clone() as Serials; else if (self is SharedFeat sharedFeat) return sharedFeat.Clone() as SharedFeat; else if (self is SlotOption slotOption) diff --git a/SabreTools.Data.Models/Metadata/Serials.cs b/SabreTools.Data.Models/Metadata/Serials.cs index ecbc8a6b..d8abbd5e 100644 --- a/SabreTools.Data.Models/Metadata/Serials.cs +++ b/SabreTools.Data.Models/Metadata/Serials.cs @@ -1,57 +1,148 @@ +using System; using System.Xml.Serialization; using Newtonsoft.Json; namespace SabreTools.Data.Models.Metadata { [JsonObject("serials"), XmlRoot("serials")] - public class Serials : DatItem + public class Serials : DatItem, ICloneable, IEquatable { - #region Keys + #region Properties - /// string - public const string MediaSerial1Key = "mediaserial1"; + public string? BoxBarcode { get; set; } - /// string - public const string MediaSerial2Key = "mediaserial2"; + public string? BoxSerial { get; set; } - /// string - public const string MediaSerial3Key = "mediaserial3"; + public string? ChipSerial { get; set; } - /// string - public const string PCBSerialKey = "pcbserial"; + public string? DigitalSerial1 { get; set; } - /// string - public const string RomChipSerial1Key = "romchipserial1"; + public string? DigitalSerial2 { get; set; } - /// string - public const string RomChipSerial2Key = "romchipserial2"; + public string? LockoutSerial { get; set; } - /// string - public const string LockoutSerialKey = "lockoutserial"; + public string? MediaSerial1 { get; set; } - /// string - public const string SaveChipSerialKey = "savechipserial"; + public string? MediaSerial2 { get; set; } - /// string - public const string ChipSerialKey = "chipserial"; + public string? MediaSerial3 { get; set; } - /// string - public const string BoxSerialKey = "boxserial"; + public string? MediaStamp { get; set; } - /// string - public const string MediaStampKey = "mediastamp"; + public string? PCBSerial { get; set; } - /// string - public const string BoxBarcodeKey = "boxbarcode"; + public string? RomChipSerial1 { get; set; } - /// string - public const string DigitalSerial1Key = "digitalserial1"; + public string? RomChipSerial2 { get; set; } - /// string - public const string DigitalSerial2Key = "digitalserial2"; + public string? SaveChipSerial { get; set; } #endregion public Serials() => ItemType = ItemType.Serials; + + /// + public object Clone() + { + var obj = new Serials(); + + obj.BoxBarcode = BoxBarcode; + obj.BoxSerial = BoxSerial; + obj.ChipSerial = ChipSerial; + obj.DigitalSerial1 = DigitalSerial1; + obj.DigitalSerial2 = DigitalSerial2; + obj.LockoutSerial = LockoutSerial; + obj.MediaSerial1 = MediaSerial1; + obj.MediaSerial2 = MediaSerial2; + obj.MediaSerial3 = MediaSerial3; + obj.MediaStamp = MediaStamp; + obj.PCBSerial = PCBSerial; + obj.RomChipSerial1 = RomChipSerial1; + obj.RomChipSerial2 = RomChipSerial2; + obj.SaveChipSerial = SaveChipSerial; + + return obj; + } + + /// + public bool Equals(Serials? other) + { + // Null never matches + if (other is null) + return false; + + // Properties + if ((BoxBarcode is null) ^ (other.BoxBarcode is null)) + return false; + else if (BoxBarcode is not null && !BoxBarcode.Equals(other.BoxBarcode, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((BoxSerial is null) ^ (other.BoxSerial is null)) + return false; + else if (BoxSerial is not null && !BoxSerial.Equals(other.BoxSerial, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((ChipSerial is null) ^ (other.ChipSerial is null)) + return false; + else if (ChipSerial is not null && !ChipSerial.Equals(other.ChipSerial, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((DigitalSerial1 is null) ^ (other.DigitalSerial1 is null)) + return false; + else if (DigitalSerial1 is not null && !DigitalSerial1.Equals(other.DigitalSerial1, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((DigitalSerial2 is null) ^ (other.DigitalSerial2 is null)) + return false; + else if (DigitalSerial2 is not null && !DigitalSerial2.Equals(other.DigitalSerial2, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((LockoutSerial is null) ^ (other.LockoutSerial is null)) + return false; + else if (LockoutSerial is not null && !LockoutSerial.Equals(other.LockoutSerial, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((MediaSerial1 is null) ^ (other.MediaSerial1 is null)) + return false; + else if (MediaSerial1 is not null && !MediaSerial1.Equals(other.MediaSerial1, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((MediaSerial2 is null) ^ (other.MediaSerial2 is null)) + return false; + else if (MediaSerial2 is not null && !MediaSerial2.Equals(other.MediaSerial2, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((MediaSerial3 is null) ^ (other.MediaSerial3 is null)) + return false; + else if (MediaSerial3 is not null && !MediaSerial3.Equals(other.MediaSerial3, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((MediaStamp is null) ^ (other.MediaStamp is null)) + return false; + else if (MediaStamp is not null && !MediaStamp.Equals(other.MediaStamp, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((PCBSerial is null) ^ (other.PCBSerial is null)) + return false; + else if (PCBSerial is not null && !PCBSerial.Equals(other.PCBSerial, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((RomChipSerial1 is null) ^ (other.RomChipSerial1 is null)) + return false; + else if (RomChipSerial1 is not null && !RomChipSerial1.Equals(other.RomChipSerial1, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((RomChipSerial2 is null) ^ (other.RomChipSerial2 is null)) + return false; + else if (RomChipSerial2 is not null && !RomChipSerial2.Equals(other.RomChipSerial2, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((SaveChipSerial is null) ^ (other.SaveChipSerial is null)) + return false; + else if (SaveChipSerial is not null && !SaveChipSerial.Equals(other.SaveChipSerial, StringComparison.OrdinalIgnoreCase)) + return false; + + return true; + } } } diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index d92149f8..26083845 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -883,20 +883,20 @@ namespace SabreTools.Metadata.DatFiles.Test { return new Data.Models.Metadata.Serials { - [Data.Models.Metadata.Serials.MediaSerial1Key] = "mediaserial1", - [Data.Models.Metadata.Serials.MediaSerial2Key] = "mediaserial2", - [Data.Models.Metadata.Serials.MediaSerial3Key] = "mediaserial3", - [Data.Models.Metadata.Serials.PCBSerialKey] = "pcbserial", - [Data.Models.Metadata.Serials.RomChipSerial1Key] = "romchipserial1", - [Data.Models.Metadata.Serials.RomChipSerial2Key] = "romchipserial2", - [Data.Models.Metadata.Serials.LockoutSerialKey] = "lockoutserial", - [Data.Models.Metadata.Serials.SaveChipSerialKey] = "savechipserial", - [Data.Models.Metadata.Serials.ChipSerialKey] = "chipserial", - [Data.Models.Metadata.Serials.BoxSerialKey] = "boxserial", - [Data.Models.Metadata.Serials.MediaStampKey] = "mediastamp", - [Data.Models.Metadata.Serials.BoxBarcodeKey] = "boxbarcode", - [Data.Models.Metadata.Serials.DigitalSerial1Key] = "digitalserial1", - [Data.Models.Metadata.Serials.DigitalSerial2Key] = "digitalserial2", + 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", }; } @@ -1585,6 +1585,25 @@ namespace SabreTools.Metadata.DatFiles.Test 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); diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index f8569b77..c7884505 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -1144,20 +1144,20 @@ namespace SabreTools.Metadata.DatFiles.Test private static void ValidateMetadataSerials(Data.Models.Metadata.Serials? serials) { Assert.NotNull(serials); - Assert.Equal("mediaserial1", serials.ReadString(Data.Models.Metadata.Serials.MediaSerial1Key)); - Assert.Equal("mediaserial2", serials.ReadString(Data.Models.Metadata.Serials.MediaSerial2Key)); - Assert.Equal("mediaserial3", serials.ReadString(Data.Models.Metadata.Serials.MediaSerial3Key)); - Assert.Equal("pcbserial", serials.ReadString(Data.Models.Metadata.Serials.PCBSerialKey)); - Assert.Equal("romchipserial1", serials.ReadString(Data.Models.Metadata.Serials.RomChipSerial1Key)); - Assert.Equal("romchipserial2", serials.ReadString(Data.Models.Metadata.Serials.RomChipSerial2Key)); - Assert.Equal("lockoutserial", serials.ReadString(Data.Models.Metadata.Serials.LockoutSerialKey)); - Assert.Equal("savechipserial", serials.ReadString(Data.Models.Metadata.Serials.SaveChipSerialKey)); - Assert.Equal("chipserial", serials.ReadString(Data.Models.Metadata.Serials.ChipSerialKey)); - Assert.Equal("boxserial", serials.ReadString(Data.Models.Metadata.Serials.BoxSerialKey)); - Assert.Equal("mediastamp", serials.ReadString(Data.Models.Metadata.Serials.MediaStampKey)); - Assert.Equal("boxbarcode", serials.ReadString(Data.Models.Metadata.Serials.BoxBarcodeKey)); - Assert.Equal("digitalserial1", serials.ReadString(Data.Models.Metadata.Serials.DigitalSerial1Key)); - Assert.Equal("digitalserial2", serials.ReadString(Data.Models.Metadata.Serials.DigitalSerial2Key)); + 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 ValidateMetadataSharedFeat(Data.Models.Metadata.SharedFeat? sharedFeat) diff --git a/SabreTools.Metadata.DatItems/Formats/Serials.cs b/SabreTools.Metadata.DatItems/Formats/Serials.cs index f6e53643..16f7c562 100644 --- a/SabreTools.Metadata.DatItems/Formats/Serials.cs +++ b/SabreTools.Metadata.DatItems/Formats/Serials.cs @@ -12,10 +12,94 @@ namespace SabreTools.Metadata.DatItems.Formats { #region Fields + public string? BoxBarcode + { + get => (_internal as Data.Models.Metadata.Serials)?.BoxBarcode; + set => (_internal as Data.Models.Metadata.Serials)?.BoxBarcode = value; + } + + public string? BoxSerial + { + get => (_internal as Data.Models.Metadata.Serials)?.BoxSerial; + set => (_internal as Data.Models.Metadata.Serials)?.BoxSerial = value; + } + + public string? ChipSerial + { + get => (_internal as Data.Models.Metadata.Serials)?.ChipSerial; + set => (_internal as Data.Models.Metadata.Serials)?.ChipSerial = value; + } + + public string? DigitalSerial1 + { + get => (_internal as Data.Models.Metadata.Serials)?.DigitalSerial1; + set => (_internal as Data.Models.Metadata.Serials)?.DigitalSerial1 = value; + } + + public string? DigitalSerial2 + { + get => (_internal as Data.Models.Metadata.Serials)?.DigitalSerial2; + set => (_internal as Data.Models.Metadata.Serials)?.DigitalSerial2 = value; + } + /// /> public override Data.Models.Metadata.ItemType ItemType => Data.Models.Metadata.ItemType.Serials; + public string? LockoutSerial + { + get => (_internal as Data.Models.Metadata.Serials)?.LockoutSerial; + set => (_internal as Data.Models.Metadata.Serials)?.LockoutSerial = value; + } + + public string? MediaSerial1 + { + get => (_internal as Data.Models.Metadata.Serials)?.MediaSerial1; + set => (_internal as Data.Models.Metadata.Serials)?.MediaSerial1 = value; + } + + public string? MediaSerial2 + { + get => (_internal as Data.Models.Metadata.Serials)?.MediaSerial2; + set => (_internal as Data.Models.Metadata.Serials)?.MediaSerial2 = value; + } + + public string? MediaSerial3 + { + get => (_internal as Data.Models.Metadata.Serials)?.MediaSerial3; + set => (_internal as Data.Models.Metadata.Serials)?.MediaSerial3 = value; + } + + public string? MediaStamp + { + get => (_internal as Data.Models.Metadata.Serials)?.MediaStamp; + set => (_internal as Data.Models.Metadata.Serials)?.MediaStamp = value; + } + + public string? PCBSerial + { + get => (_internal as Data.Models.Metadata.Serials)?.PCBSerial; + set => (_internal as Data.Models.Metadata.Serials)?.PCBSerial = value; + } + + public string? RomChipSerial1 + { + get => (_internal as Data.Models.Metadata.Serials)?.RomChipSerial1; + set => (_internal as Data.Models.Metadata.Serials)?.RomChipSerial1 = value; + } + + public string? RomChipSerial2 + { + get => (_internal as Data.Models.Metadata.Serials)?.RomChipSerial2; + set => (_internal as Data.Models.Metadata.Serials)?.RomChipSerial2 = value; + } + + public string? SaveChipSerial + { + get => (_internal as Data.Models.Metadata.Serials)?.SaveChipSerial; + set => (_internal as Data.Models.Metadata.Serials)?.SaveChipSerial = value; + } + #endregion #region Constructors diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 098aaeeb..6fbf3fef 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -824,6 +824,49 @@ namespace SabreTools.Metadata.Filter checkValue = item.Value; return true; + case Serials item when fieldName == "boxbarcode": + checkValue = item.BoxBarcode; + return true; + case Serials item when fieldName == "boxserial": + checkValue = item.BoxSerial; + return true; + case Serials item when fieldName == "chipserial": + checkValue = item.ChipSerial; + return true; + case Serials item when fieldName == "digitalserial1": + checkValue = item.DigitalSerial1; + return true; + case Serials item when fieldName == "digitalserial2": + checkValue = item.DigitalSerial2; + return true; + case Serials item when fieldName == "lockoutserial": + checkValue = item.LockoutSerial; + return true; + case Serials item when fieldName == "mediaserial1": + checkValue = item.MediaSerial1; + return true; + case Serials item when fieldName == "mediaserial2": + checkValue = item.MediaSerial2; + return true; + case Serials item when fieldName == "mediaserial3": + checkValue = item.MediaSerial3; + return true; + case Serials item when fieldName == "mediastamp": + checkValue = item.MediaStamp; + return true; + case Serials item when fieldName == "pcbserial": + checkValue = item.PCBSerial; + return true; + case Serials item when fieldName == "romchipserial1": + checkValue = item.RomChipSerial1; + return true; + case Serials item when fieldName == "romchipserial2": + checkValue = item.RomChipSerial2; + return true; + case Serials item when fieldName == "savechipserial": + checkValue = item.SaveChipSerial; + return true; + case SharedFeat item when fieldName == "value": checkValue = item.Value; return true; diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index 0b82da0d..c49356c7 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -320,6 +320,11 @@ namespace SabreTools.Metadata { // Intentionally skipped here } + else if (self is Serials selfSerials && other is Serials otherSerials) + { + if (!selfSerials.Equals(otherSerials)) + return false; + } else if (self is SharedFeat selfSharedFeat && other is SharedFeat otherSharedFeat) { if (!selfSharedFeat.Equals(otherSharedFeat)) diff --git a/SabreTools.Serialization.Readers.Test/NoIntroDatabaseTests.cs b/SabreTools.Serialization.Readers.Test/NoIntroDatabaseTests.cs index 0f3cc338..0e94a0a5 100644 --- a/SabreTools.Serialization.Readers.Test/NoIntroDatabaseTests.cs +++ b/SabreTools.Serialization.Readers.Test/NoIntroDatabaseTests.cs @@ -168,20 +168,20 @@ namespace SabreTools.Serialization.Readers.Test var serials = new Data.Models.NoIntroDatabase.Serials { - MediaSerial1 = "XXXXXX", - MediaSerial2 = "XXXXXX", - MediaSerial3 = "XXXXXX", - PCBSerial = "XXXXXX", - RomChipSerial1 = "XXXXXX", - RomChipSerial2 = "XXXXXX", - LockoutSerial = "XXXXXX", - SaveChipSerial = "XXXXXX", - ChipSerial = "XXXXXX", - BoxSerial = "XXXXXX", - MediaStamp = "XXXXXX", - BoxBarcode = "XXXXXX", - DigitalSerial1 = "XXXXXX", - DigitalSerial2 = "XXXXXX", + 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", }; var file = new Data.Models.NoIntroDatabase.File @@ -388,20 +388,20 @@ namespace SabreTools.Serialization.Readers.Test private static void Validate(Data.Models.NoIntroDatabase.Serials? serials) { Assert.NotNull(serials); - Assert.Equal("XXXXXX", serials.MediaSerial1); - Assert.Equal("XXXXXX", serials.MediaSerial2); - Assert.Equal("XXXXXX", serials.MediaSerial3); - Assert.Equal("XXXXXX", serials.PCBSerial); - Assert.Equal("XXXXXX", serials.RomChipSerial1); - Assert.Equal("XXXXXX", serials.RomChipSerial2); - Assert.Equal("XXXXXX", serials.LockoutSerial); - Assert.Equal("XXXXXX", serials.SaveChipSerial); - Assert.Equal("XXXXXX", serials.ChipSerial); - Assert.Equal("XXXXXX", serials.BoxSerial); - Assert.Equal("XXXXXX", serials.MediaStamp); - Assert.Equal("XXXXXX", serials.BoxBarcode); - Assert.Equal("XXXXXX", serials.DigitalSerial1); - Assert.Equal("XXXXXX", serials.DigitalSerial2); + 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); } ///