#176 Add Clone() to MediaTypeHeaderValue and NameValueHeaderValue.
This commit is contained in:
parent
54fbf51894
commit
99ea4fed8a
|
|
@ -248,6 +248,27 @@ namespace Microsoft.Net.Http.Headers
|
|||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Performs a deep copy of this object and all of it's NameValueHeaderValue sub components,
|
||||
/// while avoiding the cost of revalidating the components.
|
||||
/// </summary>
|
||||
/// <returns>A deep copy.</returns>
|
||||
public MediaTypeHeaderValue Clone()
|
||||
{
|
||||
var other = new MediaTypeHeaderValue();
|
||||
other._mediaType = _mediaType;
|
||||
|
||||
if (_parameters != null)
|
||||
{
|
||||
other._parameters = new ObjectCollection<NameValueHeaderValue>();
|
||||
foreach (var pair in _parameters)
|
||||
{
|
||||
other._parameters.Add(pair.Clone());
|
||||
}
|
||||
}
|
||||
return other;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return _mediaType + NameValueHeaderValue.ToString(_parameters, ';', true);
|
||||
|
|
|
|||
|
|
@ -54,6 +54,19 @@ namespace Microsoft.Net.Http.Headers
|
|||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provides a copy of this object without the cost of re-validating the values.
|
||||
/// </summary>
|
||||
/// <returns>A copy.</returns>
|
||||
public NameValueHeaderValue Clone()
|
||||
{
|
||||
return new NameValueHeaderValue()
|
||||
{
|
||||
_name = _name,
|
||||
_value = _value
|
||||
};
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
Contract.Assert(_name != null);
|
||||
|
|
|
|||
|
|
@ -64,6 +64,34 @@ namespace Microsoft.Net.Http.Headers
|
|||
Assert.Throws<ArgumentNullException>(() => mediaType.Parameters.Add(null));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Clone_SimpleMediaType_Copied()
|
||||
{
|
||||
var mediaType0 = new MediaTypeHeaderValue("text/plain");
|
||||
var mediaType1 = mediaType0.Clone();
|
||||
Assert.NotSame(mediaType0, mediaType1);
|
||||
Assert.Same(mediaType0.MediaType, mediaType1.MediaType);
|
||||
Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters);
|
||||
Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Clone_WithParameters_Copied()
|
||||
{
|
||||
var mediaType0 = new MediaTypeHeaderValue("text/plain");
|
||||
mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value"));
|
||||
var mediaType1 = mediaType0.Clone();
|
||||
Assert.NotSame(mediaType0, mediaType1);
|
||||
Assert.Same(mediaType0.MediaType, mediaType1.MediaType);
|
||||
Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters);
|
||||
Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count);
|
||||
var pair0 = mediaType0.Parameters.First();
|
||||
var pair1 = mediaType1.Parameters.First();
|
||||
Assert.NotSame(pair0, pair1);
|
||||
Assert.Same(pair0.Name, pair1.Name);
|
||||
Assert.Same(pair0.Value, pair1.Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MediaType_SetAndGetMediaType_MatchExpectations()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -59,6 +59,32 @@ namespace Microsoft.Net.Http.Headers
|
|||
CheckValue("\"quoted string with quoted \\\" quote-pair\"");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Clone_NameOnly_SuccesfullyCopied()
|
||||
{
|
||||
var pair0 = new NameValueHeaderValue("name");
|
||||
var pair1 = pair0.Clone();
|
||||
Assert.NotSame(pair0, pair1);
|
||||
Assert.Same(pair0.Name, pair1.Name);
|
||||
Assert.Null(pair0.Value);
|
||||
Assert.Null(pair1.Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Clone_NameAndValue_SuccesfullyCopied()
|
||||
{
|
||||
var pair0 = new NameValueHeaderValue("name", "value");
|
||||
var pair1 = pair0.Clone();
|
||||
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.
|
||||
pair1.Value = "othervalue";
|
||||
Assert.Equal("value", pair0.Value);
|
||||
Assert.Equal("othervalue", pair1.Value);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Value_CallSetterWithInvalidValues_Throw()
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue