diff --git a/SabreTools.Data.Extensions/MetadataExtensions.cs b/SabreTools.Data.Extensions/MetadataExtensions.cs index 151d7bf7..b308ca77 100644 --- a/SabreTools.Data.Extensions/MetadataExtensions.cs +++ b/SabreTools.Data.Extensions/MetadataExtensions.cs @@ -159,6 +159,8 @@ namespace SabreTools.Data.Extensions return control.Clone() as Control; else if (self is DeviceRef deviceRef) return deviceRef.Clone() as DeviceRef; + else if (self is DipLocation dipLocation) + return dipLocation.Clone() as DipLocation; else if (self is Extension extension) return extension.Clone() as Extension; // TODO: Reenable when PartFeature no longer needs nesting @@ -213,10 +215,6 @@ namespace SabreTools.Data.Extensions cloneDevice.Mandatory = selfDevice.Mandatory; cloneDevice.Tag = selfDevice.Tag; } - else if (self is DipLocation selfDipLocation && clone is DipLocation cloneDipLocation) - { - cloneDipLocation.Inverted = selfDipLocation.Inverted; - } else if (self is DipSwitch selfDipSwitch && clone is DipSwitch cloneDipSwitch) { cloneDipSwitch.Default = selfDipSwitch.Default; diff --git a/SabreTools.Data.Models/Listxml/DipLocation.cs b/SabreTools.Data.Models/Listxml/DipLocation.cs index 597ffc4a..cdbdf653 100644 --- a/SabreTools.Data.Models/Listxml/DipLocation.cs +++ b/SabreTools.Data.Models/Listxml/DipLocation.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/DipLocation.cs b/SabreTools.Data.Models/Metadata/DipLocation.cs index 65c36fbc..5926d140 100644 --- a/SabreTools.Data.Models/Metadata/DipLocation.cs +++ b/SabreTools.Data.Models/Metadata/DipLocation.cs @@ -1,10 +1,11 @@ +using System; using System.Xml.Serialization; using Newtonsoft.Json; namespace SabreTools.Data.Models.Metadata { [JsonObject("diplocation"), XmlRoot("diplocation")] - public class DipLocation : DatItem + public class DipLocation : 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 DipLocation() => ItemType = ItemType.DipLocation; + + /// + public object Clone() + { + var obj = new DipLocation(); + + obj.Inverted = Inverted; + obj.Name = Name; + obj.Number = Number; + + return obj; + } + + /// + public bool Equals(DipLocation? 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 6a0f8eeb..4a0cde0d 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.FromMetadata.cs @@ -505,7 +505,7 @@ namespace SabreTools.Metadata.DatFiles.Test { Inverted = true, Name = "name", - [Data.Models.Metadata.DipLocation.NumberKey] = "number", + Number = 12345, }; } @@ -1286,7 +1286,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(dipLocation); Assert.True(dipLocation.Inverted); Assert.Equal("name", dipLocation.Name); - Assert.Equal("number", dipLocation.ReadString(Data.Models.Metadata.DipLocation.NumberKey)); + Assert.Equal(12345, dipLocation.Number); } private static void ValidateDipSwitch(DipSwitch? dipSwitch) diff --git a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs index 4f63dc38..4fc21d47 100644 --- a/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs +++ b/SabreTools.Metadata.DatFiles.Test/DatFileTests.ToMetadata.cs @@ -798,7 +798,7 @@ namespace SabreTools.Metadata.DatFiles.Test Assert.NotNull(dipLocation); Assert.True(dipLocation.Inverted); Assert.Equal("name", dipLocation.Name); - Assert.Equal("number", dipLocation.ReadString(Data.Models.Metadata.DipLocation.NumberKey)); + Assert.Equal(12345, dipLocation.Number); } private static void ValidateMetadataDipSwitch(Data.Models.Metadata.DipSwitch? dipSwitch) diff --git a/SabreTools.Metadata.DatItems/Formats/DipLocation.cs b/SabreTools.Metadata.DatItems/Formats/DipLocation.cs index 1ac9e7fb..ee5f1e00 100644 --- a/SabreTools.Metadata.DatItems/Formats/DipLocation.cs +++ b/SabreTools.Metadata.DatItems/Formats/DipLocation.cs @@ -28,6 +28,12 @@ namespace SabreTools.Metadata.DatItems.Formats set => (_internal as Data.Models.Metadata.DipLocation)?.Name = value; } + public long? Number + { + get => (_internal as Data.Models.Metadata.DipLocation)?.Number; + set => (_internal as Data.Models.Metadata.DipLocation)?.Number = value; + } + #endregion #region Constructors diff --git a/SabreTools.Metadata.Filter/FilterObject.cs b/SabreTools.Metadata.Filter/FilterObject.cs index 08286036..082a6642 100644 --- a/SabreTools.Metadata.Filter/FilterObject.cs +++ b/SabreTools.Metadata.Filter/FilterObject.cs @@ -480,9 +480,8 @@ namespace SabreTools.Metadata.Filter case DipLocation item when fieldName == "inverted": checkValue = item.Inverted.FromYesNo(); return true; - - case DipLocation item when fieldName == "invertwed": - checkValue = item.Inverted.FromYesNo(); + case DipLocation item when fieldName == "number": + checkValue = item.Number?.ToString(); return true; case DipSwitch item when fieldName == "default": diff --git a/SabreTools.Metadata/DictionaryBaseExtensions.cs b/SabreTools.Metadata/DictionaryBaseExtensions.cs index 8753117f..f01def6f 100644 --- a/SabreTools.Metadata/DictionaryBaseExtensions.cs +++ b/SabreTools.Metadata/DictionaryBaseExtensions.cs @@ -138,7 +138,7 @@ namespace SabreTools.Metadata } else if (self is DipLocation selfDipLocation && other is DipLocation otherDipLocation) { - if (selfDipLocation.Inverted != otherDipLocation.Inverted) + if (!selfDipLocation.Equals(otherDipLocation)) return false; } else if (self is DipSwitch selfDipSwitch && other is DipSwitch otherDipSwitch) diff --git a/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs b/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs index 923948d6..4cec022f 100644 --- a/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/ListxmlTests.cs @@ -190,7 +190,7 @@ namespace SabreTools.Serialization.CrossModel.Test var diplocation = new Data.Models.Listxml.DipLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -669,7 +669,7 @@ namespace SabreTools.Serialization.CrossModel.Test { Assert.NotNull(diplocation); Assert.Equal("name", diplocation.Name); - Assert.Equal("XXXXXX", diplocation.Number); + Assert.Equal(12345, diplocation.Number); Assert.Equal(true, diplocation.Inverted); } diff --git a/SabreTools.Serialization.CrossModel.Test/M1Tests.cs b/SabreTools.Serialization.CrossModel.Test/M1Tests.cs index bd93c9f9..708ff79e 100644 --- a/SabreTools.Serialization.CrossModel.Test/M1Tests.cs +++ b/SabreTools.Serialization.CrossModel.Test/M1Tests.cs @@ -186,7 +186,7 @@ namespace SabreTools.Serialization.CrossModel.Test var diplocation = new Data.Models.Listxml.DipLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -663,7 +663,7 @@ namespace SabreTools.Serialization.CrossModel.Test { Assert.NotNull(diplocation); Assert.Equal("name", diplocation.Name); - Assert.Equal("XXXXXX", diplocation.Number); + Assert.Equal(12345, diplocation.Number); Assert.Equal(true, diplocation.Inverted); } diff --git a/SabreTools.Serialization.CrossModel.Test/MessTests.cs b/SabreTools.Serialization.CrossModel.Test/MessTests.cs index 73a2d3f3..ca6e5d12 100644 --- a/SabreTools.Serialization.CrossModel.Test/MessTests.cs +++ b/SabreTools.Serialization.CrossModel.Test/MessTests.cs @@ -186,7 +186,7 @@ namespace SabreTools.Serialization.CrossModel.Test var diplocation = new Data.Models.Listxml.DipLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -663,7 +663,7 @@ namespace SabreTools.Serialization.CrossModel.Test { Assert.NotNull(diplocation); Assert.Equal("name", diplocation.Name); - Assert.Equal("XXXXXX", diplocation.Number); + Assert.Equal(12345, diplocation.Number); Assert.Equal(true, diplocation.Inverted); } diff --git a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs index 1e1c156a..110e346c 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Deserializer.cs @@ -344,7 +344,7 @@ namespace SabreTools.Serialization.CrossModel var dipLocation = new DipLocation { Name = item.Name, - Number = item.ReadString(Data.Models.Metadata.DipLocation.NumberKey), + Number = item.Number, Inverted = item.Inverted, }; return dipLocation; diff --git a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs index b5400bbf..0fdb74fe 100644 --- a/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs +++ b/SabreTools.Serialization.CrossModel/Listxml.Serializer.cs @@ -380,7 +380,7 @@ namespace SabreTools.Serialization.CrossModel var dipLocation = new Data.Models.Metadata.DipLocation { Name = item.Name, - [Data.Models.Metadata.DipLocation.NumberKey] = item.Number, + Number = item.Number, Inverted = item.Inverted, }; return dipLocation; diff --git a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs index dcc48b90..619e4620 100644 --- a/SabreTools.Serialization.Readers.Test/ListxmlTests.cs +++ b/SabreTools.Serialization.Readers.Test/ListxmlTests.cs @@ -257,7 +257,7 @@ namespace SabreTools.Serialization.Readers.Test var diplocation = new Data.Models.Listxml.DipLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -736,7 +736,7 @@ namespace SabreTools.Serialization.Readers.Test { Assert.NotNull(diplocation); Assert.Equal("name", diplocation.Name); - Assert.Equal("XXXXXX", diplocation.Number); + Assert.Equal(12345, diplocation.Number); Assert.Equal(true, diplocation.Inverted); } diff --git a/SabreTools.Serialization.Readers.Test/M1Tests.cs b/SabreTools.Serialization.Readers.Test/M1Tests.cs index aac4ce63..b71ccaed 100644 --- a/SabreTools.Serialization.Readers.Test/M1Tests.cs +++ b/SabreTools.Serialization.Readers.Test/M1Tests.cs @@ -253,7 +253,7 @@ namespace SabreTools.Serialization.Readers.Test var diplocation = new Data.Models.Listxml.DipLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -730,7 +730,7 @@ namespace SabreTools.Serialization.Readers.Test { Assert.NotNull(diplocation); Assert.Equal("name", diplocation.Name); - Assert.Equal("XXXXXX", diplocation.Number); + Assert.Equal(12345, diplocation.Number); Assert.Equal(true, diplocation.Inverted); } diff --git a/SabreTools.Serialization.Readers.Test/MessTests.cs b/SabreTools.Serialization.Readers.Test/MessTests.cs index a827b740..365ccc61 100644 --- a/SabreTools.Serialization.Readers.Test/MessTests.cs +++ b/SabreTools.Serialization.Readers.Test/MessTests.cs @@ -253,7 +253,7 @@ namespace SabreTools.Serialization.Readers.Test var diplocation = new Data.Models.Listxml.DipLocation { Name = "name", - Number = "XXXXXX", + Number = 12345, Inverted = true, }; @@ -730,7 +730,7 @@ namespace SabreTools.Serialization.Readers.Test { Assert.NotNull(diplocation); Assert.Equal("name", diplocation.Name); - Assert.Equal("XXXXXX", diplocation.Number); + Assert.Equal(12345, diplocation.Number); Assert.Equal(true, diplocation.Inverted); } diff --git a/SabreTools.Serialization.Readers/Listxml.cs b/SabreTools.Serialization.Readers/Listxml.cs index bd50890c..ececc78c 100644 --- a/SabreTools.Serialization.Readers/Listxml.cs +++ b/SabreTools.Serialization.Readers/Listxml.cs @@ -435,7 +435,7 @@ namespace SabreTools.Serialization.Readers var obj = new DipLocation(); 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 eb8fb0fd..4f16ee3e 100644 --- a/SabreTools.Serialization.Readers/M1.cs +++ b/SabreTools.Serialization.Readers/M1.cs @@ -433,7 +433,7 @@ namespace SabreTools.Serialization.Readers var obj = new DipLocation(); 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 6f40d62b..dad755ab 100644 --- a/SabreTools.Serialization.Readers/Mess.cs +++ b/SabreTools.Serialization.Readers/Mess.cs @@ -433,7 +433,7 @@ namespace SabreTools.Serialization.Readers var obj = new DipLocation(); 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 1da5df05..e8f4b791 100644 --- a/SabreTools.Serialization.Writers/Listxml.cs +++ b/SabreTools.Serialization.Writers/Listxml.cs @@ -298,7 +298,7 @@ namespace SabreTools.Serialization.Writers writer.WriteStartElement("diplocation"); 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 b9ab826e..6077aad0 100644 --- a/SabreTools.Serialization.Writers/M1.cs +++ b/SabreTools.Serialization.Writers/M1.cs @@ -296,7 +296,7 @@ namespace SabreTools.Serialization.Writers writer.WriteStartElement("diplocation"); 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 35620506..5bd9d91d 100644 --- a/SabreTools.Serialization.Writers/Mess.cs +++ b/SabreTools.Serialization.Writers/Mess.cs @@ -296,7 +296,7 @@ namespace SabreTools.Serialization.Writers writer.WriteStartElement("diplocation"); writer.WriteRequiredAttributeString("name", obj.Name); - writer.WriteRequiredAttributeString("number", obj.Number); + writer.WriteRequiredAttributeString("number", obj.Number?.ToString()); writer.WriteOptionalAttributeString("inverted", obj.Inverted.FromYesNo()); writer.WriteEndElement();