Index: third_party/protobuf/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs |
diff --git a/third_party/protobuf/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs b/third_party/protobuf/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs |
index 8ed54cfb48458011a135b9dd9617efa91f687df8..6852f75f8eb269defcefafaf3c3b090a1e2a4570 100644 |
--- a/third_party/protobuf/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs |
+++ b/third_party/protobuf/csharp/src/Google.Protobuf.Test/Collections/RepeatedFieldTest.cs |
@@ -75,10 +75,96 @@ namespace Google.Protobuf.Collections |
} |
[Test] |
- public void Add_RepeatedField() |
+ public void AddRange_SlowPath() |
+ { |
+ var list = new RepeatedField<string>(); |
+ list.AddRange(new[] { "foo", "bar" }.Select(x => x)); |
+ Assert.AreEqual(2, list.Count); |
+ Assert.AreEqual("foo", list[0]); |
+ Assert.AreEqual("bar", list[1]); |
+ } |
+ |
+ [Test] |
+ public void AddRange_SlowPath_NullsProhibited_ReferenceType() |
+ { |
+ var list = new RepeatedField<string>(); |
+ // It's okay for this to throw ArgumentNullException if necessary. |
+ // It's not ideal, but not awful. |
+ Assert.Catch<ArgumentException>(() => list.AddRange(new[] { "foo", null }.Select(x => x))); |
+ } |
+ |
+ [Test] |
+ public void AddRange_SlowPath_NullsProhibited_NullableValueType() |
+ { |
+ var list = new RepeatedField<int?>(); |
+ // It's okay for this to throw ArgumentNullException if necessary. |
+ // It's not ideal, but not awful. |
+ Assert.Catch<ArgumentException>(() => list.AddRange(new[] { 20, (int?)null }.Select(x => x))); |
+ } |
+ |
+ [Test] |
+ public void AddRange_Optimized_NonNullableValueType() |
+ { |
+ var list = new RepeatedField<int>(); |
+ list.AddRange(new List<int> { 20, 30 }); |
+ Assert.AreEqual(2, list.Count); |
+ Assert.AreEqual(20, list[0]); |
+ Assert.AreEqual(30, list[1]); |
+ } |
+ |
+ [Test] |
+ public void AddRange_Optimized_ReferenceType() |
+ { |
+ var list = new RepeatedField<string>(); |
+ list.AddRange(new List<string> { "foo", "bar" }); |
+ Assert.AreEqual(2, list.Count); |
+ Assert.AreEqual("foo", list[0]); |
+ Assert.AreEqual("bar", list[1]); |
+ } |
+ |
+ [Test] |
+ public void AddRange_Optimized_NullableValueType() |
+ { |
+ var list = new RepeatedField<int?>(); |
+ list.AddRange(new List<int?> { 20, 30 }); |
+ Assert.AreEqual(2, list.Count); |
+ Assert.AreEqual((int?) 20, list[0]); |
+ Assert.AreEqual((int?) 30, list[1]); |
+ } |
+ |
+ [Test] |
+ public void AddRange_Optimized_NullsProhibited_ReferenceType() |
+ { |
+ // We don't just trust that a collection with a nullable element type doesn't contain nulls |
+ var list = new RepeatedField<string>(); |
+ // It's okay for this to throw ArgumentNullException if necessary. |
+ // It's not ideal, but not awful. |
+ Assert.Catch<ArgumentException>(() => list.AddRange(new List<string> { "foo", null })); |
+ } |
+ |
+ [Test] |
+ public void AddRange_Optimized_NullsProhibited_NullableValueType() |
+ { |
+ // We don't just trust that a collection with a nullable element type doesn't contain nulls |
+ var list = new RepeatedField<int?>(); |
+ // It's okay for this to throw ArgumentNullException if necessary. |
+ // It's not ideal, but not awful. |
+ Assert.Catch<ArgumentException>(() => list.AddRange(new List<int?> { 20, null })); |
+ } |
+ |
+ [Test] |
+ public void AddRange_AlreadyNotEmpty() |
+ { |
+ var list = new RepeatedField<int> { 1, 2, 3 }; |
+ list.AddRange(new List<int> { 4, 5, 6 }); |
+ CollectionAssert.AreEqual(new[] { 1, 2, 3, 4, 5, 6 }, list); |
+ } |
+ |
+ [Test] |
+ public void AddRange_RepeatedField() |
{ |
var list = new RepeatedField<string> { "original" }; |
- list.Add(new RepeatedField<string> { "foo", "bar" }); |
+ list.AddRange(new RepeatedField<string> { "foo", "bar" }); |
Assert.AreEqual(3, list.Count); |
Assert.AreEqual("original", list[0]); |
Assert.AreEqual("foo", list[1]); |