diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 26e77d48..bbc391ae 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -153,6 +153,8 @@ namespace SabreTools.Data.Extensions return chip.Clone() as Chip; else if (self is Condition condition) return condition.Clone() as Condition; + else if (self is ConfLocation confLocation) + return confLocation.Clone() as ConfLocation; else if (self is Control control) return control.Clone() as Control; else if (self is DeviceRef deviceRef) @@ -192,10 +194,6 @@ namespace SabreTools.Data.Extensions cloneConfiguration.Mask = selfConfiguration.Mask; cloneConfiguration.Tag = selfConfiguration.Tag; } - else if (self is ConfLocation selfConfLocation && clone is ConfLocation cloneConfLocation) - { - cloneConfLocation.Inverted = selfConfLocation.Inverted; - } else if (self is ConfSetting selfConfSetting && clone is ConfSetting cloneConfSetting) { cloneConfSetting.Default = selfConfSetting.Default; diff --git a/SabreTools.Data.Models/Listxml/ConfLocation.cs b/SabreTools.Data.Models/Listxml/ConfLocation.cs index b6fe99b3..de57786f 100644 --- a/SabreTools.Data.Models/Listxml/ConfLocation.cs +++ b/SabreTools.Data.Models/Listxml/ConfLocation.cs @@ -10,10 +10,9 @@ namespace SabreTools.Data.Models.Listxml [XmlAttribute("name")] public string? Name { get; set; } - /// Numeric? [Required] [XmlAttribute("number")] - public string? Number { get; set; } + public long? Number { get; set; } /// (yes|no) "no" [XmlAttribute("inverted")] diff --git a/SabreTools.Data.Models/Metadata/ConfLocation.cs b/SabreTools.Data.Models/Metadata/ConfLocation.cs index 211330c0..bea51e61 100644 --- a/SabreTools.Data.Models/Metadata/ConfLocation.cs +++ b/SabreTools.Data.Models/Metadata/ConfLocation.cs @@ -1,10 +1,11 @@ +using System; using System.Xml.Serialization; using Newtonsoft.Json; namespace SabreTools.Data.Models.Metadata { [JsonObject("conflocation"), XmlRoot("conflocation")] - public class ConfLocation : DatItem + public class ConfLocation : DatItem, ICloneable, IEquatable { #region Properties @@ -13,15 +14,44 @@ namespace SabreTools.Data.Models.Metadata public string? Name { get; set; } - #endregion - - #region Keys - - /// string, possibly long - public const string NumberKey = "number"; + public long? Number { get; set; } #endregion public ConfLocation() => ItemType = ItemType.ConfLocation; + + /// + public object Clone() + { + var obj = new ConfLocation(); + + obj.Inverted = Inverted; + obj.Name = Name; + obj.Number = Number; + + return obj; + } + + /// + public bool Equals(ConfLocation? other) + { + // Null never matches + if (other is null) + return false; + + // Properties + if (Inverted != other.Inverted) + return false; + + if ((Name is null) ^ (other.Name is null)) + return false; + else if (Name is not null && !Name.Equals(other.Name, StringComparison.OrdinalIgnoreCase)) + return false; + + if (Number != other.Number) + return false; + + return true; + } } } diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs index cb9fba6a..6a0f8eeb 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -443,7 +443,7 @@ namespace SabreTools.Metadata.DatFiles.Test { Inverted = true, Name = "name", - [Data.Models.Metadata.ConfLocation.NumberKey] = "number", + Number = 12345, }; } @@ -1217,7 +1217,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(confLocation); Assert.True(confLocation.Inverted); Assert.Equal("name", confLocation.Name); - Assert.Equal("number", confLocation.ReadString(Data.Models.Metadata.ConfLocation.NumberKey)); + Assert.Equal(12345, confLocation.Number); } private static void ValidateConfSetting(ConfSetting? confSetting) diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 1048ab62..4f63dc38 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -724,7 +724,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(confLocation); Assert.True(confLocation.Inverted); Assert.Equal("name", confLocation.Name); - Assert.Equal("number", confLocation.ReadString(Data.Models.Metadata.ConfLocation.NumberKey)); + Assert.Equal(12345, confLocation.Number); } private static void ValidateMetadataConfSetting(Data.Models.Metadata.ConfSetting? confSetting) diff --git a/SabreTools.Metadata.DatItems/Formats/ConfLocation.cs b/SabreTools.Metadata.DatItems/Formats/ConfLocation.cs index d1f3296a..c7e5ec7f 100644 --- a/SabreTools.Metadata.DatItems/Formats/ConfLocation.cs +++ b/SabreTools.Metadata.DatItems/Formats/ConfLocation.cs @@ -16,16 +16,22 @@ namespace SabreTools.Metadata.DatItems.Formats public override Data.Models.Metadata.ItemType ItemType => Data.Models.Metadata.ItemType.ConfLocation; + public bool? Inverted + { + get => (_internal as Data.Models.Metadata.ConfLocation)?.Inverted; + set => (_internal as Data.Models.Metadata.ConfLocation)?.Inverted = value; + } + public string? Name { get => (_internal as Data.Models.Metadata.ConfLocation)?.Name; set => (_internal as Data.Models.Metadata.ConfLocation)?.Name = value; } - public bool? Inverted + public long? Number { - get => (_internal as Data.Models.Metadata.ConfLocation)?.Inverted; - set => (_internal as Data.Models.Metadata.ConfLocation)?.Inverted = value; + get => (_internal as Data.Models.Metadata.ConfLocation)?.Number; + set => (_internal as Data.Models.Metadata.ConfLocation)?.Number = value; } #endregion diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index dc33be38..08286036 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -406,6 +406,9 @@ namespace SabreTools.Metadata.Filter case ConfLocation item when fieldName == "inverted": checkValue = item.Inverted.FromYesNo(); return true; + case ConfLocation item when fieldName == "number": + checkValue = item.Number?.ToString(); + return true; case ConfSetting item when fieldName == "default": checkValue = item.Default.FromYesNo(); diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index bedc6c69..8753117f 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -101,7 +101,7 @@ namespace SabreTools.Metadata } else if (self is ConfLocation selfConfLocation && other is ConfLocation otherConfLocation) { - if (selfConfLocation.Inverted != otherConfLocation.Inverted) + if (!selfConfLocation.Equals(otherConfLocation)) return false; } else if (self is ConfSetting selfConfSetting && other is ConfSetting otherConfSetting) diff --git a/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs b/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs index ba51404d..923948d6 100644 --- a/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs @@ -215,7 +215,7 @@ namespace SabreTools.Serialization.CrossModel.Test var conflocation = new Data.Models.Listxml.ConfLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -712,7 +712,7 @@ namespace SabreTools.Serialization.CrossModel.Test { Assert.NotNull(conflocation); Assert.Equal("name", conflocation.Name); - Assert.Equal("XXXXXX", conflocation.Number); + Assert.Equal(12345, conflocation.Number); Assert.Equal(true, conflocation.Inverted); } diff --git a/SabreTools.Serialization.CrossModel.Test/M1Tests.cs b/SabreTools.Serialization.CrossModel.Test/M1Tests.cs index 2106dda8..bd93c9f9 100644 --- a/SabreTools.Serialization.CrossModel.Test/M1Tests.cs +++ b/SabreTools.Serialization.CrossModel.Test/M1Tests.cs @@ -211,7 +211,7 @@ namespace SabreTools.Serialization.CrossModel.Test var conflocation = new Data.Models.Listxml.ConfLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -706,7 +706,7 @@ namespace SabreTools.Serialization.CrossModel.Test { Assert.NotNull(conflocation); Assert.Equal("name", conflocation.Name); - Assert.Equal("XXXXXX", conflocation.Number); + Assert.Equal(12345, conflocation.Number); Assert.Equal(true, conflocation.Inverted); } diff --git a/SabreTools.Serialization.CrossModel.Test/MessTests.cs b/SabreTools.Serialization.CrossModel.Test/MessTests.cs index 65a1e2b3..73a2d3f3 100644 --- a/SabreTools.Serialization.CrossModel.Test/MessTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/MessTests.cs @@ -211,7 +211,7 @@ namespace SabreTools.Serialization.CrossModel.Test var conflocation = new Data.Models.Listxml.ConfLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -706,7 +706,7 @@ namespace SabreTools.Serialization.CrossModel.Test { Assert.NotNull(conflocation); Assert.Equal("name", conflocation.Name); - Assert.Equal("XXXXXX", conflocation.Number); + Assert.Equal(12345, conflocation.Number); Assert.Equal(true, conflocation.Inverted); } diff --git a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs index 2113918e..1e1c156a 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs @@ -251,7 +251,7 @@ namespace SabreTools.Serialization.CrossModel var confLocation = new ConfLocation { Name = item.Name, - Number = item.ReadString(Data.Models.Metadata.ConfLocation.NumberKey), + Number = item.Number, Inverted = item.Inverted, }; return confLocation; diff --git a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs index fc3fe690..b5400bbf 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs @@ -287,7 +287,7 @@ namespace SabreTools.Serialization.CrossModel var confLocation = new Data.Models.Metadata.ConfLocation { Name = item.Name, - [Data.Models.Metadata.ConfLocation.NumberKey] = item.Number, + Number = item.Number, Inverted = item.Inverted, }; return confLocation; diff --git a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs index 986ad35c..dcc48b90 100644 --- a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs +++ b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs @@ -282,7 +282,7 @@ namespace SabreTools.Serialization.Readers.Test var conflocation = new Data.Models.Listxml.ConfLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -779,7 +779,7 @@ namespace SabreTools.Serialization.Readers.Test { Assert.NotNull(conflocation); Assert.Equal("name", conflocation.Name); - Assert.Equal("XXXXXX", conflocation.Number); + Assert.Equal(12345, conflocation.Number); Assert.Equal(true, conflocation.Inverted); } diff --git a/SabreTools.Serialization.Readers.Test/M1Tests.cs b/SabreTools.Serialization.Readers.Test/M1Tests.cs index a394554b..aac4ce63 100644 --- a/SabreTools.Serialization.Readers.Test/M1Tests.cs +++ b/SabreTools.Serialization.Readers.Test/M1Tests.cs @@ -278,7 +278,7 @@ namespace SabreTools.Serialization.Readers.Test var conflocation = new Data.Models.Listxml.ConfLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -773,7 +773,7 @@ namespace SabreTools.Serialization.Readers.Test { Assert.NotNull(conflocation); Assert.Equal("name", conflocation.Name); - Assert.Equal("XXXXXX", conflocation.Number); + Assert.Equal(12345, conflocation.Number); Assert.Equal(true, conflocation.Inverted); } diff --git a/SabreTools.Serialization.Readers.Test/MessTests.cs b/SabreTools.Serialization.Readers.Test/MessTests.cs index 8f1a3913..a827b740 100644 --- a/SabreTools.Serialization.Readers.Test/MessTests.cs +++ b/SabreTools.Serialization.Readers.Test/MessTests.cs @@ -278,7 +278,7 @@ namespace SabreTools.Serialization.Readers.Test var conflocation = new Data.Models.Listxml.ConfLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -773,7 +773,7 @@ namespace SabreTools.Serialization.Readers.Test { Assert.NotNull(conflocation); Assert.Equal("name", conflocation.Name); - Assert.Equal("XXXXXX", conflocation.Number); + Assert.Equal(12345, conflocation.Number); Assert.Equal(true, conflocation.Inverted); } diff --git a/SabreTools.Serialization.Readers/Listxml.cs b/SabreTools.Serialization.Readers/Listxml.cs index 750e4135..bd50890c 100644 --- a/SabreTools.Serialization.Readers/Listxml.cs +++ b/SabreTools.Serialization.Readers/Listxml.cs @@ -285,7 +285,7 @@ namespace SabreTools.Serialization.Readers var obj = new ConfLocation(); obj.Name = reader.GetAttribute("name"); - obj.Number = reader.GetAttribute("number"); + obj.Number = NumberHelper.ConvertToInt64(reader.GetAttribute("number")); obj.Inverted = reader.GetAttribute("inverted").AsYesNo(); return obj; diff --git a/SabreTools.Serialization.Readers/M1.cs b/SabreTools.Serialization.Readers/M1.cs index 6420d027..eb8fb0fd 100644 --- a/SabreTools.Serialization.Readers/M1.cs +++ b/SabreTools.Serialization.Readers/M1.cs @@ -283,7 +283,7 @@ namespace SabreTools.Serialization.Readers var obj = new ConfLocation(); obj.Name = reader.GetAttribute("name"); - obj.Number = reader.GetAttribute("number"); + obj.Number = NumberHelper.ConvertToInt64(reader.GetAttribute("number")); obj.Inverted = reader.GetAttribute("inverted").AsYesNo(); return obj; diff --git a/SabreTools.Serialization.Readers/Mess.cs b/SabreTools.Serialization.Readers/Mess.cs index c81db4d5..6f40d62b 100644 --- a/SabreTools.Serialization.Readers/Mess.cs +++ b/SabreTools.Serialization.Readers/Mess.cs @@ -283,7 +283,7 @@ namespace SabreTools.Serialization.Readers var obj = new ConfLocation(); obj.Name = reader.GetAttribute("name"); - obj.Number = reader.GetAttribute("number"); + obj.Number = NumberHelper.ConvertToInt64(reader.GetAttribute("number")); obj.Inverted = reader.GetAttribute("inverted").AsYesNo(); return obj; diff --git a/SabreTools.Serialization.Writers/Listxml.cs b/SabreTools.Serialization.Writers/Listxml.cs index e3d701a0..1da5df05 100644 --- a/SabreTools.Serialization.Writers/Listxml.cs +++ b/SabreTools.Serialization.Writers/Listxml.cs @@ -194,7 +194,7 @@ namespace SabreTools.Serialization.Writers writer.WriteStartElement("conflocation"); writer.WriteRequiredAttributeString("name", obj.Name); - writer.WriteRequiredAttributeString("number", obj.Number); + writer.WriteRequiredAttributeString("number", obj.Number?.ToString()); writer.WriteOptionalAttributeString("inverted", obj.Inverted.FromYesNo()); writer.WriteEndElement(); diff --git a/SabreTools.Serialization.Writers/M1.cs b/SabreTools.Serialization.Writers/M1.cs index 9151b56c..b9ab826e 100644 --- a/SabreTools.Serialization.Writers/M1.cs +++ b/SabreTools.Serialization.Writers/M1.cs @@ -192,7 +192,7 @@ namespace SabreTools.Serialization.Writers writer.WriteStartElement("conflocation"); writer.WriteRequiredAttributeString("name", obj.Name); - writer.WriteRequiredAttributeString("number", obj.Number); + writer.WriteRequiredAttributeString("number", obj.Number?.ToString()); writer.WriteOptionalAttributeString("inverted", obj.Inverted.FromYesNo()); writer.WriteEndElement(); diff --git a/SabreTools.Serialization.Writers/Mess.cs b/SabreTools.Serialization.Writers/Mess.cs index 45397c60..35620506 100644 --- a/SabreTools.Serialization.Writers/Mess.cs +++ b/SabreTools.Serialization.Writers/Mess.cs @@ -192,7 +192,7 @@ namespace SabreTools.Serialization.Writers writer.WriteStartElement("conflocation"); writer.WriteRequiredAttributeString("name", obj.Name); - writer.WriteRequiredAttributeString("number", obj.Number); + writer.WriteRequiredAttributeString("number", obj.Number?.ToString()); writer.WriteOptionalAttributeString("inverted", obj.Inverted.FromYesNo()); writer.WriteEndElement();