diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 174b67bf..90f7c6df 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -178,6 +178,8 @@ namespace SabreTools.Data.Extensions return original.Clone() as Original; else if (self is RamOption ramOption) return ramOption.Clone() as RamOption; + else if (self is Release release) + return release.Clone() as Release; else if (self is SharedFeat sharedFeat) return sharedFeat.Clone() as SharedFeat; else if (self is SlotOption slotOption) @@ -311,10 +313,6 @@ namespace SabreTools.Data.Extensions { clonePort.Tag = selfPort.Tag; } - else if (self is Release selfRelease && clone is Release cloneRelease) - { - cloneRelease.Default = selfRelease.Default; - } else if (self is Rom selfRom && clone is Rom cloneRom) { cloneRom.Dispose = selfRom.Dispose; diff --git a/SabreTools.Data.Models/Metadata/Release.cs b/SabreTools.Data.Models/Metadata/Release.cs index c3e64cd5..62421b05 100644 --- a/SabreTools.Data.Models/Metadata/Release.cs +++ b/SabreTools.Data.Models/Metadata/Release.cs @@ -1,33 +1,75 @@ +using System; using System.Xml.Serialization; using Newtonsoft.Json; namespace SabreTools.Data.Models.Metadata { [JsonObject("release"), XmlRoot("release")] - public class Release : DatItem + public class Release : DatItem, ICloneable, IEquatable { #region Properties + public string? Date { get; set; } + /// (yes|no) "no" public bool? Default { get; set; } + public string? Language { get; set; } + public string? Name { get; set; } - #endregion - - #region Keys - - /// string - public const string DateKey = "date"; - - /// string - public const string LanguageKey = "language"; - - /// string - public const string RegionKey = "region"; + public string? Region { get; set; } #endregion public Release() => ItemType = ItemType.Release; + + /// + public object Clone() + { + var obj = new Release(); + + obj.Date = Date; + obj.Default = Default; + obj.Language = Language; + obj.Name = Name; + obj.Region = Region; + + return obj; + } + + /// + public bool Equals(Release? other) + { + // Null never matches + if (other is null) + return false; + + // Properties + if ((Date is null) ^ (other.Date is null)) + return false; + else if (Date is not null && !Date.Equals(other.Date, StringComparison.OrdinalIgnoreCase)) + return false; + + if (Default != other.Default) + return false; + + if ((Language is null) ^ (other.Language is null)) + return false; + else if (Language is not null && !Language.Equals(other.Language, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Name is null) ^ (other.Name is null)) + return false; + else if (Name is not null && !Name.Equals(other.Name, StringComparison.OrdinalIgnoreCase)) + return false; + + if ((Region is null) ^ (other.Region is null)) + return false; + else if (Region is not null && !Region.Equals(other.Region, 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 ff4ce2ab..d89e020a 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -737,11 +737,11 @@ namespace SabreTools.Metadata.DatFiles.Test { return new Data.Models.Metadata.Release { - [Data.Models.Metadata.Release.DateKey] = "date", + Date = "date", Default = true, - [Data.Models.Metadata.Release.LanguageKey] = "language", + Language = "language", Name = "name", - [Data.Models.Metadata.Release.RegionKey] = "region", + Region = "region", }; } @@ -1484,11 +1484,11 @@ namespace SabreTools.Metadata.DatFiles.Test private static void ValidateRelease(Release? release) { Assert.NotNull(release); - Assert.Equal("date", release.ReadString(Data.Models.Metadata.Release.DateKey)); + Assert.Equal("date", release.Date); Assert.True(release.Default); - Assert.Equal("language", release.ReadString(Data.Models.Metadata.Release.LanguageKey)); + Assert.Equal("language", release.Language); Assert.Equal("name", release.Name); - Assert.Equal("region", release.ReadString(Data.Models.Metadata.Release.RegionKey)); + Assert.Equal("region", release.Region); } private static void ValidateRom(Rom? rom) diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 3734d6ba..c961a2cb 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -1006,11 +1006,11 @@ namespace SabreTools.Metadata.DatFiles.Test private static void ValidateMetadataRelease(Data.Models.Metadata.Release? release) { Assert.NotNull(release); - Assert.Equal("date", release.ReadString(Data.Models.Metadata.Release.DateKey)); + Assert.Equal("date", release.Date); Assert.True(release.Default); - Assert.Equal("language", release.ReadString(Data.Models.Metadata.Release.LanguageKey)); + Assert.Equal("language", release.Language); Assert.Equal("name", release.Name); - Assert.Equal("region", release.ReadString(Data.Models.Metadata.Release.RegionKey)); + Assert.Equal("region", release.Region); } private static void ValidateMetadataReleaseDetails(Data.Models.Metadata.ReleaseDetails? releaseDetails) diff --git a/SabreTools.Metadata.DatFiles.Test/FormatsTests.cs b/SabreTools.Metadata.DatFiles.Test/FormatsTests.cs index 30522099..deabf3d3 100644 --- a/SabreTools.Metadata.DatFiles.Test/FormatsTests.cs +++ b/SabreTools.Metadata.DatFiles.Test/FormatsTests.cs @@ -97,7 +97,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(actual); Assert.True(actual.SequenceEqual([ nameof(Data.Models.Metadata.Release.Name), - Data.Models.Metadata.Release.RegionKey, + nameof(Data.Models.Metadata.Release.Region), ])); } @@ -1093,7 +1093,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(actual); Assert.True(actual.SequenceEqual([ nameof(Data.Models.Metadata.Release.Name), - Data.Models.Metadata.Release.RegionKey, + nameof(Data.Models.Metadata.Release.Region), ])); } diff --git a/SabreTools.Metadata.DatFiles/Formats/ClrMamePro.cs b/SabreTools.Metadata.DatFiles/Formats/ClrMamePro.cs index 504f0966..a2912b25 100644 --- a/SabreTools.Metadata.DatFiles/Formats/ClrMamePro.cs +++ b/SabreTools.Metadata.DatFiles/Formats/ClrMamePro.cs @@ -76,8 +76,8 @@ namespace SabreTools.Metadata.DatFiles.Formats case Release release: if (string.IsNullOrEmpty(release.Name)) missingFields.Add(nameof(Data.Models.Metadata.Release.Name)); - if (string.IsNullOrEmpty(release.ReadString(Data.Models.Metadata.Release.RegionKey))) - missingFields.Add(Data.Models.Metadata.Release.RegionKey); + if (string.IsNullOrEmpty(release.Region)) + missingFields.Add(nameof(Data.Models.Metadata.Release.Region)); break; case BiosSet biosset: diff --git a/SabreTools.Metadata.DatFiles/Formats/Logiqx.cs b/SabreTools.Metadata.DatFiles/Formats/Logiqx.cs index aa421835..3e31fb2f 100644 --- a/SabreTools.Metadata.DatFiles/Formats/Logiqx.cs +++ b/SabreTools.Metadata.DatFiles/Formats/Logiqx.cs @@ -268,8 +268,8 @@ namespace SabreTools.Metadata.DatFiles.Formats case Release release: if (string.IsNullOrEmpty(release.Name)) missingFields.Add(nameof(Data.Models.Metadata.Release.Name)); - if (string.IsNullOrEmpty(release.ReadString(Data.Models.Metadata.Release.RegionKey))) - missingFields.Add(Data.Models.Metadata.Release.RegionKey); + if (string.IsNullOrEmpty(release.Region)) + missingFields.Add(nameof(Data.Models.Metadata.Release.Region)); break; case BiosSet biosset: diff --git a/SabreTools.Metadata.DatItems/Formats/Release.cs b/SabreTools.Metadata.DatItems/Formats/Release.cs index 2810a57b..61acea52 100644 --- a/SabreTools.Metadata.DatItems/Formats/Release.cs +++ b/SabreTools.Metadata.DatItems/Formats/Release.cs @@ -12,6 +12,12 @@ namespace SabreTools.Metadata.DatItems.Formats { #region Properties + public string? Date + { + get => (_internal as Data.Models.Metadata.Release)?.Date; + set => (_internal as Data.Models.Metadata.Release)?.Date = value; + } + public bool? Default { get => (_internal as Data.Models.Metadata.Release)?.Default; @@ -22,12 +28,24 @@ namespace SabreTools.Metadata.DatItems.Formats public override Data.Models.Metadata.ItemType ItemType => Data.Models.Metadata.ItemType.Release; + public string? Language + { + get => (_internal as Data.Models.Metadata.Release)?.Language; + set => (_internal as Data.Models.Metadata.Release)?.Language = value; + } + public string? Name { get => (_internal as Data.Models.Metadata.Release)?.Name; set => (_internal as Data.Models.Metadata.Release)?.Name = value; } + public string? Region + { + get => (_internal as Data.Models.Metadata.Release)?.Region; + set => (_internal as Data.Models.Metadata.Release)?.Region = value; + } + #endregion #region Constructors diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index a85958b9..af8221e1 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -771,9 +771,18 @@ namespace SabreTools.Metadata.Filter checkValue = item.Default.FromYesNo(); return true; + case Release item when fieldName == "date": + checkValue = item.Date; + return true; case Release item when fieldName == "default": checkValue = item.Default.FromYesNo(); return true; + case Release item when fieldName == "language": + checkValue = item.Language; + return true; + case Release item when fieldName == "region": + checkValue = item.Region; + return true; case Rom item when fieldName == "dispose": checkValue = item.Dispose.FromYesNo(); diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index e406cd7d..a89f2d74 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -311,7 +311,7 @@ namespace SabreTools.Metadata } else if (self is Release selfRelease && other is Release otherRelease) { - if (selfRelease.Default != otherRelease.Default) + if (!selfRelease.Equals(otherRelease)) return false; } else if (self is Rom selfRom && other is Rom otherRom) diff --git a/SabreTools.Serialization.CrossModel.Test/ClrMameProTests.cs b/SabreTools.Serialization.CrossModel.Test/ClrMameProTests.cs index 2ad54d8e..07d56805 100644 --- a/SabreTools.Serialization.CrossModel.Test/ClrMameProTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/ClrMameProTests.cs @@ -81,9 +81,9 @@ namespace SabreTools.Serialization.CrossModel.Test var release = new Data.Models.ClrMamePro.Release { Name = "name", - Region = "XXXXXX", - Language = "XXXXXX", - Date = "XXXXXX", + Region = "region", + Language = "language", + Date = "date", Default = true, }; @@ -336,9 +336,9 @@ namespace SabreTools.Serialization.CrossModel.Test { Assert.NotNull(release); Assert.Equal("name", release.Name); - Assert.Equal("XXXXXX", release.Region); - Assert.Equal("XXXXXX", release.Language); - Assert.Equal("XXXXXX", release.Date); + Assert.Equal("region", release.Region); + Assert.Equal("language", release.Language); + Assert.Equal("date", release.Date); Assert.Equal(true, release.Default); } diff --git a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs index c3b2ecaf..8ff4567a 100644 --- a/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/LogiqxTests.cs @@ -132,9 +132,9 @@ namespace SabreTools.Serialization.CrossModel.Test var release = new Data.Models.Logiqx.Release { Name = "name", - Region = "XXXXXX", - Language = "XXXXXX", - Date = "XXXXXX", + Region = "region", + Language = "language", + Date = "date", Default = true, }; @@ -440,9 +440,9 @@ namespace SabreTools.Serialization.CrossModel.Test { Assert.NotNull(release); Assert.Equal("name", release.Name); - Assert.Equal("XXXXXX", release.Region); - Assert.Equal("XXXXXX", release.Language); - Assert.Equal("XXXXXX", release.Date); + Assert.Equal("region", release.Region); + Assert.Equal("language", release.Language); + Assert.Equal("date", release.Date); Assert.Equal(true, release.Default); } diff --git a/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs b/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs index c793ed03..1b5748fd 100644 --- a/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/ClrMamePro.Deserializer.cs @@ -263,9 +263,9 @@ namespace SabreTools.Serialization.CrossModel var release = new Release { Name = item.Name, - Region = item.ReadString(Data.Models.Metadata.Release.RegionKey), - Language = item.ReadString(Data.Models.Metadata.Release.LanguageKey), - Date = item.ReadString(Data.Models.Metadata.Release.DateKey), + Region = item.Region, + Language = item.Language, + Date = item.Date, Default = item.Default, }; return release; diff --git a/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs b/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs index ef95a63d..7df8a8af 100644 --- a/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/ClrMamePro.Serializer.cs @@ -276,9 +276,9 @@ namespace SabreTools.Serialization.CrossModel var release = new Data.Models.Metadata.Release { Name = item.Name, - [Data.Models.Metadata.Release.RegionKey] = item.Region, - [Data.Models.Metadata.Release.LanguageKey] = item.Language, - [Data.Models.Metadata.Release.DateKey] = item.Date, + Region = item.Region, + Language = item.Language, + Date = item.Date, Default = item.Default, }; return release; diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs index aeeca2bc..b23b4f10 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Deserializer.cs @@ -285,9 +285,9 @@ namespace SabreTools.Serialization.CrossModel var release = new Release { Name = item.Name, - Region = item.ReadString(Data.Models.Metadata.Release.RegionKey), - Language = item.ReadString(Data.Models.Metadata.Release.LanguageKey), - Date = item.ReadString(Data.Models.Metadata.Release.DateKey), + Region = item.Region, + Language = item.Language, + Date = item.Date, Default = item.Default, }; return release; diff --git a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs index 7ef34233..7509ecd5 100644 --- a/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Logiqx.Serializer.cs @@ -279,9 +279,9 @@ namespace SabreTools.Serialization.CrossModel var release = new Data.Models.Metadata.Release { Name = item.Name, - [Data.Models.Metadata.Release.RegionKey] = item.Region, - [Data.Models.Metadata.Release.LanguageKey] = item.Language, - [Data.Models.Metadata.Release.DateKey] = item.Date, + Region = item.Region, + Language = item.Language, + Date = item.Date, Default = item.Default, }; return release; diff --git a/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs b/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs index eb63d1fd..088fc654 100644 --- a/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs +++ b/SabreTools.Serialization.Readers.Test/ClrMameProTests.cs @@ -198,9 +198,9 @@ namespace SabreTools.Serialization.Readers.Test var release = new Data.Models.ClrMamePro.Release { Name = "name", - Region = "XXXXXX", - Language = "XXXXXX", - Date = "XXXXXX", + Region = "region", + Language = "language", + Date = "date", Default = true, }; @@ -453,9 +453,9 @@ namespace SabreTools.Serialization.Readers.Test { Assert.NotNull(release); Assert.Equal("name", release.Name); - Assert.Equal("XXXXXX", release.Region); - Assert.Equal("XXXXXX", release.Language); - Assert.Equal("XXXXXX", release.Date); + Assert.Equal("region", release.Region); + Assert.Equal("language", release.Language); + Assert.Equal("date", release.Date); Assert.Equal(true, release.Default); } diff --git a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs index 7334a420..45c18740 100644 --- a/SabreTools.Serialization.Readers.Test/LogiqxTests.cs +++ b/SabreTools.Serialization.Readers.Test/LogiqxTests.cs @@ -197,9 +197,9 @@ namespace SabreTools.Serialization.Readers.Test var release = new Data.Models.Logiqx.Release { Name = "name", - Region = "XXXXXX", - Language = "XXXXXX", - Date = "XXXXXX", + Region = "region", + Language = "language", + Date = "date", Default = true, }; @@ -490,9 +490,9 @@ namespace SabreTools.Serialization.Readers.Test { Assert.NotNull(release); Assert.Equal("name", release.Name); - Assert.Equal("XXXXXX", release.Region); - Assert.Equal("XXXXXX", release.Language); - Assert.Equal("XXXXXX", release.Date); + Assert.Equal("region", release.Region); + Assert.Equal("language", release.Language); + Assert.Equal("date", release.Date); Assert.Equal(true, release.Default); }