From 3255547998e52a587874e5940f00742c241dc33f Mon Sep 17 00:00:00 2001 From: Jeffrey Stedfast Date: Sat, 22 Jun 2024 14:30:42 -0400 Subject: [PATCH] Added tests for HeaderList.set_Item[int index] and fixed a bug that was exposed --- MimeKit/HeaderList.cs | 6 +++--- UnitTests/HeaderListTests.cs | 37 ++++++++++++++++++++++++++++++++++++ UnitTests/HeaderTests.cs | 2 ++ 3 files changed, 42 insertions(+), 3 deletions(-) diff --git a/MimeKit/HeaderList.cs b/MimeKit/HeaderList.cs index dc4fcf924b..afb39355b7 100644 --- a/MimeKit/HeaderList.cs +++ b/MimeKit/HeaderList.cs @@ -1150,11 +1150,11 @@ public void RemoveAt (int index) } // update the table for the header being set - if (table.TryGetValue (value.Field, out header)) { - int idx = headers.IndexOf (header); + if (table.TryGetValue (value.Field, out var oldValue)) { + int idx = headers.IndexOf (oldValue); if (idx > index) - table[header.Field] = value; + table[oldValue.Field] = value; } else { table.Add (value.Field, value); } diff --git a/UnitTests/HeaderListTests.cs b/UnitTests/HeaderListTests.cs index a89ac3c159..f784d7a40b 100644 --- a/UnitTests/HeaderListTests.cs +++ b/UnitTests/HeaderListTests.cs @@ -273,5 +273,42 @@ public void TestReplacingMultipleHeaders () Assert.That (headers.IndexOf ("From"), Is.EqualTo (0), "From header not in the expected position."); Assert.That (headers.IndexOf ("Cc"), Is.EqualTo (2), "Cc header not in the expected position."); } + + [Test] + public void TestSetHeaderAtIndex () + { + var headers = new HeaderList { + new Header ("From", "Joe Schmoe "), + new Header ("To", "Jane Doe "), + new Header ("Subject", "Hello, World!"), + new Header ("Date", "Wed, 17 Jul 2019 16:00:00 -0400") + }; + int index = headers.IndexOf (HeaderId.Subject); + var subject = headers[index]; + var changedActions = new List (); + int changedCount = 0; + + Assert.That (subject.Id, Is.EqualTo (HeaderId.Subject)); + + // listen for CHanged events + headers.Changed += (sender, e) => { + changedActions.Add (e.Action); + changedCount++; + }; + + // setting the same header should not trigger a change eventheaders[index] = subject; + Assert.That (changedCount, Is.EqualTo (0), "Setting the same header at an index should not raise a Changed event"); + + // setting a header with the same field name/id + headers[index] = new Header (HeaderId.Subject, "This is a different subject!"); + Assert.That (changedCount, Is.EqualTo (1), "Setting a different header at an index should raise a Changed event"); + Assert.That (changedActions[0], Is.EqualTo (HeaderListChangedAction.Changed), "Setting a different header at an index should raise a Changed event"); + + // setting a header with a different field name/id + headers[index] = new Header (HeaderId.MessageId, ""); + Assert.That (changedCount, Is.EqualTo (3), "Setting a different header at an index should raise a Changed event"); + Assert.That (changedActions[1], Is.EqualTo (HeaderListChangedAction.Removed), "Expected a Removed action for the old header"); + Assert.That (changedActions[2], Is.EqualTo (HeaderListChangedAction.Added), "Expected an Added action for the new header"); + } } } diff --git a/UnitTests/HeaderTests.cs b/UnitTests/HeaderTests.cs index 0038d6ac0e..4df974f513 100644 --- a/UnitTests/HeaderTests.cs +++ b/UnitTests/HeaderTests.cs @@ -479,6 +479,8 @@ public void TestToHeaderId () parsed = "X-MadeUp-Header".ToHeaderId (); Assert.That (parsed, Is.EqualTo (HeaderId.Unknown), "Failed to parse the made-up header value"); + + Assert.That (((HeaderId) 1025).ToHeaderName (), Is.EqualTo ("Unknown"), "Unknown HeaderId"); } [Test]