| 
					
				 | 
			
			
				@@ -33,6 +33,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using System;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using System.IO;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using Google.Protobuf.TestProtos;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Proto2 = Google.Protobuf.TestProtos.Proto2;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using NUnit.Framework;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using System.Collections;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using System.Collections.Generic;
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -111,6 +112,50 @@ namespace Google.Protobuf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Assert.AreEqual("", message.OneofString);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Assert.AreEqual(ByteString.Empty, message.OneofBytes);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Assert.IsNull(message.OneofNestedMessage);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // proto2 default values
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var message2 = new Proto2.TestAllTypes();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(true, message2.DefaultBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(ByteString.CopyFromUtf8("world"), message2.DefaultBytes);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual("123", message2.DefaultCord);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(52e3, message2.DefaultDouble);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(47, message2.DefaultFixed32);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(48, message2.DefaultFixed64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(51.5, message2.DefaultFloat);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(Proto2.ForeignEnum.ForeignBar, message2.DefaultForeignEnum);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(Proto2.ImportEnum.ImportBar, message2.DefaultImportEnum);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(41, message2.DefaultInt32);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(42, message2.DefaultInt64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(Proto2.TestAllTypes.Types.NestedEnum.Bar, message2.DefaultNestedEnum);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(49, message2.DefaultSfixed32);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(-50, message2.DefaultSfixed64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(-45, message2.DefaultSint32);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(46, message2.DefaultSint64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual("hello", message2.DefaultString);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual("abc", message2.DefaultStringPiece);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(43, message2.DefaultUint32);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreEqual(44, message2.DefaultUint64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultBytes);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultCord);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultDouble);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultFixed32);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultFixed64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultFloat);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultForeignEnum);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultImportEnum);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultInt32);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultInt64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultNestedEnum);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultSfixed32);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultSfixed64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultSint32);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultSint64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultString);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultStringPiece);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultUint32);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message2.HasDefaultUint64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         [Test]
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -123,6 +168,107 @@ namespace Google.Protobuf 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Assert.Throws<ArgumentNullException>(() => message.OneofBytes = null);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Test]
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void FieldPresence()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var message = new Proto2.TestAllTypes();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.HasOptionalBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.OptionalBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.OptionalBool = true;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.HasOptionalBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.OptionalBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.OptionalBool = false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.HasOptionalBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.OptionalBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.ClearOptionalBool();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.HasOptionalBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.OptionalBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.HasDefaultBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.DefaultBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.DefaultBool = false;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.HasDefaultBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.DefaultBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.DefaultBool = true;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.HasDefaultBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.DefaultBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.ClearDefaultBool();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.HasDefaultBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.DefaultBool);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Test]
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void RequiredFields()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var message = new Proto2.TestRequired();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.IsInitialized());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.A = 1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.B = 2;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.C = 3;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.IsInitialized());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Test]
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void RequiredFieldsInExtensions()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var message = new Proto2.TestAllExtensions();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.IsInitialized());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.SetExtension(Proto2.TestRequired.Extensions.Single, new Proto2.TestRequired());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.IsInitialized());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var extensionMessage = message.GetExtension(Proto2.TestRequired.Extensions.Single);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            extensionMessage.A = 1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            extensionMessage.B = 2;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            extensionMessage.C = 3;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.IsInitialized());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.RegisterExtension(Proto2.TestRequired.Extensions.Multi);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.IsInitialized());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.GetExtension(Proto2.TestRequired.Extensions.Multi).Add(new Proto2.TestRequired());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.IsInitialized());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            extensionMessage = message.GetExtension(Proto2.TestRequired.Extensions.Multi)[0];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            extensionMessage.A = 1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            extensionMessage.B = 2;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            extensionMessage.C = 3;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.IsInitialized());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Test]
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void RequiredFieldInNestedMessageMapValue()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var message = new Proto2.TestRequiredMap();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.Foo.Add(0, new Proto2.TestRequiredMap.Types.NestedMessage());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.False(message.IsInitialized());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            message.Foo[0].RequiredInt32 = 12;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.True(message.IsInitialized());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         [Test]
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public void RoundTrip_Empty()
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         {
 
			 |