|  | @@ -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()
 | 
	
		
			
				|  |  |          {
 |