Disc categories are the same, just ordered differently in the UI

This commit is contained in:
Matt Nadareski
2026-06-14 15:58:53 -04:00
parent 76ace7292c
commit 5c7de45f4f
11 changed files with 143 additions and 320 deletions

View File

@@ -40,6 +40,69 @@ namespace SabreTools.RedumpLib.Test.Data
#endregion
#region Disc Category
/// <summary>
/// Check that every DiscCategory has a long name provided
/// </summary>
/// <param name="discCategory">DiscCategory value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDiscCategoryTestData))]
public void DiscCategory_LongName(DiscCategory? discCategory, bool expectNull)
{
var actual = discCategory.LongName();
if (expectNull)
Assert.Null(actual);
else
Assert.NotNull(actual);
}
/// <summary>
/// Check that every DiscCategory can be mapped from a string
/// </summary>
/// <param name="discCategory">DiscCategory value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDiscCategoryTestData))]
public void DiscCategory_ToDiscCategory(DiscCategory? discCategory, bool expectNull)
{
string? longName = discCategory.LongName();
string? longNameSpaceless = longName?.Replace(" ", string.Empty);
var actualNormal = longName.ToDiscCategory();
var actualSpaceless = longNameSpaceless.ToDiscCategory();
if (expectNull)
{
Assert.Null(actualNormal);
Assert.Null(actualSpaceless);
}
else
{
Assert.Equal(discCategory, actualNormal);
Assert.Equal(discCategory, actualSpaceless);
}
}
/// <summary>
/// Generate a test set of DiscCategory values
/// </summary>
/// <returns>MemberData-compatible list of DiscCategory values</returns>
public static TheoryData<DiscCategory?, bool> GenerateDiscCategoryTestData()
{
var testData = new TheoryData<DiscCategory?, bool>() { { null, true } };
foreach (DiscCategory? discCategory in Enum.GetValues<DiscCategory>().Cast<DiscCategory?>())
{
testData.Add(discCategory, false);
}
return testData;
}
#endregion
#region Language
/// <summary>

View File

@@ -117,69 +117,6 @@ namespace SabreTools.RedumpLib.Test.RedumpInfo
#endregion
#region Disc Category
/// <summary>
/// Check that every DiscCategory has a long name provided
/// </summary>
/// <param name="discCategory">DiscCategory value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDiscCategoryTestData))]
public void DiscCategory_LongName(DiscCategory? discCategory, bool expectNull)
{
var actual = discCategory.LongName();
if (expectNull)
Assert.Null(actual);
else
Assert.NotNull(actual);
}
/// <summary>
/// Check that every DiscCategory can be mapped from a string
/// </summary>
/// <param name="discCategory">DiscCategory value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDiscCategoryTestData))]
public void DiscCategory_ToDiscCategory(DiscCategory? discCategory, bool expectNull)
{
string? longName = discCategory.LongName();
string? longNameSpaceless = longName?.Replace(" ", string.Empty);
var actualNormal = longName.ToDiscCategory();
var actualSpaceless = longNameSpaceless.ToDiscCategory();
if (expectNull)
{
Assert.Null(actualNormal);
Assert.Null(actualSpaceless);
}
else
{
Assert.Equal(discCategory, actualNormal);
Assert.Equal(discCategory, actualSpaceless);
}
}
/// <summary>
/// Generate a test set of DiscCategory values
/// </summary>
/// <returns>MemberData-compatible list of DiscCategory values</returns>
public static TheoryData<DiscCategory?, bool> GenerateDiscCategoryTestData()
{
var testData = new TheoryData<DiscCategory?, bool>() { { null, true } };
foreach (DiscCategory? discCategory in Enum.GetValues<DiscCategory>().Cast<DiscCategory?>())
{
testData.Add(discCategory, false);
}
return testData;
}
#endregion
#region Disc Subpath
/// <summary>

View File

@@ -118,69 +118,6 @@ namespace SabreTools.RedumpLib.Test.RedumpOrg
#endregion
#region Disc Category
/// <summary>
/// Check that every DiscCategory has a long name provided
/// </summary>
/// <param name="discCategory">DiscCategory value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDiscCategoryTestData))]
public void DiscCategory_LongName(DiscCategory? discCategory, bool expectNull)
{
var actual = discCategory.LongName();
if (expectNull)
Assert.Null(actual);
else
Assert.NotNull(actual);
}
/// <summary>
/// Check that every DiscCategory can be mapped from a string
/// </summary>
/// <param name="discCategory">DiscCategory value to check</param>
/// <param name="expectNull">True to expect a null value, false otherwise</param>
[Theory]
[MemberData(nameof(GenerateDiscCategoryTestData))]
public void DiscCategory_ToDiscCategory(DiscCategory? discCategory, bool expectNull)
{
string? longName = discCategory.LongName();
string? longNameSpaceless = longName?.Replace(" ", string.Empty);
var actualNormal = longName.ToDiscCategory();
var actualSpaceless = longNameSpaceless.ToDiscCategory();
if (expectNull)
{
Assert.Null(actualNormal);
Assert.Null(actualSpaceless);
}
else
{
Assert.Equal(discCategory, actualNormal);
Assert.Equal(discCategory, actualSpaceless);
}
}
/// <summary>
/// Generate a test set of DiscCategory values
/// </summary>
/// <returns>MemberData-compatible list of DiscCategory values</returns>
public static TheoryData<DiscCategory?, bool> GenerateDiscCategoryTestData()
{
var testData = new TheoryData<DiscCategory?, bool>() { { null, true } };
foreach (DiscCategory? discCategory in Enum.GetValues<DiscCategory>().Cast<DiscCategory?>())
{
testData.Add(discCategory, false);
}
return testData;
}
#endregion
#region Disc Subpath
/// <summary>

View File

@@ -1,9 +1,9 @@
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SabreTools.RedumpLib.RedumpOrg.Data;
using SabreTools.RedumpLib.Data;
namespace SabreTools.RedumpLib.RedumpOrg.Converters
namespace SabreTools.RedumpLib.Converters
{
/// <summary>
/// Serialize DiscCategory enum values

View File

@@ -2,6 +2,45 @@ using SabreTools.RedumpLib.Attributes;
namespace SabreTools.RedumpLib.Data
{
/// <summary>
/// List of all disc categories
/// </summary>
public enum DiscCategory
{
[HumanReadable(LongName = "Games")]
Games = 1,
[HumanReadable(LongName = "Demos")]
Demos = 2,
[HumanReadable(LongName = "Video")]
Video = 3,
[HumanReadable(LongName = "Audio")]
Audio = 4,
[HumanReadable(LongName = "Multimedia")]
Multimedia = 5,
[HumanReadable(LongName = "Applications")]
Applications = 6,
[HumanReadable(LongName = "Coverdiscs")]
Coverdiscs = 7,
[HumanReadable(LongName = "Educational")]
Educational = 8,
[HumanReadable(LongName = "Bonus Discs")]
BonusDiscs = 9,
[HumanReadable(LongName = "Preproduction")]
Preproduction = 10,
[HumanReadable(LongName = "Add-Ons")]
AddOns = 11,
}
/// <summary>
/// List of all disc langauges
/// </summary>

View File

@@ -806,6 +806,45 @@ namespace SabreTools.RedumpLib.Data
#endregion
#region Disc Category
/// <summary>
/// Get the Redump longnames for each known category
/// </summary>
public static string? LongName(this DiscCategory category)
=> ((DiscCategory?)category).LongName();
/// <summary>
/// Get the Redump longnames for each known category
/// </summary>
public static string? LongName(this DiscCategory? category)
=> AttributeHelper<DiscCategory?>.GetHumanReadableAttribute(category)?.LongName;
/// <summary>
/// Get the Category enum value for a given string
/// </summary>
/// <param name="category">String value to convert</param>
/// <returns>Category represented by the string, if possible</returns>
public static DiscCategory? ToDiscCategory(this string? category)
{
// No value means no match
if (category is null || category.Length == 0)
return null;
category = category?.ToLowerInvariant();
var categories = (DiscCategory[])Enum.GetValues(typeof(DiscCategory));
// Check long names
int index = Array.FindIndex(categories, c => category == c.LongName()?.ToLowerInvariant()
|| category == c.LongName()?.Replace(" ", string.Empty)?.ToLowerInvariant());
if (index > -1)
return categories[index];
return null;
}
#endregion
#region Language
/// <summary>

View File

@@ -1,35 +0,0 @@
using System;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SabreTools.RedumpLib.RedumpInfo.Data;
namespace SabreTools.RedumpLib.RedumpInfo.Converters
{
/// <summary>
/// Serialize DiscCategory enum values
/// </summary>
public class DiscCategoryConverter : JsonConverter<DiscCategory?>
{
public override bool CanRead { get { return true; } }
public override DiscCategory? ReadJson(JsonReader reader, Type objectType, DiscCategory? existingValue, bool hasExistingValue, JsonSerializer serializer)
{
// If we have a value already, don't overwrite it
if (hasExistingValue)
return existingValue;
// Read the value
if (reader.Value is not string value)
return null;
// Try to parse the value
return value.ToDiscCategory();
}
public override void WriteJson(JsonWriter writer, DiscCategory? value, JsonSerializer serializer)
{
JToken t = JToken.FromObject(value.LongName() ?? string.Empty);
t.WriteTo(writer);
}
}
}

View File

@@ -2,45 +2,6 @@ using SabreTools.RedumpLib.Attributes;
namespace SabreTools.RedumpLib.RedumpInfo.Data
{
/// <summary>
/// List of all disc categories
/// </summary>
public enum DiscCategory
{
[HumanReadable(LongName = "Add-Ons")]
AddOns,
[HumanReadable(LongName = "Applications")]
Applications,
[HumanReadable(LongName = "Audio")]
Audio,
[HumanReadable(LongName = "Bonus Discs")]
BonusDiscs,
[HumanReadable(LongName = "Coverdiscs")]
Coverdiscs,
[HumanReadable(LongName = "Demos")]
Demos,
[HumanReadable(LongName = "Educational")]
Educational,
[HumanReadable(LongName = "Games")]
Games,
[HumanReadable(LongName = "Multimedia")]
Multimedia,
[HumanReadable(LongName = "Preproduction")]
Preproduction,
[HumanReadable(LongName = "Video")]
Video,
}
/// <summary>
/// List of all disc subpaths
/// </summary>

View File

@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using SabreTools.RedumpLib.Attributes;
using SabreTools.RedumpLib.Data;
@@ -100,45 +99,6 @@ namespace SabreTools.RedumpLib.RedumpInfo.Data
#endregion
#region Disc Category
/// <summary>
/// Get the Redump longnames for each known category
/// </summary>
public static string? LongName(this DiscCategory category)
=> ((DiscCategory?)category).LongName();
/// <summary>
/// Get the Redump longnames for each known category
/// </summary>
public static string? LongName(this DiscCategory? category)
=> AttributeHelper<DiscCategory?>.GetHumanReadableAttribute(category)?.LongName;
/// <summary>
/// Get the Category enum value for a given string
/// </summary>
/// <param name="category">String value to convert</param>
/// <returns>Category represented by the string, if possible</returns>
public static DiscCategory? ToDiscCategory(this string? category)
{
// No value means no match
if (category is null || category.Length == 0)
return null;
category = category?.ToLowerInvariant();
var categories = (DiscCategory[])Enum.GetValues(typeof(DiscCategory));
// Check long names
int index = Array.FindIndex(categories, c => category == c.LongName()?.ToLowerInvariant()
|| category == c.LongName()?.Replace(" ", string.Empty)?.ToLowerInvariant());
if (index > -1)
return categories[index];
return null;
}
#endregion
#region Disc Subpath
/// <summary>

View File

@@ -2,45 +2,6 @@ using SabreTools.RedumpLib.Attributes;
namespace SabreTools.RedumpLib.RedumpOrg.Data
{
/// <summary>
/// List of all disc categories
/// </summary>
public enum DiscCategory
{
[HumanReadable(LongName = "Games")]
Games = 1,
[HumanReadable(LongName = "Demos")]
Demos = 2,
[HumanReadable(LongName = "Video")]
Video = 3,
[HumanReadable(LongName = "Audio")]
Audio = 4,
[HumanReadable(LongName = "Multimedia")]
Multimedia = 5,
[HumanReadable(LongName = "Applications")]
Applications = 6,
[HumanReadable(LongName = "Coverdiscs")]
Coverdiscs = 7,
[HumanReadable(LongName = "Educational")]
Educational = 8,
[HumanReadable(LongName = "Bonus Discs")]
BonusDiscs = 9,
[HumanReadable(LongName = "Preproduction")]
Preproduction = 10,
[HumanReadable(LongName = "Add-Ons")]
AddOns = 11,
}
/// <summary>
/// List of all disc subpaths
/// </summary>

View File

@@ -71,45 +71,6 @@ namespace SabreTools.RedumpLib.RedumpOrg.Data
#endregion
#region Disc Category
/// <summary>
/// Get the Redump longnames for each known category
/// </summary>
public static string? LongName(this DiscCategory category)
=> ((DiscCategory?)category).LongName();
/// <summary>
/// Get the Redump longnames for each known category
/// </summary>
public static string? LongName(this DiscCategory? category)
=> AttributeHelper<DiscCategory?>.GetHumanReadableAttribute(category)?.LongName;
/// <summary>
/// Get the Category enum value for a given string
/// </summary>
/// <param name="category">String value to convert</param>
/// <returns>Category represented by the string, if possible</returns>
public static DiscCategory? ToDiscCategory(this string? category)
{
// No value means no match
if (category is null || category.Length == 0)
return null;
category = category?.ToLowerInvariant();
var categories = (DiscCategory[])Enum.GetValues(typeof(DiscCategory));
// Check long names
int index = Array.FindIndex(categories, c => category == c.LongName()?.ToLowerInvariant()
|| category == c.LongName()?.Replace(" ", string.Empty)?.ToLowerInvariant());
if (index > -1)
return categories[index];
return null;
}
#endregion
#region Disc Subpath
/// <summary>