Device.Manadatory converted to property

This commit is contained in:
Matt Nadareski
2026-04-02 02:43:29 -04:00
parent 3ef7b5860d
commit 8356aed5b0
22 changed files with 45 additions and 36 deletions

View File

@@ -1864,8 +1864,10 @@ namespace SabreTools.Data.Extensions.Test
[Theory]
[InlineData(null, null)]
[InlineData("INVALID", null)]
[InlineData("1", true)]
[InlineData("yes", true)]
[InlineData("True", true)]
[InlineData("0", false)]
[InlineData("no", false)]
[InlineData("False", false)]
public void AsYesNoTest(string? field, bool? expected)

View File

@@ -184,6 +184,7 @@ namespace SabreTools.Data.Extensions
else if (self is Device selfDevice && clone is Device cloneDevice)
{
cloneDevice.DeviceType = selfDevice.DeviceType;
cloneDevice.Mandatory = selfDevice.Mandatory;
}
else if (self is DipLocation selfDipLocation && clone is DipLocation cloneDipLocation)
{
@@ -1402,8 +1403,8 @@ namespace SabreTools.Data.Extensions
{
return yesno?.ToLowerInvariant() switch
{
"yes" or "true" => true,
"no" or "false" => false,
"1" or "yes" or "true" => true,
"0" or "no" or "false" => false,
_ => null,
};
}

View File

@@ -18,9 +18,9 @@ namespace SabreTools.Data.Models.Listxml
[XmlAttribute("fixed_image")]
public string? FixedImage { get; set; }
/// <remarks>Numeric boolean</remarks>
/// <remarks>(0|1) "0"</remarks>
[XmlAttribute("mandatory")]
public string? Mandatory { get; set; }
public bool? Mandatory { get; set; }
[XmlAttribute("interface")]
public string? Interface { get; set; }

View File

@@ -11,6 +11,9 @@ namespace SabreTools.Data.Models.Metadata
/// <remarks>(unknown|cartridge|floppydisk|harddisk|cylinder|cassette|punchcard|punchtape|printout|serial|parallel|snapshot|quickload|memcard|cdrom|magtape|romimage|midiin|midiout|picture|vidfile)</remarks>
public DeviceType? DeviceType { get; set; }
/// <remarks>(0|1) "0"</remarks>
public bool? Mandatory { get; set; }
#endregion
#region Keys
@@ -29,10 +32,6 @@ namespace SabreTools.Data.Models.Metadata
/// <remarks>string</remarks>
public const string InterfaceKey = "interface";
/// <remarks>(0|1) "0"</remarks>
/// TODO: Convert to bool?
public const string MandatoryKey = "mandatory";
/// <remarks>string</remarks>
public const string TagKey = "tag";

View File

@@ -485,7 +485,7 @@ namespace SabreTools.Metadata.DatFiles.Test
[Data.Models.Metadata.Device.FixedImageKey] = "fixedimage",
[Data.Models.Metadata.Device.InstanceKey] = CreateMetadataInstance(),
[Data.Models.Metadata.Device.InterfaceKey] = "interface",
[Data.Models.Metadata.Device.MandatoryKey] = 1L,
Mandatory = true,
[Data.Models.Metadata.Device.TagKey] = "tag",
DeviceType = Data.Models.Metadata.DeviceType.PunchTape,
};
@@ -1262,7 +1262,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.NotNull(device);
Assert.Equal("fixedimage", device.ReadString(Data.Models.Metadata.Device.FixedImageKey));
Assert.Equal("interface", device.ReadString(Data.Models.Metadata.Device.InterfaceKey));
Assert.Equal(1, device.ReadLong(Data.Models.Metadata.Device.MandatoryKey));
Assert.Equal(true, device.Mandatory);
Assert.Equal("tag", device.ReadString(Data.Models.Metadata.Device.TagKey));
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.DeviceType);

View File

@@ -774,7 +774,7 @@ namespace SabreTools.Metadata.DatFiles.Test
Assert.NotNull(device);
Assert.Equal("fixedimage", device.ReadString(Data.Models.Metadata.Device.FixedImageKey));
Assert.Equal("interface", device.ReadString(Data.Models.Metadata.Device.InterfaceKey));
Assert.Equal(1, device.ReadLong(Data.Models.Metadata.Device.MandatoryKey));
Assert.Equal(true, device.Mandatory);
Assert.Equal("tag", device.ReadString(Data.Models.Metadata.Device.TagKey));
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.DeviceType);

View File

@@ -39,6 +39,12 @@ namespace SabreTools.Metadata.DatItems.Formats
}
}
public bool? Mandatory
{
get => (_internal as Data.Models.Metadata.Device)?.Mandatory;
set => (_internal as Data.Models.Metadata.Device)?.Mandatory = value;
}
#endregion
#region Constructors
@@ -47,11 +53,6 @@ namespace SabreTools.Metadata.DatItems.Formats
public Device(Data.Models.Metadata.Device item) : base(item)
{
// Process flag values
bool? mandatory = ReadBool(Data.Models.Metadata.Device.MandatoryKey);
if (mandatory is not null)
Write<string?>(Data.Models.Metadata.Device.MandatoryKey, mandatory.FromYesNo());
// Handle subitems
var instance = item.Read<Data.Models.Metadata.Instance>(Data.Models.Metadata.Device.InstanceKey);
if (instance is not null)

View File

@@ -389,6 +389,9 @@ namespace SabreTools.Metadata.Filter
case Device item when fieldName == "type":
checkValue = item.DeviceType?.AsStringValue();
return true;
case Device item when fieldName == "mandatory":
checkValue = item.Mandatory.FromYesNo();
return true;
case DipLocation item when fieldName == "inverted":
checkValue = item.Inverted.FromYesNo();

View File

@@ -293,7 +293,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
Mandatory = "XXXXXX",
Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -800,7 +800,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
Assert.Equal("XXXXXX", device.Mandatory);
Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);

View File

@@ -289,7 +289,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
Mandatory = "XXXXXX",
Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -794,7 +794,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
Assert.Equal("XXXXXX", device.Mandatory);
Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);

View File

@@ -289,7 +289,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
Mandatory = "XXXXXX",
Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -794,7 +794,7 @@ namespace SabreTools.Serialization.CrossModel.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
Assert.Equal("XXXXXX", device.Mandatory);
Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);

View File

@@ -309,7 +309,7 @@ namespace SabreTools.Serialization.CrossModel
Type = item.DeviceType,
Tag = item.ReadString(Data.Models.Metadata.Device.TagKey),
FixedImage = item.ReadString(Data.Models.Metadata.Device.FixedImageKey),
Mandatory = item.ReadString(Data.Models.Metadata.Device.MandatoryKey),
Mandatory = item.Mandatory,
Interface = item.ReadString(Data.Models.Metadata.Device.InterfaceKey),
};

View File

@@ -344,7 +344,7 @@ namespace SabreTools.Serialization.CrossModel
DeviceType = item.Type,
[Data.Models.Metadata.Device.TagKey] = item.Tag,
[Data.Models.Metadata.Device.FixedImageKey] = item.FixedImage,
[Data.Models.Metadata.Device.MandatoryKey] = item.Mandatory,
Mandatory = item.Mandatory,
[Data.Models.Metadata.Device.InterfaceKey] = item.Interface,
};

View File

@@ -360,7 +360,7 @@ namespace SabreTools.Serialization.Readers.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
Mandatory = "XXXXXX",
Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -867,7 +867,7 @@ namespace SabreTools.Serialization.Readers.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
Assert.Equal("XXXXXX", device.Mandatory);
Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);

View File

@@ -356,7 +356,7 @@ namespace SabreTools.Serialization.Readers.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
Mandatory = "XXXXXX",
Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -861,7 +861,7 @@ namespace SabreTools.Serialization.Readers.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
Assert.Equal("XXXXXX", device.Mandatory);
Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);

View File

@@ -356,7 +356,7 @@ namespace SabreTools.Serialization.Readers.Test
Type = Data.Models.Metadata.DeviceType.PunchTape,
Tag = "XXXXXX",
FixedImage = "XXXXXX",
Mandatory = "XXXXXX",
Mandatory = true,
Interface = "XXXXXX",
Instance = instance,
Extension = [extension],
@@ -861,7 +861,7 @@ namespace SabreTools.Serialization.Readers.Test
Assert.Equal(Data.Models.Metadata.DeviceType.PunchTape, device.Type);
Assert.Equal("XXXXXX", device.Tag);
Assert.Equal("XXXXXX", device.FixedImage);
Assert.Equal("XXXXXX", device.Mandatory);
Assert.Equal(true, device.Mandatory);
Assert.Equal("XXXXXX", device.Interface);
Validate(device.Instance);

View File

@@ -368,7 +368,7 @@ namespace SabreTools.Serialization.Readers
obj.Type = reader.GetAttribute("type").AsDeviceType();
obj.Tag = reader.GetAttribute("tag");
obj.FixedImage = reader.GetAttribute("fixed_image");
obj.Mandatory = reader.GetAttribute("mandatory");
obj.Mandatory = reader.GetAttribute("mandatory").AsYesNo();
obj.Interface = reader.GetAttribute("interface");
List<Extension> extensions = [];

View File

@@ -366,7 +366,7 @@ namespace SabreTools.Serialization.Readers
obj.Type = reader.GetAttribute("type").AsDeviceType();
obj.Tag = reader.GetAttribute("tag");
obj.FixedImage = reader.GetAttribute("fixed_image");
obj.Mandatory = reader.GetAttribute("mandatory");
obj.Mandatory = reader.GetAttribute("mandatory").AsYesNo();
obj.Interface = reader.GetAttribute("interface");
List<Extension> extensions = [];

View File

@@ -366,7 +366,7 @@ namespace SabreTools.Serialization.Readers
obj.Type = reader.GetAttribute("type").AsDeviceType();
obj.Tag = reader.GetAttribute("tag");
obj.FixedImage = reader.GetAttribute("fixed_image");
obj.Mandatory = reader.GetAttribute("mandatory");
obj.Mandatory = reader.GetAttribute("mandatory").AsYesNo();
obj.Interface = reader.GetAttribute("interface");
List<Extension> extensions = [];

View File

@@ -256,7 +256,8 @@ namespace SabreTools.Serialization.Writers
writer.WriteRequiredAttributeString("type", obj.Type?.AsStringValue());
writer.WriteOptionalAttributeString("tag", obj.Tag);
writer.WriteOptionalAttributeString("fixed_image", obj.FixedImage);
writer.WriteOptionalAttributeString("mandatory", obj.Mandatory);
if (obj.Mandatory is not null)
writer.WriteOptionalAttributeString("mandatory", obj.Mandatory.Value ? "1" : "0");
writer.WriteOptionalAttributeString("interface", obj.Interface);
if (obj.Instance is not null)

View File

@@ -254,7 +254,8 @@ namespace SabreTools.Serialization.Writers
writer.WriteRequiredAttributeString("type", obj.Type?.AsStringValue());
writer.WriteOptionalAttributeString("tag", obj.Tag);
writer.WriteOptionalAttributeString("fixed_image", obj.FixedImage);
writer.WriteOptionalAttributeString("mandatory", obj.Mandatory);
if (obj.Mandatory is not null)
writer.WriteOptionalAttributeString("mandatory", obj.Mandatory.Value ? "1" : "0");
writer.WriteOptionalAttributeString("interface", obj.Interface);
if (obj.Instance is not null)

View File

@@ -254,7 +254,8 @@ namespace SabreTools.Serialization.Writers
writer.WriteRequiredAttributeString("type", obj.Type?.AsStringValue());
writer.WriteOptionalAttributeString("tag", obj.Tag);
writer.WriteOptionalAttributeString("fixed_image", obj.FixedImage);
writer.WriteOptionalAttributeString("mandatory", obj.Mandatory);
if (obj.Mandatory is not null)
writer.WriteOptionalAttributeString("mandatory", obj.Mandatory.Value ? "1" : "0");
writer.WriteOptionalAttributeString("interface", obj.Interface);
if (obj.Instance is not null)