csharptest пре 15 година
родитељ
комит
e495477358

+ 2 - 0
ProtocolBuffers.build

@@ -151,6 +151,7 @@
       <arg file="${protos-dir}/google/protobuf/unittest_lite_imports_nonlite.proto" />
       <arg file="${protos-dir}/google/protobuf/unittest_no_generic_services.proto" />
 
+      <arg file="${protos-dir}/extest/unittest_extras_full.proto" />
       <arg file="${protos-dir}/extest/unittest_extras_lite.proto" />
       <arg file="${protos-dir}/tutorial/addressbook.proto" />
     </exec>
@@ -188,6 +189,7 @@
 
     <copy todir="${src}/ProtocolBuffersLite.Test/TestProtos">
       <fileset basedir="${tmp-dir}">
+        <include name="UnitTestExtrasFullProtoFile.cs" />
         <include name="UnitTestExtrasLiteProtoFile.cs" />
         <include name="UnitTestImportLiteProtoFile.cs" />
         <include name="UnitTestImportProtoFile.cs" />

+ 49 - 0
protos/extest/unittest_extras_full.proto

@@ -0,0 +1,49 @@
+// Additional options required for C# generation. File from copyright
+// line onwards is as per original distribution.
+import "google/protobuf/csharp_options.proto";
+option (google.protobuf.csharp_file_options).namespace = "Google.ProtocolBuffers.TestProtos";
+option (google.protobuf.csharp_file_options).umbrella_classname = "UnitTestExtrasFullProtoFile";
+
+package protobuf_unittest_extra;
+
+option optimize_for = CODE_SIZE;
+
+option java_package = "com.google.protobuf";
+
+message TestInteropPerson {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+  repeated int32 codes = 10 [packed=true];
+
+  enum PhoneType {
+    MOBILE = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+
+  message PhoneNumber {
+    required string number = 1;
+    optional PhoneType type = 2 [default = HOME];
+  }
+
+  repeated PhoneNumber phone = 4;
+  
+  repeated group Addresses = 5 {
+    required string address = 1;
+    optional string address2 = 2;
+    required string city = 3;
+    required string state = 4;
+    required fixed32 zip = 5;
+  }
+
+  extensions 100 to 199;
+}
+
+message  TestInteropEmployeeId {
+  required string number = 1;
+}
+  
+extend TestInteropPerson {
+  required TestInteropEmployeeId employee_id = 126;
+}

+ 39 - 1
protos/extest/unittest_extras_lite.proto

@@ -16,8 +16,46 @@ message TestRequiredLite {
 }
 
 enum ExtraEnum {
-  DEFAULT = 1;
+  DEFAULT = 10;
   EXLITE_FOO = 7;
   EXLITE_BAR = 8;
   EXLITE_BAZ = 9;
 }
+
+message TestInteropPersonLite {
+  required string name = 1;
+  required int32 id = 2;
+  optional string email = 3;
+  repeated int32 codes = 10 [packed=true];
+
+  enum PhoneType {
+    MOBILE = 0;
+    HOME = 1;
+    WORK = 2;
+  }
+
+  message PhoneNumber {
+    required string number = 1;
+    optional PhoneType type = 2 [default = HOME];
+  }
+
+  repeated PhoneNumber phone = 4;
+  
+  repeated group Addresses = 5 {
+    required string address = 1;
+    optional string address2 = 2;
+    required string city = 3;
+    required string state = 4;
+    required fixed32 zip = 5;
+  }
+
+  extensions 100 to 199;
+}
+
+message  TestInteropEmployeeIdLite {
+  required string number = 1;
+}
+  
+extend TestInteropPersonLite {
+  required TestInteropEmployeeIdLite employee_id_lite = 126;
+}

+ 3 - 0
src/ProtoGen/ExtensionGenerator.cs

@@ -70,6 +70,9 @@ namespace Google.ProtocolBuffers.ProtoGen {
       writer.WriteLine("public const int {0} = {1};", GetFieldConstantName(Descriptor), Descriptor.FieldNumber);
 
       if (UseLiteRuntime) {
+        if (Descriptor.MappedType == MappedType.Message && Descriptor.MessageType.Options.MessageSetWireFormat) {
+          throw new ArgumentException("option message_set_wire_format = true; is not supported in Lite runtime extensions.");
+        }
         if (!Descriptor.IsCLSCompliant && Descriptor.File.CSharpOptions.ClsCompliance) {
           writer.WriteLine("[global::System.CLSCompliant(false)]");
         }

+ 5 - 0
src/ProtocolBuffers.Test/ExtendableMessageTest.cs

@@ -42,6 +42,11 @@ namespace Google.ProtocolBuffers {
   [TestFixture]
   public class ExtendableMessageTest {
 
+    [Test, ExpectedException(typeof(ArgumentException))]
+    public void ExtensionWriterInvalidExtension() {
+      TestPackedExtensions.CreateBuilder()[UnitTestProtoFile.OptionalForeignMessageExtension.Descriptor] =
+        ForeignMessage.DefaultInstance;
+    }
 
     [Test]
     public void ExtensionWriterTest() {

+ 1 - 0
src/ProtocolBuffers.sln

@@ -38,6 +38,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unittest", "unittest", "{C8
 		..\protos\google\protobuf\unittest_embed_optimize_for.proto = ..\protos\google\protobuf\unittest_embed_optimize_for.proto
 		..\protos\google\protobuf\unittest_empty.proto = ..\protos\google\protobuf\unittest_empty.proto
 		..\protos\google\protobuf\unittest_enormous_descriptor.proto = ..\protos\google\protobuf\unittest_enormous_descriptor.proto
+		..\protos\extest\unittest_extras_full.proto = ..\protos\extest\unittest_extras_full.proto
 		..\protos\extest\unittest_extras_lite.proto = ..\protos\extest\unittest_extras_lite.proto
 		..\protos\google\protobuf\unittest_import.proto = ..\protos\google\protobuf\unittest_import.proto
 		..\protos\google\protobuf\unittest_import_lite.proto = ..\protos\google\protobuf\unittest_import_lite.proto

+ 3 - 1
src/ProtocolBuffers/GeneratedExtensionLite.cs

@@ -82,7 +82,9 @@ namespace Google.ProtocolBuffers {
       get { return true; }
     }
 
-#warning ToDo - Discover the meaning and purpose of this durring serialization and return the correct value
+    /// <summary>
+    /// This is not supported and assertions are made to ensure this does not exist on extensions of Lite types
+    /// </summary>
     public bool MessageSetWireFormat {
       get { return false; }
     }

+ 121 - 4
src/ProtocolBuffersLite.Test/AbstractBuilderLiteTest.cs

@@ -71,24 +71,128 @@ namespace Google.ProtocolBuffers {
     }
 
     [Test]
-    public void TestIBuilderLiteWeakMergeFromByteString() {
+    public void TestBuilderLiteMergeFromCodedInputStream() {
       TestAllTypesLite copy, msg = TestAllTypesLite.CreateBuilder()
         .SetOptionalString("Should be merged.").Build();
 
       copy = TestAllTypesLite.DefaultInstance;
       Assert.AreNotEqual(msg.ToByteArray(), copy.ToByteArray());
 
-      copy = (TestAllTypesLite)((IBuilderLite)copy.ToBuilder()).WeakMergeFrom(msg.ToByteString()).WeakBuild();
+      copy = copy.ToBuilder().MergeFrom(CodedInputStream.CreateInstance(new MemoryStream(msg.ToByteArray()))).Build();
+      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+    }
+
+    [Test]
+    public void TestBuilderLiteMergeDelimitedFrom() {
+      TestAllTypesLite copy, msg = TestAllTypesLite.CreateBuilder()
+        .SetOptionalString("Should be merged.").Build();
+
+      copy = TestAllTypesLite.DefaultInstance;
+      Assert.AreNotEqual(msg.ToByteArray(), copy.ToByteArray());
+      Stream s = new MemoryStream();
+      msg.WriteDelimitedTo(s);
+      s.Position = 0;
+      copy = copy.ToBuilder().MergeDelimitedFrom(s).Build();
+      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+    }
+
+    [Test]
+    public void TestBuilderLiteMergeDelimitedFromExtensions() {
+      TestAllExtensionsLite copy, msg = TestAllExtensionsLite.CreateBuilder()
+        .SetExtension(UnitTestLiteProtoFile.OptionalStringExtensionLite, "Should be merged.").Build();
+
+      copy = TestAllExtensionsLite.DefaultInstance;
+      Assert.AreNotEqual(msg.ToByteArray(), copy.ToByteArray());
+
+      Stream s = new MemoryStream();
+      msg.WriteDelimitedTo(s);
+      s.Position = 0;
+
+      ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+      UnitTestLiteProtoFile.RegisterAllExtensions(registry);
+
+      copy = copy.ToBuilder().MergeDelimitedFrom(s, registry).Build();
+      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+      Assert.AreEqual("Should be merged.", copy.GetExtension(UnitTestLiteProtoFile.OptionalStringExtensionLite));
+    }
+
+    [Test]
+    public void TestBuilderLiteMergeFromStream() {
+      TestAllTypesLite copy, msg = TestAllTypesLite.CreateBuilder()
+        .SetOptionalString("Should be merged.").Build();
+
+      copy = TestAllTypesLite.DefaultInstance;
+      Assert.AreNotEqual(msg.ToByteArray(), copy.ToByteArray());
+      Stream s = new MemoryStream();
+      msg.WriteTo(s);
+      s.Position = 0;
+      copy = copy.ToBuilder().MergeFrom(s).Build();
+      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+    }
+
+    [Test]
+    public void TestBuilderLiteMergeFromStreamExtensions() {
+      TestAllExtensionsLite copy, msg = TestAllExtensionsLite.CreateBuilder()
+        .SetExtension(UnitTestLiteProtoFile.OptionalStringExtensionLite, "Should be merged.").Build();
+
+      copy = TestAllExtensionsLite.DefaultInstance;
+      Assert.AreNotEqual(msg.ToByteArray(), copy.ToByteArray());
+
+      Stream s = new MemoryStream();
+      msg.WriteTo(s);
+      s.Position = 0;
+
+      ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+      UnitTestLiteProtoFile.RegisterAllExtensions(registry);
+
+      copy = copy.ToBuilder().MergeFrom(s, registry).Build();
       Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+      Assert.AreEqual("Should be merged.", copy.GetExtension(UnitTestLiteProtoFile.OptionalStringExtensionLite));
+    }
+
+    [Test]
+    public void TestIBuilderLiteWeakMergeFromIMessageLite() {
+      TestAllTypesLite copy, msg = TestAllTypesLite.CreateBuilder()
+        .SetOptionalString("Should be merged.").Build();
 
-      //again with extension registry
       copy = TestAllTypesLite.DefaultInstance;
       Assert.AreNotEqual(msg.ToByteArray(), copy.ToByteArray());
 
-      copy = (TestAllTypesLite)((IBuilderLite)copy.ToBuilder()).WeakMergeFrom(msg.ToByteString(), ExtensionRegistry.Empty).WeakBuild();
+      copy = (TestAllTypesLite)((IBuilderLite)copy.ToBuilder()).WeakMergeFrom((IMessageLite)msg).WeakBuild();
       Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
     }
 
+    [Test]
+    public void TestIBuilderLiteWeakMergeFromByteString() {
+      TestAllTypesLite copy, msg = TestAllTypesLite.CreateBuilder()
+        .SetOptionalString("Should be merged.").Build();
+
+      copy = TestAllTypesLite.DefaultInstance;
+      Assert.AreNotEqual(msg.ToByteArray(), copy.ToByteArray());
+
+      copy = (TestAllTypesLite)((IBuilderLite)copy.ToBuilder()).WeakMergeFrom(msg.ToByteString()).WeakBuild();
+      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+    }
+
+    [Test]
+    public void TestIBuilderLiteWeakMergeFromByteStringExtensions() {
+      TestAllExtensionsLite copy, msg = TestAllExtensionsLite.CreateBuilder()
+        .SetExtension(UnitTestLiteProtoFile.OptionalStringExtensionLite, "Should be merged.").Build();
+
+      copy = TestAllExtensionsLite.DefaultInstance;
+      Assert.AreNotEqual(msg.ToByteArray(), copy.ToByteArray());
+
+      copy = (TestAllExtensionsLite)((IBuilderLite)copy.ToBuilder()).WeakMergeFrom(msg.ToByteString(), ExtensionRegistry.Empty).WeakBuild();
+      Assert.AreNotEqual(msg.ToByteArray(), copy.ToByteArray());
+
+      ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+      UnitTestLiteProtoFile.RegisterAllExtensions(registry);
+
+      copy = (TestAllExtensionsLite)((IBuilderLite)copy.ToBuilder()).WeakMergeFrom(msg.ToByteString(), registry).WeakBuild();
+      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+      Assert.AreEqual("Should be merged.", copy.GetExtension(UnitTestLiteProtoFile.OptionalStringExtensionLite));
+    }
+    
     [Test]
     public void TestIBuilderLiteWeakMergeFromCodedInputStream() {
       TestAllTypesLite copy, msg = TestAllTypesLite.CreateBuilder()
@@ -147,5 +251,18 @@ namespace Google.ProtocolBuffers {
       Assert.IsTrue(ReferenceEquals(TestRequiredLite.DefaultInstance,
         ((IBuilderLite)TestRequiredLite.CreateBuilder()).WeakDefaultInstanceForType));
     }
+
+    [Test]
+    public void TestGeneratedBuilderLiteAddRange() {
+      TestAllTypesLite copy, msg = TestAllTypesLite.CreateBuilder()
+        .SetOptionalUint32(123)
+        .AddRepeatedInt32(1)
+        .AddRepeatedInt32(2)
+        .AddRepeatedInt32(3)
+        .Build();
+
+      copy = msg.DefaultInstanceForType.ToBuilder().MergeFrom(msg).Build();
+      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+    }
   }
 }

+ 126 - 0
src/ProtocolBuffersLite.Test/AbstractMessageLiteTest.cs

@@ -0,0 +1,126 @@
+#region Copyright notice and license
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using Google.ProtocolBuffers;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers {
+  [TestFixture]
+  public class AbstractMessageLiteTest {
+
+    [Test]
+    public void TestMessageLiteToByteString() {
+      TestRequiredLite msg = TestRequiredLite.CreateBuilder()
+        .SetD(42)
+        .SetEn(ExtraEnum.EXLITE_BAZ)
+        .Build();
+      
+      ByteString b = msg.ToByteString();
+      Assert.AreEqual(4, b.Length);
+      Assert.AreEqual(TestRequiredLite.DFieldNumber << 3, b[0]);
+      Assert.AreEqual(42, b[1]);
+      Assert.AreEqual(TestRequiredLite.EnFieldNumber << 3, b[2]);
+      Assert.AreEqual((int)ExtraEnum.EXLITE_BAZ, b[3]);
+    }
+
+    [Test]
+    public void TestMessageLiteToByteArray() {
+      TestRequiredLite msg = TestRequiredLite.CreateBuilder()
+        .SetD(42)
+        .SetEn(ExtraEnum.EXLITE_BAZ)
+        .Build();
+
+      ByteString b = msg.ToByteString();
+      ByteString copy = ByteString.CopyFrom(msg.ToByteArray());
+      Assert.AreEqual(b, copy);
+    }
+
+    [Test]
+    public void TestMessageLiteWriteTo() {
+      TestRequiredLite msg = TestRequiredLite.CreateBuilder()
+        .SetD(42)
+        .SetEn(ExtraEnum.EXLITE_BAZ)
+        .Build();
+
+      MemoryStream ms = new MemoryStream();
+      msg.WriteTo(ms);
+      Assert.AreEqual(msg.ToByteArray(), ms.ToArray());
+    }
+
+    [Test]
+    public void TestMessageLiteWriteDelimitedTo() {
+      TestRequiredLite msg = TestRequiredLite.CreateBuilder()
+        .SetD(42)
+        .SetEn(ExtraEnum.EXLITE_BAZ)
+        .Build();
+
+      MemoryStream ms = new MemoryStream();
+      msg.WriteDelimitedTo(ms);
+      byte[] buffer = ms.ToArray();
+
+      Assert.AreEqual(5, buffer.Length);
+      Assert.AreEqual(4, buffer[0]);
+      byte[] msgBytes = new byte[4];
+      Array.Copy(buffer, 1, msgBytes, 0, 4);
+      Assert.AreEqual(msg.ToByteArray(), msgBytes);
+    }
+
+    [Test]
+    public void TestIMessageLiteWeakCreateBuilderForType() {
+      IMessageLite msg = TestRequiredLite.DefaultInstance;
+      Assert.AreEqual(typeof(TestRequiredLite.Builder), msg.WeakCreateBuilderForType().GetType());
+    }
+
+    [Test]
+    public void TestMessageLiteWeakToBuilder() {
+      IMessageLite msg = TestRequiredLite.CreateBuilder()
+        .SetD(42)
+        .SetEn(ExtraEnum.EXLITE_BAZ)
+        .Build();
+
+      IMessageLite copy = msg.WeakToBuilder().WeakBuild();
+      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+    }
+
+    [Test]
+    public void TestMessageLiteWeakDefaultInstanceForType() {
+      IMessageLite msg = TestRequiredLite.DefaultInstance;
+      Assert.IsTrue(Object.ReferenceEquals(TestRequiredLite.DefaultInstance, msg.WeakDefaultInstanceForType));
+    }
+  }
+}

+ 111 - 111
src/ProtocolBuffersLite.Test/ExtendableMessageLiteTest.cs

@@ -43,6 +43,52 @@ namespace Google.ProtocolBuffers {
   [TestFixture]
   public class ExtendableMessageLiteTest {
 
+    [Test, Ignore("Not implemented, no assertion made"), ExpectedException(typeof(ArgumentException))]
+    public void ExtensionWriterInvalidExtension() {
+      TestPackedExtensionsLite.CreateBuilder()[UnitTestLiteProtoFile.OptionalForeignMessageExtensionLite.Descriptor] = 
+        ForeignMessageLite.DefaultInstance;
+    }
+
+    [Test]
+    public void ExtensionWriterTestMessages() {
+      TestAllExtensionsLite.Builder b = TestAllExtensionsLite.CreateBuilder().SetExtension(
+        UnitTestLiteProtoFile.OptionalForeignMessageExtensionLite, ForeignMessageLite.CreateBuilder().SetC(123).Build());
+      TestAllExtensionsLite copy, msg = b.Build();
+
+      ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+      UnitTestLiteProtoFile.RegisterAllExtensions(registry);
+
+      copy = TestAllExtensionsLite.ParseFrom(msg.ToByteArray(), registry);
+      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+    }
+
+    [Test]
+    public void ExtensionWriterIsInitialized() {
+      Assert.IsTrue(ForeignMessageLite.DefaultInstance.IsInitialized);
+      Assert.IsTrue(TestPackedExtensionsLite.CreateBuilder().IsInitialized);
+      Assert.IsTrue(TestAllExtensionsLite.CreateBuilder().SetExtension(
+        UnitTestLiteProtoFile.OptionalForeignMessageExtensionLite, ForeignMessageLite.DefaultInstance)
+        .IsInitialized);
+    }
+
+    [Test]
+    public void ExtensionWriterTestSetExtensionLists() {
+      TestAllExtensionsLite msg, copy;
+      TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.CreateBuilder()
+        .SetExtension(UnitTestLiteProtoFile.RepeatedBoolExtensionLite, new[] { true, false })
+        .SetExtension(UnitTestLiteProtoFile.RepeatedCordExtensionLite, new[] { "123", "456" })
+        .SetExtension(UnitTestLiteProtoFile.RepeatedForeignEnumExtensionLite, new[] { ForeignEnumLite.FOREIGN_LITE_BAZ, ForeignEnumLite.FOREIGN_LITE_FOO })
+        ;
+
+      msg = builder.Build();
+      ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+      UnitTestLiteProtoFile.RegisterAllExtensions(registry);
+
+      copy = TestAllExtensionsLite.ParseFrom(msg.ToByteArray(), registry);
+      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+
+      Assert.AreEqual(ForeignEnumLite.FOREIGN_LITE_FOO, copy.GetExtension(UnitTestLiteProtoFile.RepeatedForeignEnumExtensionLite, 1));
+    }
 
     [Test]
     public void ExtensionWriterTest() {
@@ -184,121 +230,75 @@ namespace Google.ProtocolBuffers {
       Assert.AreEqual(123u, copy.GetExtension(UnitTestLiteProtoFile.RepeatedUint64ExtensionLite, 0));
     }
 
-    
-    
-    /*
-    
     [Test]
-    public void ExtensionWriterTest() {
-      TestAllExtensionsLite.Builder builder = TestAllExtensionsLite.CreateBuilder()
-          .SetExtension(UnitTestLiteProtoFile.DefaultBoolExtensionLite, true)
-          .SetExtension(UnitTestLiteProtoFile.DefaultBytesExtensionLite, ByteString.CopyFromUtf8("123"))
-          .SetExtension(UnitTestLiteProtoFile.DefaultCordExtensionLite, "123")
-          .SetExtension(UnitTestLiteProtoFile.DefaultDoubleExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultFixed32ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.DefaultFixed64ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.DefaultFloatExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_FOO)
-          .SetExtension(UnitTestLiteProtoFile.DefaultImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_BAZ)
-          .SetExtension(UnitTestLiteProtoFile.DefaultInt32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultInt64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultNestedEnumExtensionLite, TestAllTypesLite.Types.NestedEnum.FOO)
-          .SetExtension(UnitTestLiteProtoFile.DefaultSfixed32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultSfixed64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultSint32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultSint64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultStringExtensionLite, "123")
-          .SetExtension(UnitTestLiteProtoFile.DefaultStringPieceExtensionLite, "123")
-          .SetExtension(UnitTestLiteProtoFile.DefaultUint32ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.DefaultUint64ExtensionLite, 123u)
-          //Optional
-          .SetExtension(UnitTestLiteProtoFile.OptionalBoolExtensionLite, true)
-          .SetExtension(UnitTestLiteProtoFile.OptionalBytesExtensionLite, ByteString.CopyFromUtf8("123"))
-          .SetExtension(UnitTestLiteProtoFile.OptionalCordExtensionLite, "123")
-          .SetExtension(UnitTestLiteProtoFile.OptionalDoubleExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.OptionalFixed32ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.OptionalFixed64ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.OptionalFloatExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.OptionalForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_FOO)
-          .SetExtension(UnitTestLiteProtoFile.OptionalImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_BAZ)
-          .SetExtension(UnitTestLiteProtoFile.OptionalInt32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.OptionalInt64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.OptionalNestedEnumExtensionLite, TestAllTypesLite.Types.NestedEnum.FOO)
-          .SetExtension(UnitTestLiteProtoFile.OptionalSfixed32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.OptionalSfixed64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.OptionalSint32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.OptionalSint64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.OptionalStringExtensionLite, "123")
-          .SetExtension(UnitTestLiteProtoFile.OptionalStringPieceExtensionLite, "123")
-          .SetExtension(UnitTestLiteProtoFile.OptionalUint32ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.OptionalUint64ExtensionLite, 123u)
-          //Repeated
-          .AddExtension(UnitTestLiteProtoFile.RepeatedBoolExtensionLite, true)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedBytesExtensionLite, ByteString.CopyFromUtf8("123"))
-          .AddExtension(UnitTestLiteProtoFile.RepeatedCordExtensionLite, "123")
-          .AddExtension(UnitTestLiteProtoFile.RepeatedDoubleExtensionLite, 123)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedFixed32ExtensionLite, 123u)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedFixed64ExtensionLite, 123u)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedFloatExtensionLite, 123)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_FOO)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_BAZ)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedInt32ExtensionLite, 123)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedInt64ExtensionLite, 123)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedNestedEnumExtensionLite, TestAllTypesLite.Types.NestedEnum.FOO)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedSfixed32ExtensionLite, 123)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedSfixed64ExtensionLite, 123)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedSint32ExtensionLite, 123)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedSint64ExtensionLite, 123)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedStringExtensionLite, "123")
-          .AddExtension(UnitTestLiteProtoFile.RepeatedStringPieceExtensionLite, "123")
-          .AddExtension(UnitTestLiteProtoFile.RepeatedUint32ExtensionLite, 123u)
-          .AddExtension(UnitTestLiteProtoFile.RepeatedUint64ExtensionLite, 123u)
-        ;
-      builder = TestAllExtensionsLite.CreateBuilder()
-          .SetExtension(UnitTestLiteProtoFile.DefaultBoolExtensionLite, true)
-          .SetExtension(UnitTestLiteProtoFile.DefaultBytesExtensionLite, ByteString.CopyFromUtf8("123"))
-          .SetExtension(UnitTestLiteProtoFile.DefaultCordExtensionLite, "123")
-          .SetExtension(UnitTestLiteProtoFile.DefaultDoubleExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultFixed32ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.DefaultFixed64ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.DefaultFloatExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultForeignEnumExtensionLite, ForeignEnumLite.FOREIGN_LITE_FOO)
-          .SetExtension(UnitTestLiteProtoFile.DefaultImportEnumExtensionLite, ImportEnumLite.IMPORT_LITE_BAZ)
-          .SetExtension(UnitTestLiteProtoFile.DefaultInt32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultInt64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultNestedEnumExtensionLite, TestAllTypesLite.Types.NestedEnum.FOO)
-          .SetExtension(UnitTestLiteProtoFile.DefaultSfixed32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultSfixed64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultSint32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultSint64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.DefaultStringExtensionLite, "123")
-          .SetExtension(UnitTestLiteProtoFile.DefaultStringPieceExtensionLite, "123")
-          .SetExtension(UnitTestLiteProtoFile.DefaultUint32ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.DefaultUint64ExtensionLite, 123u)
-        ;
+    public void ExtensionWriterTestPacked() {
 
-      TestAllExtensionsLite msg = builder.Build();
-      byte[] data = msg.ToByteArray();
-      TestAllExtensionsLite.Builder copyBuilder = TestAllExtensionsLite.CreateBuilder().MergeFrom(data);
-      TestAllExtensionsLite copy = copyBuilder.Build();
+      TestPackedExtensionsLite.Builder builder = TestPackedExtensionsLite.CreateBuilder()
+        .AddExtension(UnitTestLiteProtoFile.PackedBoolExtensionLite, true)
+        .AddExtension(UnitTestLiteProtoFile.PackedDoubleExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedFixed32ExtensionLite, 123u)
+        .AddExtension(UnitTestLiteProtoFile.PackedFixed64ExtensionLite, 123u)
+        .AddExtension(UnitTestLiteProtoFile.PackedFloatExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedInt32ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedInt64ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedSfixed32ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedSfixed64ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedSint32ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedSint64ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedUint32ExtensionLite, 123u)
+        .AddExtension(UnitTestLiteProtoFile.PackedUint64ExtensionLite, 123u)
+        .AddExtension(UnitTestLiteProtoFile.PackedBoolExtensionLite, true)
+        .AddExtension(UnitTestLiteProtoFile.PackedDoubleExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedFixed32ExtensionLite, 123u)
+        .AddExtension(UnitTestLiteProtoFile.PackedFixed64ExtensionLite, 123u)
+        .AddExtension(UnitTestLiteProtoFile.PackedFloatExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedInt32ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedInt64ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedSfixed32ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedSfixed64ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedSint32ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedSint64ExtensionLite, 123)
+        .AddExtension(UnitTestLiteProtoFile.PackedUint32ExtensionLite, 123u)
+        .AddExtension(UnitTestLiteProtoFile.PackedUint64ExtensionLite, 123u);
+
+      TestPackedExtensionsLite msg = builder.Build();
+
+      ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+      UnitTestLiteProtoFile.RegisterAllExtensions(registry);
+
+      TestPackedExtensionsLite.Builder copyBuilder = TestPackedExtensionsLite.CreateBuilder().MergeFrom(msg.ToByteArray(), registry);
+      TestPackedExtensionsLite copy = copyBuilder.Build();
 
       Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+
+      Assert.AreEqual(true, copy.GetExtension(UnitTestLiteProtoFile.PackedBoolExtensionLite, 0));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedDoubleExtensionLite, 0));
+      Assert.AreEqual(123u, copy.GetExtension(UnitTestLiteProtoFile.PackedFixed32ExtensionLite, 0));
+      Assert.AreEqual(123u, copy.GetExtension(UnitTestLiteProtoFile.PackedFixed64ExtensionLite, 0));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedFloatExtensionLite, 0));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedInt32ExtensionLite, 0));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedInt64ExtensionLite, 0));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedSfixed32ExtensionLite, 0));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedSfixed64ExtensionLite, 0));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedSint32ExtensionLite, 0));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedSint64ExtensionLite, 0));
+      Assert.AreEqual(123u, copy.GetExtension(UnitTestLiteProtoFile.PackedUint32ExtensionLite, 0));
+      Assert.AreEqual(123u, copy.GetExtension(UnitTestLiteProtoFile.PackedUint64ExtensionLite, 0));
+
+      Assert.AreEqual(true, copy.GetExtension(UnitTestLiteProtoFile.PackedBoolExtensionLite, 1));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedDoubleExtensionLite, 1));
+      Assert.AreEqual(123u, copy.GetExtension(UnitTestLiteProtoFile.PackedFixed32ExtensionLite, 1));
+      Assert.AreEqual(123u, copy.GetExtension(UnitTestLiteProtoFile.PackedFixed64ExtensionLite, 1));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedFloatExtensionLite, 1));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedInt32ExtensionLite, 1));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedInt64ExtensionLite, 1));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedSfixed32ExtensionLite, 1));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedSfixed64ExtensionLite, 1));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedSint32ExtensionLite, 1));
+      Assert.AreEqual(123, copy.GetExtension(UnitTestLiteProtoFile.PackedSint64ExtensionLite, 1));
+      Assert.AreEqual(123u, copy.GetExtension(UnitTestLiteProtoFile.PackedUint32ExtensionLite, 1));
+      Assert.AreEqual(123u, copy.GetExtension(UnitTestLiteProtoFile.PackedUint64ExtensionLite, 1));
+
     }
-     * 
-          //Packed
-          .SetExtension(UnitTestLiteProtoFile.PackedBoolExtensionLite, true)
-          .SetExtension(UnitTestLiteProtoFile.PackedDoubleExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.PackedFixed32ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.PackedFixed64ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.PackedFloatExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.PackedInt32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.PackedInt64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.PackedSfixed32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.PackedSfixed64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.PackedSint32ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.PackedSint64ExtensionLite, 123)
-          .SetExtension(UnitTestLiteProtoFile.PackedUint32ExtensionLite, 123u)
-          .SetExtension(UnitTestLiteProtoFile.PackedUint64ExtensionLite, 123u)
-     */
   }
 }

+ 115 - 0
src/ProtocolBuffersLite.Test/InteropLiteTest.cs

@@ -0,0 +1,115 @@
+#region Copyright notice and license
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#endregion
+
+using System;
+using System.Collections.Generic;
+using Google.ProtocolBuffers;
+using Google.ProtocolBuffers.TestProtos;
+using NUnit.Framework;
+
+namespace Google.ProtocolBuffers {
+  [TestFixture]
+  public class InteropLiteTest {
+
+    [Test]
+    public void TestConvertFromFullMinimal() {
+      TestInteropPerson person = TestInteropPerson.CreateBuilder()
+        .SetId(123)
+        .SetName("abc")
+        .Build();
+      Assert.IsTrue(person.IsInitialized);
+
+      TestInteropPersonLite copy = TestInteropPersonLite.ParseFrom(person.ToByteArray());
+
+      Assert.AreEqual(person.ToByteArray(), copy.ToByteArray());
+    }
+
+    [Test]
+    public void TestConvertFromFullComplete() {
+      TestInteropPerson person = TestInteropPerson.CreateBuilder()
+        .SetId(123)
+        .SetName("abc")
+        .SetEmail("abc@123.com")
+        .AddRangeCodes(new[] { 1, 2, 3 })
+        .AddPhone(TestInteropPerson.Types.PhoneNumber.CreateBuilder().SetNumber("555-1234").Build())
+        .AddPhone(TestInteropPerson.Types.PhoneNumber.CreateBuilder().SetNumber("555-5678").Build())
+        .AddAddresses(TestInteropPerson.Types.Addresses.CreateBuilder().SetAddress("123 Seseme").SetCity("Wonderland").SetState("NA").SetZip(12345).Build())
+        .SetExtension(UnitTestExtrasFullProtoFile.EmployeeId, TestInteropEmployeeId.CreateBuilder().SetNumber("123").Build())
+        .Build();
+      Assert.IsTrue(person.IsInitialized);
+
+      ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+      UnitTestExtrasLiteProtoFile.RegisterAllExtensions(registry);
+
+      TestInteropPersonLite copy = TestInteropPersonLite.ParseFrom(person.ToByteArray(), registry);
+
+      Assert.AreEqual(person.ToByteArray(), copy.ToByteArray());
+    }
+
+    [Test]
+    public void TestConvertFromLiteMinimal() {
+      TestInteropPersonLite person = TestInteropPersonLite.CreateBuilder()
+        .SetId(123)
+        .SetName("abc")
+        .Build();
+      Assert.IsTrue(person.IsInitialized);
+
+      TestInteropPerson copy = TestInteropPerson.ParseFrom(person.ToByteArray());
+
+      Assert.AreEqual(person.ToByteArray(), copy.ToByteArray());
+    }
+
+    [Test]
+    public void TestConvertFromLiteComplete() {
+      TestInteropPersonLite person = TestInteropPersonLite.CreateBuilder()
+        .SetId(123)
+        .SetName("abc")
+        .SetEmail("abc@123.com")
+        .AddRangeCodes(new[] { 1, 2, 3 })
+        .AddPhone(TestInteropPersonLite.Types.PhoneNumber.CreateBuilder().SetNumber("555-1234").Build())
+        .AddPhone(TestInteropPersonLite.Types.PhoneNumber.CreateBuilder().SetNumber("555-5678").Build())
+        .AddAddresses(TestInteropPersonLite.Types.Addresses.CreateBuilder().SetAddress("123 Seseme").SetCity("Wonderland").SetState("NA").SetZip(12345).Build())
+        .SetExtension(UnitTestExtrasLiteProtoFile.EmployeeIdLite, TestInteropEmployeeIdLite.CreateBuilder().SetNumber("123").Build())
+        .Build();
+      Assert.IsTrue(person.IsInitialized);
+
+      ExtensionRegistry registry = ExtensionRegistry.CreateInstance();
+      UnitTestExtrasFullProtoFile.RegisterAllExtensions(registry);
+
+      TestInteropPerson copy = TestInteropPerson.ParseFrom(person.ToByteArray(), registry);
+
+      Assert.AreEqual(person.ToByteArray(), copy.ToByteArray());
+    }
+  }
+}

+ 1 - 0
src/ProtocolBuffersLite.Test/ProtocolBuffersLite.Test.csproj

@@ -58,6 +58,7 @@
       <Link>Properties\AssemblyInfo.cs</Link>
     </Compile>
     <Compile Include="AbstractBuilderLiteTest.cs" />
+    <Compile Include="AbstractMessageLiteTest.cs" />
     <Compile Include="ExtendableBuilderLiteTest.cs" />
     <Compile Include="ExtendableMessageLiteTest.cs" />
     <Compile Include="LiteTest.cs" />

+ 97 - 0
src/ProtocolBuffersLite.Test/ProtocolBuffersLiteMixed.Test.csproj

@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>9.0.30729</ProductVersion>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectGuid>{EEFFED24-3750-4567-9A23-1DB676A15610}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <AppDesignerFolder>Properties</AppDesignerFolder>
+    <RootNamespace>Google.ProtocolBuffers</RootNamespace>
+    <AssemblyName>Google.ProtocolBuffersMixedLite.Test</AssemblyName>
+    <TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
+    <FileAlignment>512</FileAlignment>
+    <SignAssembly>true</SignAssembly>
+    <AssemblyOriginatorKeyFile>..\ProtocolBuffers.Test\Properties\Google.ProtocolBuffers.Test.snk</AssemblyOriginatorKeyFile>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>false</Optimize>
+    <OutputPath>bin\Debug\</OutputPath>
+    <DefineConstants>DEBUG;TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+    <DebugType>pdbonly</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>bin\Release\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Silverlight2|AnyCPU' ">
+    <OutputPath>bin\Silverlight2\</OutputPath>
+    <DefineConstants>TRACE</DefineConstants>
+    <Optimize>true</Optimize>
+    <DebugType>pdbonly</DebugType>
+    <PlatformTarget>AnyCPU</PlatformTarget>
+    <ErrorReport>prompt</ErrorReport>
+  </PropertyGroup>
+  <ItemGroup>
+    <Reference Include="nunit.framework, Version=2.2.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\lib\nunit.framework.dll</HintPath>
+    </Reference>
+    <Reference Include="Rhino.Mocks, Version=3.5.0.2, Culture=neutral, PublicKeyToken=0b3305902db7183f, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\..\lib\Rhino.Mocks.dll</HintPath>
+    </Reference>
+    <Reference Include="System" />
+    <Reference Include="System.Data" />
+    <Reference Include="System.Xml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="..\ProtocolBuffers.Test\Properties\AssemblyInfo.cs">
+      <Link>Properties\AssemblyInfo.cs</Link>
+    </Compile>
+    <Compile Include="..\ProtocolBuffers.Test\TestProtos\FIXUP.cs">
+      <Link>TestProtos\FIXUP.cs</Link>
+    </Compile>
+    <Compile Include="AbstractBuilderLiteTest.cs" />
+    <Compile Include="AbstractMessageLiteTest.cs" />
+    <Compile Include="ExtendableBuilderLiteTest.cs" />
+    <Compile Include="ExtendableMessageLiteTest.cs" />
+    <Compile Include="InteropLiteTest.cs" />
+    <Compile Include="LiteTest.cs" />
+    <Compile Include="TestLiteByApi.cs" />
+    <Compile Include="TestProtos\UnitTestExtrasFullProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestExtrasLiteProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestImportLiteProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestImportProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestLiteImportNonLiteProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestLiteProtoFile.cs" />
+    <Compile Include="TestProtos\UnitTestProtoFile.cs" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\ProtocolBuffers.Test\Properties\Google.ProtocolBuffers.Test.snk">
+      <Link>Properties\Google.ProtocolBuffers.Test.snk</Link>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\ProtocolBuffers\ProtocolBuffers.csproj">
+      <Project>{6908BDCE-D925-43F3-94AC-A531E6DF2591}</Project>
+      <Name>ProtocolBuffers</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
+  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
+       Other similar extension points exist, see Microsoft.Common.targets.
+  <Target Name="BeforeBuild">
+  </Target>
+  <Target Name="AfterBuild">
+  </Target>
+  -->
+</Project>

+ 976 - 0
src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasFullProtoFile.cs

@@ -0,0 +1,976 @@
+// Generated by ProtoGen, Version=0.9.0.0, Culture=neutral, PublicKeyToken=8fd7408b07f8d2cd.  DO NOT EDIT!
+
+using pb = global::Google.ProtocolBuffers;
+using pbc = global::Google.ProtocolBuffers.Collections;
+using pbd = global::Google.ProtocolBuffers.Descriptors;
+using scg = global::System.Collections.Generic;
+namespace Google.ProtocolBuffers.TestProtos {
+  
+  public static partial class UnitTestExtrasFullProtoFile {
+  
+    #region Extension registration
+    public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.EmployeeId);
+    }
+    #endregion
+    #region Extensions
+    public const int EmployeeIdFieldNumber = 126;
+    public static pb::GeneratedExtensionBase<global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeId> EmployeeId;
+    #endregion
+    
+    #region Static variables
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_extra_TestInteropPerson__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson, global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Builder> internal__static_protobuf_unittest_extra_TestInteropPerson__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_extra_TestInteropPerson_PhoneNumber__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber, global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber.Builder> internal__static_protobuf_unittest_extra_TestInteropPerson_PhoneNumber__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_extra_TestInteropPerson_Addresses__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses, global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses.Builder> internal__static_protobuf_unittest_extra_TestInteropPerson_Addresses__FieldAccessorTable;
+    internal static pbd::MessageDescriptor internal__static_protobuf_unittest_extra_TestInteropEmployeeId__Descriptor;
+    internal static pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeId, global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeId.Builder> internal__static_protobuf_unittest_extra_TestInteropEmployeeId__FieldAccessorTable;
+    #endregion
+    #region Descriptor
+    public static pbd::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbd::FileDescriptor descriptor;
+    
+    static UnitTestExtrasFullProtoFile() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          "CiFleHRlc3QvdW5pdHRlc3RfZXh0cmFzX2Z1bGwucHJvdG8SF3Byb3RvYnVm" + 
+          "X3VuaXR0ZXN0X2V4dHJhGiRnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlv" + 
+          "bnMucHJvdG8i1gMKEVRlc3RJbnRlcm9wUGVyc29uEgwKBG5hbWUYASACKAkS" + 
+          "CgoCaWQYAiACKAUSDQoFZW1haWwYAyABKAkSEQoFY29kZXMYCiADKAVCAhAB" + 
+          "EkUKBXBob25lGAQgAygLMjYucHJvdG9idWZfdW5pdHRlc3RfZXh0cmEuVGVz" + 
+          "dEludGVyb3BQZXJzb24uUGhvbmVOdW1iZXISRwoJYWRkcmVzc2VzGAUgAygK" + 
+          "MjQucHJvdG9idWZfdW5pdHRlc3RfZXh0cmEuVGVzdEludGVyb3BQZXJzb24u" + 
+          "QWRkcmVzc2VzGmcKC1Bob25lTnVtYmVyEg4KBm51bWJlchgBIAIoCRJICgR0" + 
+          "eXBlGAIgASgOMjQucHJvdG9idWZfdW5pdHRlc3RfZXh0cmEuVGVzdEludGVy" + 
+          "b3BQZXJzb24uUGhvbmVUeXBlOgRIT01FGlgKCUFkZHJlc3NlcxIPCgdhZGRy" + 
+          "ZXNzGAEgAigJEhAKCGFkZHJlc3MyGAIgASgJEgwKBGNpdHkYAyACKAkSDQoF" + 
+          "c3RhdGUYBCACKAkSCwoDemlwGAUgAigHIisKCVBob25lVHlwZRIKCgZNT0JJ" + 
+          "TEUQABIICgRIT01FEAESCAoEV09SSxACKgUIZBDIASInChVUZXN0SW50ZXJv" + 
+          "cEVtcGxveWVlSWQSDgoGbnVtYmVyGAEgAigJOm8KC2VtcGxveWVlX2lkEiou" + 
+          "cHJvdG9idWZfdW5pdHRlc3RfZXh0cmEuVGVzdEludGVyb3BQZXJzb24YfiAC" + 
+          "KAsyLi5wcm90b2J1Zl91bml0dGVzdF9leHRyYS5UZXN0SW50ZXJvcEVtcGxv" + 
+          "eWVlSWRCWgoTY29tLmdvb2dsZS5wcm90b2J1ZkgCwj5ACiFHb29nbGUuUHJv" + 
+          "dG9jb2xCdWZmZXJzLlRlc3RQcm90b3MSG1VuaXRUZXN0RXh0cmFzRnVsbFBy" + 
+          "b3RvRmlsZQ==");
+      pbd::FileDescriptor.InternalDescriptorAssigner assigner = delegate(pbd::FileDescriptor root) {
+        descriptor = root;
+        internal__static_protobuf_unittest_extra_TestInteropPerson__Descriptor = Descriptor.MessageTypes[0];
+        internal__static_protobuf_unittest_extra_TestInteropPerson__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson, global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Builder>(internal__static_protobuf_unittest_extra_TestInteropPerson__Descriptor,
+                new string[] { "Name", "Id", "Email", "Codes", "Phone", "Addresses", });
+        internal__static_protobuf_unittest_extra_TestInteropPerson_PhoneNumber__Descriptor = internal__static_protobuf_unittest_extra_TestInteropPerson__Descriptor.NestedTypes[0];
+        internal__static_protobuf_unittest_extra_TestInteropPerson_PhoneNumber__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber, global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber.Builder>(internal__static_protobuf_unittest_extra_TestInteropPerson_PhoneNumber__Descriptor,
+                new string[] { "Number", "Type", });
+        internal__static_protobuf_unittest_extra_TestInteropPerson_Addresses__Descriptor = internal__static_protobuf_unittest_extra_TestInteropPerson__Descriptor.NestedTypes[1];
+        internal__static_protobuf_unittest_extra_TestInteropPerson_Addresses__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses, global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses.Builder>(internal__static_protobuf_unittest_extra_TestInteropPerson_Addresses__Descriptor,
+                new string[] { "Address", "Address2", "City", "State", "Zip", });
+        internal__static_protobuf_unittest_extra_TestInteropEmployeeId__Descriptor = Descriptor.MessageTypes[1];
+        internal__static_protobuf_unittest_extra_TestInteropEmployeeId__FieldAccessorTable = 
+            new pb::FieldAccess.FieldAccessorTable<global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeId, global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeId.Builder>(internal__static_protobuf_unittest_extra_TestInteropEmployeeId__Descriptor,
+                new string[] { "Number", });
+        global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.EmployeeId = pb::GeneratedSingleExtension<global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeId>.CreateInstance(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.Descriptor.Extensions[0]);
+        pb::ExtensionRegistry registry = pb::ExtensionRegistry.CreateInstance();
+        RegisterAllExtensions(registry);
+        global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.RegisterAllExtensions(registry);
+        return registry;
+      };
+      pbd::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
+          new pbd::FileDescriptor[] {
+          global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.Descriptor, 
+          }, assigner);
+    }
+    #endregion
+    
+  }
+  #region Messages
+  public sealed partial class TestInteropPerson : pb::ExtendableMessage<TestInteropPerson, TestInteropPerson.Builder> {
+    private static readonly TestInteropPerson defaultInstance = new Builder().BuildPartial();
+    public static TestInteropPerson DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestInteropPerson DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override TestInteropPerson ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.internal__static_protobuf_unittest_extra_TestInteropPerson__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestInteropPerson, TestInteropPerson.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.internal__static_protobuf_unittest_extra_TestInteropPerson__FieldAccessorTable; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public enum PhoneType {
+        MOBILE = 0,
+        HOME = 1,
+        WORK = 2,
+      }
+      
+      public sealed partial class PhoneNumber : pb::GeneratedMessage<PhoneNumber, PhoneNumber.Builder> {
+        private static readonly PhoneNumber defaultInstance = new Builder().BuildPartial();
+        public static PhoneNumber DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override PhoneNumber DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override PhoneNumber ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.internal__static_protobuf_unittest_extra_TestInteropPerson_PhoneNumber__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<PhoneNumber, PhoneNumber.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.internal__static_protobuf_unittest_extra_TestInteropPerson_PhoneNumber__FieldAccessorTable; }
+        }
+        
+        public const int NumberFieldNumber = 1;
+        private bool hasNumber;
+        private string number_ = "";
+        public bool HasNumber {
+          get { return hasNumber; }
+        }
+        public string Number {
+          get { return number_; }
+        }
+        
+        public const int TypeFieldNumber = 2;
+        private bool hasType;
+        private global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneType type_ = global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneType.HOME;
+        public bool HasType {
+          get { return hasType; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneType Type {
+          get { return type_; }
+        }
+        
+        public static PhoneNumber ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static PhoneNumber ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(PhoneNumber prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<PhoneNumber, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          PhoneNumber result = new PhoneNumber();
+          
+          protected override PhoneNumber MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new PhoneNumber();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber.Descriptor; }
+          }
+          
+          public override PhoneNumber DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber.DefaultInstance; }
+          }
+          
+          public override PhoneNumber BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            PhoneNumber returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          
+          public bool HasNumber {
+            get { return result.HasNumber; }
+          }
+          public string Number {
+            get { return result.Number; }
+            set { SetNumber(value); }
+          }
+          public Builder SetNumber(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasNumber = true;
+            result.number_ = value;
+            return this;
+          }
+          public Builder ClearNumber() {
+            result.hasNumber = false;
+            result.number_ = "";
+            return this;
+          }
+          
+          public bool HasType {
+           get { return result.HasType; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneType Type {
+            get { return result.Type; }
+            set { SetType(value); }
+          }
+          public Builder SetType(global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneType value) {
+            result.hasType = true;
+            result.type_ = value;
+            return this;
+          }
+          public Builder ClearType() {
+            result.hasType = false;
+            result.type_ = global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneType.HOME;
+            return this;
+          }
+        }
+        static PhoneNumber() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.Descriptor, null);
+        }
+      }
+      
+      public sealed partial class Addresses : pb::GeneratedMessage<Addresses, Addresses.Builder> {
+        private static readonly Addresses defaultInstance = new Builder().BuildPartial();
+        public static Addresses DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Addresses DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override Addresses ThisMessage {
+          get { return this; }
+        }
+        
+        public static pbd::MessageDescriptor Descriptor {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.internal__static_protobuf_unittest_extra_TestInteropPerson_Addresses__Descriptor; }
+        }
+        
+        protected override pb::FieldAccess.FieldAccessorTable<Addresses, Addresses.Builder> InternalFieldAccessors {
+          get { return global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.internal__static_protobuf_unittest_extra_TestInteropPerson_Addresses__FieldAccessorTable; }
+        }
+        
+        public const int AddressFieldNumber = 1;
+        private bool hasAddress;
+        private string address_ = "";
+        public bool HasAddress {
+          get { return hasAddress; }
+        }
+        public string Address {
+          get { return address_; }
+        }
+        
+        public const int Address2FieldNumber = 2;
+        private bool hasAddress2;
+        private string address2_ = "";
+        public bool HasAddress2 {
+          get { return hasAddress2; }
+        }
+        public string Address2 {
+          get { return address2_; }
+        }
+        
+        public const int CityFieldNumber = 3;
+        private bool hasCity;
+        private string city_ = "";
+        public bool HasCity {
+          get { return hasCity; }
+        }
+        public string City {
+          get { return city_; }
+        }
+        
+        public const int StateFieldNumber = 4;
+        private bool hasState;
+        private string state_ = "";
+        public bool HasState {
+          get { return hasState; }
+        }
+        public string State {
+          get { return state_; }
+        }
+        
+        public const int ZipFieldNumber = 5;
+        private bool hasZip;
+        private uint zip_ = 0;
+        public bool HasZip {
+          get { return hasZip; }
+        }
+        [global::System.CLSCompliant(false)]
+        public uint Zip {
+          get { return zip_; }
+        }
+        
+        public static Addresses ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Addresses ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Addresses ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Addresses ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Addresses ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Addresses ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Addresses ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Addresses ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Addresses ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Addresses ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Addresses prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilder<Addresses, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          Addresses result = new Addresses();
+          
+          protected override Addresses MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new Addresses();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override pbd::MessageDescriptor DescriptorForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses.Descriptor; }
+          }
+          
+          public override Addresses DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses.DefaultInstance; }
+          }
+          
+          public override Addresses BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            Addresses returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          
+          public bool HasAddress {
+            get { return result.HasAddress; }
+          }
+          public string Address {
+            get { return result.Address; }
+            set { SetAddress(value); }
+          }
+          public Builder SetAddress(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasAddress = true;
+            result.address_ = value;
+            return this;
+          }
+          public Builder ClearAddress() {
+            result.hasAddress = false;
+            result.address_ = "";
+            return this;
+          }
+          
+          public bool HasAddress2 {
+            get { return result.HasAddress2; }
+          }
+          public string Address2 {
+            get { return result.Address2; }
+            set { SetAddress2(value); }
+          }
+          public Builder SetAddress2(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasAddress2 = true;
+            result.address2_ = value;
+            return this;
+          }
+          public Builder ClearAddress2() {
+            result.hasAddress2 = false;
+            result.address2_ = "";
+            return this;
+          }
+          
+          public bool HasCity {
+            get { return result.HasCity; }
+          }
+          public string City {
+            get { return result.City; }
+            set { SetCity(value); }
+          }
+          public Builder SetCity(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasCity = true;
+            result.city_ = value;
+            return this;
+          }
+          public Builder ClearCity() {
+            result.hasCity = false;
+            result.city_ = "";
+            return this;
+          }
+          
+          public bool HasState {
+            get { return result.HasState; }
+          }
+          public string State {
+            get { return result.State; }
+            set { SetState(value); }
+          }
+          public Builder SetState(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasState = true;
+            result.state_ = value;
+            return this;
+          }
+          public Builder ClearState() {
+            result.hasState = false;
+            result.state_ = "";
+            return this;
+          }
+          
+          public bool HasZip {
+            get { return result.HasZip; }
+          }
+          [global::System.CLSCompliant(false)]
+          public uint Zip {
+            get { return result.Zip; }
+            set { SetZip(value); }
+          }
+          [global::System.CLSCompliant(false)]
+          public Builder SetZip(uint value) {
+            result.hasZip = true;
+            result.zip_ = value;
+            return this;
+          }
+          public Builder ClearZip() {
+            result.hasZip = false;
+            result.zip_ = 0;
+            return this;
+          }
+        }
+        static Addresses() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int NameFieldNumber = 1;
+    private bool hasName;
+    private string name_ = "";
+    public bool HasName {
+      get { return hasName; }
+    }
+    public string Name {
+      get { return name_; }
+    }
+    
+    public const int IdFieldNumber = 2;
+    private bool hasId;
+    private int id_ = 0;
+    public bool HasId {
+      get { return hasId; }
+    }
+    public int Id {
+      get { return id_; }
+    }
+    
+    public const int EmailFieldNumber = 3;
+    private bool hasEmail;
+    private string email_ = "";
+    public bool HasEmail {
+      get { return hasEmail; }
+    }
+    public string Email {
+      get { return email_; }
+    }
+    
+    public const int CodesFieldNumber = 10;
+    private pbc::PopsicleList<int> codes_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> CodesList {
+      get { return pbc::Lists.AsReadOnly(codes_); }
+    }
+    public int CodesCount {
+      get { return codes_.Count; }
+    }
+    public int GetCodes(int index) {
+      return codes_[index];
+    }
+    
+    public const int PhoneFieldNumber = 4;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber> phone_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber> PhoneList {
+      get { return phone_; }
+    }
+    public int PhoneCount {
+      get { return phone_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber GetPhone(int index) {
+      return phone_[index];
+    }
+    
+    public const int AddressesFieldNumber = 5;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses> addresses_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses> AddressesList {
+      get { return addresses_; }
+    }
+    public int AddressesCount {
+      get { return addresses_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses GetAddresses(int index) {
+      return addresses_[index];
+    }
+    
+    public static TestInteropPerson ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestInteropPerson ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropPerson ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestInteropPerson ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropPerson ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestInteropPerson ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropPerson ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestInteropPerson ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestInteropPerson ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestInteropPerson ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestInteropPerson prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::ExtendableBuilder<TestInteropPerson, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      TestInteropPerson result = new TestInteropPerson();
+      
+      protected override TestInteropPerson MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new TestInteropPerson();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Descriptor; }
+      }
+      
+      public override TestInteropPerson DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.DefaultInstance; }
+      }
+      
+      public override TestInteropPerson BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        result.codes_.MakeReadOnly();
+        result.phone_.MakeReadOnly();
+        result.addresses_.MakeReadOnly();
+        TestInteropPerson returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      
+      public bool HasName {
+        get { return result.HasName; }
+      }
+      public string Name {
+        get { return result.Name; }
+        set { SetName(value); }
+      }
+      public Builder SetName(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasName = true;
+        result.name_ = value;
+        return this;
+      }
+      public Builder ClearName() {
+        result.hasName = false;
+        result.name_ = "";
+        return this;
+      }
+      
+      public bool HasId {
+        get { return result.HasId; }
+      }
+      public int Id {
+        get { return result.Id; }
+        set { SetId(value); }
+      }
+      public Builder SetId(int value) {
+        result.hasId = true;
+        result.id_ = value;
+        return this;
+      }
+      public Builder ClearId() {
+        result.hasId = false;
+        result.id_ = 0;
+        return this;
+      }
+      
+      public bool HasEmail {
+        get { return result.HasEmail; }
+      }
+      public string Email {
+        get { return result.Email; }
+        set { SetEmail(value); }
+      }
+      public Builder SetEmail(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasEmail = true;
+        result.email_ = value;
+        return this;
+      }
+      public Builder ClearEmail() {
+        result.hasEmail = false;
+        result.email_ = "";
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> CodesList {
+        get { return result.codes_; }
+      }
+      public int CodesCount {
+        get { return result.CodesCount; }
+      }
+      public int GetCodes(int index) {
+        return result.GetCodes(index);
+      }
+      public Builder SetCodes(int index, int value) {
+        result.codes_[index] = value;
+        return this;
+      }
+      public Builder AddCodes(int value) {
+        result.codes_.Add(value);
+        return this;
+      }
+      public Builder AddRangeCodes(scg::IEnumerable<int> values) {
+        base.AddRange(values, result.codes_);
+        return this;
+      }
+      public Builder ClearCodes() {
+        result.codes_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber> PhoneList {
+        get { return result.phone_; }
+      }
+      public int PhoneCount {
+        get { return result.PhoneCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber GetPhone(int index) {
+        return result.GetPhone(index);
+      }
+      public Builder SetPhone(int index, global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.phone_[index] = value;
+        return this;
+      }
+      public Builder SetPhone(int index, global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.phone_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddPhone(global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.phone_.Add(value);
+        return this;
+      }
+      public Builder AddPhone(global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.phone_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangePhone(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.PhoneNumber> values) {
+        base.AddRange(values, result.phone_);
+        return this;
+      }
+      public Builder ClearPhone() {
+        result.phone_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses> AddressesList {
+        get { return result.addresses_; }
+      }
+      public int AddressesCount {
+        get { return result.AddressesCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses GetAddresses(int index) {
+        return result.GetAddresses(index);
+      }
+      public Builder SetAddresses(int index, global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.addresses_[index] = value;
+        return this;
+      }
+      public Builder SetAddresses(int index, global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.addresses_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddAddresses(global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.addresses_.Add(value);
+        return this;
+      }
+      public Builder AddAddresses(global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.addresses_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeAddresses(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestInteropPerson.Types.Addresses> values) {
+        base.AddRange(values, result.addresses_);
+        return this;
+      }
+      public Builder ClearAddresses() {
+        result.addresses_.Clear();
+        return this;
+      }
+    }
+    static TestInteropPerson() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.Descriptor, null);
+    }
+  }
+  
+  public sealed partial class TestInteropEmployeeId : pb::GeneratedMessage<TestInteropEmployeeId, TestInteropEmployeeId.Builder> {
+    private static readonly TestInteropEmployeeId defaultInstance = new Builder().BuildPartial();
+    public static TestInteropEmployeeId DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestInteropEmployeeId DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override TestInteropEmployeeId ThisMessage {
+      get { return this; }
+    }
+    
+    public static pbd::MessageDescriptor Descriptor {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.internal__static_protobuf_unittest_extra_TestInteropEmployeeId__Descriptor; }
+    }
+    
+    protected override pb::FieldAccess.FieldAccessorTable<TestInteropEmployeeId, TestInteropEmployeeId.Builder> InternalFieldAccessors {
+      get { return global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.internal__static_protobuf_unittest_extra_TestInteropEmployeeId__FieldAccessorTable; }
+    }
+    
+    public const int NumberFieldNumber = 1;
+    private bool hasNumber;
+    private string number_ = "";
+    public bool HasNumber {
+      get { return hasNumber; }
+    }
+    public string Number {
+      get { return number_; }
+    }
+    
+    public static TestInteropEmployeeId ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestInteropEmployeeId ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropEmployeeId ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestInteropEmployeeId ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropEmployeeId ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestInteropEmployeeId ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropEmployeeId ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestInteropEmployeeId ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestInteropEmployeeId ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestInteropEmployeeId ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestInteropEmployeeId prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilder<TestInteropEmployeeId, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      TestInteropEmployeeId result = new TestInteropEmployeeId();
+      
+      protected override TestInteropEmployeeId MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new TestInteropEmployeeId();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override pbd::MessageDescriptor DescriptorForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeId.Descriptor; }
+      }
+      
+      public override TestInteropEmployeeId DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeId.DefaultInstance; }
+      }
+      
+      public override TestInteropEmployeeId BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        TestInteropEmployeeId returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      
+      public bool HasNumber {
+        get { return result.HasNumber; }
+      }
+      public string Number {
+        get { return result.Number; }
+        set { SetNumber(value); }
+      }
+      public Builder SetNumber(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasNumber = true;
+        result.number_ = value;
+        return this;
+      }
+      public Builder ClearNumber() {
+        result.hasNumber = false;
+        result.number_ = "";
+        return this;
+      }
+    }
+    static TestInteropEmployeeId() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasFullProtoFile.Descriptor, null);
+    }
+  }
+  
+  #endregion
+  
+}

+ 1306 - 1
src/ProtocolBuffersLite.Test/TestProtos/UnitTestExtrasLiteProtoFile.cs

@@ -10,21 +10,35 @@ namespace Google.ProtocolBuffers.TestProtos {
   
     #region Extension registration
     public static void RegisterAllExtensions(pb::ExtensionRegistry registry) {
+      registry.Add(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasLiteProtoFile.EmployeeIdLite);
     }
     #endregion
+    #region Extensions
+    public const int EmployeeIdLiteFieldNumber = 126;
+    public static pb::GeneratedExtensionLite<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite, global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeIdLite> EmployeeIdLite;
+    #endregion
+    
     #region Static variables
     #endregion
     #region Extensions
     internal static readonly object Descriptor;
     static UnitTestExtrasLiteProtoFile() {
       Descriptor = null;
+      global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasLiteProtoFile.EmployeeIdLite = 
+        new pb::GeneratedExtensionLite<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite, global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeIdLite>(
+          global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.DefaultInstance,
+          null,
+          global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeIdLite.DefaultInstance,
+          null,
+          global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasLiteProtoFile.EmployeeIdLiteFieldNumber,
+          pbd::FieldType.Message);
     }
     #endregion
     
   }
   #region Enums
   public enum ExtraEnum {
-    DEFAULT = 1,
+    DEFAULT = 10,
     EXLITE_FOO = 7,
     EXLITE_BAR = 8,
     EXLITE_BAZ = 9,
@@ -270,6 +284,1297 @@ namespace Google.ProtocolBuffers.TestProtos {
     }
   }
   
+  public sealed partial class TestInteropPersonLite : pb::ExtendableMessageLite<TestInteropPersonLite, TestInteropPersonLite.Builder> {
+    private static readonly TestInteropPersonLite defaultInstance = new Builder().BuildPartial();
+    public static TestInteropPersonLite DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestInteropPersonLite DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override TestInteropPersonLite ThisMessage {
+      get { return this; }
+    }
+    
+    #region Nested types
+    public static class Types {
+      public enum PhoneType {
+        MOBILE = 0,
+        HOME = 1,
+        WORK = 2,
+      }
+      
+      public sealed partial class PhoneNumber : pb::GeneratedMessageLite<PhoneNumber, PhoneNumber.Builder> {
+        private static readonly PhoneNumber defaultInstance = new Builder().BuildPartial();
+        public static PhoneNumber DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override PhoneNumber DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override PhoneNumber ThisMessage {
+          get { return this; }
+        }
+        
+        public const int NumberFieldNumber = 1;
+        private bool hasNumber;
+        private string number_ = "";
+        public bool HasNumber {
+          get { return hasNumber; }
+        }
+        public string Number {
+          get { return number_; }
+        }
+        
+        public const int TypeFieldNumber = 2;
+        private bool hasType;
+        private global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneType type_ = global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneType.HOME;
+        public bool HasType {
+          get { return hasType; }
+        }
+        public global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneType Type {
+          get { return type_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasNumber) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          int size = SerializedSize;
+          if (HasNumber) {
+            output.WriteString(1, Number);
+          }
+          if (HasType) {
+            output.WriteEnum(2, (int) Type);
+          }
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasNumber) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Number);
+            }
+            if (HasType) {
+              size += pb::CodedOutputStream.ComputeEnumSize(2, (int) Type);
+            }
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static PhoneNumber ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static PhoneNumber ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static PhoneNumber ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static PhoneNumber ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(PhoneNumber prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilderLite<PhoneNumber, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          PhoneNumber result = new PhoneNumber();
+          
+          protected override PhoneNumber MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new PhoneNumber();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override PhoneNumber DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber.DefaultInstance; }
+          }
+          
+          public override PhoneNumber BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            PhoneNumber returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessageLite other) {
+            if (other is PhoneNumber) {
+              return MergeFrom((PhoneNumber) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(PhoneNumber other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber.DefaultInstance) return this;
+            if (other.HasNumber) {
+              Number = other.Number;
+            }
+            if (other.HasType) {
+              Type = other.Type;
+            }
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    return this;
+                  }
+                  ParseUnknownField(input, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Number = input.ReadString();
+                  break;
+                }
+                case 16: {
+                  int rawValue = input.ReadEnum();
+                  if (!global::System.Enum.IsDefined(typeof(global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneType), rawValue)) {
+                  } else {
+                    Type = (global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneType) rawValue;
+                  }
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasNumber {
+            get { return result.HasNumber; }
+          }
+          public string Number {
+            get { return result.Number; }
+            set { SetNumber(value); }
+          }
+          public Builder SetNumber(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasNumber = true;
+            result.number_ = value;
+            return this;
+          }
+          public Builder ClearNumber() {
+            result.hasNumber = false;
+            result.number_ = "";
+            return this;
+          }
+          
+          public bool HasType {
+           get { return result.HasType; }
+          }
+          public global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneType Type {
+            get { return result.Type; }
+            set { SetType(value); }
+          }
+          public Builder SetType(global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneType value) {
+            result.hasType = true;
+            result.type_ = value;
+            return this;
+          }
+          public Builder ClearType() {
+            result.hasType = false;
+            result.type_ = global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneType.HOME;
+            return this;
+          }
+        }
+        static PhoneNumber() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasLiteProtoFile.Descriptor, null);
+        }
+      }
+      
+      public sealed partial class Addresses : pb::GeneratedMessageLite<Addresses, Addresses.Builder> {
+        private static readonly Addresses defaultInstance = new Builder().BuildPartial();
+        public static Addresses DefaultInstance {
+          get { return defaultInstance; }
+        }
+        
+        public override Addresses DefaultInstanceForType {
+          get { return defaultInstance; }
+        }
+        
+        protected override Addresses ThisMessage {
+          get { return this; }
+        }
+        
+        public const int AddressFieldNumber = 1;
+        private bool hasAddress;
+        private string address_ = "";
+        public bool HasAddress {
+          get { return hasAddress; }
+        }
+        public string Address {
+          get { return address_; }
+        }
+        
+        public const int Address2FieldNumber = 2;
+        private bool hasAddress2;
+        private string address2_ = "";
+        public bool HasAddress2 {
+          get { return hasAddress2; }
+        }
+        public string Address2 {
+          get { return address2_; }
+        }
+        
+        public const int CityFieldNumber = 3;
+        private bool hasCity;
+        private string city_ = "";
+        public bool HasCity {
+          get { return hasCity; }
+        }
+        public string City {
+          get { return city_; }
+        }
+        
+        public const int StateFieldNumber = 4;
+        private bool hasState;
+        private string state_ = "";
+        public bool HasState {
+          get { return hasState; }
+        }
+        public string State {
+          get { return state_; }
+        }
+        
+        public const int ZipFieldNumber = 5;
+        private bool hasZip;
+        private uint zip_ = 0;
+        public bool HasZip {
+          get { return hasZip; }
+        }
+        [global::System.CLSCompliant(false)]
+        public uint Zip {
+          get { return zip_; }
+        }
+        
+        public override bool IsInitialized {
+          get {
+            if (!hasAddress) return false;
+            if (!hasCity) return false;
+            if (!hasState) return false;
+            if (!hasZip) return false;
+            return true;
+          }
+        }
+        
+        public override void WriteTo(pb::CodedOutputStream output) {
+          int size = SerializedSize;
+          if (HasAddress) {
+            output.WriteString(1, Address);
+          }
+          if (HasAddress2) {
+            output.WriteString(2, Address2);
+          }
+          if (HasCity) {
+            output.WriteString(3, City);
+          }
+          if (HasState) {
+            output.WriteString(4, State);
+          }
+          if (HasZip) {
+            output.WriteFixed32(5, Zip);
+          }
+        }
+        
+        private int memoizedSerializedSize = -1;
+        public override int SerializedSize {
+          get {
+            int size = memoizedSerializedSize;
+            if (size != -1) return size;
+            
+            size = 0;
+            if (HasAddress) {
+              size += pb::CodedOutputStream.ComputeStringSize(1, Address);
+            }
+            if (HasAddress2) {
+              size += pb::CodedOutputStream.ComputeStringSize(2, Address2);
+            }
+            if (HasCity) {
+              size += pb::CodedOutputStream.ComputeStringSize(3, City);
+            }
+            if (HasState) {
+              size += pb::CodedOutputStream.ComputeStringSize(4, State);
+            }
+            if (HasZip) {
+              size += pb::CodedOutputStream.ComputeFixed32Size(5, Zip);
+            }
+            memoizedSerializedSize = size;
+            return size;
+          }
+        }
+        
+        public static Addresses ParseFrom(pb::ByteString data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Addresses ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Addresses ParseFrom(byte[] data) {
+          return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+        }
+        public static Addresses ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+        }
+        public static Addresses ParseFrom(global::System.IO.Stream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Addresses ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Addresses ParseDelimitedFrom(global::System.IO.Stream input) {
+          return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+        }
+        public static Addresses ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+          return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+        }
+        public static Addresses ParseFrom(pb::CodedInputStream input) {
+          return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+        }
+        public static Addresses ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+          return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+        }
+        public static Builder CreateBuilder() { return new Builder(); }
+        public override Builder ToBuilder() { return CreateBuilder(this); }
+        public override Builder CreateBuilderForType() { return new Builder(); }
+        public static Builder CreateBuilder(Addresses prototype) {
+          return (Builder) new Builder().MergeFrom(prototype);
+        }
+        
+        public sealed partial class Builder : pb::GeneratedBuilderLite<Addresses, Builder> {
+          protected override Builder ThisBuilder {
+            get { return this; }
+          }
+          public Builder() {}
+          
+          Addresses result = new Addresses();
+          
+          protected override Addresses MessageBeingBuilt {
+            get { return result; }
+          }
+          
+          public override Builder Clear() {
+            result = new Addresses();
+            return this;
+          }
+          
+          public override Builder Clone() {
+            return new Builder().MergeFrom(result);
+          }
+          
+          public override Addresses DefaultInstanceForType {
+            get { return global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses.DefaultInstance; }
+          }
+          
+          public override Addresses BuildPartial() {
+            if (result == null) {
+              throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+            }
+            Addresses returnMe = result;
+            result = null;
+            return returnMe;
+          }
+          
+          public override Builder MergeFrom(pb::IMessageLite other) {
+            if (other is Addresses) {
+              return MergeFrom((Addresses) other);
+            } else {
+              base.MergeFrom(other);
+              return this;
+            }
+          }
+          
+          public override Builder MergeFrom(Addresses other) {
+            if (other == global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses.DefaultInstance) return this;
+            if (other.HasAddress) {
+              Address = other.Address;
+            }
+            if (other.HasAddress2) {
+              Address2 = other.Address2;
+            }
+            if (other.HasCity) {
+              City = other.City;
+            }
+            if (other.HasState) {
+              State = other.State;
+            }
+            if (other.HasZip) {
+              Zip = other.Zip;
+            }
+            return this;
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input) {
+            return MergeFrom(input, pb::ExtensionRegistry.Empty);
+          }
+          
+          public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+            while (true) {
+              uint tag = input.ReadTag();
+              switch (tag) {
+                case 0: {
+                  return this;
+                }
+                default: {
+                  if (pb::WireFormat.IsEndGroupTag(tag)) {
+                    return this;
+                  }
+                  ParseUnknownField(input, extensionRegistry, tag);
+                  break;
+                }
+                case 10: {
+                  Address = input.ReadString();
+                  break;
+                }
+                case 18: {
+                  Address2 = input.ReadString();
+                  break;
+                }
+                case 26: {
+                  City = input.ReadString();
+                  break;
+                }
+                case 34: {
+                  State = input.ReadString();
+                  break;
+                }
+                case 45: {
+                  Zip = input.ReadFixed32();
+                  break;
+                }
+              }
+            }
+          }
+          
+          
+          public bool HasAddress {
+            get { return result.HasAddress; }
+          }
+          public string Address {
+            get { return result.Address; }
+            set { SetAddress(value); }
+          }
+          public Builder SetAddress(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasAddress = true;
+            result.address_ = value;
+            return this;
+          }
+          public Builder ClearAddress() {
+            result.hasAddress = false;
+            result.address_ = "";
+            return this;
+          }
+          
+          public bool HasAddress2 {
+            get { return result.HasAddress2; }
+          }
+          public string Address2 {
+            get { return result.Address2; }
+            set { SetAddress2(value); }
+          }
+          public Builder SetAddress2(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasAddress2 = true;
+            result.address2_ = value;
+            return this;
+          }
+          public Builder ClearAddress2() {
+            result.hasAddress2 = false;
+            result.address2_ = "";
+            return this;
+          }
+          
+          public bool HasCity {
+            get { return result.HasCity; }
+          }
+          public string City {
+            get { return result.City; }
+            set { SetCity(value); }
+          }
+          public Builder SetCity(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasCity = true;
+            result.city_ = value;
+            return this;
+          }
+          public Builder ClearCity() {
+            result.hasCity = false;
+            result.city_ = "";
+            return this;
+          }
+          
+          public bool HasState {
+            get { return result.HasState; }
+          }
+          public string State {
+            get { return result.State; }
+            set { SetState(value); }
+          }
+          public Builder SetState(string value) {
+            pb::ThrowHelper.ThrowIfNull(value, "value");
+            result.hasState = true;
+            result.state_ = value;
+            return this;
+          }
+          public Builder ClearState() {
+            result.hasState = false;
+            result.state_ = "";
+            return this;
+          }
+          
+          public bool HasZip {
+            get { return result.HasZip; }
+          }
+          [global::System.CLSCompliant(false)]
+          public uint Zip {
+            get { return result.Zip; }
+            set { SetZip(value); }
+          }
+          [global::System.CLSCompliant(false)]
+          public Builder SetZip(uint value) {
+            result.hasZip = true;
+            result.zip_ = value;
+            return this;
+          }
+          public Builder ClearZip() {
+            result.hasZip = false;
+            result.zip_ = 0;
+            return this;
+          }
+        }
+        static Addresses() {
+          object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasLiteProtoFile.Descriptor, null);
+        }
+      }
+      
+    }
+    #endregion
+    
+    public const int NameFieldNumber = 1;
+    private bool hasName;
+    private string name_ = "";
+    public bool HasName {
+      get { return hasName; }
+    }
+    public string Name {
+      get { return name_; }
+    }
+    
+    public const int IdFieldNumber = 2;
+    private bool hasId;
+    private int id_ = 0;
+    public bool HasId {
+      get { return hasId; }
+    }
+    public int Id {
+      get { return id_; }
+    }
+    
+    public const int EmailFieldNumber = 3;
+    private bool hasEmail;
+    private string email_ = "";
+    public bool HasEmail {
+      get { return hasEmail; }
+    }
+    public string Email {
+      get { return email_; }
+    }
+    
+    public const int CodesFieldNumber = 10;
+    private int codesMemoizedSerializedSize;
+    private pbc::PopsicleList<int> codes_ = new pbc::PopsicleList<int>();
+    public scg::IList<int> CodesList {
+      get { return pbc::Lists.AsReadOnly(codes_); }
+    }
+    public int CodesCount {
+      get { return codes_.Count; }
+    }
+    public int GetCodes(int index) {
+      return codes_[index];
+    }
+    
+    public const int PhoneFieldNumber = 4;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber> phone_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber> PhoneList {
+      get { return phone_; }
+    }
+    public int PhoneCount {
+      get { return phone_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber GetPhone(int index) {
+      return phone_[index];
+    }
+    
+    public const int AddressesFieldNumber = 5;
+    private pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses> addresses_ = new pbc::PopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses>();
+    public scg::IList<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses> AddressesList {
+      get { return addresses_; }
+    }
+    public int AddressesCount {
+      get { return addresses_.Count; }
+    }
+    public global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses GetAddresses(int index) {
+      return addresses_[index];
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasName) return false;
+        if (!hasId) return false;
+        foreach (global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber element in PhoneList) {
+          if (!element.IsInitialized) return false;
+        }
+        if (!ExtensionsAreInitialized) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      int size = SerializedSize;
+      pb::ExtendableMessageLite<TestInteropPersonLite, TestInteropPersonLite.Builder>.ExtensionWriter extensionWriter = CreateExtensionWriter(this);
+      if (HasName) {
+        output.WriteString(1, Name);
+      }
+      if (HasId) {
+        output.WriteInt32(2, Id);
+      }
+      if (HasEmail) {
+        output.WriteString(3, Email);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber element in PhoneList) {
+        output.WriteMessage(4, element);
+      }
+      foreach (global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses element in AddressesList) {
+        output.WriteGroup(5, element);
+      }
+      if (codes_.Count > 0) {
+        output.WriteRawVarint32(82);
+        output.WriteRawVarint32((uint) codesMemoizedSerializedSize);
+        foreach (int element in codes_) {
+          output.WriteInt32NoTag(element);
+        }
+      }
+      extensionWriter.WriteUntil(200, output);
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasName) {
+          size += pb::CodedOutputStream.ComputeStringSize(1, Name);
+        }
+        if (HasId) {
+          size += pb::CodedOutputStream.ComputeInt32Size(2, Id);
+        }
+        if (HasEmail) {
+          size += pb::CodedOutputStream.ComputeStringSize(3, Email);
+        }
+        {
+          int dataSize = 0;
+          foreach (int element in CodesList) {
+            dataSize += pb::CodedOutputStream.ComputeInt32SizeNoTag(element);
+          }
+          size += dataSize;
+          if (codes_.Count != 0) {
+            size += 1 + pb::CodedOutputStream.ComputeInt32SizeNoTag(dataSize);
+          }
+          codesMemoizedSerializedSize = dataSize;
+        }
+        foreach (global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber element in PhoneList) {
+          size += pb::CodedOutputStream.ComputeMessageSize(4, element);
+        }
+        foreach (global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses element in AddressesList) {
+          size += pb::CodedOutputStream.ComputeGroupSize(5, element);
+        }
+        size += ExtensionsSerializedSize;
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static TestInteropPersonLite ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestInteropPersonLite ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropPersonLite ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestInteropPersonLite ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropPersonLite ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestInteropPersonLite ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropPersonLite ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestInteropPersonLite ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestInteropPersonLite ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestInteropPersonLite ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestInteropPersonLite prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::ExtendableBuilderLite<TestInteropPersonLite, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      TestInteropPersonLite result = new TestInteropPersonLite();
+      
+      protected override TestInteropPersonLite MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new TestInteropPersonLite();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override TestInteropPersonLite DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.DefaultInstance; }
+      }
+      
+      public override TestInteropPersonLite BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        result.codes_.MakeReadOnly();
+        result.phone_.MakeReadOnly();
+        result.addresses_.MakeReadOnly();
+        TestInteropPersonLite returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessageLite other) {
+        if (other is TestInteropPersonLite) {
+          return MergeFrom((TestInteropPersonLite) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestInteropPersonLite other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.DefaultInstance) return this;
+        if (other.HasName) {
+          Name = other.Name;
+        }
+        if (other.HasId) {
+          Id = other.Id;
+        }
+        if (other.HasEmail) {
+          Email = other.Email;
+        }
+        if (other.codes_.Count != 0) {
+          base.AddRange(other.codes_, result.codes_);
+        }
+        if (other.phone_.Count != 0) {
+          base.AddRange(other.phone_, result.phone_);
+        }
+        if (other.addresses_.Count != 0) {
+          base.AddRange(other.addresses_, result.addresses_);
+        }
+          this.MergeExtensionFields(other);
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                return this;
+              }
+              ParseUnknownField(input, extensionRegistry, tag);
+              break;
+            }
+            case 10: {
+              Name = input.ReadString();
+              break;
+            }
+            case 16: {
+              Id = input.ReadInt32();
+              break;
+            }
+            case 26: {
+              Email = input.ReadString();
+              break;
+            }
+            case 34: {
+              global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber.CreateBuilder();
+              input.ReadMessage(subBuilder, extensionRegistry);
+              AddPhone(subBuilder.BuildPartial());
+              break;
+            }
+            case 43: {
+              global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses.Builder subBuilder = global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses.CreateBuilder();
+              input.ReadGroup(5, subBuilder, extensionRegistry);
+              AddAddresses(subBuilder.BuildPartial());
+              break;
+            }
+            case 82: {
+              int length = input.ReadInt32();
+              int limit = input.PushLimit(length);
+              while (!input.ReachedLimit) {
+                AddCodes(input.ReadInt32());
+              }
+              input.PopLimit(limit);
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public bool HasName {
+        get { return result.HasName; }
+      }
+      public string Name {
+        get { return result.Name; }
+        set { SetName(value); }
+      }
+      public Builder SetName(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasName = true;
+        result.name_ = value;
+        return this;
+      }
+      public Builder ClearName() {
+        result.hasName = false;
+        result.name_ = "";
+        return this;
+      }
+      
+      public bool HasId {
+        get { return result.HasId; }
+      }
+      public int Id {
+        get { return result.Id; }
+        set { SetId(value); }
+      }
+      public Builder SetId(int value) {
+        result.hasId = true;
+        result.id_ = value;
+        return this;
+      }
+      public Builder ClearId() {
+        result.hasId = false;
+        result.id_ = 0;
+        return this;
+      }
+      
+      public bool HasEmail {
+        get { return result.HasEmail; }
+      }
+      public string Email {
+        get { return result.Email; }
+        set { SetEmail(value); }
+      }
+      public Builder SetEmail(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasEmail = true;
+        result.email_ = value;
+        return this;
+      }
+      public Builder ClearEmail() {
+        result.hasEmail = false;
+        result.email_ = "";
+        return this;
+      }
+      
+      public pbc::IPopsicleList<int> CodesList {
+        get { return result.codes_; }
+      }
+      public int CodesCount {
+        get { return result.CodesCount; }
+      }
+      public int GetCodes(int index) {
+        return result.GetCodes(index);
+      }
+      public Builder SetCodes(int index, int value) {
+        result.codes_[index] = value;
+        return this;
+      }
+      public Builder AddCodes(int value) {
+        result.codes_.Add(value);
+        return this;
+      }
+      public Builder AddRangeCodes(scg::IEnumerable<int> values) {
+        base.AddRange(values, result.codes_);
+        return this;
+      }
+      public Builder ClearCodes() {
+        result.codes_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber> PhoneList {
+        get { return result.phone_; }
+      }
+      public int PhoneCount {
+        get { return result.PhoneCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber GetPhone(int index) {
+        return result.GetPhone(index);
+      }
+      public Builder SetPhone(int index, global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.phone_[index] = value;
+        return this;
+      }
+      public Builder SetPhone(int index, global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.phone_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddPhone(global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.phone_.Add(value);
+        return this;
+      }
+      public Builder AddPhone(global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.phone_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangePhone(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.PhoneNumber> values) {
+        base.AddRange(values, result.phone_);
+        return this;
+      }
+      public Builder ClearPhone() {
+        result.phone_.Clear();
+        return this;
+      }
+      
+      public pbc::IPopsicleList<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses> AddressesList {
+        get { return result.addresses_; }
+      }
+      public int AddressesCount {
+        get { return result.AddressesCount; }
+      }
+      public global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses GetAddresses(int index) {
+        return result.GetAddresses(index);
+      }
+      public Builder SetAddresses(int index, global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.addresses_[index] = value;
+        return this;
+      }
+      public Builder SetAddresses(int index, global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.addresses_[index] = builderForValue.Build();
+        return this;
+      }
+      public Builder AddAddresses(global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.addresses_.Add(value);
+        return this;
+      }
+      public Builder AddAddresses(global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses.Builder builderForValue) {
+        pb::ThrowHelper.ThrowIfNull(builderForValue, "builderForValue");
+        result.addresses_.Add(builderForValue.Build());
+        return this;
+      }
+      public Builder AddRangeAddresses(scg::IEnumerable<global::Google.ProtocolBuffers.TestProtos.TestInteropPersonLite.Types.Addresses> values) {
+        base.AddRange(values, result.addresses_);
+        return this;
+      }
+      public Builder ClearAddresses() {
+        result.addresses_.Clear();
+        return this;
+      }
+    }
+    static TestInteropPersonLite() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasLiteProtoFile.Descriptor, null);
+    }
+  }
+  
+  public sealed partial class TestInteropEmployeeIdLite : pb::GeneratedMessageLite<TestInteropEmployeeIdLite, TestInteropEmployeeIdLite.Builder> {
+    private static readonly TestInteropEmployeeIdLite defaultInstance = new Builder().BuildPartial();
+    public static TestInteropEmployeeIdLite DefaultInstance {
+      get { return defaultInstance; }
+    }
+    
+    public override TestInteropEmployeeIdLite DefaultInstanceForType {
+      get { return defaultInstance; }
+    }
+    
+    protected override TestInteropEmployeeIdLite ThisMessage {
+      get { return this; }
+    }
+    
+    public const int NumberFieldNumber = 1;
+    private bool hasNumber;
+    private string number_ = "";
+    public bool HasNumber {
+      get { return hasNumber; }
+    }
+    public string Number {
+      get { return number_; }
+    }
+    
+    public override bool IsInitialized {
+      get {
+        if (!hasNumber) return false;
+        return true;
+      }
+    }
+    
+    public override void WriteTo(pb::CodedOutputStream output) {
+      int size = SerializedSize;
+      if (HasNumber) {
+        output.WriteString(1, Number);
+      }
+    }
+    
+    private int memoizedSerializedSize = -1;
+    public override int SerializedSize {
+      get {
+        int size = memoizedSerializedSize;
+        if (size != -1) return size;
+        
+        size = 0;
+        if (HasNumber) {
+          size += pb::CodedOutputStream.ComputeStringSize(1, Number);
+        }
+        memoizedSerializedSize = size;
+        return size;
+      }
+    }
+    
+    public static TestInteropEmployeeIdLite ParseFrom(pb::ByteString data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestInteropEmployeeIdLite ParseFrom(pb::ByteString data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropEmployeeIdLite ParseFrom(byte[] data) {
+      return ((Builder) CreateBuilder().MergeFrom(data)).BuildParsed();
+    }
+    public static TestInteropEmployeeIdLite ParseFrom(byte[] data, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(data, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropEmployeeIdLite ParseFrom(global::System.IO.Stream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestInteropEmployeeIdLite ParseFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static TestInteropEmployeeIdLite ParseDelimitedFrom(global::System.IO.Stream input) {
+      return CreateBuilder().MergeDelimitedFrom(input).BuildParsed();
+    }
+    public static TestInteropEmployeeIdLite ParseDelimitedFrom(global::System.IO.Stream input, pb::ExtensionRegistry extensionRegistry) {
+      return CreateBuilder().MergeDelimitedFrom(input, extensionRegistry).BuildParsed();
+    }
+    public static TestInteropEmployeeIdLite ParseFrom(pb::CodedInputStream input) {
+      return ((Builder) CreateBuilder().MergeFrom(input)).BuildParsed();
+    }
+    public static TestInteropEmployeeIdLite ParseFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+      return ((Builder) CreateBuilder().MergeFrom(input, extensionRegistry)).BuildParsed();
+    }
+    public static Builder CreateBuilder() { return new Builder(); }
+    public override Builder ToBuilder() { return CreateBuilder(this); }
+    public override Builder CreateBuilderForType() { return new Builder(); }
+    public static Builder CreateBuilder(TestInteropEmployeeIdLite prototype) {
+      return (Builder) new Builder().MergeFrom(prototype);
+    }
+    
+    public sealed partial class Builder : pb::GeneratedBuilderLite<TestInteropEmployeeIdLite, Builder> {
+      protected override Builder ThisBuilder {
+        get { return this; }
+      }
+      public Builder() {}
+      
+      TestInteropEmployeeIdLite result = new TestInteropEmployeeIdLite();
+      
+      protected override TestInteropEmployeeIdLite MessageBeingBuilt {
+        get { return result; }
+      }
+      
+      public override Builder Clear() {
+        result = new TestInteropEmployeeIdLite();
+        return this;
+      }
+      
+      public override Builder Clone() {
+        return new Builder().MergeFrom(result);
+      }
+      
+      public override TestInteropEmployeeIdLite DefaultInstanceForType {
+        get { return global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeIdLite.DefaultInstance; }
+      }
+      
+      public override TestInteropEmployeeIdLite BuildPartial() {
+        if (result == null) {
+          throw new global::System.InvalidOperationException("build() has already been called on this Builder");
+        }
+        TestInteropEmployeeIdLite returnMe = result;
+        result = null;
+        return returnMe;
+      }
+      
+      public override Builder MergeFrom(pb::IMessageLite other) {
+        if (other is TestInteropEmployeeIdLite) {
+          return MergeFrom((TestInteropEmployeeIdLite) other);
+        } else {
+          base.MergeFrom(other);
+          return this;
+        }
+      }
+      
+      public override Builder MergeFrom(TestInteropEmployeeIdLite other) {
+        if (other == global::Google.ProtocolBuffers.TestProtos.TestInteropEmployeeIdLite.DefaultInstance) return this;
+        if (other.HasNumber) {
+          Number = other.Number;
+        }
+        return this;
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input) {
+        return MergeFrom(input, pb::ExtensionRegistry.Empty);
+      }
+      
+      public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
+        while (true) {
+          uint tag = input.ReadTag();
+          switch (tag) {
+            case 0: {
+              return this;
+            }
+            default: {
+              if (pb::WireFormat.IsEndGroupTag(tag)) {
+                return this;
+              }
+              ParseUnknownField(input, extensionRegistry, tag);
+              break;
+            }
+            case 10: {
+              Number = input.ReadString();
+              break;
+            }
+          }
+        }
+      }
+      
+      
+      public bool HasNumber {
+        get { return result.HasNumber; }
+      }
+      public string Number {
+        get { return result.Number; }
+        set { SetNumber(value); }
+      }
+      public Builder SetNumber(string value) {
+        pb::ThrowHelper.ThrowIfNull(value, "value");
+        result.hasNumber = true;
+        result.number_ = value;
+        return this;
+      }
+      public Builder ClearNumber() {
+        result.hasNumber = false;
+        result.number_ = "";
+        return this;
+      }
+    }
+    static TestInteropEmployeeIdLite() {
+      object.ReferenceEquals(global::Google.ProtocolBuffers.TestProtos.UnitTestExtrasLiteProtoFile.Descriptor, null);
+    }
+  }
+  
   #endregion
   
 }