Make Serials more complete

This commit is contained in:
Matt Nadareski
2026-04-03 18:50:04 -04:00
parent 97b04b26a3
commit c623c2b1f6
8 changed files with 330 additions and 86 deletions

View File

@@ -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)

View File

@@ -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<Serials>
{
#region Keys
#region Properties
/// <remarks>string</remarks>
public const string MediaSerial1Key = "mediaserial1";
public string? BoxBarcode { get; set; }
/// <remarks>string</remarks>
public const string MediaSerial2Key = "mediaserial2";
public string? BoxSerial { get; set; }
/// <remarks>string</remarks>
public const string MediaSerial3Key = "mediaserial3";
public string? ChipSerial { get; set; }
/// <remarks>string</remarks>
public const string PCBSerialKey = "pcbserial";
public string? DigitalSerial1 { get; set; }
/// <remarks>string</remarks>
public const string RomChipSerial1Key = "romchipserial1";
public string? DigitalSerial2 { get; set; }
/// <remarks>string</remarks>
public const string RomChipSerial2Key = "romchipserial2";
public string? LockoutSerial { get; set; }
/// <remarks>string</remarks>
public const string LockoutSerialKey = "lockoutserial";
public string? MediaSerial1 { get; set; }
/// <remarks>string</remarks>
public const string SaveChipSerialKey = "savechipserial";
public string? MediaSerial2 { get; set; }
/// <remarks>string</remarks>
public const string ChipSerialKey = "chipserial";
public string? MediaSerial3 { get; set; }
/// <remarks>string</remarks>
public const string BoxSerialKey = "boxserial";
public string? MediaStamp { get; set; }
/// <remarks>string</remarks>
public const string MediaStampKey = "mediastamp";
public string? PCBSerial { get; set; }
/// <remarks>string</remarks>
public const string BoxBarcodeKey = "boxbarcode";
public string? RomChipSerial1 { get; set; }
/// <remarks>string</remarks>
public const string DigitalSerial1Key = "digitalserial1";
public string? RomChipSerial2 { get; set; }
/// <remarks>string</remarks>
public const string DigitalSerial2Key = "digitalserial2";
public string? SaveChipSerial { get; set; }
#endregion
public Serials() => ItemType = ItemType.Serials;
/// <inheritdoc/>
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;
}
/// <inheritdoc/>
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;
}
}
}

View File

@@ -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);

View File

@@ -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)

View File

@@ -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;
}
/// <inheritdoc>/>
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

View File

@@ -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;

View File

@@ -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))

View File

@@ -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);
}
/// <summary>