diff --git a/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs b/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs index f4bc8b55..cf97ee9d 100644 --- a/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs +++ b/SabreTools.Data.Extensions.Test/MetadataExtensionsTests.cs @@ -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) diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index f1700a2a..794373df 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -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, }; } diff --git a/SabreTools.Data.Models/Listxml/Device.cs b/SabreTools.Data.Models/Listxml/Device.cs index 45a26277..ef377197 100644 --- a/SabreTools.Data.Models/Listxml/Device.cs +++ b/SabreTools.Data.Models/Listxml/Device.cs @@ -18,9 +18,9 @@ namespace SabreTools.Data.Models.Listxml [XmlAttribute("fixed_image")] public string? FixedImage { get; set; } - /// Numeric boolean + /// (0|1) "0" [XmlAttribute("mandatory")] - public string? Mandatory { get; set; } + public bool? Mandatory { get; set; } [XmlAttribute("interface")] public string? Interface { get; set; } diff --git a/SabreTools.Data.Models/Metadata/Device.cs b/SabreTools.Data.Models/Metadata/Device.cs index 3d17f455..6165eb4b 100644 --- a/SabreTools.Data.Models/Metadata/Device.cs +++ b/SabreTools.Data.Models/Metadata/Device.cs @@ -11,6 +11,9 @@ namespace SabreTools.Data.Models.Metadata /// (unknown|cartridge|floppydisk|harddisk|cylinder|cassette|punchcard|punchtape|printout|serial|parallel|snapshot|quickload|memcard|cdrom|magtape|romimage|midiin|midiout|picture|vidfile) public DeviceType? DeviceType { get; set; } + /// (0|1) "0" + public bool? Mandatory { get; set; } + #endregion #region Keys @@ -29,10 +32,6 @@ namespace SabreTools.Data.Models.Metadata /// string public const string InterfaceKey = "interface"; - /// (0|1) "0" - /// TODO: Convert to bool? - public const string MandatoryKey = "mandatory"; - /// string public const string TagKey = "tag"; diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index dcdc1daf..117109d3 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -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); diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 2bfb50e0..7e7e06a2 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -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); diff --git a/SabreTools.Metadata.DatItems/Formats/Device.cs b/SabreTools.Metadata.DatItems/Formats/Device.cs index 57ce5981..ff14ce51 100644 --- a/SabreTools.Metadata.DatItems/Formats/Device.cs +++ b/SabreTools.Metadata.DatItems/Formats/Device.cs @@ -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(Data.Models.Metadata.Device.MandatoryKey, mandatory.FromYesNo()); - // Handle subitems var instance = item.Read(Data.Models.Metadata.Device.InstanceKey); if (instance is not null) diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 3c742bb3..7c624720 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -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(); diff --git a/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs b/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs index fdfca515..734cfa18 100644 --- a/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs @@ -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); diff --git a/SabreTools.Serialization.CrossModel.Test/M1Tests.cs b/SabreTools.Serialization.CrossModel.Test/M1Tests.cs index 16e28c35..57fe2ba8 100644 --- a/SabreTools.Serialization.CrossModel.Test/M1Tests.cs +++ b/SabreTools.Serialization.CrossModel.Test/M1Tests.cs @@ -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); diff --git a/SabreTools.Serialization.CrossModel.Test/MessTests.cs b/SabreTools.Serialization.CrossModel.Test/MessTests.cs index 96911cf5..778266fa 100644 --- a/SabreTools.Serialization.CrossModel.Test/MessTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/MessTests.cs @@ -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); diff --git a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs index 02a38a83..4e17acd2 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs @@ -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), }; diff --git a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs index 10c5e034..01d8fa7e 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs @@ -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, }; diff --git a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs index 6cfd1795..439b3a9e 100644 --- a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs +++ b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs @@ -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); diff --git a/SabreTools.Serialization.Readers.Test/M1Tests.cs b/SabreTools.Serialization.Readers.Test/M1Tests.cs index cbff6514..90be4b60 100644 --- a/SabreTools.Serialization.Readers.Test/M1Tests.cs +++ b/SabreTools.Serialization.Readers.Test/M1Tests.cs @@ -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); diff --git a/SabreTools.Serialization.Readers.Test/MessTests.cs b/SabreTools.Serialization.Readers.Test/MessTests.cs index 4b798855..3eee2b80 100644 --- a/SabreTools.Serialization.Readers.Test/MessTests.cs +++ b/SabreTools.Serialization.Readers.Test/MessTests.cs @@ -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); diff --git a/SabreTools.Serialization.Readers/Listxml.cs b/SabreTools.Serialization.Readers/Listxml.cs index 2b868c56..9e38ba06 100644 --- a/SabreTools.Serialization.Readers/Listxml.cs +++ b/SabreTools.Serialization.Readers/Listxml.cs @@ -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 extensions = []; diff --git a/SabreTools.Serialization.Readers/M1.cs b/SabreTools.Serialization.Readers/M1.cs index efc59aed..154c9aab 100644 --- a/SabreTools.Serialization.Readers/M1.cs +++ b/SabreTools.Serialization.Readers/M1.cs @@ -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 extensions = []; diff --git a/SabreTools.Serialization.Readers/Mess.cs b/SabreTools.Serialization.Readers/Mess.cs index bf568a0e..a39567c4 100644 --- a/SabreTools.Serialization.Readers/Mess.cs +++ b/SabreTools.Serialization.Readers/Mess.cs @@ -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 extensions = []; diff --git a/SabreTools.Serialization.Writers/Listxml.cs b/SabreTools.Serialization.Writers/Listxml.cs index 01c8313e..cc458cf6 100644 --- a/SabreTools.Serialization.Writers/Listxml.cs +++ b/SabreTools.Serialization.Writers/Listxml.cs @@ -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) diff --git a/SabreTools.Serialization.Writers/M1.cs b/SabreTools.Serialization.Writers/M1.cs index b9fcdb21..7f4137e6 100644 --- a/SabreTools.Serialization.Writers/M1.cs +++ b/SabreTools.Serialization.Writers/M1.cs @@ -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) diff --git a/SabreTools.Serialization.Writers/Mess.cs b/SabreTools.Serialization.Writers/Mess.cs index 0a2e83c9..c74c693a 100644 --- a/SabreTools.Serialization.Writers/Mess.cs +++ b/SabreTools.Serialization.Writers/Mess.cs @@ -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)