From 40719b37f66e94f1295928bc942282cff9529a35 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 26 Jun 2015 14:34:22 -0700 Subject: [PATCH] #177 Enable Copy to return non-read-only. --- .../MediaTypeHeaderValue.cs | 5 ---- .../NameValueHeaderValue.cs | 5 ---- .../MediaTypeHeaderValueTest.cs | 23 +++++++++++++++++++ .../NameValueHeaderValueTest.cs | 16 +++++++++++++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 968eb4c6cc..aebf80e00b 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -273,11 +273,6 @@ namespace Microsoft.Net.Http.Headers /// A deep copy. public MediaTypeHeaderValue Copy() { - if (IsReadOnly) - { - return this; - } - var other = new MediaTypeHeaderValue(); other._mediaType = _mediaType; diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index c2e38e643c..f5b1c72435 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -64,11 +64,6 @@ namespace Microsoft.Net.Http.Headers /// A copy. public NameValueHeaderValue Copy() { - if (IsReadOnly) - { - return this; - } - return new NameValueHeaderValue() { _name = _name, diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index cfd389e4d4..9ca74a3632 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -135,6 +135,29 @@ namespace Microsoft.Net.Http.Headers Assert.Same(pair0.Value, pair1.Value); } + [Fact] + public void CopyFromReadOnly_WithParameters_CopiedAsNonReadOnly() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType1 = mediaType0.CopyAsReadOnly(); + var mediaType2 = mediaType1.Copy(); + + Assert.NotSame(mediaType2, mediaType1); + Assert.Same(mediaType2.MediaType, mediaType1.MediaType); + Assert.True(mediaType1.IsReadOnly); + Assert.False(mediaType2.IsReadOnly); + Assert.NotSame(mediaType2.Parameters, mediaType1.Parameters); + Assert.Equal(mediaType2.Parameters.Count, mediaType1.Parameters.Count); + var pair2 = mediaType2.Parameters.First(); + var pair1 = mediaType1.Parameters.First(); + Assert.NotSame(pair2, pair1); + Assert.True(pair1.IsReadOnly); + Assert.False(pair2.IsReadOnly); + Assert.Same(pair2.Name, pair1.Name); + Assert.Same(pair2.Value, pair1.Value); + } + [Fact] public void MediaType_SetAndGetMediaType_MatchExpectations() { diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index a5bf8c9b66..46d1d30d75 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -127,6 +127,22 @@ namespace Microsoft.Net.Http.Headers Assert.Throws(() => { pair1.Value = "othervalue"; }); } + [Fact] + public void CopyFromReadOnly_NameAndValue_CopiedAsNonReadOnly() + { + var pair0 = new NameValueHeaderValue("name", "value"); + var pair1 = pair0.CopyAsReadOnly(); + var pair2 = pair1.Copy(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + + // Change one value and verify the other is unchanged. + pair2.Value = "othervalue"; + Assert.Equal("othervalue", pair2.Value); + Assert.Equal("value", pair1.Value); + } + [Fact] public void Value_CallSetterWithInvalidValues_Throw() {