| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522 | #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.#endregionusing System;using System.Collections.Generic;using Google.ProtocolBuffers.Collections;using Google.ProtocolBuffers.TestProtos;using NUnit.Framework;namespace Google.ProtocolBuffers{    [TestFixture]    public class GeneratedMessageTest    {        private ReflectionTester reflectionTester;        private ReflectionTester extensionsReflectionTester;        [SetUp]        public void SetUp()        {            reflectionTester = ReflectionTester.CreateTestAllTypesInstance();            extensionsReflectionTester = ReflectionTester.CreateTestAllExtensionsInstance();        }        [Test]        public void RepeatedAddPrimitiveBeforeBuild()        {            TestAllTypes message = new TestAllTypes.Builder {RepeatedInt32List = {1, 2, 3}}.Build();            TestUtil.AssertEqual(new int[] {1, 2, 3}, message.RepeatedInt32List);        }        [Test]        public void AddPrimitiveFailsAfterBuild()        {            TestAllTypes.Builder builder = new TestAllTypes.Builder();            IList<int> list = builder.RepeatedInt32List;            list.Add(1); // Fine            builder.Build();            try            {                list.Add(2);                Assert.Fail("List should be frozen");            }            catch (NotSupportedException)            {                // Expected            }        }        [Test]        public void RepeatedAddMessageBeforeBuild()        {            TestAllTypes message = new TestAllTypes.Builder                                       {                                           RepeatedNestedMessageList =                                               {new TestAllTypes.Types.NestedMessage.Builder {Bb = 10}.Build()}                                       }.Build();            Assert.AreEqual(1, message.RepeatedNestedMessageCount);            Assert.AreEqual(10, message.RepeatedNestedMessageList[0].Bb);        }        [Test]        public void AddMessageFailsAfterBuild()        {            TestAllTypes.Builder builder = new TestAllTypes.Builder();            IList<TestAllTypes.Types.NestedMessage> list = builder.RepeatedNestedMessageList;            builder.Build();            try            {                list.Add(new TestAllTypes.Types.NestedMessage.Builder {Bb = 10}.Build());                Assert.Fail("List should be frozen");            }            catch (NotSupportedException)            {                // Expected            }        }        [Test]        public void DefaultInstance()        {            Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.DefaultInstance.DefaultInstanceForType);            Assert.AreSame(TestAllTypes.DefaultInstance, TestAllTypes.CreateBuilder().DefaultInstanceForType);        }        [Test]        public void Accessors()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            TestUtil.SetAllFields(builder);            TestAllTypes message = builder.Build();            TestUtil.AssertAllFieldsSet(message);        }        [Test]        public void SettersRejectNull()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            TestUtil.AssertArgumentNullException(() => builder.SetOptionalString(null));            TestUtil.AssertArgumentNullException(() => builder.SetOptionalBytes(null));            TestUtil.AssertArgumentNullException(                () => builder.SetOptionalNestedMessage((TestAllTypes.Types.NestedMessage) null));            TestUtil.AssertArgumentNullException(                () => builder.SetOptionalNestedMessage((TestAllTypes.Types.NestedMessage.Builder) null));            TestUtil.AssertArgumentNullException(() => builder.AddRepeatedString(null));            TestUtil.AssertArgumentNullException(() => builder.AddRepeatedBytes(null));            TestUtil.AssertArgumentNullException(                () => builder.AddRepeatedNestedMessage((TestAllTypes.Types.NestedMessage) null));            TestUtil.AssertArgumentNullException(                () => builder.AddRepeatedNestedMessage((TestAllTypes.Types.NestedMessage.Builder) null));        }        [Test]        public void RepeatedSetters()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            TestUtil.SetAllFields(builder);            TestUtil.ModifyRepeatedFields(builder);            TestAllTypes message = builder.Build();            TestUtil.AssertRepeatedFieldsModified(message);        }        [Test]        public void RepeatedAppend()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            builder.AddRangeRepeatedInt32(new int[] {1, 2, 3, 4});            builder.AddRangeRepeatedForeignEnum((new ForeignEnum[] {ForeignEnum.FOREIGN_BAZ}));            ForeignMessage foreignMessage = ForeignMessage.CreateBuilder().SetC(12).Build();            builder.AddRangeRepeatedForeignMessage(new ForeignMessage[] {foreignMessage});            TestAllTypes message = builder.Build();            TestUtil.AssertEqual(message.RepeatedInt32List, new int[] {1, 2, 3, 4});            TestUtil.AssertEqual(message.RepeatedForeignEnumList, new ForeignEnum[] {ForeignEnum.FOREIGN_BAZ});            Assert.AreEqual(1, message.RepeatedForeignMessageCount);            Assert.AreEqual(12, message.GetRepeatedForeignMessage(0).C);        }        [Test]        public void RepeatedAppendRejectsNull()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            ForeignMessage foreignMessage = ForeignMessage.CreateBuilder().SetC(12).Build();            TestUtil.AssertArgumentNullException(                () => builder.AddRangeRepeatedForeignMessage(new[] {foreignMessage, null}));            TestUtil.AssertArgumentNullException(() => builder.AddRangeRepeatedForeignMessage(null));            TestUtil.AssertArgumentNullException(() => builder.AddRangeRepeatedForeignEnum(null));            TestUtil.AssertArgumentNullException(() => builder.AddRangeRepeatedString(new[] {"one", null}));            TestUtil.AssertArgumentNullException(                () => builder.AddRangeRepeatedBytes(new[] {TestUtil.ToBytes("one"), null}));        }        [Test]        public void SettingForeignMessageUsingBuilder()        {            TestAllTypes message = TestAllTypes.CreateBuilder()                // Pass builder for foreign message instance.                .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(123))                .Build();            TestAllTypes expectedMessage = TestAllTypes.CreateBuilder()                // Create expected version passing foreign message instance explicitly.                .SetOptionalForeignMessage(ForeignMessage.CreateBuilder().SetC(123).Build())                .Build();            Assert.AreEqual(expectedMessage, message);        }        [Test]        public void SettingRepeatedForeignMessageUsingBuilder()        {            TestAllTypes message = TestAllTypes.CreateBuilder()                // Pass builder for foreign message instance.                .AddRepeatedForeignMessage(ForeignMessage.CreateBuilder().SetC(456))                .Build();            TestAllTypes expectedMessage = TestAllTypes.CreateBuilder()                // Create expected version passing foreign message instance explicitly.                .AddRepeatedForeignMessage(ForeignMessage.CreateBuilder().SetC(456).Build())                .Build();            Assert.AreEqual(expectedMessage, message);        }        [Test]        public void SettingRepeatedValuesUsingRangeInCollectionInitializer()        {            int[] values = {1, 2, 3};            TestAllTypes message = new TestAllTypes.Builder                                       {                                           RepeatedSint32List = {values}                                       }.Build();            Assert.IsTrue(Lists.Equals(values, message.RepeatedSint32List));        }        [Test]        public void SettingRepeatedValuesUsingIndividualValuesInCollectionInitializer()        {            TestAllTypes message = new TestAllTypes.Builder                                       {                                           RepeatedSint32List = {6, 7}                                       }.Build();            Assert.IsTrue(Lists.Equals(new int[] {6, 7}, message.RepeatedSint32List));        }        [Test]        public void Defaults()        {            TestUtil.AssertClear(TestAllTypes.DefaultInstance);            TestUtil.AssertClear(TestAllTypes.CreateBuilder().Build());            Assert.AreEqual("\u1234", TestExtremeDefaultValues.DefaultInstance.Utf8String);        }        [Test]        public void ReflectionGetters()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            TestUtil.SetAllFields(builder);            TestAllTypes message = builder.Build();            reflectionTester.AssertAllFieldsSetViaReflection(message);        }        [Test]        public void ReflectionSetters()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            reflectionTester.SetAllFieldsViaReflection(builder);            TestAllTypes message = builder.Build();            TestUtil.AssertAllFieldsSet(message);        }        [Test]        public void ReflectionSettersRejectNull()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            reflectionTester.AssertReflectionSettersRejectNull(builder);        }        [Test]        public void ReflectionRepeatedSetters()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            reflectionTester.SetAllFieldsViaReflection(builder);            reflectionTester.ModifyRepeatedFieldsViaReflection(builder);            TestAllTypes message = builder.Build();            TestUtil.AssertRepeatedFieldsModified(message);        }        [Test]        public void TestReflectionRepeatedSettersRejectNull()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            reflectionTester.AssertReflectionRepeatedSettersRejectNull(builder);        }        [Test]        public void ReflectionDefaults()        {            TestUtil.TestInMultipleCultures(() =>                                                {                                                    reflectionTester.AssertClearViaReflection(                                                        TestAllTypes.DefaultInstance);                                                    reflectionTester.AssertClearViaReflection(                                                        TestAllTypes.CreateBuilder().Build());                                                });        }        // =================================================================        // Extensions.        [Test]        public void ExtensionAccessors()        {            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();            TestUtil.SetAllExtensions(builder);            TestAllExtensions message = builder.Build();            TestUtil.AssertAllExtensionsSet(message);        }        [Test]        public void ExtensionRepeatedSetters()        {            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();            TestUtil.SetAllExtensions(builder);            TestUtil.ModifyRepeatedExtensions(builder);            TestAllExtensions message = builder.Build();            TestUtil.AssertRepeatedExtensionsModified(message);        }        [Test]        public void ExtensionDefaults()        {            TestUtil.AssertExtensionsClear(TestAllExtensions.DefaultInstance);            TestUtil.AssertExtensionsClear(TestAllExtensions.CreateBuilder().Build());        }        [Test]        public void ExtensionReflectionGetters()        {            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();            TestUtil.SetAllExtensions(builder);            TestAllExtensions message = builder.Build();            extensionsReflectionTester.AssertAllFieldsSetViaReflection(message);        }        [Test]        public void ExtensionReflectionSetters()        {            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();            extensionsReflectionTester.SetAllFieldsViaReflection(builder);            TestAllExtensions message = builder.Build();            TestUtil.AssertAllExtensionsSet(message);        }        [Test]        public void ExtensionReflectionSettersRejectNull()        {            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();            extensionsReflectionTester.AssertReflectionSettersRejectNull(builder);        }        [Test]        public void ExtensionReflectionRepeatedSetters()        {            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();            extensionsReflectionTester.SetAllFieldsViaReflection(builder);            extensionsReflectionTester.ModifyRepeatedFieldsViaReflection(builder);            TestAllExtensions message = builder.Build();            TestUtil.AssertRepeatedExtensionsModified(message);        }        [Test]        public void ExtensionReflectionRepeatedSettersRejectNull()        {            TestAllExtensions.Builder builder = TestAllExtensions.CreateBuilder();            extensionsReflectionTester.AssertReflectionRepeatedSettersRejectNull(builder);        }        [Test]        public void ExtensionReflectionDefaults()        {            TestUtil.TestInMultipleCultures(() =>                                                {                                                    extensionsReflectionTester.AssertClearViaReflection(                                                        TestAllExtensions.DefaultInstance);                                                    extensionsReflectionTester.AssertClearViaReflection(                                                        TestAllExtensions.CreateBuilder().Build());                                                });        }        [Test]        public void ClearExtension()        {            // ClearExtension() is not actually used in TestUtil, so try it manually.            Assert.IsFalse(TestAllExtensions.CreateBuilder()                               .SetExtension(UnitTestProtoFile.OptionalInt32Extension, 1)                               .ClearExtension(UnitTestProtoFile.OptionalInt32Extension)                               .HasExtension(UnitTestProtoFile.OptionalInt32Extension));            Assert.AreEqual(0, TestAllExtensions.CreateBuilder()                                   .AddExtension(UnitTestProtoFile.RepeatedInt32Extension, 1)                                   .ClearExtension(UnitTestProtoFile.RepeatedInt32Extension)                                   .GetExtensionCount(UnitTestProtoFile.RepeatedInt32Extension));        }        [Test]        public void ExtensionMergeFrom()        {            TestAllExtensions original = TestAllExtensions.CreateBuilder()                .SetExtension(UnitTestProtoFile.OptionalInt32Extension, 1).Build();            TestAllExtensions merged =                TestAllExtensions.CreateBuilder().MergeFrom(original).Build();            Assert.IsTrue((merged.HasExtension(UnitTestProtoFile.OptionalInt32Extension)));            Assert.AreEqual(1, (int) merged.GetExtension(UnitTestProtoFile.OptionalInt32Extension));        }        /* Removed multiple files option for the moment    [Test]    public void MultipleFilesOption() {      // We mostly just want to check that things compile.      MessageWithNoOuter message = MessageWithNoOuter.CreateBuilder()          .SetNested(MessageWithNoOuter.Types.NestedMessage.CreateBuilder().SetI(1))          .AddForeign(TestAllTypes.CreateBuilder().SetOptionalInt32(1))          .SetNestedEnum(MessageWithNoOuter.Types.NestedEnum.BAZ)          .SetForeignEnum(EnumWithNoOuter.BAR)          .Build();      Assert.AreEqual(message, MessageWithNoOuter.ParseFrom(message.ToByteString()));      Assert.AreEqual(MultiFileProto.Descriptor, MessageWithNoOuter.Descriptor.File);      FieldDescriptor field = MessageWithNoOuter.Descriptor.FindDescriptor<FieldDescriptor>("foreign_enum");      Assert.AreEqual(MultiFileProto.Descriptor.FindTypeByName<EnumDescriptor>("EnumWithNoOuter")        .FindValueByNumber((int)EnumWithNoOuter.BAR), message[field]);      Assert.AreEqual(MultiFileProto.Descriptor, ServiceWithNoOuter.Descriptor.File);      Assert.IsFalse(TestAllExtensions.DefaultInstance.HasExtension(MultiFileProto.ExtensionWithOuter));    }*/        [Test]        public void OptionalFieldWithRequiredSubfieldsOptimizedForSize()        {            TestOptionalOptimizedForSize message = TestOptionalOptimizedForSize.DefaultInstance;            Assert.IsTrue(message.IsInitialized);            message = TestOptionalOptimizedForSize.CreateBuilder().SetO(                TestRequiredOptimizedForSize.CreateBuilder().BuildPartial()                ).BuildPartial();            Assert.IsFalse(message.IsInitialized);            message = TestOptionalOptimizedForSize.CreateBuilder().SetO(                TestRequiredOptimizedForSize.CreateBuilder().SetX(5).BuildPartial()                ).BuildPartial();            Assert.IsTrue(message.IsInitialized);        }        [Test]        public void OptimizedForSizeMergeUsesAllFieldsFromTarget()        {            TestOptimizedForSize withFieldSet = new TestOptimizedForSize.Builder {I = 10}.Build();            TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder();            builder.MergeFrom(withFieldSet);            TestOptimizedForSize built = builder.Build();            Assert.AreEqual(10, built.I);        }        [Test]        public void UninitializedExtensionInOptimizedForSizeMakesMessageUninitialized()        {            TestOptimizedForSize.Builder builder = new TestOptimizedForSize.Builder();            builder.SetExtension(TestOptimizedForSize.TestExtension2,                                 new TestRequiredOptimizedForSize.Builder().BuildPartial());            Assert.IsFalse(builder.IsInitialized);            Assert.IsFalse(builder.BuildPartial().IsInitialized);            builder = new TestOptimizedForSize.Builder();            builder.SetExtension(TestOptimizedForSize.TestExtension2,                                 new TestRequiredOptimizedForSize.Builder {X = 10}.BuildPartial());            Assert.IsTrue(builder.IsInitialized);            Assert.IsTrue(builder.BuildPartial().IsInitialized);        }        [Test]        public void ToBuilder()        {            TestAllTypes.Builder builder = TestAllTypes.CreateBuilder();            TestUtil.SetAllFields(builder);            TestAllTypes message = builder.Build();            TestUtil.AssertAllFieldsSet(message.ToBuilder().Build());        }        [Test]        public void FieldConstantValues()        {            Assert.AreEqual(TestAllTypes.Types.NestedMessage.BbFieldNumber, 1);            Assert.AreEqual(TestAllTypes.OptionalInt32FieldNumber, 1);            Assert.AreEqual(TestAllTypes.OptionalGroupFieldNumber, 16);            Assert.AreEqual(TestAllTypes.OptionalNestedMessageFieldNumber, 18);            Assert.AreEqual(TestAllTypes.OptionalNestedEnumFieldNumber, 21);            Assert.AreEqual(TestAllTypes.RepeatedInt32FieldNumber, 31);            Assert.AreEqual(TestAllTypes.RepeatedGroupFieldNumber, 46);            Assert.AreEqual(TestAllTypes.RepeatedNestedMessageFieldNumber, 48);            Assert.AreEqual(TestAllTypes.RepeatedNestedEnumFieldNumber, 51);        }        [Test]        public void ExtensionConstantValues()        {            Assert.AreEqual(TestRequired.SingleFieldNumber, 1000);            Assert.AreEqual(TestRequired.MultiFieldNumber, 1001);            Assert.AreEqual(UnitTestProtoFile.OptionalInt32ExtensionFieldNumber, 1);            Assert.AreEqual(UnitTestProtoFile.OptionalGroupExtensionFieldNumber, 16);            Assert.AreEqual(UnitTestProtoFile.OptionalNestedMessageExtensionFieldNumber, 18);            Assert.AreEqual(UnitTestProtoFile.OptionalNestedEnumExtensionFieldNumber, 21);            Assert.AreEqual(UnitTestProtoFile.RepeatedInt32ExtensionFieldNumber, 31);            Assert.AreEqual(UnitTestProtoFile.RepeatedGroupExtensionFieldNumber, 46);            Assert.AreEqual(UnitTestProtoFile.RepeatedNestedMessageExtensionFieldNumber, 48);            Assert.AreEqual(UnitTestProtoFile.RepeatedNestedEnumExtensionFieldNumber, 51);        }        [Test]        public void EmptyPackedValue()        {            TestPackedTypes empty = new TestPackedTypes.Builder().Build();            Assert.AreEqual(0, empty.SerializedSize);        }    }}
 |