using System; using System.Collections.Generic; using System.Text; using Google.ProtocolBuffers.TestProtos; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace Google.ProtocolBuffers { [TestClass] public class GeneratedBuilderTest { class OneTimeEnumerator : IEnumerable { readonly T _item; bool _enumerated; public OneTimeEnumerator(T item) { _item = item; } public IEnumerator GetEnumerator() { Assert.IsFalse(_enumerated, "The collection {0} has already been enumerated", GetType()); _enumerated = true; yield return _item; } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } } [TestMethod] public void DoesNotEnumerateTwiceForMessageList() { TestAllTypes.Builder b = new TestAllTypes.Builder(); b.AddRangeRepeatedForeignMessage( new OneTimeEnumerator( ForeignMessage.DefaultInstance)); } [TestMethod] public void DoesNotEnumerateTwiceForPrimitiveList() { TestAllTypes.Builder b = new TestAllTypes.Builder(); b.AddRangeRepeatedInt32(new OneTimeEnumerator(1)); } [TestMethod] public void DoesNotEnumerateTwiceForStringList() { TestAllTypes.Builder b = new TestAllTypes.Builder(); b.AddRangeRepeatedString(new OneTimeEnumerator("test")); } [TestMethod] public void DoesNotEnumerateTwiceForEnumList() { TestAllTypes.Builder b = new TestAllTypes.Builder(); b.AddRangeRepeatedForeignEnum(new OneTimeEnumerator(ForeignEnum.FOREIGN_BAR)); } private delegate void TestMethod(); private static void AssertThrows(TestMethod method) where T : Exception { try { method(); } catch (Exception error) { if (error is T) return; throw; } Assert.Fail("Expected exception of type " + typeof(T)); } [TestMethod] public void DoesNotAddNullToMessageListByAddRange() { TestAllTypes.Builder b = new TestAllTypes.Builder(); AssertThrows( () => b.AddRangeRepeatedForeignMessage(new ForeignMessage[] { null }) ); } [TestMethod] public void DoesNotAddNullToMessageListByAdd() { TestAllTypes.Builder b = new TestAllTypes.Builder(); AssertThrows( () => b.AddRepeatedForeignMessage((ForeignMessage)null) ); } [TestMethod] public void DoesNotAddNullToMessageListBySet() { TestAllTypes.Builder b = new TestAllTypes.Builder(); b.AddRepeatedForeignMessage(ForeignMessage.DefaultInstance); AssertThrows( () => b.SetRepeatedForeignMessage(0, (ForeignMessage)null) ); } [TestMethod] public void DoesNotAddNullToStringListByAddRange() { TestAllTypes.Builder b = new TestAllTypes.Builder(); AssertThrows( () => b.AddRangeRepeatedString(new String[] { null }) ); } [TestMethod] public void DoesNotAddNullToStringListByAdd() { TestAllTypes.Builder b = new TestAllTypes.Builder(); AssertThrows( () => b.AddRepeatedString(null) ); } [TestMethod] public void DoesNotAddNullToStringListBySet() { TestAllTypes.Builder b = new TestAllTypes.Builder(); b.AddRepeatedString("one"); AssertThrows( () => b.SetRepeatedString(0, null) ); } } }