Handle an enum that needed to be handled

This commit is contained in:
Matt Nadareski
2026-04-03 17:41:36 -04:00
parent e01537c2f4
commit 9df08780db
18 changed files with 111 additions and 26 deletions

View File

@@ -1879,6 +1879,22 @@ namespace SabreTools.Data.Extensions.Test
Assert.Equal(expected, actual);
}
[Theory]
[InlineData(null, null)]
[InlineData("8", Width.Byte)]
[InlineData("byte", Width.Byte)]
[InlineData("16", Width.Short)]
[InlineData("short", Width.Short)]
[InlineData("32", Width.Int)]
[InlineData("int", Width.Int)]
[InlineData("64", Width.Long)]
[InlineData("long", Width.Long)]
public void AsWidth(string? field, Width? expected)
{
Width? actual = field.AsWidth();
Assert.Equal(expected, actual);
}
[Theory]
[InlineData(null, null)]
[InlineData("INVALID", null)]
@@ -2205,6 +2221,18 @@ namespace SabreTools.Data.Extensions.Test
Assert.Equal(expected, actual);
}
[Theory]
[InlineData((Width)int.MaxValue, null)]
[InlineData(Width.Byte, "8")]
[InlineData(Width.Short, "16")]
[InlineData(Width.Int, "32")]
[InlineData(Width.Long, "64")]
public void FromWidthTest(Width field, string? expected)
{
string? actual = field.AsStringValue();
Assert.Equal(expected, actual);
}
[Theory]
[InlineData(null, null)]
[InlineData(true, "yes")]

View File

@@ -218,6 +218,7 @@ namespace SabreTools.Data.Extensions
{
cloneDataArea.Endianness = selfDataArea.Endianness;
cloneDataArea.Size = selfDataArea.Size;
cloneDataArea.Width = selfDataArea.Width;
}
else if (self is Device selfDevice && clone is Device cloneDevice)
{
@@ -1448,6 +1449,23 @@ namespace SabreTools.Data.Extensions
};
}
/// <summary>
/// Get the enum value for an input string, if possible
/// </summary>
/// <param name="value">String value to parse/param>
/// <returns>Enum value representing the input, null on error</returns>
public static Width? AsWidth(this string? value)
{
return value?.ToLowerInvariant() switch
{
"8" or "byte" => Width.Byte,
"16" or "short" => Width.Short,
"32" or "int" => Width.Int,
"64" or "long" => Width.Long,
_ => null,
};
}
/// <summary>
/// Get bool? value from input string
/// </summary>
@@ -1839,6 +1857,23 @@ namespace SabreTools.Data.Extensions
};
}
/// <summary>
/// Get the string value for an input enum, if possible
/// </summary>
/// <param name="value">Enum value to parse/param>
/// <returns>String value representing the input, null on error</returns>
public static string? AsStringValue(this Width value)
{
return value switch
{
Width.Byte =>"8",
Width.Short =>"16",
Width.Int =>"32",
Width.Long =>"64",
_ => null,
};
}
/// <summary>
/// Get the string value for an input enum, if possible
/// </summary>

View File

@@ -15,6 +15,9 @@ namespace SabreTools.Data.Models.Metadata
public long? Size { get; set; }
/// <remarks>(8|16|32|64) "8"</remarks>
public Width? Width { get; set; }
#endregion
#region Keys
@@ -23,10 +26,6 @@ namespace SabreTools.Data.Models.Metadata
[NoFilter]
public const string RomKey = "rom";
/// <remarks>(8|16|32|64) "8"</remarks>
/// TODO: Convert to enum
public const string WidthKey = "width";
#endregion
public DataArea() => ItemType = ItemType.DataArea;

View File

@@ -574,4 +574,22 @@ namespace SabreTools.Data.Models.Metadata
/// <summary>"test"</summary>
Test,
}
/// <summary>
/// Determine area width
/// </summary>
public enum Width
{
/// <summary>8</summary>
Byte = 8,
/// <summary>16</summary>
Short = 16,
/// <summary>32</summary>
Int = 32,
/// <summary>64</summary>
Long = 64,
}
}

View File

@@ -17,7 +17,7 @@ namespace SabreTools.Data.Models.SoftwareList
/// <remarks>(8|16|32|64) "8"</remarks>
[XmlAttribute("width")]
public string? Width { get; set; }
public Width? Width { get; set; }
/// <remarks>(big|little) "little"</remarks>
[XmlAttribute("endianness")]

View File

@@ -543,7 +543,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Name = "name",
[Data.Models.Metadata.DataArea.RomKey] = new Data.Models.Metadata.Rom[] { [] },
Size = 12345,
[Data.Models.Metadata.DataArea.WidthKey] = 64,
Width = Data.Models.Metadata.Width.Long,
};
}
@@ -1236,7 +1236,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal(Data.Models.Metadata.Endianness.Big, dataArea.Endianness);
Assert.Equal("name", dataArea.Name);
Assert.Equal(12345, dataArea.Size);
Assert.Equal(64, dataArea.ReadLong(Data.Models.Metadata.DataArea.WidthKey));
Assert.Equal(Data.Models.Metadata.Width.Long, dataArea.Width);
}
private static void ValidateDevice(Device? device)

View File

@@ -761,7 +761,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal(Data.Models.Metadata.Endianness.Big, dataArea.Endianness);
Assert.Equal("name", dataArea.Name);
Assert.Equal(12345, dataArea.Size);
Assert.Equal(64, dataArea.ReadLong(Data.Models.Metadata.DataArea.WidthKey));
Assert.Equal(Data.Models.Metadata.Width.Long, dataArea.Width);
Data.Models.Metadata.Rom[]? roms = dataArea.ReadArray<Data.Models.Metadata.Rom>(Data.Models.Metadata.DataArea.RomKey);
Assert.NotNull(roms);

View File

@@ -360,7 +360,7 @@ namespace SabreTools.Metadata.DatFiles
aggregateDataArea.Endianness = dataArea.Endianness;
aggregateDataArea.Name = dataArea.Name;
aggregateDataArea.Size = dataArea.Size;
aggregateDataArea[Data.Models.Metadata.DataArea.WidthKey] = dataArea.ReadString(Data.Models.Metadata.DataArea.WidthKey);
aggregateDataArea.Width = dataArea.Width;
}
// Clear any empty fields
@@ -786,7 +786,7 @@ namespace SabreTools.Metadata.DatFiles
aggregateDataArea.Endianness = dataArea.Endianness;
aggregateDataArea.Name = dataArea.Name;
aggregateDataArea.Size = dataArea.Size;
aggregateDataArea[Data.Models.Metadata.DataArea.WidthKey] = dataArea.ReadString(Data.Models.Metadata.DataArea.WidthKey);
aggregateDataArea.Width = dataArea.Width;
}
// Clear any empty fields

View File

@@ -35,19 +35,19 @@ namespace SabreTools.Metadata.DatItems.Formats
set => (_internal as Data.Models.Metadata.DataArea)?.Size = value;
}
public Data.Models.Metadata.Width? Width
{
get => (_internal as Data.Models.Metadata.DataArea)?.Width;
set => (_internal as Data.Models.Metadata.DataArea)?.Width = value;
}
#endregion
#region Constructors
public DataArea() : base() { }
public DataArea(Data.Models.Metadata.DataArea item) : base(item)
{
// Process flag values
long? width = ReadLong(Data.Models.Metadata.DataArea.WidthKey);
if (width is not null)
Write<string?>(Data.Models.Metadata.DataArea.WidthKey, width.ToString());
}
public DataArea(Data.Models.Metadata.DataArea item) : base(item) { }
public DataArea(Data.Models.Metadata.DataArea item, Machine machine, Source source) : this(item)
{

View File

@@ -37,7 +37,7 @@ namespace SabreTools.Metadata.DatItems.Formats
return dataArea is not null
&& (!string.IsNullOrEmpty(dataArea.Name)
|| dataArea.Size is not null
|| dataArea.ReadLong(Data.Models.Metadata.DataArea.WidthKey) is not null
|| dataArea.Width is not null
|| dataArea.Endianness is not null);
}
}

View File

@@ -460,6 +460,9 @@ namespace SabreTools.Metadata.Filter
case DataArea item when fieldName == "size":
checkValue = item.Size?.ToString();
return true;
case DataArea item when fieldName == "width":
checkValue = item.Width?.AsStringValue();
return true;
case Device item when fieldName == "type":
checkValue = item.DeviceType?.AsStringValue();

View File

@@ -122,6 +122,8 @@ namespace SabreTools.Metadata
return false;
if (selfDataArea.Size != otherDataArea.Size)
return false;
if (selfDataArea.Width != otherDataArea.Width)
return false;
}
else if (self is Device selfDevice && other is Device otherDevice)
{

View File

@@ -71,7 +71,7 @@ namespace SabreTools.Serialization.CrossModel.Test
{
Name = "name",
Size = 12345,
Width = "XXXXXX",
Width = Data.Models.Metadata.Width.Long,
Endianness = Data.Models.Metadata.Endianness.Big,
Rom = [rom],
};
@@ -230,7 +230,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.NotNull(dataarea);
Assert.Equal("name", dataarea.Name);
Assert.Equal(12345, dataarea.Size);
Assert.Equal("XXXXXX", dataarea.Width);
Assert.Equal(Data.Models.Metadata.Width.Long, dataarea.Width);
Assert.Equal(Data.Models.Metadata.Endianness.Big, dataarea.Endianness);
Assert.NotNull(dataarea.Rom);

View File

@@ -75,7 +75,7 @@ namespace SabreTools.Serialization.CrossModel
{
Name = item.Name,
Size = item.Size,
Width = item.ReadString(Data.Models.Metadata.DataArea.WidthKey),
Width = item.Width,
Endianness = item.Endianness,
};

View File

@@ -76,7 +76,7 @@ namespace SabreTools.Serialization.CrossModel
{
Name = item.Name,
Size = item.Size,
[Data.Models.Metadata.DataArea.WidthKey] = item.Width,
Width = item.Width,
Endianness = item.Endianness,
};

View File

@@ -144,7 +144,7 @@ namespace SabreTools.Serialization.Readers.Test
{
Name = "name",
Size = 12345,
Width = "XXXXXX",
Width = Data.Models.Metadata.Width.Long,
Endianness = Data.Models.Metadata.Endianness.Big,
Rom = [rom],
};
@@ -303,7 +303,7 @@ namespace SabreTools.Serialization.Readers.Test
Assert.NotNull(dataarea);
Assert.Equal("name", dataarea.Name);
Assert.Equal(12345, dataarea.Size);
Assert.Equal("XXXXXX", dataarea.Width);
Assert.Equal(Data.Models.Metadata.Width.Long, dataarea.Width);
Assert.Equal(Data.Models.Metadata.Endianness.Big, dataarea.Endianness);
Assert.NotNull(dataarea.Rom);

View File

@@ -127,7 +127,7 @@ namespace SabreTools.Serialization.Readers
obj.Name = reader.GetAttribute("name");
obj.Size = NumberHelper.ConvertToInt64(reader.GetAttribute("size"));
obj.Width = reader.GetAttribute("width");
obj.Width = reader.GetAttribute("width").AsWidth();
obj.Endianness = reader.GetAttribute("endianness").AsEndianness();
List<Rom> roms = [];

View File

@@ -105,7 +105,7 @@ namespace SabreTools.Serialization.Writers
writer.WriteRequiredAttributeString("name", obj.Name);
writer.WriteRequiredAttributeString("size", obj.Size?.ToString());
writer.WriteOptionalAttributeString("width", obj.Width);
writer.WriteOptionalAttributeString("width", obj.Width?.AsStringValue());
writer.WriteOptionalAttributeString("endianness", obj.Endianness?.AsStringValue());
if (obj.Rom is not null && obj.Rom.Length > 0)