Convert Release fully over to properties

This commit is contained in:
Matt Nadareski
2026-04-03 14:02:03 -04:00
parent 62b2fd3325
commit 52edf9d20c
18 changed files with 136 additions and 69 deletions

View File

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

View File

@@ -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<Release>
{
#region Properties
public string? Date { get; set; }
/// <remarks>(yes|no) "no"</remarks>
public bool? Default { get; set; }
public string? Language { get; set; }
public string? Name { get; set; }
#endregion
#region Keys
/// <remarks>string</remarks>
public const string DateKey = "date";
/// <remarks>string</remarks>
public const string LanguageKey = "language";
/// <remarks>string</remarks>
public const string RegionKey = "region";
public string? Region { get; set; }
#endregion
public Release() => ItemType = ItemType.Release;
/// <inheritdoc/>
public object Clone()
{
var obj = new Release();
obj.Date = Date;
obj.Default = Default;
obj.Language = Language;
obj.Name = Name;
obj.Region = Region;
return obj;
}
/// <inheritdoc/>
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;
}
}
}

View File

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

View File

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

View File

@@ -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),
]));
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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