Quellcode durchsuchen

Fix to constructor access for nested types, and first pass at streaming.

Jon Skeet vor 17 Jahren
Ursprung
Commit
ad6903fe33

+ 2 - 6
csharp/ProtocolBuffers.Test/CodedOutputStreamTest.cs

@@ -21,10 +21,6 @@ namespace Google.ProtocolBuffers {
   [TestFixture]
   public class CodedOutputStreamTest {
 
-    private static void AssertEqualBytes(byte[] a, byte[] b) {
-      Assert.AreEqual(ByteString.CopyFrom(a), ByteString.CopyFrom(b));
-    }
-
     /// <summary>
     /// Writes the given value using WriteRawVarint32() and WriteRawVarint64() and
     /// checks that the result matches the given bytes
@@ -171,7 +167,7 @@ namespace Google.ProtocolBuffers {
       TestAllTypes message = TestUtil.GetAllSet();
 
       byte[] rawBytes = message.ToByteArray();
-      AssertEqualBytes(TestUtil.GoldenMessage.ToByteArray(), rawBytes);
+      TestUtil.AssertEqualBytes(TestUtil.GoldenMessage.ToByteArray(), rawBytes);
 
       // Try different block sizes.
       for (int blockSize = 1; blockSize < 256; blockSize *= 2) {
@@ -180,7 +176,7 @@ namespace Google.ProtocolBuffers {
           CodedOutputStream.CreateInstance(rawOutput, blockSize);
         message.WriteTo(output);
         output.Flush();
-        AssertEqualBytes(rawBytes, rawOutput.ToArray());
+        TestUtil.AssertEqualBytes(rawBytes, rawOutput.ToArray());
       }
     }
 

+ 23 - 0
csharp/ProtocolBuffers.Test/MessageStreamIteratorTest.cs

@@ -0,0 +1,23 @@
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using NUnit.Framework;
+using NestedMessage = Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage;
+
+namespace Google.ProtocolBuffers {
+  [TestFixture]
+  public class MessageStreamIteratorTest {
+
+    [Test]
+    public void ThreeMessagesInMemory() {
+      MemoryStream stream = new MemoryStream(MessageStreamWriterTest.ThreeMessageData);      
+      IEnumerable<NestedMessage> iterator = MessageStreamIterator.FromStreamProvider<NestedMessage>(() => stream);
+      List<NestedMessage> messages = new List<NestedMessage>(iterator);
+
+      Assert.AreEqual(3, messages.Count);
+      Assert.AreEqual(5, messages[0].Bb);
+      Assert.AreEqual(1500, messages[1].Bb);
+      Assert.IsFalse(messages[2].HasBb);
+    }
+  }
+}

+ 36 - 0
csharp/ProtocolBuffers.Test/MessageStreamWriterTest.cs

@@ -0,0 +1,36 @@
+using System.IO;
+using NUnit.Framework;
+using NestedMessage = Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage;
+
+namespace Google.ProtocolBuffers {
+  [TestFixture]
+  public class MessageStreamWriterTest {
+
+    internal static readonly byte[] ThreeMessageData = new byte[] {
+        (1 << 3) | 2, 2, // Field 1, 2 bytes long (first message)
+        (1 << 3) | 0, 5, // Field 1, value 5
+        (1 << 3) | 2, 3, // Field 1, 3 bytes long (second message)
+        (1 << 3) | 0, (1500 & 0x7f) | 0x80, 1500 >> 7, // Field 1, value 1500
+        (1 << 3) | 2, 0, // Field 1, no data (third message)
+    };
+
+    [Test]
+    public void ThreeMessages() {
+      NestedMessage message1 = new NestedMessage.Builder { Bb = 5 }.Build();
+      NestedMessage message2 = new NestedMessage.Builder { Bb = 1500 }.Build();
+      NestedMessage message3 = new NestedMessage.Builder().Build();
+
+      byte[] data;
+      using (MemoryStream stream = new MemoryStream()) {
+        MessageStreamWriter<NestedMessage> writer = new MessageStreamWriter<NestedMessage>(stream);
+        writer.Write(message1);
+        writer.Write(message2);
+        writer.Write(message3);
+        writer.Flush();
+        data = stream.ToArray();
+      }
+
+      TestUtil.AssertEqualBytes(ThreeMessageData, data);
+    }
+  }
+}

+ 5 - 1
csharp/ProtocolBuffers.Test/ProtocolBuffers.Test.csproj

@@ -3,7 +3,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{DD01ED24-3750-4567-9A23-1DB676A15610}</ProjectGuid>
     <OutputType>Library</OutputType>
@@ -42,6 +42,8 @@
       <HintPath>lib\Rhino.Mocks.dll</HintPath>
     </Reference>
     <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="AbstractMessageTest.cs" />
@@ -51,6 +53,8 @@
     <Compile Include="DescriptorsTest.cs" />
     <Compile Include="DynamicMessageTest.cs" />
     <Compile Include="GeneratedMessageTest.cs" />
+    <Compile Include="MessageStreamIteratorTest.cs" />
+    <Compile Include="MessageStreamWriterTest.cs" />
     <Compile Include="MessageTest.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="ReflectionTester.cs" />

+ 2 - 2
csharp/ProtocolBuffers.Test/TestProtos/MessageWithNoOuter.cs

@@ -112,7 +112,7 @@ namespace Google.ProtocolBuffers.TestProtos {
           }
           
           // Construct using global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Types.NestedMessage.CreateBuilder()
-          internal Builder() {}
+          public Builder() {}
           
           global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Types.NestedMessage result = new global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.Types.NestedMessage();
           
@@ -252,7 +252,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter result = new global::Google.ProtocolBuffers.TestProtos.MessageWithNoOuter();
       

+ 1 - 1
csharp/ProtocolBuffers.Test/TestProtos/UnitTestEmbedOptimizeForProtoFile.cs

@@ -185,7 +185,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize result = new global::Google.ProtocolBuffers.TestProtos.TestEmbedOptimizedForSize();
       

+ 1 - 1
csharp/ProtocolBuffers.Test/TestProtos/UnitTestImportProtoFile.cs

@@ -161,7 +161,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.ImportMessage.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.ImportMessage result = new global::Google.ProtocolBuffers.TestProtos.ImportMessage();
       

+ 6 - 6
csharp/ProtocolBuffers.Test/TestProtos/UnitTestMessageSetProtoFile.cs

@@ -189,7 +189,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestMessageSet.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestMessageSet result = new global::Google.ProtocolBuffers.TestProtos.TestMessageSet();
       
@@ -373,7 +373,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestMessageSetContainer.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestMessageSetContainer result = new global::Google.ProtocolBuffers.TestProtos.TestMessageSetContainer();
       
@@ -608,7 +608,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension1.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension1 result = new global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension1();
       
@@ -822,7 +822,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension2.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension2 result = new global::Google.ProtocolBuffers.TestProtos.TestMessageSetExtension2();
       
@@ -1071,7 +1071,7 @@ namespace Google.ProtocolBuffers.TestProtos {
           }
           
           // Construct using global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Types.Item.CreateBuilder()
-          internal Builder() {}
+          public Builder() {}
           
           global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Types.Item result = new global::Google.ProtocolBuffers.TestProtos.RawMessageSet.Types.Item();
           
@@ -1290,7 +1290,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.RawMessageSet.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.RawMessageSet result = new global::Google.ProtocolBuffers.TestProtos.RawMessageSet();
       

+ 1 - 1
csharp/ProtocolBuffers.Test/TestProtos/UnitTestOptimizeForProtoFile.cs

@@ -148,7 +148,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize result = new global::Google.ProtocolBuffers.TestProtos.TestOptimizedForSize();
       

+ 29 - 29
csharp/ProtocolBuffers.Test/TestProtos/UnitTestProtoFile.cs

@@ -1111,7 +1111,7 @@ namespace Google.ProtocolBuffers.TestProtos {
           }
           
           // Construct using global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage.CreateBuilder()
-          internal Builder() {}
+          public Builder() {}
           
           global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage result = new global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.NestedMessage();
           
@@ -1318,7 +1318,7 @@ namespace Google.ProtocolBuffers.TestProtos {
           }
           
           // Construct using global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup.CreateBuilder()
-          internal Builder() {}
+          public Builder() {}
           
           global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup result = new global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.OptionalGroup();
           
@@ -1525,7 +1525,7 @@ namespace Google.ProtocolBuffers.TestProtos {
           }
           
           // Construct using global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup.CreateBuilder()
-          internal Builder() {}
+          public Builder() {}
           
           global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup result = new global::Google.ProtocolBuffers.TestProtos.TestAllTypes.Types.RepeatedGroup();
           
@@ -2847,7 +2847,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestAllTypes.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestAllTypes result = new global::Google.ProtocolBuffers.TestProtos.TestAllTypes();
       
@@ -5420,7 +5420,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.ForeignMessage.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.ForeignMessage result = new global::Google.ProtocolBuffers.TestProtos.ForeignMessage();
       
@@ -5615,7 +5615,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestAllExtensions.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestAllExtensions result = new global::Google.ProtocolBuffers.TestProtos.TestAllExtensions();
       
@@ -5796,7 +5796,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension result = new global::Google.ProtocolBuffers.TestProtos.OptionalGroup_extension();
       
@@ -6003,7 +6003,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension result = new global::Google.ProtocolBuffers.TestProtos.RepeatedGroup_extension();
       
@@ -6735,7 +6735,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestRequired.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestRequired result = new global::Google.ProtocolBuffers.TestProtos.TestRequired();
       
@@ -7814,7 +7814,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign result = new global::Google.ProtocolBuffers.TestProtos.TestRequiredForeign();
       
@@ -8127,7 +8127,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestForeignNested.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestForeignNested result = new global::Google.ProtocolBuffers.TestProtos.TestForeignNested();
       
@@ -8339,7 +8339,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage result = new global::Google.ProtocolBuffers.TestProtos.TestEmptyMessage();
       
@@ -8508,7 +8508,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions result = new global::Google.ProtocolBuffers.TestProtos.TestEmptyMessageWithExtensions();
       
@@ -8705,7 +8705,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber result = new global::Google.ProtocolBuffers.TestProtos.TestReallyLargeTagNumber();
       
@@ -8954,7 +8954,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage result = new global::Google.ProtocolBuffers.TestProtos.TestRecursiveMessage();
       
@@ -9208,7 +9208,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA result = new global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionA();
       
@@ -9452,7 +9452,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB result = new global::Google.ProtocolBuffers.TestProtos.TestMutualRecursionB();
       
@@ -9730,7 +9730,7 @@ namespace Google.ProtocolBuffers.TestProtos {
           }
           
           // Construct using global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo.CreateBuilder()
-          internal Builder() {}
+          public Builder() {}
           
           global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo result = new global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Foo();
           
@@ -9937,7 +9937,7 @@ namespace Google.ProtocolBuffers.TestProtos {
           }
           
           // Construct using global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar.CreateBuilder()
-          internal Builder() {}
+          public Builder() {}
           
           global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar result = new global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.Types.Bar();
           
@@ -10157,7 +10157,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber result = new global::Google.ProtocolBuffers.TestProtos.TestDupFieldNumber();
       
@@ -10503,7 +10503,7 @@ namespace Google.ProtocolBuffers.TestProtos {
           }
           
           // Construct using global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage.CreateBuilder()
-          internal Builder() {}
+          public Builder() {}
           
           global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage result = new global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.Types.NestedMessage();
           
@@ -10768,7 +10768,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits result = new global::Google.ProtocolBuffers.TestProtos.TestNestedMessageHasBits();
       
@@ -11188,7 +11188,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames result = new global::Google.ProtocolBuffers.TestProtos.TestCamelCaseFieldNames();
       
@@ -11873,7 +11873,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings result = new global::Google.ProtocolBuffers.TestProtos.TestFieldOrderings();
       
@@ -12212,7 +12212,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues result = new global::Google.ProtocolBuffers.TestProtos.TestExtremeDefaultValues();
       
@@ -12533,7 +12533,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.FooRequest.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.FooRequest result = new global::Google.ProtocolBuffers.TestProtos.FooRequest();
       
@@ -12698,7 +12698,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.FooResponse.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.FooResponse result = new global::Google.ProtocolBuffers.TestProtos.FooResponse();
       
@@ -12863,7 +12863,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.BarRequest.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.BarRequest result = new global::Google.ProtocolBuffers.TestProtos.BarRequest();
       
@@ -13028,7 +13028,7 @@ namespace Google.ProtocolBuffers.TestProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.TestProtos.BarResponse.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.TestProtos.BarResponse result = new global::Google.ProtocolBuffers.TestProtos.BarResponse();
       

+ 204 - 200
csharp/ProtocolBuffers.Test/TestUtil.cs

@@ -755,7 +755,7 @@ namespace Google.ProtocolBuffers {
       message.SetExtension(UnitTestProtoFile.DefaultCordExtension, "425");
     }
 
-    public static void ModifyRepeatedFields(TestAllTypes.Builder message) {
+    internal static void ModifyRepeatedFields(TestAllTypes.Builder message) {
       message.SetRepeatedInt32(1, 501);
       message.SetRepeatedInt64(1, 502);
       message.SetRepeatedUint32(1, 503);
@@ -785,7 +785,7 @@ namespace Google.ProtocolBuffers {
       message.SetRepeatedCord(1, "525");
     }
 
-    public static void AssertRepeatedFieldsModified(TestAllTypes message) {
+    internal static void AssertRepeatedFieldsModified(TestAllTypes message) {
       // ModifyRepeatedFields only sets the second repeated element of each
       // field.  In addition to verifying this, we also verify that the first
       // element and size were *not* modified.
@@ -877,7 +877,7 @@ namespace Google.ProtocolBuffers {
     /// <summary>
     /// Helper to assert that sequences are equal.
     /// </summary>
-    public static void AssertEqual<T>(IEnumerable<T> first, IEnumerable<T> second) {
+    internal static void AssertEqual<T>(IEnumerable<T> first, IEnumerable<T> second) {
       using (IEnumerator<T> firstEnumerator = first.GetEnumerator()) {
         foreach (T secondElement in second) {
           Assert.IsTrue(firstEnumerator.MoveNext(), "First enumerator ran out of elements too early.");
@@ -887,207 +887,211 @@ namespace Google.ProtocolBuffers {
       }
     }
 
-    public static void AssertAllExtensionsSet(TestAllExtensions message) {
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalInt32Extension   ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalInt64Extension   ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalUint32Extension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalUint64Extension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalSint32Extension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalSint64Extension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalFixed32Extension ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalFixed64Extension ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalSfixed32Extension));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalSfixed64Extension));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalFloatExtension   ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalDoubleExtension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalBoolExtension    ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalStringExtension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalBytesExtension   ));
-
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalGroupExtension         ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalNestedMessageExtension ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalForeignMessageExtension));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalImportMessageExtension ));
-
-    Assert.IsTrue(message.GetExtension(UnitTestProtoFile.OptionalGroupExtension         ).HasA);
-    Assert.IsTrue(message.GetExtension(UnitTestProtoFile.OptionalNestedMessageExtension ).HasBb);
-    Assert.IsTrue(message.GetExtension(UnitTestProtoFile.OptionalForeignMessageExtension).HasC);
-    Assert.IsTrue(message.GetExtension(UnitTestProtoFile.OptionalImportMessageExtension ).HasD);
-
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalNestedEnumExtension ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalForeignEnumExtension));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalImportEnumExtension ));
-
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalStringPieceExtension));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalCordExtension));
-
-    Assert.AreEqual(101  , message.GetExtension(UnitTestProtoFile.OptionalInt32Extension   ));
-    Assert.AreEqual(102L , message.GetExtension(UnitTestProtoFile.OptionalInt64Extension   ));
-    Assert.AreEqual(103U  , message.GetExtension(UnitTestProtoFile.OptionalUint32Extension  ));
-    Assert.AreEqual(104UL , message.GetExtension(UnitTestProtoFile.OptionalUint64Extension  ));
-    Assert.AreEqual(105  , message.GetExtension(UnitTestProtoFile.OptionalSint32Extension  ));
-    Assert.AreEqual(106L , message.GetExtension(UnitTestProtoFile.OptionalSint64Extension  ));
-    Assert.AreEqual(107U  , message.GetExtension(UnitTestProtoFile.OptionalFixed32Extension ));
-    Assert.AreEqual(108UL , message.GetExtension(UnitTestProtoFile.OptionalFixed64Extension ));
-    Assert.AreEqual(109  , message.GetExtension(UnitTestProtoFile.OptionalSfixed32Extension));
-    Assert.AreEqual(110L , message.GetExtension(UnitTestProtoFile.OptionalSfixed64Extension));
-    Assert.AreEqual(111F , message.GetExtension(UnitTestProtoFile.OptionalFloatExtension   ));
-    Assert.AreEqual(112D , message.GetExtension(UnitTestProtoFile.OptionalDoubleExtension  ));
-    Assert.AreEqual(true , message.GetExtension(UnitTestProtoFile.OptionalBoolExtension    ));
-    Assert.AreEqual("115", message.GetExtension(UnitTestProtoFile.OptionalStringExtension  ));
-    Assert.AreEqual(ToBytes("116"), message.GetExtension(UnitTestProtoFile.OptionalBytesExtension));
-
-    Assert.AreEqual(117, message.GetExtension(UnitTestProtoFile.OptionalGroupExtension         ).A);
-    Assert.AreEqual(118, message.GetExtension(UnitTestProtoFile.OptionalNestedMessageExtension ).Bb);
-    Assert.AreEqual(119, message.GetExtension(UnitTestProtoFile.OptionalForeignMessageExtension).C);
-    Assert.AreEqual(120, message.GetExtension(UnitTestProtoFile.OptionalImportMessageExtension ).D);
-
-    Assert.AreEqual(TestAllTypes.Types.NestedEnum.BAZ, message.GetExtension(UnitTestProtoFile.OptionalNestedEnumExtension));
-    Assert.AreEqual(ForeignEnum.FOREIGN_BAZ, message.GetExtension(UnitTestProtoFile.OptionalForeignEnumExtension));
-    Assert.AreEqual(ImportEnum.IMPORT_BAZ, message.GetExtension(UnitTestProtoFile.OptionalImportEnumExtension));
-
-    Assert.AreEqual("124", message.GetExtension(UnitTestProtoFile.OptionalStringPieceExtension));
-    Assert.AreEqual("125", message.GetExtension(UnitTestProtoFile.OptionalCordExtension));
-
-    // -----------------------------------------------------------------
-
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedInt32Extension   ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedInt64Extension   ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedUint32Extension  ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedUint64Extension  ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedSint32Extension  ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedSint64Extension  ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedFixed32Extension ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedFixed64Extension ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedSfixed32Extension));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedSfixed64Extension));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedFloatExtension   ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedDoubleExtension  ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedBoolExtension    ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedStringExtension  ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedBytesExtension   ));
-
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedGroupExtension         ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedNestedMessageExtension ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedForeignMessageExtension));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedImportMessageExtension ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedNestedEnumExtension    ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedForeignEnumExtension   ));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedImportEnumExtension    ));
-
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedStringPieceExtension));
-    Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedCordExtension));
-
-    Assert.AreEqual(201  , message.GetExtension(UnitTestProtoFile.RepeatedInt32Extension   , 0));
-    Assert.AreEqual(202L , message.GetExtension(UnitTestProtoFile.RepeatedInt64Extension   , 0));
-    Assert.AreEqual(203U  , message.GetExtension(UnitTestProtoFile.RepeatedUint32Extension  , 0));
-    Assert.AreEqual(204UL , message.GetExtension(UnitTestProtoFile.RepeatedUint64Extension  , 0));
-    Assert.AreEqual(205  , message.GetExtension(UnitTestProtoFile.RepeatedSint32Extension  , 0));
-    Assert.AreEqual(206L , message.GetExtension(UnitTestProtoFile.RepeatedSint64Extension  , 0));
-    Assert.AreEqual(207U  , message.GetExtension(UnitTestProtoFile.RepeatedFixed32Extension , 0));
-    Assert.AreEqual(208UL , message.GetExtension(UnitTestProtoFile.RepeatedFixed64Extension , 0));
-    Assert.AreEqual(209  , message.GetExtension(UnitTestProtoFile.RepeatedSfixed32Extension, 0));
-    Assert.AreEqual(210L , message.GetExtension(UnitTestProtoFile.RepeatedSfixed64Extension, 0));
-    Assert.AreEqual(211F , message.GetExtension(UnitTestProtoFile.RepeatedFloatExtension   , 0));
-    Assert.AreEqual(212D , message.GetExtension(UnitTestProtoFile.RepeatedDoubleExtension  , 0));
-    Assert.AreEqual(true , message.GetExtension(UnitTestProtoFile.RepeatedBoolExtension    , 0));
-    Assert.AreEqual("215", message.GetExtension(UnitTestProtoFile.RepeatedStringExtension  , 0));
-    Assert.AreEqual(ToBytes("216"), message.GetExtension(UnitTestProtoFile.RepeatedBytesExtension, 0));
-
-    Assert.AreEqual(217, message.GetExtension(UnitTestProtoFile.RepeatedGroupExtension         , 0).A);
-    Assert.AreEqual(218, message.GetExtension(UnitTestProtoFile.RepeatedNestedMessageExtension , 0).Bb);
-    Assert.AreEqual(219, message.GetExtension(UnitTestProtoFile.RepeatedForeignMessageExtension, 0).C);
-    Assert.AreEqual(220, message.GetExtension(UnitTestProtoFile.RepeatedImportMessageExtension , 0).D);
-
-    Assert.AreEqual(TestAllTypes.Types.NestedEnum.BAR, message.GetExtension(UnitTestProtoFile.RepeatedNestedEnumExtension, 0));
-    Assert.AreEqual(ForeignEnum.FOREIGN_BAR, message.GetExtension(UnitTestProtoFile.RepeatedForeignEnumExtension, 0));
-    Assert.AreEqual(ImportEnum.IMPORT_BAR, message.GetExtension(UnitTestProtoFile.RepeatedImportEnumExtension, 0));
-
-    Assert.AreEqual("224", message.GetExtension(UnitTestProtoFile.RepeatedStringPieceExtension, 0));
-    Assert.AreEqual("225", message.GetExtension(UnitTestProtoFile.RepeatedCordExtension, 0));
-
-    Assert.AreEqual(301  , message.GetExtension(UnitTestProtoFile.RepeatedInt32Extension   , 1));
-    Assert.AreEqual(302L , message.GetExtension(UnitTestProtoFile.RepeatedInt64Extension   , 1));
-    Assert.AreEqual(303U  , message.GetExtension(UnitTestProtoFile.RepeatedUint32Extension  , 1));
-    Assert.AreEqual(304UL , message.GetExtension(UnitTestProtoFile.RepeatedUint64Extension  , 1));
-    Assert.AreEqual(305  , message.GetExtension(UnitTestProtoFile.RepeatedSint32Extension  , 1));
-    Assert.AreEqual(306L , message.GetExtension(UnitTestProtoFile.RepeatedSint64Extension  , 1));
-    Assert.AreEqual(307U  , message.GetExtension(UnitTestProtoFile.RepeatedFixed32Extension , 1));
-    Assert.AreEqual(308UL , message.GetExtension(UnitTestProtoFile.RepeatedFixed64Extension , 1));
-    Assert.AreEqual(309  , message.GetExtension(UnitTestProtoFile.RepeatedSfixed32Extension, 1));
-    Assert.AreEqual(310L , message.GetExtension(UnitTestProtoFile.RepeatedSfixed64Extension, 1));
-    Assert.AreEqual(311F , message.GetExtension(UnitTestProtoFile.RepeatedFloatExtension   , 1));
-    Assert.AreEqual(312D , message.GetExtension(UnitTestProtoFile.RepeatedDoubleExtension  , 1));
-    Assert.AreEqual(false, message.GetExtension(UnitTestProtoFile.RepeatedBoolExtension    , 1));
-    Assert.AreEqual("315", message.GetExtension(UnitTestProtoFile.RepeatedStringExtension  , 1));
-    Assert.AreEqual(ToBytes("316"), message.GetExtension(UnitTestProtoFile.RepeatedBytesExtension, 1));
-
-    Assert.AreEqual(317, message.GetExtension(UnitTestProtoFile.RepeatedGroupExtension         , 1).A);
-    Assert.AreEqual(318, message.GetExtension(UnitTestProtoFile.RepeatedNestedMessageExtension , 1).Bb);
-    Assert.AreEqual(319, message.GetExtension(UnitTestProtoFile.RepeatedForeignMessageExtension, 1).C);
-    Assert.AreEqual(320, message.GetExtension(UnitTestProtoFile.RepeatedImportMessageExtension , 1).D);
-
-    Assert.AreEqual(TestAllTypes.Types.NestedEnum.BAZ, message.GetExtension(UnitTestProtoFile.RepeatedNestedEnumExtension, 1));
-    Assert.AreEqual(ForeignEnum.FOREIGN_BAZ, message.GetExtension(UnitTestProtoFile.RepeatedForeignEnumExtension, 1));
-    Assert.AreEqual(ImportEnum.IMPORT_BAZ, message.GetExtension(UnitTestProtoFile.RepeatedImportEnumExtension, 1));
-
-    Assert.AreEqual("324", message.GetExtension(UnitTestProtoFile.RepeatedStringPieceExtension, 1));
-    Assert.AreEqual("325", message.GetExtension(UnitTestProtoFile.RepeatedCordExtension, 1));
-
-    // -----------------------------------------------------------------
-
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultInt32Extension   ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultInt64Extension   ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultUint32Extension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultUint64Extension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultSint32Extension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultSint64Extension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultFixed32Extension ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultFixed64Extension ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultSfixed32Extension));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultSfixed64Extension));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultFloatExtension   ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultDoubleExtension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultBoolExtension    ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultStringExtension  ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultBytesExtension   ));
-
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultNestedEnumExtension ));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultForeignEnumExtension));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultImportEnumExtension ));
-
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultStringPieceExtension));
-    Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultCordExtension));
-
-    Assert.AreEqual(401  , message.GetExtension(UnitTestProtoFile.DefaultInt32Extension   ));
-    Assert.AreEqual(402L , message.GetExtension(UnitTestProtoFile.DefaultInt64Extension   ));
-    Assert.AreEqual(403U  , message.GetExtension(UnitTestProtoFile.DefaultUint32Extension  ));
-    Assert.AreEqual(404UL , message.GetExtension(UnitTestProtoFile.DefaultUint64Extension  ));
-    Assert.AreEqual(405  , message.GetExtension(UnitTestProtoFile.DefaultSint32Extension  ));
-    Assert.AreEqual(406L , message.GetExtension(UnitTestProtoFile.DefaultSint64Extension  ));
-    Assert.AreEqual(407U  , message.GetExtension(UnitTestProtoFile.DefaultFixed32Extension ));
-    Assert.AreEqual(408UL , message.GetExtension(UnitTestProtoFile.DefaultFixed64Extension ));
-    Assert.AreEqual(409  , message.GetExtension(UnitTestProtoFile.DefaultSfixed32Extension));
-    Assert.AreEqual(410L , message.GetExtension(UnitTestProtoFile.DefaultSfixed64Extension));
-    Assert.AreEqual(411F , message.GetExtension(UnitTestProtoFile.DefaultFloatExtension   ));
-    Assert.AreEqual(412D , message.GetExtension(UnitTestProtoFile.DefaultDoubleExtension  ));
-    Assert.AreEqual(false, message.GetExtension(UnitTestProtoFile.DefaultBoolExtension    ));
-    Assert.AreEqual("415", message.GetExtension(UnitTestProtoFile.DefaultStringExtension  ));
-    Assert.AreEqual(ToBytes("416"), message.GetExtension(UnitTestProtoFile.DefaultBytesExtension));
-
-    Assert.AreEqual(TestAllTypes.Types.NestedEnum.FOO, message.GetExtension(UnitTestProtoFile.DefaultNestedEnumExtension ));
-    Assert.AreEqual(ForeignEnum.FOREIGN_FOO, message.GetExtension(UnitTestProtoFile.DefaultForeignEnumExtension));
-    Assert.AreEqual(ImportEnum.IMPORT_FOO, message.GetExtension(UnitTestProtoFile.DefaultImportEnumExtension));
-
-    Assert.AreEqual("424", message.GetExtension(UnitTestProtoFile.DefaultStringPieceExtension));
-    Assert.AreEqual("425", message.GetExtension(UnitTestProtoFile.DefaultCordExtension));
+    internal static void AssertEqualBytes(byte[] expected, byte[] actual) {
+      Assert.AreEqual(ByteString.CopyFrom(expected), ByteString.CopyFrom(actual));
+    }
+
+    internal static void AssertAllExtensionsSet(TestAllExtensions message) {
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalInt32Extension   ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalInt64Extension   ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalUint32Extension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalUint64Extension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalSint32Extension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalSint64Extension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalFixed32Extension ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalFixed64Extension ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalSfixed32Extension));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalSfixed64Extension));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalFloatExtension   ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalDoubleExtension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalBoolExtension    ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalStringExtension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalBytesExtension   ));
+
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalGroupExtension         ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalNestedMessageExtension ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalForeignMessageExtension));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalImportMessageExtension ));
+
+      Assert.IsTrue(message.GetExtension(UnitTestProtoFile.OptionalGroupExtension         ).HasA);
+      Assert.IsTrue(message.GetExtension(UnitTestProtoFile.OptionalNestedMessageExtension ).HasBb);
+      Assert.IsTrue(message.GetExtension(UnitTestProtoFile.OptionalForeignMessageExtension).HasC);
+      Assert.IsTrue(message.GetExtension(UnitTestProtoFile.OptionalImportMessageExtension ).HasD);
+
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalNestedEnumExtension ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalForeignEnumExtension));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalImportEnumExtension ));
+
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalStringPieceExtension));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.OptionalCordExtension));
+
+      Assert.AreEqual(101  , message.GetExtension(UnitTestProtoFile.OptionalInt32Extension   ));
+      Assert.AreEqual(102L , message.GetExtension(UnitTestProtoFile.OptionalInt64Extension   ));
+      Assert.AreEqual(103U  , message.GetExtension(UnitTestProtoFile.OptionalUint32Extension  ));
+      Assert.AreEqual(104UL , message.GetExtension(UnitTestProtoFile.OptionalUint64Extension  ));
+      Assert.AreEqual(105  , message.GetExtension(UnitTestProtoFile.OptionalSint32Extension  ));
+      Assert.AreEqual(106L , message.GetExtension(UnitTestProtoFile.OptionalSint64Extension  ));
+      Assert.AreEqual(107U  , message.GetExtension(UnitTestProtoFile.OptionalFixed32Extension ));
+      Assert.AreEqual(108UL , message.GetExtension(UnitTestProtoFile.OptionalFixed64Extension ));
+      Assert.AreEqual(109  , message.GetExtension(UnitTestProtoFile.OptionalSfixed32Extension));
+      Assert.AreEqual(110L , message.GetExtension(UnitTestProtoFile.OptionalSfixed64Extension));
+      Assert.AreEqual(111F , message.GetExtension(UnitTestProtoFile.OptionalFloatExtension   ));
+      Assert.AreEqual(112D , message.GetExtension(UnitTestProtoFile.OptionalDoubleExtension  ));
+      Assert.AreEqual(true , message.GetExtension(UnitTestProtoFile.OptionalBoolExtension    ));
+      Assert.AreEqual("115", message.GetExtension(UnitTestProtoFile.OptionalStringExtension  ));
+      Assert.AreEqual(ToBytes("116"), message.GetExtension(UnitTestProtoFile.OptionalBytesExtension));
+
+      Assert.AreEqual(117, message.GetExtension(UnitTestProtoFile.OptionalGroupExtension         ).A);
+      Assert.AreEqual(118, message.GetExtension(UnitTestProtoFile.OptionalNestedMessageExtension ).Bb);
+      Assert.AreEqual(119, message.GetExtension(UnitTestProtoFile.OptionalForeignMessageExtension).C);
+      Assert.AreEqual(120, message.GetExtension(UnitTestProtoFile.OptionalImportMessageExtension ).D);
+
+      Assert.AreEqual(TestAllTypes.Types.NestedEnum.BAZ, message.GetExtension(UnitTestProtoFile.OptionalNestedEnumExtension));
+      Assert.AreEqual(ForeignEnum.FOREIGN_BAZ, message.GetExtension(UnitTestProtoFile.OptionalForeignEnumExtension));
+      Assert.AreEqual(ImportEnum.IMPORT_BAZ, message.GetExtension(UnitTestProtoFile.OptionalImportEnumExtension));
+
+      Assert.AreEqual("124", message.GetExtension(UnitTestProtoFile.OptionalStringPieceExtension));
+      Assert.AreEqual("125", message.GetExtension(UnitTestProtoFile.OptionalCordExtension));
+
+      // -----------------------------------------------------------------
+
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedInt32Extension   ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedInt64Extension   ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedUint32Extension  ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedUint64Extension  ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedSint32Extension  ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedSint64Extension  ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedFixed32Extension ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedFixed64Extension ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedSfixed32Extension));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedSfixed64Extension));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedFloatExtension   ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedDoubleExtension  ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedBoolExtension    ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedStringExtension  ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedBytesExtension   ));
+
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedGroupExtension         ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedNestedMessageExtension ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedForeignMessageExtension));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedImportMessageExtension ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedNestedEnumExtension    ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedForeignEnumExtension   ));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedImportEnumExtension    ));
+
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedStringPieceExtension));
+      Assert.AreEqual(2, message.GetExtensionCount(UnitTestProtoFile.RepeatedCordExtension));
+
+      Assert.AreEqual(201  , message.GetExtension(UnitTestProtoFile.RepeatedInt32Extension   , 0));
+      Assert.AreEqual(202L , message.GetExtension(UnitTestProtoFile.RepeatedInt64Extension   , 0));
+      Assert.AreEqual(203U  , message.GetExtension(UnitTestProtoFile.RepeatedUint32Extension  , 0));
+      Assert.AreEqual(204UL , message.GetExtension(UnitTestProtoFile.RepeatedUint64Extension  , 0));
+      Assert.AreEqual(205  , message.GetExtension(UnitTestProtoFile.RepeatedSint32Extension  , 0));
+      Assert.AreEqual(206L , message.GetExtension(UnitTestProtoFile.RepeatedSint64Extension  , 0));
+      Assert.AreEqual(207U  , message.GetExtension(UnitTestProtoFile.RepeatedFixed32Extension , 0));
+      Assert.AreEqual(208UL , message.GetExtension(UnitTestProtoFile.RepeatedFixed64Extension , 0));
+      Assert.AreEqual(209  , message.GetExtension(UnitTestProtoFile.RepeatedSfixed32Extension, 0));
+      Assert.AreEqual(210L , message.GetExtension(UnitTestProtoFile.RepeatedSfixed64Extension, 0));
+      Assert.AreEqual(211F , message.GetExtension(UnitTestProtoFile.RepeatedFloatExtension   , 0));
+      Assert.AreEqual(212D , message.GetExtension(UnitTestProtoFile.RepeatedDoubleExtension  , 0));
+      Assert.AreEqual(true , message.GetExtension(UnitTestProtoFile.RepeatedBoolExtension    , 0));
+      Assert.AreEqual("215", message.GetExtension(UnitTestProtoFile.RepeatedStringExtension  , 0));
+      Assert.AreEqual(ToBytes("216"), message.GetExtension(UnitTestProtoFile.RepeatedBytesExtension, 0));
+
+      Assert.AreEqual(217, message.GetExtension(UnitTestProtoFile.RepeatedGroupExtension         , 0).A);
+      Assert.AreEqual(218, message.GetExtension(UnitTestProtoFile.RepeatedNestedMessageExtension , 0).Bb);
+      Assert.AreEqual(219, message.GetExtension(UnitTestProtoFile.RepeatedForeignMessageExtension, 0).C);
+      Assert.AreEqual(220, message.GetExtension(UnitTestProtoFile.RepeatedImportMessageExtension , 0).D);
+
+      Assert.AreEqual(TestAllTypes.Types.NestedEnum.BAR, message.GetExtension(UnitTestProtoFile.RepeatedNestedEnumExtension, 0));
+      Assert.AreEqual(ForeignEnum.FOREIGN_BAR, message.GetExtension(UnitTestProtoFile.RepeatedForeignEnumExtension, 0));
+      Assert.AreEqual(ImportEnum.IMPORT_BAR, message.GetExtension(UnitTestProtoFile.RepeatedImportEnumExtension, 0));
+
+      Assert.AreEqual("224", message.GetExtension(UnitTestProtoFile.RepeatedStringPieceExtension, 0));
+      Assert.AreEqual("225", message.GetExtension(UnitTestProtoFile.RepeatedCordExtension, 0));
+
+      Assert.AreEqual(301  , message.GetExtension(UnitTestProtoFile.RepeatedInt32Extension   , 1));
+      Assert.AreEqual(302L , message.GetExtension(UnitTestProtoFile.RepeatedInt64Extension   , 1));
+      Assert.AreEqual(303U  , message.GetExtension(UnitTestProtoFile.RepeatedUint32Extension  , 1));
+      Assert.AreEqual(304UL , message.GetExtension(UnitTestProtoFile.RepeatedUint64Extension  , 1));
+      Assert.AreEqual(305  , message.GetExtension(UnitTestProtoFile.RepeatedSint32Extension  , 1));
+      Assert.AreEqual(306L , message.GetExtension(UnitTestProtoFile.RepeatedSint64Extension  , 1));
+      Assert.AreEqual(307U  , message.GetExtension(UnitTestProtoFile.RepeatedFixed32Extension , 1));
+      Assert.AreEqual(308UL , message.GetExtension(UnitTestProtoFile.RepeatedFixed64Extension , 1));
+      Assert.AreEqual(309  , message.GetExtension(UnitTestProtoFile.RepeatedSfixed32Extension, 1));
+      Assert.AreEqual(310L , message.GetExtension(UnitTestProtoFile.RepeatedSfixed64Extension, 1));
+      Assert.AreEqual(311F , message.GetExtension(UnitTestProtoFile.RepeatedFloatExtension   , 1));
+      Assert.AreEqual(312D , message.GetExtension(UnitTestProtoFile.RepeatedDoubleExtension  , 1));
+      Assert.AreEqual(false, message.GetExtension(UnitTestProtoFile.RepeatedBoolExtension    , 1));
+      Assert.AreEqual("315", message.GetExtension(UnitTestProtoFile.RepeatedStringExtension  , 1));
+      Assert.AreEqual(ToBytes("316"), message.GetExtension(UnitTestProtoFile.RepeatedBytesExtension, 1));
+
+      Assert.AreEqual(317, message.GetExtension(UnitTestProtoFile.RepeatedGroupExtension         , 1).A);
+      Assert.AreEqual(318, message.GetExtension(UnitTestProtoFile.RepeatedNestedMessageExtension , 1).Bb);
+      Assert.AreEqual(319, message.GetExtension(UnitTestProtoFile.RepeatedForeignMessageExtension, 1).C);
+      Assert.AreEqual(320, message.GetExtension(UnitTestProtoFile.RepeatedImportMessageExtension , 1).D);
+
+      Assert.AreEqual(TestAllTypes.Types.NestedEnum.BAZ, message.GetExtension(UnitTestProtoFile.RepeatedNestedEnumExtension, 1));
+      Assert.AreEqual(ForeignEnum.FOREIGN_BAZ, message.GetExtension(UnitTestProtoFile.RepeatedForeignEnumExtension, 1));
+      Assert.AreEqual(ImportEnum.IMPORT_BAZ, message.GetExtension(UnitTestProtoFile.RepeatedImportEnumExtension, 1));
+
+      Assert.AreEqual("324", message.GetExtension(UnitTestProtoFile.RepeatedStringPieceExtension, 1));
+      Assert.AreEqual("325", message.GetExtension(UnitTestProtoFile.RepeatedCordExtension, 1));
+
+      // -----------------------------------------------------------------
+
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultInt32Extension   ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultInt64Extension   ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultUint32Extension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultUint64Extension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultSint32Extension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultSint64Extension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultFixed32Extension ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultFixed64Extension ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultSfixed32Extension));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultSfixed64Extension));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultFloatExtension   ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultDoubleExtension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultBoolExtension    ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultStringExtension  ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultBytesExtension   ));
+
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultNestedEnumExtension ));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultForeignEnumExtension));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultImportEnumExtension ));
+
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultStringPieceExtension));
+      Assert.IsTrue(message.HasExtension(UnitTestProtoFile.DefaultCordExtension));
+
+      Assert.AreEqual(401  , message.GetExtension(UnitTestProtoFile.DefaultInt32Extension   ));
+      Assert.AreEqual(402L , message.GetExtension(UnitTestProtoFile.DefaultInt64Extension   ));
+      Assert.AreEqual(403U  , message.GetExtension(UnitTestProtoFile.DefaultUint32Extension  ));
+      Assert.AreEqual(404UL , message.GetExtension(UnitTestProtoFile.DefaultUint64Extension  ));
+      Assert.AreEqual(405  , message.GetExtension(UnitTestProtoFile.DefaultSint32Extension  ));
+      Assert.AreEqual(406L , message.GetExtension(UnitTestProtoFile.DefaultSint64Extension  ));
+      Assert.AreEqual(407U  , message.GetExtension(UnitTestProtoFile.DefaultFixed32Extension ));
+      Assert.AreEqual(408UL , message.GetExtension(UnitTestProtoFile.DefaultFixed64Extension ));
+      Assert.AreEqual(409  , message.GetExtension(UnitTestProtoFile.DefaultSfixed32Extension));
+      Assert.AreEqual(410L , message.GetExtension(UnitTestProtoFile.DefaultSfixed64Extension));
+      Assert.AreEqual(411F , message.GetExtension(UnitTestProtoFile.DefaultFloatExtension   ));
+      Assert.AreEqual(412D , message.GetExtension(UnitTestProtoFile.DefaultDoubleExtension  ));
+      Assert.AreEqual(false, message.GetExtension(UnitTestProtoFile.DefaultBoolExtension    ));
+      Assert.AreEqual("415", message.GetExtension(UnitTestProtoFile.DefaultStringExtension  ));
+      Assert.AreEqual(ToBytes("416"), message.GetExtension(UnitTestProtoFile.DefaultBytesExtension));
+
+      Assert.AreEqual(TestAllTypes.Types.NestedEnum.FOO, message.GetExtension(UnitTestProtoFile.DefaultNestedEnumExtension ));
+      Assert.AreEqual(ForeignEnum.FOREIGN_FOO, message.GetExtension(UnitTestProtoFile.DefaultForeignEnumExtension));
+      Assert.AreEqual(ImportEnum.IMPORT_FOO, message.GetExtension(UnitTestProtoFile.DefaultImportEnumExtension));
+
+      Assert.AreEqual("424", message.GetExtension(UnitTestProtoFile.DefaultStringPieceExtension));
+      Assert.AreEqual("425", message.GetExtension(UnitTestProtoFile.DefaultCordExtension));
     }
 
     /// <summary>
     /// Modifies the repeated extensions of the given message to contain the values
     /// expected by AssertRepeatedExtensionsModified.
     /// </summary>
-    public static void ModifyRepeatedExtensions(TestAllExtensions.Builder message) {
+    internal static void ModifyRepeatedExtensions(TestAllExtensions.Builder message) {
       message.SetExtension(UnitTestProtoFile.RepeatedInt32Extension, 1, 501);
       message.SetExtension(UnitTestProtoFile.RepeatedInt64Extension, 1, 502L);
       message.SetExtension(UnitTestProtoFile.RepeatedUint32Extension, 1, 503U);
@@ -1121,7 +1125,7 @@ namespace Google.ProtocolBuffers {
     /// Asserts that all repeated extensions are set to the values assigned by
     /// SetAllExtensions follwed by ModifyRepeatedExtensions.
     /// </summary>
-    public static void AssertRepeatedExtensionsModified(TestAllExtensions message) {
+    internal static void AssertRepeatedExtensionsModified(TestAllExtensions message) {
       // ModifyRepeatedFields only sets the second repeated element of each
       // field.  In addition to verifying this, we also verify that the first
       // element and size were *not* modified.
@@ -1210,7 +1214,7 @@ namespace Google.ProtocolBuffers {
       Assert.AreEqual("525", message.GetExtension(UnitTestProtoFile.RepeatedCordExtension, 1));
     }
 
-    public static void AssertExtensionsClear(TestAllExtensions message) {
+    internal static void AssertExtensionsClear(TestAllExtensions message) {
       // HasBlah() should initially be false for all optional fields.
       Assert.IsFalse(message.HasExtension(UnitTestProtoFile.OptionalInt32Extension));
       Assert.IsFalse(message.HasExtension(UnitTestProtoFile.OptionalInt64Extension));

+ 8 - 0
csharp/ProtocolBuffers/Delegates.cs

@@ -0,0 +1,8 @@
+using System.IO;
+namespace Google.ProtocolBuffers {
+
+  /// <summary>
+  /// Delegate to return a stream when asked, used by MessageStreamIterator.
+  /// </summary>
+  public delegate Stream StreamProvider();
+}

+ 16 - 16
csharp/ProtocolBuffers/DescriptorProtos/DescriptorProtoFile.cs

@@ -363,7 +363,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorSet.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorSet result = new global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorSet();
       
@@ -726,7 +726,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto result = new global::Google.ProtocolBuffers.DescriptorProtos.FileDescriptorProto();
       
@@ -1326,7 +1326,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
           }
           
           // Construct using global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Types.ExtensionRange.CreateBuilder()
-          internal Builder() {}
+          public Builder() {}
           
           global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Types.ExtensionRange result = new global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.Types.ExtensionRange();
           
@@ -1646,7 +1646,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto result = new global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProto();
       
@@ -2337,7 +2337,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto result = new global::Google.ProtocolBuffers.DescriptorProtos.FieldDescriptorProto();
       
@@ -2791,7 +2791,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.EnumDescriptorProto.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.EnumDescriptorProto result = new global::Google.ProtocolBuffers.DescriptorProtos.EnumDescriptorProto();
       
@@ -3136,7 +3136,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.EnumValueDescriptorProto.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.EnumValueDescriptorProto result = new global::Google.ProtocolBuffers.DescriptorProtos.EnumValueDescriptorProto();
       
@@ -3450,7 +3450,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.ServiceDescriptorProto.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.ServiceDescriptorProto result = new global::Google.ProtocolBuffers.DescriptorProtos.ServiceDescriptorProto();
       
@@ -3811,7 +3811,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.MethodDescriptorProto.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.MethodDescriptorProto result = new global::Google.ProtocolBuffers.DescriptorProtos.MethodDescriptorProto();
       
@@ -4254,7 +4254,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.FileOptions.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.FileOptions result = new global::Google.ProtocolBuffers.DescriptorProtos.FileOptions();
       
@@ -4674,7 +4674,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions result = new global::Google.ProtocolBuffers.DescriptorProtos.MessageOptions();
       
@@ -4906,7 +4906,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions result = new global::Google.ProtocolBuffers.DescriptorProtos.FieldOptions();
       
@@ -5128,7 +5128,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions result = new global::Google.ProtocolBuffers.DescriptorProtos.EnumOptions();
       
@@ -5293,7 +5293,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions result = new global::Google.ProtocolBuffers.DescriptorProtos.EnumValueOptions();
       
@@ -5458,7 +5458,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions result = new global::Google.ProtocolBuffers.DescriptorProtos.ServiceOptions();
       
@@ -5623,7 +5623,7 @@ namespace Google.ProtocolBuffers.DescriptorProtos {
       }
       
       // Construct using global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions.CreateBuilder()
-      internal Builder() {}
+      public Builder() {}
       
       global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions result = new global::Google.ProtocolBuffers.DescriptorProtos.MethodOptions();
       

+ 1 - 1
csharp/ProtocolBuffers/FieldAccess/RepeatedMessageAccessor.cs

@@ -36,7 +36,7 @@ namespace Google.ProtocolBuffers.FieldAccess {
     private readonly Func<IBuilder> createBuilderDelegate;
 
     internal RepeatedMessageAccessor(string name) : base(name) {
-      MethodInfo createBuilderMethod = ClrType.GetMethod("CreateBuilder", new Type[0]);
+      MethodInfo createBuilderMethod = ClrType.GetMethod("CreateBuilder", Type.EmptyTypes);
       if (createBuilderMethod == null) {
         throw new ArgumentException("No public static CreateBuilder method declared in " + ClrType.Name);
       }

+ 2 - 2
csharp/ProtocolBuffers/FieldAccess/SingleMessageAccessor.cs

@@ -31,8 +31,8 @@ namespace Google.ProtocolBuffers.FieldAccess {
     /// </summary>
     private readonly Func<IBuilder> createBuilderDelegate;
 
-    internal SingleMessageAccessor(string name) : base(name) {      
-      MethodInfo createBuilderMethod = ClrType.GetMethod("CreateBuilder", new Type[0]);
+    internal SingleMessageAccessor(string name) : base(name) {
+      MethodInfo createBuilderMethod = ClrType.GetMethod("CreateBuilder", Type.EmptyTypes);
       if (createBuilderMethod == null) {
         throw new ArgumentException("No public static CreateBuilder method declared in " + ClrType.Name);
       }

+ 5 - 0
csharp/ProtocolBuffers/InvalidProtocolBufferException.cs

@@ -71,5 +71,10 @@ namespace Google.ProtocolBuffers {
         "Protocol message was too large.  May be malicious.  " +
         "Use CodedInputStream.SetSizeLimit() to increase the size limit.");
     }
+
+    internal static InvalidProtocolBufferException InvalidMessageStreamTag() {
+      return new InvalidProtocolBufferException(
+        "Stream of protocol messages had invalid tag. Expected tag is length-delimited field 1.");
+    }
   }
 }

+ 124 - 0
csharp/ProtocolBuffers/MessageStreamIterator.cs

@@ -0,0 +1,124 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Collections;
+using System.IO;
+using System.Reflection;
+
+namespace Google.ProtocolBuffers {
+
+  /// <summary>
+  /// Helper class to create MessageStreamIterators without explicitly specifying
+  /// the builder type. The concrete builder type is determined by reflection, based
+  /// on the message type. The reflection step looks for a <c>CreateBuilder</c> method
+  /// in the message type which is public and static, and uses the return type of that
+  /// method as the builder type. This will work for all generated messages, whether
+  /// optimised for size or speed. It won't work for dynamic messages.
+  /// 
+  /// TODO(jonskeet): This also won't work for non-public protos :(
+  /// Pass in delegate to create a builder?
+  /// </summary>
+  public static class MessageStreamIterator {
+
+    public static IEnumerable<TMessage> FromFile<TMessage>(string file) 
+        where TMessage : IMessage<TMessage> {
+      return FromStreamProvider<TMessage>(() => File.OpenRead(file));
+    }
+
+    public static IEnumerable<TMessage> FromStreamProvider<TMessage>(StreamProvider streamProvider)
+        where TMessage : IMessage<TMessage> {
+      MethodInfo createBuilderMethod = typeof(TMessage).GetMethod("CreateBuilder", Type.EmptyTypes);
+      if (createBuilderMethod == null) {
+        throw new ArgumentException("Message type " + typeof(TMessage).FullName + " has no CreateBuilder method.");
+      }
+      if (createBuilderMethod.ReturnType == typeof(void)) {
+        throw new ArgumentException("CreateBuilder method in " + typeof(TMessage).FullName + " has void return type");
+      }
+      Type builderType = createBuilderMethod.ReturnType;
+      if (builderType.GetConstructor(Type.EmptyTypes) == null) {
+        throw new ArgumentException("Builder type " + builderType.FullName + " has no public parameterless constructor.");
+      }
+      Type messageInterface = typeof(IMessage<,>).MakeGenericType(typeof(TMessage), builderType);
+      Type builderInterface = typeof(IBuilder<,>).MakeGenericType(typeof(TMessage), builderType);
+      if (Array.IndexOf(typeof (TMessage).GetInterfaces(), messageInterface) == -1) {
+        throw new ArgumentException("Message type " + typeof(TMessage) + " doesn't implement " + messageInterface.FullName);
+      }
+      if (Array.IndexOf(builderType.GetInterfaces(), builderInterface) == -1) {
+        throw new ArgumentException("Builder type " + typeof(TMessage) + " doesn't implement " + builderInterface.FullName);
+      }
+      Type iteratorType = typeof(MessageStreamIterator<,>).MakeGenericType(typeof(TMessage), builderType);
+      MethodInfo factoryMethod = iteratorType.GetMethod("FromStreamProvider", new Type[] { typeof(StreamProvider) });
+      return (IEnumerable<TMessage>) factoryMethod.Invoke(null, new object[] { streamProvider });
+    }
+  }
+
+  /// <summary>
+  /// Iterates over data created using a <see cref="MessageStreamWriter{T}" />.
+  /// Unlike MessageStreamWriter, this class is not usually constructed directly with
+  /// a stream; instead it is provided with a way of opening a stream when iteration
+  /// is started. The stream is closed when the iteration is completed or the enumerator
+  /// is disposed. (This occurs naturally when using <c>foreach</c>.)
+  /// This type is generic in both the message type and the builder type; if only the
+  /// iteration is required (i.e. just <see cref="IEnumerable{T}" />) then the static
+  /// generic methods in the nongeneric class are more appropriate.
+  /// </summary>
+  public sealed class MessageStreamIterator<TMessage, TBuilder> : IEnumerable<TMessage> 
+      where TMessage : IMessage<TMessage, TBuilder>
+      where TBuilder : IBuilder<TMessage, TBuilder>, new() {
+
+    private readonly StreamProvider streamProvider;
+    private readonly ExtensionRegistry extensionRegistry;
+    private static readonly uint ExpectedTag = WireFormat.MakeTag(1, WireFormat.WireType.LengthDelimited);
+
+    private MessageStreamIterator(StreamProvider streamProvider, ExtensionRegistry extensionRegistry) {
+      this.streamProvider = streamProvider;
+      this.extensionRegistry = extensionRegistry;
+    }
+
+    /// <summary>
+    /// Creates an instance which opens the specified file when it begins
+    /// iterating. No extension registry is used when reading messages.
+    /// </summary>
+    public static MessageStreamIterator<TMessage, TBuilder> FromFile(string file) {
+      return new MessageStreamIterator<TMessage, TBuilder>(() => File.OpenRead(file), ExtensionRegistry.Empty);
+    }
+
+    /// <summary>
+    /// Creates an instance which calls the given delegate when it begins
+    /// iterating. No extension registry is used when reading messages.
+    /// </summary>
+    public static MessageStreamIterator<TMessage, TBuilder> FromStreamProvider(StreamProvider streamProvider) {
+      return new MessageStreamIterator<TMessage, TBuilder>(streamProvider, ExtensionRegistry.Empty);
+    }
+
+    /// <summary>
+    /// Creates a new instance which uses the same stream provider as this one,
+    /// but the specified extension registry.
+    /// </summary>
+    public MessageStreamIterator<TMessage, TBuilder> WithExtensionRegistry(ExtensionRegistry newRegistry) {
+      return new MessageStreamIterator<TMessage, TBuilder>(streamProvider, newRegistry);
+    }
+
+    public IEnumerator<TMessage> GetEnumerator() {
+      using (Stream stream = streamProvider()) {
+        CodedInputStream input = CodedInputStream.CreateInstance(stream);
+        uint tag;
+        while ((tag = input.ReadTag()) != 0) {
+          if (tag != ExpectedTag) {
+            throw InvalidProtocolBufferException.InvalidMessageStreamTag();
+          }
+          TBuilder builder = new TBuilder();
+          input.ReadMessage(builder, extensionRegistry);
+          yield return builder.Build();
+        }
+      }
+    }
+
+    /// <summary>
+    /// Explicit implementation of nongeneric IEnumerable interface.
+    /// </summary>
+    IEnumerator IEnumerable.GetEnumerator() {
+      return GetEnumerator();
+    }
+  }
+}

+ 33 - 0
csharp/ProtocolBuffers/MessageStreamWriter.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.IO;
+
+namespace Google.ProtocolBuffers {
+  /// <summary>
+  /// Writes multiple messages to the same stream. Each message is written
+  /// as if it were an element of a repeated field 1 in a larger protocol buffer.
+  /// This class takes no ownership of the stream it is given; it never closes the
+  /// stream.
+  /// </summary>
+  public sealed class MessageStreamWriter<T> where T : IMessage<T> {
+
+    private readonly CodedOutputStream codedOutput;
+
+    /// <summary>
+    /// Creates an instance which writes to the given stream.
+    /// </summary>
+    /// <param name="output">Stream to write messages to.</param>
+    public MessageStreamWriter(Stream output) {
+      codedOutput = CodedOutputStream.CreateInstance(output);
+    }
+
+    public void Write(T message) {
+      codedOutput.WriteMessage(1, message);
+    }
+
+    public void Flush() {
+      codedOutput.Flush();
+    }
+  }
+}

+ 4 - 1
csharp/ProtocolBuffers/ProtocolBuffers.csproj

@@ -3,7 +3,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
-    <ProductVersion>9.0.21022</ProductVersion>
+    <ProductVersion>9.0.30729</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</ProjectGuid>
     <OutputType>Library</OutputType>
@@ -41,6 +41,7 @@
     <Compile Include="AbstractBuilder.cs" />
     <Compile Include="AbstractMessage.cs" />
     <Compile Include="ByteString.cs" />
+    <Compile Include="Delegates.cs" />
     <Compile Include="CodedInputStream.cs" />
     <Compile Include="CodedOutputStream.cs" />
     <Compile Include="Collections\Dictionaries.cs" />
@@ -93,6 +94,8 @@
     <Compile Include="IRpcChannel.cs" />
     <Compile Include="IRpcController.cs" />
     <Compile Include="IService.cs" />
+    <Compile Include="MessageStreamIterator.cs" />
+    <Compile Include="MessageStreamWriter.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="RpcUtil.cs" />
     <Compile Include="TextFormat.cs" />

+ 3 - 2
src/google/protobuf/compiler/csharp/csharp_message.cc

@@ -481,7 +481,7 @@ void MessageGenerator::GenerateBuilder(io::Printer* printer) {
 void MessageGenerator::GenerateCommonBuilderMethods(io::Printer* printer) {
   printer->Print(
     "// Construct using $classname$.CreateBuilder()\r\n"
-    "internal Builder() {}\r\n"
+    "$access$ Builder() {}\r\n"
     "\r\n"
     "$classname$ result = new $classname$();\r\n"
     "\r\n"
@@ -506,7 +506,8 @@ void MessageGenerator::GenerateCommonBuilderMethods(io::Printer* printer) {
     "  get { return $classname$.DefaultInstance; }\r\n"
     "}\r\n"
     "\r\n",
-    "classname", ClassName(descriptor_));
+    "classname", ClassName(descriptor_),
+    "access", ClassAccessLevel(descriptor_->file()));
 
   // -----------------------------------------------------------------