Make inverted DataArea less impactful

This commit is contained in:
Matt Nadareski
2026-04-09 23:56:36 -04:00
parent 5f9eaef9f2
commit 3d33f44eca
12 changed files with 58 additions and 317 deletions

View File

@@ -141,10 +141,12 @@ namespace SabreTools.Metadata.DatFiles.Test
ValidatePartFeature(partFeature);
// All other fields are tested separately
Rom? partRom = Array.Find(datItems, item => item is Rom rom && rom.DataAreaSpecified && rom.PartInterface is not null) as Rom;
Rom? partRom = Array.Find(datItems, item => item is Rom rom && rom.DataAreaName is not null && rom.PartInterface is not null) as Rom;
Assert.NotNull(partRom);
DataArea? romDataArea = partRom.DataArea;
ValidateDataArea(romDataArea);
Assert.Equal(Data.Models.Metadata.Endianness.Big, partRom.DataAreaEndianness);
Assert.Equal("name", partRom.DataAreaName);
Assert.Equal(12345, partRom.DataAreaSize);
Assert.Equal(Data.Models.Metadata.Width.Long, partRom.DataAreaWidth);
Assert.Equal("interface", partRom.PartInterface);
Assert.Equal("name", partRom.PartName);
@@ -157,7 +159,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Release? release = Array.Find(datItems, item => item is Release) as Release;
ValidateRelease(release);
Rom? rom = Array.Find(datItems, item => item is Rom rom && !rom.DataAreaSpecified && rom.PartInterface is null && rom.OpenMSXMediaType is null) as Rom;
Rom? rom = Array.Find(datItems, item => item is Rom rom && rom.DataAreaName is null && rom.PartInterface is null && rom.OpenMSXMediaType is null) as Rom;
ValidateRom(rom);
Sample? sample = Array.Find(datItems, item => item is Sample) as Sample;
@@ -1205,15 +1207,6 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.Equal("ways3", control.Ways3);
}
private static void ValidateDataArea(DataArea? dataArea)
{
Assert.NotNull(dataArea);
Assert.Equal(Data.Models.Metadata.Endianness.Big, dataArea.Endianness);
Assert.Equal("name", dataArea.Name);
Assert.Equal(12345, dataArea.Size);
Assert.Equal(Data.Models.Metadata.Width.Long, dataArea.Width);
}
private static void ValidateDevice(Device? device)
{
Assert.NotNull(device);
@@ -1299,12 +1292,6 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.True(disk.Writable);
}
private static void ValidateDiskArea(DiskArea? diskArea)
{
Assert.NotNull(diskArea);
Assert.Equal("name", diskArea.Name);
}
private static void ValidateDisplay(Display? display)
{
Assert.NotNull(display);

View File

@@ -152,13 +152,6 @@ namespace SabreTools.Metadata.DatFiles.Test
return item;
}
private static DataArea CreateDataArea(Machine machine)
{
DataArea item = new DataArea(CreateMetadataDataArea());
item.CopyMachineInformation(machine);
return item;
}
private static DeviceRef CreateDeviceRef(Machine machine)
{
DeviceRef item = new DeviceRef(CreateMetadataDeviceRef());
@@ -283,7 +276,10 @@ namespace SabreTools.Metadata.DatFiles.Test
{
Rom item = new Rom(CreateMetadataRom());
item.CopyMachineInformation(machine);
item.DataArea = CreateDataArea(machine);
item.DataAreaEndianness = Data.Models.Metadata.Endianness.Big;
item.DataAreaName = "name";
item.DataAreaSize = 12345;
item.DataAreaWidth = Data.Models.Metadata.Width.Long;
item.PartInterface = "interface";
item.PartName = "name";
return item;

View File

@@ -588,7 +588,6 @@ namespace SabreTools.Metadata.DatFiles
{
foreach (var dataArea in dataAreas)
{
var dataAreaItem = new DataArea(dataArea, machine, source);
var roms = dataArea.Rom;
if (roms is null)
continue;
@@ -617,7 +616,10 @@ namespace SabreTools.Metadata.DatFiles
continue;
}
romItem.DataArea = dataAreaItem;
romItem.DataAreaEndianness = dataArea.Endianness;
romItem.DataAreaName = dataArea.Name;
romItem.DataAreaSize = dataArea.Size;
romItem.DataAreaWidth = dataArea.Width;
romItem.PartInterface = item.Interface;
romItem.PartName = item.Name;

View File

@@ -217,15 +217,23 @@ namespace SabreTools.Metadata.DatFiles
machine.Rom = [.. machine.Rom, romItem];
// Add Part and DataArea mappings
if ((rom.PartInterface is not null || rom.PartName is not null) && rom.DataArea is not null)
if ((rom.PartInterface is not null || rom.PartName is not null)
&& (rom.DataAreaEndianness is not null || rom.DataAreaName is not null || rom.DataAreaSize is not null || rom.DataAreaWidth is not null))
{
var partItemInternal = new Data.Models.Metadata.Part
{
Interface = rom.PartInterface,
Name = rom.PartName,
};
var dataAreaItemInternal = new Data.Models.Metadata.DataArea
{
Endianness = rom.DataAreaEndianness,
Name = rom.DataAreaName,
Size = rom.DataAreaSize,
Width = rom.DataAreaWidth,
};
partMappings[partItemInternal] = romItem;
dataAreaMappings[partItemInternal] = (rom.DataArea.GetInternalClone(), romItem);
dataAreaMappings[partItemInternal] = (dataAreaItemInternal, romItem);
}
break;
@@ -555,15 +563,23 @@ namespace SabreTools.Metadata.DatFiles
machine.Rom = [.. machine.Rom, romItem];
// Add Part and DataArea mappings
if ((rom.PartInterface is not null || rom.PartName is not null) && rom.DataArea is not null)
if ((rom.PartInterface is not null || rom.PartName is not null)
&& (rom.DataAreaEndianness is not null || rom.DataAreaName is not null || rom.DataAreaSize is not null || rom.DataAreaWidth is not null))
{
var partItemInternal = new Data.Models.Metadata.Part
{
Interface = rom.PartInterface,
Name = rom.PartName,
};
var dataAreaItemInternal = new Data.Models.Metadata.DataArea
{
Endianness = rom.DataAreaEndianness,
Name = rom.DataAreaName,
Size = rom.DataAreaSize,
Width = rom.DataAreaWidth,
};
partMappings[partItemInternal] = romItem;
dataAreaMappings[partItemInternal] = (rom.DataArea.GetInternalClone(), romItem);
dataAreaMappings[partItemInternal] = (dataAreaItemInternal, romItem);
}
break;

View File

@@ -282,9 +282,6 @@ namespace SabreTools.Metadata.DatFiles.Formats
case Data.Models.Metadata.ItemType.Control:
datItem = datItemObj.ToObject<Control>();
break;
case Data.Models.Metadata.ItemType.DataArea:
datItem = datItemObj.ToObject<DataArea>();
break;
case Data.Models.Metadata.ItemType.Device:
datItem = datItemObj.ToObject<Device>();
break;
@@ -303,9 +300,6 @@ namespace SabreTools.Metadata.DatFiles.Formats
case Data.Models.Metadata.ItemType.Disk:
datItem = datItemObj.ToObject<Disk>();
break;
case Data.Models.Metadata.ItemType.DiskArea:
datItem = datItemObj.ToObject<DiskArea>();
break;
case Data.Models.Metadata.ItemType.Display:
datItem = datItemObj.ToObject<Display>();
break;
@@ -373,6 +367,12 @@ namespace SabreTools.Metadata.DatFiles.Formats
datItem = datItemObj.ToObject<SourceDetails>();
break;
// Removed
case Data.Models.Metadata.ItemType.DataArea:
case Data.Models.Metadata.ItemType.DiskArea:
case Data.Models.Metadata.ItemType.Part:
break;
// TODO: Implement these?
case Data.Models.Metadata.ItemType.Dump:
case Data.Models.Metadata.ItemType.Video:

View File

@@ -107,18 +107,10 @@ namespace SabreTools.Metadata.DatFiles.Formats
switch (datItem)
{
case DipSwitch dipSwitch:
if (dipSwitch.PartInterface is null && dipSwitch.PartName is null)
{
if (string.IsNullOrEmpty(dipSwitch.PartName))
missingFields.Add(nameof(Data.Models.Metadata.Part.Name));
if (string.IsNullOrEmpty(dipSwitch.PartInterface))
missingFields.Add(nameof(Data.Models.Metadata.Part.Interface));
}
else
{
if (string.IsNullOrEmpty(dipSwitch.PartName))
missingFields.Add(nameof(Data.Models.Metadata.Part.Name));
if (string.IsNullOrEmpty(dipSwitch.PartInterface))
missingFields.Add(nameof(Data.Models.Metadata.Part.Interface));
}
if (string.IsNullOrEmpty(dipSwitch.Name))
missingFields.Add(nameof(Data.Models.Metadata.DipSwitch.Name));
@@ -138,18 +130,10 @@ namespace SabreTools.Metadata.DatFiles.Formats
break;
case Disk disk:
if (disk.PartInterface is null && disk.PartName is null)
{
if (string.IsNullOrEmpty(disk.PartName))
missingFields.Add(nameof(Data.Models.Metadata.Part.Name));
if (string.IsNullOrEmpty(disk.PartInterface))
missingFields.Add(nameof(Data.Models.Metadata.Part.Interface));
}
else
{
if (string.IsNullOrEmpty(disk.PartName))
missingFields.Add(nameof(Data.Models.Metadata.Part.Name));
if (string.IsNullOrEmpty(disk.PartInterface))
missingFields.Add(nameof(Data.Models.Metadata.Part.Interface));
}
if (disk.DiskAreaName is null)
missingFields.Add(nameof(Data.Models.Metadata.DiskArea.Name));
@@ -164,31 +148,15 @@ namespace SabreTools.Metadata.DatFiles.Formats
break;
case Rom rom:
if (rom.PartInterface is null && rom.PartName is null)
{
if (string.IsNullOrEmpty(rom.PartName))
missingFields.Add(nameof(Data.Models.Metadata.Part.Name));
if (string.IsNullOrEmpty(rom.PartInterface))
missingFields.Add(nameof(Data.Models.Metadata.Part.Interface));
}
else
{
if (string.IsNullOrEmpty(rom.PartName))
missingFields.Add(nameof(Data.Models.Metadata.Part.Name));
if (string.IsNullOrEmpty(rom.PartInterface))
missingFields.Add(nameof(Data.Models.Metadata.Part.Interface));
}
if (!rom.DataAreaSpecified)
{
if (string.IsNullOrEmpty(rom.DataAreaName))
missingFields.Add(nameof(Data.Models.Metadata.DataArea.Name));
if (rom.DataAreaSize is null)
missingFields.Add(nameof(Data.Models.Metadata.DataArea.Size));
}
else
{
if (string.IsNullOrEmpty(rom.DataArea!.Name))
missingFields.Add(nameof(Data.Models.Metadata.DataArea.Name));
if (rom.DataArea!.Size is null)
missingFields.Add(nameof(Data.Models.Metadata.DataArea.Size));
}
break;

View File

@@ -34,6 +34,8 @@ namespace SabreTools.Metadata.DatItems.Formats.Test
Rom actual = disk.ConvertToRom();
Assert.Equal(Data.Models.Metadata.Endianness.Little, actual.DataAreaEndianness);
Assert.Equal("name", actual.DataAreaName);
Assert.Equal(DupeType.All | DupeType.External, actual.DupeType);
Assert.Equal(HashType.MD5.ZeroString, actual.MD5);
Assert.Equal("merge", actual.Merge);
@@ -46,10 +48,6 @@ namespace SabreTools.Metadata.DatItems.Formats.Test
Assert.Equal(HashType.SHA1.ZeroString, actual.SHA1);
Assert.Equal(Data.Models.Metadata.ItemStatus.Good, actual.Status);
DataArea? actualDataArea = actual.DataArea;
Assert.NotNull(actualDataArea);
Assert.Equal("name", actualDataArea.Name);
Machine? actualMachine = actual.Machine;
Assert.NotNull(actualMachine);
Assert.Equal("name", actualMachine.Name);

View File

@@ -20,7 +20,6 @@ namespace SabreTools.Metadata.DatItems
[XmlInclude(typeof(ConfLocation))]
[XmlInclude(typeof(ConfSetting))]
[XmlInclude(typeof(Control))]
[XmlInclude(typeof(DataArea))]
[XmlInclude(typeof(Device))]
[XmlInclude(typeof(DeviceRef))]
[XmlInclude(typeof(DipLocation))]

View File

@@ -1,105 +0,0 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
namespace SabreTools.Metadata.DatItems.Formats
{
/// <summary>
/// SoftwareList dataarea information
/// </summary>
/// <remarks>One DataArea can contain multiple Rom items</remarks>
[JsonObject("dataarea"), XmlRoot("dataarea")]
public sealed class DataArea : DatItem<Data.Models.Metadata.DataArea>
{
#region Properties
public Data.Models.Metadata.Endianness? Endianness
{
get => _internal.Endianness;
set => _internal.Endianness = value;
}
/// <inheritdoc>/>
public override Data.Models.Metadata.ItemType ItemType
=> Data.Models.Metadata.ItemType.DataArea;
public string? Name
{
get => _internal.Name;
set => _internal.Name = value;
}
public long? Size
{
get => _internal.Size;
set => _internal.Size = value;
}
public Data.Models.Metadata.Width? Width
{
get => _internal.Width;
set => _internal.Width = value;
}
#endregion
#region Constructors
public DataArea() : base() { }
public DataArea(Data.Models.Metadata.DataArea item)
{
_internal = item.Clone() as Data.Models.Metadata.DataArea ?? new();
// Clear all lists
_internal.Rom = null;
}
public DataArea(Data.Models.Metadata.DataArea item, Machine machine, Source source) : this(item)
{
Source = source;
CopyMachineInformation(machine);
}
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => Name;
/// <inheritdoc/>
public override void SetName(string? name) => Name = name;
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new DataArea(GetInternalClone());
/// <inheritdoc/>
public override Data.Models.Metadata.DataArea GetInternalClone()
=> _internal.Clone() as Data.Models.Metadata.DataArea ?? new();
#endregion
#region Comparision Methods
/// <inheritdoc/>
public override bool Equals(DatItem? other)
{
// If the other item is null
if (other is null)
return false;
// If the type matches
if (other is DataArea otherDataArea)
return _internal.Equals(otherDataArea._internal);
// Everything else fails
return false;
}
#endregion
}
}

View File

@@ -144,8 +144,8 @@ namespace SabreTools.Metadata.DatItems.Formats
// Create a DataArea if there was an existing DiskArea
if (DiskAreaName is not null)
{
var dataArea = new DataArea { Name = DiskAreaName };
rom.DataArea = dataArea;
rom.DataAreaEndianness = Endianness.Little;
rom.DataAreaName = DiskAreaName;
}
rom.DupeType = DupeType;

View File

@@ -1,87 +0,0 @@
using System.Xml.Serialization;
using Newtonsoft.Json;
namespace SabreTools.Metadata.DatItems.Formats
{
/// <summary>
/// SoftwareList diskarea information
/// </summary>
/// <remarks>One DiskArea can contain multiple Disk items</remarks>
[JsonObject("diskarea"), XmlRoot("diskarea")]
public sealed class DiskArea : DatItem<Data.Models.Metadata.DiskArea>
{
#region Properties
/// <inheritdoc>/>
public override Data.Models.Metadata.ItemType ItemType
=> Data.Models.Metadata.ItemType.DiskArea;
public string? Name
{
get => _internal.Name;
set => _internal.Name = value;
}
#endregion
#region Constructors
public DiskArea() : base() { }
public DiskArea(Data.Models.Metadata.DiskArea item) : base(item)
{
_internal = item.Clone() as Data.Models.Metadata.DiskArea ?? new();
// Clear all lists
_internal.Disk = null;
}
public DiskArea(Data.Models.Metadata.DiskArea item, Machine machine, Source source) : this(item)
{
Source = source;
CopyMachineInformation(machine);
}
#endregion
#region Accessors
/// <inheritdoc/>
public override string? GetName() => Name;
/// <inheritdoc/>
public override void SetName(string? name) => Name = name;
#endregion
#region Cloning Methods
/// <inheritdoc/>
public override object Clone() => new DiskArea(GetInternalClone());
/// <inheritdoc/>
public override Data.Models.Metadata.DiskArea GetInternalClone()
=> _internal.Clone() as Data.Models.Metadata.DiskArea ?? new();
#endregion
#region Comparision Methods
/// <inheritdoc/>
public override bool Equals(DatItem? other)
{
// If the other item is null
if (other is null)
return false;
// If the type matches
if (other is DiskArea otherDiskArea)
return _internal.Equals(otherDiskArea._internal);
// Everything else fails
return false;
}
#endregion
}
}

View File

@@ -2,7 +2,6 @@ using System.Xml.Serialization;
using Newtonsoft.Json;
using SabreTools.Data.Extensions;
using SabreTools.Data.Models.Metadata;
using SabreTools.Metadata.Filter;
using SabreTools.Text.Extensions;
namespace SabreTools.Metadata.DatItems.Formats
@@ -117,20 +116,13 @@ namespace SabreTools.Metadata.DatItems.Formats
set => _internal.Creator = value;
}
public DataArea? DataArea { get; set; }
public Endianness? DataAreaEndianness { get; set; }
[JsonIgnore]
public bool DataAreaSpecified
{
get
{
return DataArea is not null
&& (!string.IsNullOrEmpty(DataArea.Name)
|| DataArea.Size is not null
|| DataArea.Width is not null
|| DataArea.Endianness is not null);
}
}
public string? DataAreaName { get; set; }
public long? DataAreaSize { get; set; }
public Width? DataAreaWidth { get; set; }
public string? Date
{
@@ -933,31 +925,6 @@ namespace SabreTools.Metadata.DatItems.Formats
#endregion
#region Manipulation
/// <inheritdoc/>
public override bool PassesFilter(FilterRunner filterRunner)
{
if (Machine is not null && !Machine.PassesFilter(filterRunner))
return false;
// TODO: DataArea
// TODO: Part
return filterRunner.Run(_internal);
}
/// <inheritdoc/>
public override bool PassesFilterDB(FilterRunner filterRunner)
{
// TODO: DataArea
// TODO: Part
return filterRunner.Run(_internal);
}
#endregion
#region Sorting and Merging
/// <inheritdoc/>