1 #region Copyright notice and license 2 // Protocol Buffers - Google's data interchange format 3 // Copyright 2008 Google Inc. All rights reserved. 4 // 5 // Use of this source code is governed by a BSD-style 6 // license that can be found in the LICENSE file or at 7 // https://developers.google.com/open-source/licenses/bsd 8 #endregion 9 10 using NUnit.Framework; 11 using ProtobufUnittest; 12 using System; 13 using System.IO; 14 using UnitTest.Issues.TestProtos; 15 16 namespace Google.Protobuf.Test 17 { 18 public class Proto3OptionalTest 19 { 20 [Test] OptionalInt32FieldLifecycle()21 public void OptionalInt32FieldLifecycle() 22 { 23 var message = new TestProto3Optional(); 24 Assert.IsFalse(message.HasOptionalInt32); 25 Assert.AreEqual(0, message.OptionalInt32); 26 27 message.OptionalInt32 = 5; 28 Assert.IsTrue(message.HasOptionalInt32); 29 Assert.AreEqual(5, message.OptionalInt32); 30 31 message.OptionalInt32 = 0; 32 Assert.IsTrue(message.HasOptionalInt32); 33 Assert.AreEqual(0, message.OptionalInt32); 34 35 message.ClearOptionalInt32(); 36 Assert.IsFalse(message.HasOptionalInt32); 37 Assert.AreEqual(0, message.OptionalInt32); 38 } 39 40 [Test] OptionalStringFieldLifecycle()41 public void OptionalStringFieldLifecycle() 42 { 43 var message = new TestProto3Optional(); 44 Assert.IsFalse(message.HasOptionalString); 45 Assert.AreEqual("", message.OptionalString); 46 47 message.OptionalString = "x"; 48 Assert.IsTrue(message.HasOptionalString); 49 Assert.AreEqual("x", message.OptionalString); 50 51 message.OptionalString = ""; 52 Assert.IsTrue(message.HasOptionalString); 53 Assert.AreEqual("", message.OptionalString); 54 55 message.ClearOptionalString(); 56 Assert.IsFalse(message.HasOptionalString); 57 Assert.AreEqual("", message.OptionalString); 58 59 Assert.Throws<ArgumentNullException>(() => message.OptionalString = null); 60 } 61 62 [Test] Clone()63 public void Clone() 64 { 65 var original = new TestProto3Optional { OptionalInt64 = 0L }; 66 67 var clone = original.Clone(); 68 Assert.False(clone.HasOptionalInt32); 69 Assert.AreEqual(0, clone.OptionalInt32); 70 Assert.True(clone.HasOptionalInt64); 71 Assert.AreEqual(0L, clone.OptionalInt64); 72 } 73 74 [Test] Serialization_NotSet()75 public void Serialization_NotSet() 76 { 77 var stream = new MemoryStream(); 78 var message = new TestProto3Optional(); 79 message.WriteTo(stream); 80 Assert.AreEqual(0, stream.Length); 81 } 82 83 [Test] Serialization_SetToDefault()84 public void Serialization_SetToDefault() 85 { 86 var stream = new MemoryStream(); 87 var message = new TestProto3Optional { OptionalInt32 = 0 }; 88 message.WriteTo(stream); 89 Assert.AreEqual(2, stream.Length); // Tag and value 90 } 91 92 [Test] Serialization_Roundtrip()93 public void Serialization_Roundtrip() 94 { 95 var original = new TestProto3Optional { OptionalInt64 = 0L, OptionalFixed32 = 5U }; 96 var stream = new MemoryStream(); 97 original.WriteTo(stream); 98 stream.Position = 0; 99 var deserialized = TestProto3Optional.Parser.ParseFrom(stream); 100 101 Assert.AreEqual(0, deserialized.OptionalInt32); 102 Assert.IsFalse(deserialized.HasOptionalInt32); 103 104 Assert.AreEqual(0L, deserialized.OptionalInt64); 105 Assert.IsTrue(deserialized.HasOptionalInt64); 106 107 Assert.AreEqual(5U, deserialized.OptionalFixed32); 108 Assert.IsTrue(deserialized.HasOptionalFixed32); 109 } 110 111 [Test] Equality_IgnoresPresence()112 public void Equality_IgnoresPresence() 113 { 114 var message1 = new TestProto3Optional { OptionalInt32 = 0 }; 115 var message2 = new TestProto3Optional(); 116 117 Assert.IsTrue(message1.Equals(message2)); 118 message1.ClearOptionalInt32(); 119 } 120 121 [Test] MixedFields()122 public void MixedFields() 123 { 124 var descriptor = MixedRegularAndOptional.Descriptor; 125 Assert.AreEqual(1, descriptor.Oneofs.Count); 126 Assert.AreEqual(0, descriptor.RealOneofCount); 127 Assert.True(descriptor.Oneofs[0].IsSynthetic); 128 } 129 } 130 } 131