xref: /aosp_15_r20/external/protobuf/csharp/src/Google.Protobuf.Test/Proto3OptionalTest.cs (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker #region Copyright notice and license
2*1b3f573fSAndroid Build Coastguard Worker // Protocol Buffers - Google's data interchange format
3*1b3f573fSAndroid Build Coastguard Worker // Copyright 2008 Google Inc.  All rights reserved.
4*1b3f573fSAndroid Build Coastguard Worker // https://developers.google.com/protocol-buffers/
5*1b3f573fSAndroid Build Coastguard Worker //
6*1b3f573fSAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
7*1b3f573fSAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
8*1b3f573fSAndroid Build Coastguard Worker // met:
9*1b3f573fSAndroid Build Coastguard Worker //
10*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
11*1b3f573fSAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
12*1b3f573fSAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
13*1b3f573fSAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
14*1b3f573fSAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
15*1b3f573fSAndroid Build Coastguard Worker // distribution.
16*1b3f573fSAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
17*1b3f573fSAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
18*1b3f573fSAndroid Build Coastguard Worker // this software without specific prior written permission.
19*1b3f573fSAndroid Build Coastguard Worker //
20*1b3f573fSAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21*1b3f573fSAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23*1b3f573fSAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24*1b3f573fSAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25*1b3f573fSAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26*1b3f573fSAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*1b3f573fSAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*1b3f573fSAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*1b3f573fSAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30*1b3f573fSAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*1b3f573fSAndroid Build Coastguard Worker #endregion
32*1b3f573fSAndroid Build Coastguard Worker 
33*1b3f573fSAndroid Build Coastguard Worker using NUnit.Framework;
34*1b3f573fSAndroid Build Coastguard Worker using ProtobufUnittest;
35*1b3f573fSAndroid Build Coastguard Worker using System;
36*1b3f573fSAndroid Build Coastguard Worker using System.IO;
37*1b3f573fSAndroid Build Coastguard Worker using UnitTest.Issues.TestProtos;
38*1b3f573fSAndroid Build Coastguard Worker 
39*1b3f573fSAndroid Build Coastguard Worker namespace Google.Protobuf.Test
40*1b3f573fSAndroid Build Coastguard Worker {
41*1b3f573fSAndroid Build Coastguard Worker     class Proto3OptionalTest
42*1b3f573fSAndroid Build Coastguard Worker     {
43*1b3f573fSAndroid Build Coastguard Worker         [Test]
OptionalInt32FieldLifecycle()44*1b3f573fSAndroid Build Coastguard Worker         public void OptionalInt32FieldLifecycle()
45*1b3f573fSAndroid Build Coastguard Worker         {
46*1b3f573fSAndroid Build Coastguard Worker             var message = new TestProto3Optional();
47*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(message.HasOptionalInt32);
48*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, message.OptionalInt32);
49*1b3f573fSAndroid Build Coastguard Worker 
50*1b3f573fSAndroid Build Coastguard Worker             message.OptionalInt32 = 5;
51*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(message.HasOptionalInt32);
52*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(5, message.OptionalInt32);
53*1b3f573fSAndroid Build Coastguard Worker 
54*1b3f573fSAndroid Build Coastguard Worker             message.OptionalInt32 = 0;
55*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(message.HasOptionalInt32);
56*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, message.OptionalInt32);
57*1b3f573fSAndroid Build Coastguard Worker 
58*1b3f573fSAndroid Build Coastguard Worker             message.ClearOptionalInt32();
59*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(message.HasOptionalInt32);
60*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, message.OptionalInt32);
61*1b3f573fSAndroid Build Coastguard Worker         }
62*1b3f573fSAndroid Build Coastguard Worker 
63*1b3f573fSAndroid Build Coastguard Worker         [Test]
OptionalStringFieldLifecycle()64*1b3f573fSAndroid Build Coastguard Worker         public void OptionalStringFieldLifecycle()
65*1b3f573fSAndroid Build Coastguard Worker         {
66*1b3f573fSAndroid Build Coastguard Worker             var message = new TestProto3Optional();
67*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(message.HasOptionalString);
68*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual("", message.OptionalString);
69*1b3f573fSAndroid Build Coastguard Worker 
70*1b3f573fSAndroid Build Coastguard Worker             message.OptionalString = "x";
71*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(message.HasOptionalString);
72*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual("x", message.OptionalString);
73*1b3f573fSAndroid Build Coastguard Worker 
74*1b3f573fSAndroid Build Coastguard Worker             message.OptionalString = "";
75*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(message.HasOptionalString);
76*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual("", message.OptionalString);
77*1b3f573fSAndroid Build Coastguard Worker 
78*1b3f573fSAndroid Build Coastguard Worker             message.ClearOptionalString();
79*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(message.HasOptionalString);
80*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual("", message.OptionalString);
81*1b3f573fSAndroid Build Coastguard Worker 
82*1b3f573fSAndroid Build Coastguard Worker             Assert.Throws<ArgumentNullException>(() => message.OptionalString = null);
83*1b3f573fSAndroid Build Coastguard Worker         }
84*1b3f573fSAndroid Build Coastguard Worker 
85*1b3f573fSAndroid Build Coastguard Worker         [Test]
Clone()86*1b3f573fSAndroid Build Coastguard Worker         public void Clone()
87*1b3f573fSAndroid Build Coastguard Worker         {
88*1b3f573fSAndroid Build Coastguard Worker             var original = new TestProto3Optional { OptionalInt64 = 0L };
89*1b3f573fSAndroid Build Coastguard Worker 
90*1b3f573fSAndroid Build Coastguard Worker             var clone = original.Clone();
91*1b3f573fSAndroid Build Coastguard Worker             Assert.False(clone.HasOptionalInt32);
92*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, clone.OptionalInt32);
93*1b3f573fSAndroid Build Coastguard Worker             Assert.True(clone.HasOptionalInt64);
94*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0L, clone.OptionalInt64);
95*1b3f573fSAndroid Build Coastguard Worker         }
96*1b3f573fSAndroid Build Coastguard Worker 
97*1b3f573fSAndroid Build Coastguard Worker         [Test]
Serialization_NotSet()98*1b3f573fSAndroid Build Coastguard Worker         public void Serialization_NotSet()
99*1b3f573fSAndroid Build Coastguard Worker         {
100*1b3f573fSAndroid Build Coastguard Worker             var stream = new MemoryStream();
101*1b3f573fSAndroid Build Coastguard Worker             var message = new TestProto3Optional();
102*1b3f573fSAndroid Build Coastguard Worker             message.WriteTo(stream);
103*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, stream.Length);
104*1b3f573fSAndroid Build Coastguard Worker         }
105*1b3f573fSAndroid Build Coastguard Worker 
106*1b3f573fSAndroid Build Coastguard Worker         [Test]
Serialization_SetToDefault()107*1b3f573fSAndroid Build Coastguard Worker         public void Serialization_SetToDefault()
108*1b3f573fSAndroid Build Coastguard Worker         {
109*1b3f573fSAndroid Build Coastguard Worker             var stream = new MemoryStream();
110*1b3f573fSAndroid Build Coastguard Worker             var message = new TestProto3Optional { OptionalInt32 = 0 };
111*1b3f573fSAndroid Build Coastguard Worker             message.WriteTo(stream);
112*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(2, stream.Length); // Tag and value
113*1b3f573fSAndroid Build Coastguard Worker         }
114*1b3f573fSAndroid Build Coastguard Worker 
115*1b3f573fSAndroid Build Coastguard Worker         [Test]
Serialization_Roundtrip()116*1b3f573fSAndroid Build Coastguard Worker         public void Serialization_Roundtrip()
117*1b3f573fSAndroid Build Coastguard Worker         {
118*1b3f573fSAndroid Build Coastguard Worker             var original = new TestProto3Optional { OptionalInt64 = 0L, OptionalFixed32 = 5U };
119*1b3f573fSAndroid Build Coastguard Worker             var stream = new MemoryStream();
120*1b3f573fSAndroid Build Coastguard Worker             original.WriteTo(stream);
121*1b3f573fSAndroid Build Coastguard Worker             stream.Position = 0;
122*1b3f573fSAndroid Build Coastguard Worker             var deserialized = TestProto3Optional.Parser.ParseFrom(stream);
123*1b3f573fSAndroid Build Coastguard Worker 
124*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, deserialized.OptionalInt32);
125*1b3f573fSAndroid Build Coastguard Worker             Assert.IsFalse(deserialized.HasOptionalInt32);
126*1b3f573fSAndroid Build Coastguard Worker 
127*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0L, deserialized.OptionalInt64);
128*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(deserialized.HasOptionalInt64);
129*1b3f573fSAndroid Build Coastguard Worker 
130*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(5U, deserialized.OptionalFixed32);
131*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(deserialized.HasOptionalFixed32);
132*1b3f573fSAndroid Build Coastguard Worker         }
133*1b3f573fSAndroid Build Coastguard Worker 
134*1b3f573fSAndroid Build Coastguard Worker         [Test]
Equality_IgnoresPresence()135*1b3f573fSAndroid Build Coastguard Worker         public void Equality_IgnoresPresence()
136*1b3f573fSAndroid Build Coastguard Worker         {
137*1b3f573fSAndroid Build Coastguard Worker             var message1 = new TestProto3Optional { OptionalInt32 = 0 };
138*1b3f573fSAndroid Build Coastguard Worker             var message2 = new TestProto3Optional();
139*1b3f573fSAndroid Build Coastguard Worker 
140*1b3f573fSAndroid Build Coastguard Worker             Assert.IsTrue(message1.Equals(message2));
141*1b3f573fSAndroid Build Coastguard Worker             message1.ClearOptionalInt32();
142*1b3f573fSAndroid Build Coastguard Worker         }
143*1b3f573fSAndroid Build Coastguard Worker 
144*1b3f573fSAndroid Build Coastguard Worker         [Test]
MixedFields()145*1b3f573fSAndroid Build Coastguard Worker         public void MixedFields()
146*1b3f573fSAndroid Build Coastguard Worker         {
147*1b3f573fSAndroid Build Coastguard Worker             var descriptor = MixedRegularAndOptional.Descriptor;
148*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(1, descriptor.Oneofs.Count);
149*1b3f573fSAndroid Build Coastguard Worker             Assert.AreEqual(0, descriptor.RealOneofCount);
150*1b3f573fSAndroid Build Coastguard Worker             Assert.True(descriptor.Oneofs[0].IsSynthetic);
151*1b3f573fSAndroid Build Coastguard Worker         }
152*1b3f573fSAndroid Build Coastguard Worker     }
153*1b3f573fSAndroid Build Coastguard Worker }
154