| OLD | NEW |
| (Empty) |
| 1 #region Copyright notice and license | |
| 2 // Protocol Buffers - Google's data interchange format | |
| 3 // Copyright 2008 Google Inc. All rights reserved. | |
| 4 // https://developers.google.com/protocol-buffers/ | |
| 5 // | |
| 6 // Redistribution and use in source and binary forms, with or without | |
| 7 // modification, are permitted provided that the following conditions are | |
| 8 // met: | |
| 9 // | |
| 10 // * Redistributions of source code must retain the above copyright | |
| 11 // notice, this list of conditions and the following disclaimer. | |
| 12 // * Redistributions in binary form must reproduce the above | |
| 13 // copyright notice, this list of conditions and the following disclaimer | |
| 14 // in the documentation and/or other materials provided with the | |
| 15 // distribution. | |
| 16 // * Neither the name of Google Inc. nor the names of its | |
| 17 // contributors may be used to endorse or promote products derived from | |
| 18 // this software without specific prior written permission. | |
| 19 // | |
| 20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 21 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 22 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 23 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| 24 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| 25 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| 26 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 27 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 28 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 29 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 30 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 31 #endregion | |
| 32 | |
| 33 using System.Linq; | |
| 34 using Google.Protobuf.TestProtos; | |
| 35 using NUnit.Framework; | |
| 36 using UnitTest.Issues.TestProtos; | |
| 37 | |
| 38 namespace Google.Protobuf.Reflection | |
| 39 { | |
| 40 /// <summary> | |
| 41 /// Tests for descriptors. (Not in its own namespace or broken up into indiv
idual classes as the | |
| 42 /// size doesn't warrant it. On the other hand, this makes me feel a bit dir
ty...) | |
| 43 /// </summary> | |
| 44 public class DescriptorsTest | |
| 45 { | |
| 46 [Test] | |
| 47 public void FileDescriptor() | |
| 48 { | |
| 49 FileDescriptor file = UnittestProto3.Descriptor; | |
| 50 | |
| 51 Assert.AreEqual("google/protobuf/unittest_proto3.proto", file.Name); | |
| 52 Assert.AreEqual("protobuf_unittest", file.Package); | |
| 53 | |
| 54 Assert.AreEqual("UnittestProto", file.Proto.Options.JavaOuterClassna
me); | |
| 55 Assert.AreEqual("google/protobuf/unittest_proto3.proto", file.Proto.
Name); | |
| 56 | |
| 57 // unittest.proto doesn't have any public imports, but unittest_impo
rt.proto does. | |
| 58 Assert.AreEqual(0, file.PublicDependencies.Count); | |
| 59 Assert.AreEqual(1, UnittestImportProto3.Descriptor.PublicDependencie
s.Count); | |
| 60 Assert.AreEqual(UnittestImportPublicProto3.Descriptor, UnittestImpor
tProto3.Descriptor.PublicDependencies[0]); | |
| 61 | |
| 62 Assert.AreEqual(1, file.Dependencies.Count); | |
| 63 Assert.AreEqual(UnittestImportProto3.Descriptor, file.Dependencies[0
]); | |
| 64 | |
| 65 MessageDescriptor messageType = TestAllTypes.Descriptor; | |
| 66 Assert.AreSame(typeof(TestAllTypes), messageType.GeneratedType); | |
| 67 Assert.AreEqual(messageType, file.MessageTypes[0]); | |
| 68 Assert.AreEqual(messageType, file.FindTypeByName<MessageDescriptor>(
"TestAllTypes")); | |
| 69 Assert.Null(file.FindTypeByName<MessageDescriptor>("NoSuchType")); | |
| 70 Assert.Null(file.FindTypeByName<MessageDescriptor>("protobuf_unittes
t.TestAllTypes")); | |
| 71 for (int i = 0; i < file.MessageTypes.Count; i++) | |
| 72 { | |
| 73 Assert.AreEqual(i, file.MessageTypes[i].Index); | |
| 74 } | |
| 75 | |
| 76 Assert.AreEqual(file.EnumTypes[0], file.FindTypeByName<EnumDescripto
r>("ForeignEnum")); | |
| 77 Assert.Null(file.FindTypeByName<EnumDescriptor>("NoSuchType")); | |
| 78 Assert.Null(file.FindTypeByName<EnumDescriptor>("protobuf_unittest.F
oreignEnum")); | |
| 79 Assert.AreEqual(1, UnittestImportProto3.Descriptor.EnumTypes.Count); | |
| 80 Assert.AreEqual("ImportEnum", UnittestImportProto3.Descriptor.EnumTy
pes[0].Name); | |
| 81 for (int i = 0; i < file.EnumTypes.Count; i++) | |
| 82 { | |
| 83 Assert.AreEqual(i, file.EnumTypes[i].Index); | |
| 84 } | |
| 85 | |
| 86 Assert.AreEqual(10, file.SerializedData[0]); | |
| 87 } | |
| 88 | |
| 89 [Test] | |
| 90 public void MessageDescriptor() | |
| 91 { | |
| 92 MessageDescriptor messageType = TestAllTypes.Descriptor; | |
| 93 MessageDescriptor nestedType = TestAllTypes.Types.NestedMessage.Desc
riptor; | |
| 94 | |
| 95 Assert.AreEqual("TestAllTypes", messageType.Name); | |
| 96 Assert.AreEqual("protobuf_unittest.TestAllTypes", messageType.FullNa
me); | |
| 97 Assert.AreEqual(UnittestProto3.Descriptor, messageType.File); | |
| 98 Assert.IsNull(messageType.ContainingType); | |
| 99 Assert.IsNull(messageType.Proto.Options); | |
| 100 | |
| 101 Assert.AreEqual("TestAllTypes", messageType.Name); | |
| 102 | |
| 103 Assert.AreEqual("NestedMessage", nestedType.Name); | |
| 104 Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedMessage", nest
edType.FullName); | |
| 105 Assert.AreEqual(UnittestProto3.Descriptor, nestedType.File); | |
| 106 Assert.AreEqual(messageType, nestedType.ContainingType); | |
| 107 | |
| 108 FieldDescriptor field = messageType.Fields.InDeclarationOrder()[0]; | |
| 109 Assert.AreEqual("single_int32", field.Name); | |
| 110 Assert.AreEqual(field, messageType.FindDescriptor<FieldDescriptor>("
single_int32")); | |
| 111 Assert.Null(messageType.FindDescriptor<FieldDescriptor>("no_such_fie
ld")); | |
| 112 Assert.AreEqual(field, messageType.FindFieldByNumber(1)); | |
| 113 Assert.Null(messageType.FindFieldByNumber(571283)); | |
| 114 var fieldsInDeclarationOrder = messageType.Fields.InDeclarationOrder
(); | |
| 115 for (int i = 0; i < fieldsInDeclarationOrder.Count; i++) | |
| 116 { | |
| 117 Assert.AreEqual(i, fieldsInDeclarationOrder[i].Index); | |
| 118 } | |
| 119 | |
| 120 Assert.AreEqual(nestedType, messageType.NestedTypes[0]); | |
| 121 Assert.AreEqual(nestedType, messageType.FindDescriptor<MessageDescri
ptor>("NestedMessage")); | |
| 122 Assert.Null(messageType.FindDescriptor<MessageDescriptor>("NoSuchTyp
e")); | |
| 123 for (int i = 0; i < messageType.NestedTypes.Count; i++) | |
| 124 { | |
| 125 Assert.AreEqual(i, messageType.NestedTypes[i].Index); | |
| 126 } | |
| 127 | |
| 128 Assert.AreEqual(messageType.EnumTypes[0], messageType.FindDescriptor
<EnumDescriptor>("NestedEnum")); | |
| 129 Assert.Null(messageType.FindDescriptor<EnumDescriptor>("NoSuchType")
); | |
| 130 for (int i = 0; i < messageType.EnumTypes.Count; i++) | |
| 131 { | |
| 132 Assert.AreEqual(i, messageType.EnumTypes[i].Index); | |
| 133 } | |
| 134 } | |
| 135 | |
| 136 [Test] | |
| 137 public void FieldDescriptor() | |
| 138 { | |
| 139 MessageDescriptor messageType = TestAllTypes.Descriptor; | |
| 140 FieldDescriptor primitiveField = messageType.FindDescriptor<FieldDes
criptor>("single_int32"); | |
| 141 FieldDescriptor enumField = messageType.FindDescriptor<FieldDescript
or>("single_nested_enum"); | |
| 142 FieldDescriptor messageField = messageType.FindDescriptor<FieldDescr
iptor>("single_foreign_message"); | |
| 143 | |
| 144 Assert.AreEqual("single_int32", primitiveField.Name); | |
| 145 Assert.AreEqual("protobuf_unittest.TestAllTypes.single_int32", | |
| 146 primitiveField.FullName); | |
| 147 Assert.AreEqual(1, primitiveField.FieldNumber); | |
| 148 Assert.AreEqual(messageType, primitiveField.ContainingType); | |
| 149 Assert.AreEqual(UnittestProto3.Descriptor, primitiveField.File); | |
| 150 Assert.AreEqual(FieldType.Int32, primitiveField.FieldType); | |
| 151 Assert.IsNull(primitiveField.Proto.Options); | |
| 152 | |
| 153 Assert.AreEqual("single_nested_enum", enumField.Name); | |
| 154 Assert.AreEqual(FieldType.Enum, enumField.FieldType); | |
| 155 // Assert.AreEqual(TestAllTypes.Types.NestedEnum.DescriptorProtoFile
, enumField.EnumType); | |
| 156 | |
| 157 Assert.AreEqual("single_foreign_message", messageField.Name); | |
| 158 Assert.AreEqual(FieldType.Message, messageField.FieldType); | |
| 159 Assert.AreEqual(ForeignMessage.Descriptor, messageField.MessageType)
; | |
| 160 } | |
| 161 | |
| 162 [Test] | |
| 163 public void FieldDescriptorLabel() | |
| 164 { | |
| 165 FieldDescriptor singleField = | |
| 166 TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("single_
int32"); | |
| 167 FieldDescriptor repeatedField = | |
| 168 TestAllTypes.Descriptor.FindDescriptor<FieldDescriptor>("repeate
d_int32"); | |
| 169 | |
| 170 Assert.IsFalse(singleField.IsRepeated); | |
| 171 Assert.IsTrue(repeatedField.IsRepeated); | |
| 172 } | |
| 173 | |
| 174 [Test] | |
| 175 public void EnumDescriptor() | |
| 176 { | |
| 177 // Note: this test is a bit different to the Java version because th
ere's no static way of getting to the descriptor | |
| 178 EnumDescriptor enumType = UnittestProto3.Descriptor.FindTypeByName<E
numDescriptor>("ForeignEnum"); | |
| 179 EnumDescriptor nestedType = TestAllTypes.Descriptor.FindDescriptor<E
numDescriptor>("NestedEnum"); | |
| 180 | |
| 181 Assert.AreEqual("ForeignEnum", enumType.Name); | |
| 182 Assert.AreEqual("protobuf_unittest.ForeignEnum", enumType.FullName); | |
| 183 Assert.AreEqual(UnittestProto3.Descriptor, enumType.File); | |
| 184 Assert.Null(enumType.ContainingType); | |
| 185 Assert.Null(enumType.Proto.Options); | |
| 186 | |
| 187 Assert.AreEqual("NestedEnum", nestedType.Name); | |
| 188 Assert.AreEqual("protobuf_unittest.TestAllTypes.NestedEnum", | |
| 189 nestedType.FullName); | |
| 190 Assert.AreEqual(UnittestProto3.Descriptor, nestedType.File); | |
| 191 Assert.AreEqual(TestAllTypes.Descriptor, nestedType.ContainingType); | |
| 192 | |
| 193 EnumValueDescriptor value = enumType.FindValueByName("FOREIGN_FOO"); | |
| 194 Assert.AreEqual(value, enumType.Values[1]); | |
| 195 Assert.AreEqual("FOREIGN_FOO", value.Name); | |
| 196 Assert.AreEqual(4, value.Number); | |
| 197 Assert.AreEqual((int) ForeignEnum.FOREIGN_FOO, value.Number); | |
| 198 Assert.AreEqual(value, enumType.FindValueByNumber(4)); | |
| 199 Assert.Null(enumType.FindValueByName("NO_SUCH_VALUE")); | |
| 200 for (int i = 0; i < enumType.Values.Count; i++) | |
| 201 { | |
| 202 Assert.AreEqual(i, enumType.Values[i].Index); | |
| 203 } | |
| 204 } | |
| 205 | |
| 206 [Test] | |
| 207 public void OneofDescriptor() | |
| 208 { | |
| 209 OneofDescriptor descriptor = TestAllTypes.Descriptor.FindDescriptor<
OneofDescriptor>("oneof_field"); | |
| 210 Assert.AreEqual("oneof_field", descriptor.Name); | |
| 211 Assert.AreEqual("protobuf_unittest.TestAllTypes.oneof_field", descri
ptor.FullName); | |
| 212 | |
| 213 var expectedFields = new[] { | |
| 214 TestAllTypes.OneofBytesFieldNumber, | |
| 215 TestAllTypes.OneofNestedMessageFieldNumber, | |
| 216 TestAllTypes.OneofStringFieldNumber, | |
| 217 TestAllTypes.OneofUint32FieldNumber } | |
| 218 .Select(fieldNumber => TestAllTypes.Descriptor.FindFieldByNumber
(fieldNumber)) | |
| 219 .ToList(); | |
| 220 foreach (var field in expectedFields) | |
| 221 { | |
| 222 Assert.AreSame(descriptor, field.ContainingOneof); | |
| 223 } | |
| 224 | |
| 225 CollectionAssert.AreEquivalent(expectedFields, descriptor.Fields); | |
| 226 } | |
| 227 | |
| 228 [Test] | |
| 229 public void ConstructionWithoutGeneratedCodeInfo() | |
| 230 { | |
| 231 var data = UnittestIssues.Descriptor.Proto.ToByteArray(); | |
| 232 var newDescriptor = Google.Protobuf.Reflection.FileDescriptor.Intern
alBuildGeneratedFileFrom(data, new Reflection.FileDescriptor[] { }, null); | |
| 233 | |
| 234 // We should still be able to get at a field... | |
| 235 var messageDescriptor = newDescriptor.FindTypeByName<MessageDescript
or>("ItemField"); | |
| 236 var fieldDescriptor = messageDescriptor.FindFieldByName("item"); | |
| 237 // But there shouldn't be an accessor (or a generated type for the m
essage) | |
| 238 Assert.IsNull(fieldDescriptor.Accessor); | |
| 239 Assert.IsNull(messageDescriptor.GeneratedType); | |
| 240 } | |
| 241 | |
| 242 // From TestFieldOrdering: | |
| 243 // string my_string = 11; | |
| 244 // int64 my_int = 1; | |
| 245 // float my_float = 101; | |
| 246 // NestedMessage single_nested_message = 200; | |
| 247 [Test] | |
| 248 public void FieldListOrderings() | |
| 249 { | |
| 250 var fields = TestFieldOrderings.Descriptor.Fields; | |
| 251 Assert.AreEqual(new[] { 11, 1, 101, 200 }, fields.InDeclarationOrder
().Select(x => x.FieldNumber)); | |
| 252 Assert.AreEqual(new[] { 1, 11, 101, 200 }, fields.InFieldNumberOrder
().Select(x => x.FieldNumber)); | |
| 253 } | |
| 254 } | |
| 255 } | |
| OLD | NEW |