diff --git a/src/BMEcatSharp/Types/Address.cs b/src/BMEcatSharp/Types/Address.cs index e89701b..d11b090 100644 --- a/src/BMEcatSharp/Types/Address.cs +++ b/src/BMEcatSharp/Types/Address.cs @@ -258,7 +258,7 @@ public bool EmailComponentsSpecified get { // HACK: called just before the payload gets serialized - EmailComponent.EmailsToEmailComponentsIfValueIsCreated(emails, ref emailComponents); + EmailComponent.EmailsToEmailComponents(emails, ref emailComponents); if (emailComponents?.Count > 0) { diff --git a/src/BMEcatSharp/Types/BMEBuyerAddress.cs b/src/BMEcatSharp/Types/BMEBuyerAddress.cs index 13dda41..9b8475f 100644 --- a/src/BMEcatSharp/Types/BMEBuyerAddress.cs +++ b/src/BMEcatSharp/Types/BMEBuyerAddress.cs @@ -298,7 +298,7 @@ public bool EmailComponentsSpecified get { // HACK: called just before the payload gets serialized - EmailComponent.EmailsToEmailComponentsIfValueIsCreated(emails, ref emailComponents); + EmailComponent.EmailsToEmailComponents(emails, ref emailComponents); if (emailComponents?.Count > 0) { diff --git a/src/BMEcatSharp/Types/BMESupplierAddress.cs b/src/BMEcatSharp/Types/BMESupplierAddress.cs index aa96de5..1e4c6ff 100644 --- a/src/BMEcatSharp/Types/BMESupplierAddress.cs +++ b/src/BMEcatSharp/Types/BMESupplierAddress.cs @@ -298,7 +298,7 @@ public bool EmailComponentsSpecified get { // HACK: called just before the payload gets serialized - EmailComponent.EmailsToEmailComponentsIfValueIsCreated(emails, ref emailComponents); + EmailComponent.EmailsToEmailComponents(emails, ref emailComponents); if (emailComponents?.Count > 0) { diff --git a/src/BMEcatSharp/Types/EmailComponent.cs b/src/BMEcatSharp/Types/EmailComponent.cs index 47f287c..741a826 100644 --- a/src/BMEcatSharp/Types/EmailComponent.cs +++ b/src/BMEcatSharp/Types/EmailComponent.cs @@ -5,18 +5,6 @@ [EditorBrowsable(EditorBrowsableState.Never)] public abstract class EmailComponent { - [EditorBrowsable(EditorBrowsableState.Never)] - public static void EmailsToEmailComponentsIfValueIsCreated(Lazy?> emails, ref List? emailComponents) - { - if (!emails.IsValueCreated) - { - emailComponents = []; - return; - } - - EmailsToEmailComponents(emails, ref emailComponents); - } - [EditorBrowsable(EditorBrowsableState.Never)] public static void EmailsToEmailComponents(Lazy?> emails, ref List? emailComponents) { diff --git a/src/OpenTransSharp.Tests/OpenTransSharp.Tests.csproj b/src/OpenTransSharp.Tests/OpenTransSharp.Tests.csproj index 9309d13..7f07171 100644 --- a/src/OpenTransSharp.Tests/OpenTransSharp.Tests.csproj +++ b/src/OpenTransSharp.Tests/OpenTransSharp.Tests.csproj @@ -1,4 +1,4 @@ - + net6.0;net7.0;net8.0 @@ -49,6 +49,9 @@ Always + + Always + diff --git a/src/OpenTransSharp.Tests/Orders/OrderSerializationTests.cs b/src/OpenTransSharp.Tests/Orders/OrderSerializationTests.cs index 53e8aa9..39eb224 100644 --- a/src/OpenTransSharp.Tests/Orders/OrderSerializationTests.cs +++ b/src/OpenTransSharp.Tests/Orders/OrderSerializationTests.cs @@ -1,3 +1,4 @@ +using BMEcatSharp; using System.Linq; namespace OpenTransSharp.Tests.Orders; @@ -197,4 +198,86 @@ public void Ticket17_Directly_set_Address_Emails_property_is_serialized_even_if_ serializedContent.Should().Contain("email@example.com"); serializedContent.Should().Contain("email.2@example.com"); } + + [Test] + public void Ticket19_deserialized_and_immediately_serialized_address_keeps_email_values() + { + var options = new OpenTransXmlSerializerOptions(); + var serializerFactory = new OpenTransXmlSerializerFactory(options); + + var serializer = serializerFactory.Create
(); + + var addressString = """ +
+ + general-id + general-name + + general-mail +
+ """; + var deserialized = serializer.Deserialize
(addressString); + + var serializedContent = serializer.Serialize(deserialized); + + serializedContent.Should().Contain("general-mail"); + } + + [Test] + public void Ticket19_deserialized_and_immediately_serialized_address_keeps_email_values_while_accessing_emails_inbetween() + { + var options = new OpenTransXmlSerializerOptions(); + var serializerFactory = new OpenTransXmlSerializerFactory(options); + + var serializer = serializerFactory.Create
(); + + var addressString = """ +
+ + general-id + general-name + + general-mail +
+ """; + var deserialized = serializer.Deserialize
(addressString); + + var emails = deserialized.Emails; + + var serializedContent = serializer.Serialize(deserialized); + + serializedContent.Should().Contain("general-mail"); + } + + [Test] + public void Ticket19_deserialized_and_immediately_serialized_address_keeps_email_values_while_mutating_emails_inbetween() + { + var options = new OpenTransXmlSerializerOptions(); + var serializerFactory = new OpenTransXmlSerializerFactory(options); + + var serializer = serializerFactory.Create
(); + + var addressString = """ +
+ + general-id + general-name + + general-mail +
+ """; + var deserialized = serializer.Deserialize
(addressString); + + var emails = deserialized.Emails; + emails.Clear(); + emails.Add(new Email("another-email@gmail.com")); + + var serializedContent = serializer.Serialize(deserialized); + + serializedContent.Should().NotContain("general-mail"); + serializedContent.Should().Contain("another-email@gmail.com"); + } } diff --git a/src/OpenTransSharp.Tests/Quotations/QuotationSerializationTests.cs b/src/OpenTransSharp.Tests/Quotations/QuotationSerializationTests.cs index 0d68211..0d161c2 100644 --- a/src/OpenTransSharp.Tests/Quotations/QuotationSerializationTests.cs +++ b/src/OpenTransSharp.Tests/Quotations/QuotationSerializationTests.cs @@ -56,4 +56,14 @@ public void Can_validate_Quotation_with_UDX() Debug.WriteLine(serialized); order.IsValid(target).Should().Be(true); } + + [Test] + public void Can_deserialize_Quotation_Emails_Ticket_19() + { + var quotation = File.ReadAllText("""Quotations\ticket_19_deserialize_email.xml"""); + var deserialized = target.Deserialize(quotation); + + var serialized = target.Serialize(deserialized); + serialized.Should().Contain("general-mail"); + } } diff --git a/src/OpenTransSharp.Tests/Quotations/ticket_19_deserialize_email.xml b/src/OpenTransSharp.Tests/Quotations/ticket_19_deserialize_email.xml new file mode 100644 index 0000000..8ad3950 --- /dev/null +++ b/src/OpenTransSharp.Tests/Quotations/ticket_19_deserialize_email.xml @@ -0,0 +1,66 @@ + + + + + 149136 + 2024-01-11T00:00:00 + 2024-01-11T00:00:00 + 2024-01-31T00:00:00 + + + 123456 + buyer +
+ + general-id + general-name + + general-mail +
+
+ + 400302 + delivery + + + 400302 + invoice_recipient + + + 400302 + supplier + +
+ + 400302 + 400302 + 400302 + + EUR + + FCA + UPS + + 8 weeks +
+
+ + + 1.0 + + N01.544.660.13.004 + Mitnehmer + + 24 + C62 + 2500.8 + + 2024-05-03T16:45:36.3398861+02:00 + 2024-05-03T16:45:36.3398882+02:00 + + + + + 1 + +
\ No newline at end of file diff --git a/src/OpenTransSharp/Types/Address.cs b/src/OpenTransSharp/Types/Address.cs index 05f71d9..7f479d7 100644 --- a/src/OpenTransSharp/Types/Address.cs +++ b/src/OpenTransSharp/Types/Address.cs @@ -7,6 +7,7 @@ namespace OpenTransSharp; ///
/// This element is used to transfer address information of a business partner. /// +[OpenTransXmlRoot("ADDRESS")] public class Address { /// @@ -270,7 +271,7 @@ public bool EmailComponentsSpecified get { // HACK: called just before the payload gets serialized - EmailComponent.EmailsToEmailComponentsIfValueIsCreated(emails, ref emailComponents); + EmailComponent.EmailsToEmailComponents(emails, ref emailComponents); if (emailComponents?.Count > 0) { diff --git a/src/OpenTransSharp/Xml/OpenTransXmlRootAttribute.cs b/src/OpenTransSharp/Xml/OpenTransXmlRootAttribute.cs new file mode 100644 index 0000000..ba1b468 --- /dev/null +++ b/src/OpenTransSharp/Xml/OpenTransXmlRootAttribute.cs @@ -0,0 +1,19 @@ +namespace OpenTransSharp.Xml; + +public class OpenTransXmlRootAttribute : XmlRootAttribute +{ + public OpenTransXmlRootAttribute() + { + Init(); + } + + public OpenTransXmlRootAttribute(string elementName) : base(elementName) + { + Init(); + } + + private void Init() + { + Namespace = "http://www.opentrans.org/XMLSchema/2.1"; + } +}