xref: /aosp_15_r20/external/protobuf/php/tests/DescriptorsTest.php (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
1*1b3f573fSAndroid Build Coastguard Worker<?php
2*1b3f573fSAndroid Build Coastguard Worker
3*1b3f573fSAndroid Build Coastguard Workerrequire_once('test_base.php');
4*1b3f573fSAndroid Build Coastguard Workerrequire_once('test_util.php');
5*1b3f573fSAndroid Build Coastguard Worker
6*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\DescriptorPool;
7*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\Internal\RepeatedField;
8*1b3f573fSAndroid Build Coastguard Workeruse Google\Protobuf\Internal\MapField;
9*1b3f573fSAndroid Build Coastguard Workeruse Descriptors\TestDescriptorsEnum;
10*1b3f573fSAndroid Build Coastguard Workeruse Descriptors\TestDescriptorsMessage;
11*1b3f573fSAndroid Build Coastguard Workeruse Descriptors\TestDescriptorsMessage\Sub;
12*1b3f573fSAndroid Build Coastguard Workeruse Foo\TestMessage;
13*1b3f573fSAndroid Build Coastguard Workeruse Bar\TestInclude;
14*1b3f573fSAndroid Build Coastguard Worker
15*1b3f573fSAndroid Build Coastguard Workerclass DescriptorsTest extends TestBase
16*1b3f573fSAndroid Build Coastguard Worker{
17*1b3f573fSAndroid Build Coastguard Worker
18*1b3f573fSAndroid Build Coastguard Worker    // Redefine these here for compatibility with c extension
19*1b3f573fSAndroid Build Coastguard Worker    const GPBLABEL_OPTIONAL = 1;
20*1b3f573fSAndroid Build Coastguard Worker    const GPBLABEL_REQUIRED = 2;
21*1b3f573fSAndroid Build Coastguard Worker    const GPBLABEL_REPEATED = 3;
22*1b3f573fSAndroid Build Coastguard Worker
23*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_DOUBLE   =  1;
24*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_FLOAT    =  2;
25*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_INT64    =  3;
26*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_UINT64   =  4;
27*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_INT32    =  5;
28*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_FIXED64  =  6;
29*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_FIXED32  =  7;
30*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_BOOL     =  8;
31*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_STRING   =  9;
32*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_GROUP    = 10;
33*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_MESSAGE  = 11;
34*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_BYTES    = 12;
35*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_UINT32   = 13;
36*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_ENUM     = 14;
37*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_SFIXED32 = 15;
38*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_SFIXED64 = 16;
39*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_SINT32   = 17;
40*1b3f573fSAndroid Build Coastguard Worker    const GPBTYPE_SINT64   = 18;
41*1b3f573fSAndroid Build Coastguard Worker
42*1b3f573fSAndroid Build Coastguard Worker    #########################################################
43*1b3f573fSAndroid Build Coastguard Worker    # Test descriptor pool.
44*1b3f573fSAndroid Build Coastguard Worker    #########################################################
45*1b3f573fSAndroid Build Coastguard Worker
46*1b3f573fSAndroid Build Coastguard Worker    public function testDescriptorPool()
47*1b3f573fSAndroid Build Coastguard Worker    {
48*1b3f573fSAndroid Build Coastguard Worker        $pool = DescriptorPool::getGeneratedPool();
49*1b3f573fSAndroid Build Coastguard Worker
50*1b3f573fSAndroid Build Coastguard Worker        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
51*1b3f573fSAndroid Build Coastguard Worker        $this->assertInstanceOf('\Google\Protobuf\Descriptor', $desc);
52*1b3f573fSAndroid Build Coastguard Worker
53*1b3f573fSAndroid Build Coastguard Worker        $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));
54*1b3f573fSAndroid Build Coastguard Worker        $this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $enumDesc);
55*1b3f573fSAndroid Build Coastguard Worker    }
56*1b3f573fSAndroid Build Coastguard Worker
57*1b3f573fSAndroid Build Coastguard Worker    public function testDescriptorPoolIncorrectArgs()
58*1b3f573fSAndroid Build Coastguard Worker    {
59*1b3f573fSAndroid Build Coastguard Worker        $pool = DescriptorPool::getGeneratedPool();
60*1b3f573fSAndroid Build Coastguard Worker
61*1b3f573fSAndroid Build Coastguard Worker        $desc = $pool->getDescriptorByClassName('NotAClass');
62*1b3f573fSAndroid Build Coastguard Worker        $this->assertNull($desc);
63*1b3f573fSAndroid Build Coastguard Worker
64*1b3f573fSAndroid Build Coastguard Worker        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsEnum()));
65*1b3f573fSAndroid Build Coastguard Worker        $this->assertNull($desc);
66*1b3f573fSAndroid Build Coastguard Worker
67*1b3f573fSAndroid Build Coastguard Worker        $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsMessage()));
68*1b3f573fSAndroid Build Coastguard Worker        $this->assertNull($enumDesc);
69*1b3f573fSAndroid Build Coastguard Worker    }
70*1b3f573fSAndroid Build Coastguard Worker
71*1b3f573fSAndroid Build Coastguard Worker    #########################################################
72*1b3f573fSAndroid Build Coastguard Worker    # Test descriptor.
73*1b3f573fSAndroid Build Coastguard Worker    #########################################################
74*1b3f573fSAndroid Build Coastguard Worker
75*1b3f573fSAndroid Build Coastguard Worker    public function testDescriptor()
76*1b3f573fSAndroid Build Coastguard Worker    {
77*1b3f573fSAndroid Build Coastguard Worker        $pool = DescriptorPool::getGeneratedPool();
78*1b3f573fSAndroid Build Coastguard Worker        $class = get_class(new TestDescriptorsMessage());
79*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('Descriptors\TestDescriptorsMessage', $class);
80*1b3f573fSAndroid Build Coastguard Worker        $desc = $pool->getDescriptorByClassName($class);
81*1b3f573fSAndroid Build Coastguard Worker
82*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('descriptors.TestDescriptorsMessage', $desc->getFullName());
83*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame($class, $desc->getClass());
84*1b3f573fSAndroid Build Coastguard Worker
85*1b3f573fSAndroid Build Coastguard Worker        $this->assertInstanceOf('\Google\Protobuf\FieldDescriptor', $desc->getField(0));
86*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(8, $desc->getFieldCount());
87*1b3f573fSAndroid Build Coastguard Worker
88*1b3f573fSAndroid Build Coastguard Worker        $this->assertInstanceOf('\Google\Protobuf\OneofDescriptor', $desc->getOneofDecl(0));
89*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2, $desc->getOneofDeclCount());
90*1b3f573fSAndroid Build Coastguard Worker    }
91*1b3f573fSAndroid Build Coastguard Worker
92*1b3f573fSAndroid Build Coastguard Worker    public function testDescriptorForIncludedMessage()
93*1b3f573fSAndroid Build Coastguard Worker    {
94*1b3f573fSAndroid Build Coastguard Worker        $pool = DescriptorPool::getGeneratedPool();
95*1b3f573fSAndroid Build Coastguard Worker        $class = get_class(new TestMessage());
96*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('Foo\TestMessage', $class);
97*1b3f573fSAndroid Build Coastguard Worker        $desc = $pool->getDescriptorByClassName($class);
98*1b3f573fSAndroid Build Coastguard Worker        $fielddesc = $desc->getField(17);
99*1b3f573fSAndroid Build Coastguard Worker        $subdesc = $fielddesc->getMessageType();
100*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('Bar\TestInclude', $subdesc->getClass());
101*1b3f573fSAndroid Build Coastguard Worker    }
102*1b3f573fSAndroid Build Coastguard Worker
103*1b3f573fSAndroid Build Coastguard Worker    #########################################################
104*1b3f573fSAndroid Build Coastguard Worker    # Test enum descriptor.
105*1b3f573fSAndroid Build Coastguard Worker    #########################################################
106*1b3f573fSAndroid Build Coastguard Worker
107*1b3f573fSAndroid Build Coastguard Worker    public function testEnumDescriptor()
108*1b3f573fSAndroid Build Coastguard Worker    {
109*1b3f573fSAndroid Build Coastguard Worker        // WARNING - we need to do this so that TestDescriptorsEnum is registered!!?
110*1b3f573fSAndroid Build Coastguard Worker        new TestDescriptorsMessage();
111*1b3f573fSAndroid Build Coastguard Worker
112*1b3f573fSAndroid Build Coastguard Worker        $pool = DescriptorPool::getGeneratedPool();
113*1b3f573fSAndroid Build Coastguard Worker
114*1b3f573fSAndroid Build Coastguard Worker        $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));
115*1b3f573fSAndroid Build Coastguard Worker
116*1b3f573fSAndroid Build Coastguard Worker        // Build map of enum values
117*1b3f573fSAndroid Build Coastguard Worker        $enumDescMap = [];
118*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < $enumDesc->getValueCount(); $i++) {
119*1b3f573fSAndroid Build Coastguard Worker            $enumValueDesc = $enumDesc->getValue($i);
120*1b3f573fSAndroid Build Coastguard Worker            $this->assertInstanceOf('\Google\Protobuf\EnumValueDescriptor', $enumValueDesc);
121*1b3f573fSAndroid Build Coastguard Worker            $enumDescMap[$enumValueDesc->getNumber()] = $enumValueDesc->getName();
122*1b3f573fSAndroid Build Coastguard Worker        }
123*1b3f573fSAndroid Build Coastguard Worker
124*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('ZERO', $enumDescMap[0]);
125*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('ONE', $enumDescMap[1]);
126*1b3f573fSAndroid Build Coastguard Worker
127*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(2, $enumDesc->getValueCount());
128*1b3f573fSAndroid Build Coastguard Worker    }
129*1b3f573fSAndroid Build Coastguard Worker
130*1b3f573fSAndroid Build Coastguard Worker    #########################################################
131*1b3f573fSAndroid Build Coastguard Worker    # Test field descriptor.
132*1b3f573fSAndroid Build Coastguard Worker    #########################################################
133*1b3f573fSAndroid Build Coastguard Worker
134*1b3f573fSAndroid Build Coastguard Worker    public function testFieldDescriptor()
135*1b3f573fSAndroid Build Coastguard Worker    {
136*1b3f573fSAndroid Build Coastguard Worker        $pool = DescriptorPool::getGeneratedPool();
137*1b3f573fSAndroid Build Coastguard Worker        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
138*1b3f573fSAndroid Build Coastguard Worker
139*1b3f573fSAndroid Build Coastguard Worker        $fieldDescMap = $this->buildFieldMap($desc);
140*1b3f573fSAndroid Build Coastguard Worker
141*1b3f573fSAndroid Build Coastguard Worker        // Optional int field
142*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $fieldDescMap[1];
143*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('optional_int32', $fieldDesc->getName());
144*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $fieldDesc->getNumber());
145*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
146*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
147*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse($fieldDesc->isMap());
148*1b3f573fSAndroid Build Coastguard Worker
149*1b3f573fSAndroid Build Coastguard Worker        // Optional enum field
150*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $fieldDescMap[16];
151*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('optional_enum', $fieldDesc->getName());
152*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(16, $fieldDesc->getNumber());
153*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
154*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBTYPE_ENUM, $fieldDesc->getType());
155*1b3f573fSAndroid Build Coastguard Worker        $this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $fieldDesc->getEnumType());
156*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse($fieldDesc->isMap());
157*1b3f573fSAndroid Build Coastguard Worker
158*1b3f573fSAndroid Build Coastguard Worker        // Optional message field
159*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $fieldDescMap[17];
160*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('optional_message', $fieldDesc->getName());
161*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(17, $fieldDesc->getNumber());
162*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
163*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
164*1b3f573fSAndroid Build Coastguard Worker        $this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
165*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse($fieldDesc->isMap());
166*1b3f573fSAndroid Build Coastguard Worker
167*1b3f573fSAndroid Build Coastguard Worker        // Repeated int field
168*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $fieldDescMap[31];
169*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('repeated_int32', $fieldDesc->getName());
170*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(31, $fieldDesc->getNumber());
171*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
172*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
173*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse($fieldDesc->isMap());
174*1b3f573fSAndroid Build Coastguard Worker
175*1b3f573fSAndroid Build Coastguard Worker        // Repeated message field
176*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $fieldDescMap[47];
177*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('repeated_message', $fieldDesc->getName());
178*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(47, $fieldDesc->getNumber());
179*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
180*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
181*1b3f573fSAndroid Build Coastguard Worker        $this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());
182*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse($fieldDesc->isMap());
183*1b3f573fSAndroid Build Coastguard Worker        $this->assertNull($fieldDesc->getContainingOneof());
184*1b3f573fSAndroid Build Coastguard Worker
185*1b3f573fSAndroid Build Coastguard Worker        // Oneof int field
186*1b3f573fSAndroid Build Coastguard Worker        // Tested further in testOneofDescriptor()
187*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $fieldDescMap[51];
188*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('oneof_int32', $fieldDesc->getName());
189*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(51, $fieldDesc->getNumber());
190*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
191*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
192*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse($fieldDesc->isMap());
193*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame($fieldDesc->getContainingOneof(), $fieldDesc->getRealContainingOneof());
194*1b3f573fSAndroid Build Coastguard Worker
195*1b3f573fSAndroid Build Coastguard Worker        $oneofDesc = $fieldDesc->getContainingOneof();
196*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('my_oneof', $oneofDesc->getName());
197*1b3f573fSAndroid Build Coastguard Worker
198*1b3f573fSAndroid Build Coastguard Worker        // Proto3 optional it field.
199*1b3f573fSAndroid Build Coastguard Worker        // Tested further in testOneofDescriptor()
200*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $fieldDescMap[52];
201*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('proto3_optional_int32', $fieldDesc->getName());
202*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(52, $fieldDesc->getNumber());
203*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());
204*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());
205*1b3f573fSAndroid Build Coastguard Worker        $this->assertFalse($fieldDesc->isMap());
206*1b3f573fSAndroid Build Coastguard Worker        $this->assertNull($fieldDesc->getRealContainingOneof());
207*1b3f573fSAndroid Build Coastguard Worker        $this->assertNotNull($fieldDesc->getContainingOneof());
208*1b3f573fSAndroid Build Coastguard Worker
209*1b3f573fSAndroid Build Coastguard Worker        // Map int-enum field
210*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $fieldDescMap[71];
211*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('map_int32_enum', $fieldDesc->getName());
212*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(71, $fieldDesc->getNumber());
213*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());
214*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());
215*1b3f573fSAndroid Build Coastguard Worker        $this->assertTrue($fieldDesc->isMap());
216*1b3f573fSAndroid Build Coastguard Worker        $mapDesc = $fieldDesc->getMessageType();
217*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('descriptors.TestDescriptorsMessage.MapInt32EnumEntry', $mapDesc->getFullName());
218*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBTYPE_INT32, $mapDesc->getField(0)->getType());
219*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(self::GPBTYPE_ENUM, $mapDesc->getField(1)->getType());
220*1b3f573fSAndroid Build Coastguard Worker    }
221*1b3f573fSAndroid Build Coastguard Worker
222*1b3f573fSAndroid Build Coastguard Worker    public function testFieldDescriptorEnumException()
223*1b3f573fSAndroid Build Coastguard Worker    {
224*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
225*1b3f573fSAndroid Build Coastguard Worker
226*1b3f573fSAndroid Build Coastguard Worker        $pool = DescriptorPool::getGeneratedPool();
227*1b3f573fSAndroid Build Coastguard Worker        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
228*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $desc->getField(0);
229*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc->getEnumType();
230*1b3f573fSAndroid Build Coastguard Worker    }
231*1b3f573fSAndroid Build Coastguard Worker
232*1b3f573fSAndroid Build Coastguard Worker    public function testFieldDescriptorMessageException()
233*1b3f573fSAndroid Build Coastguard Worker    {
234*1b3f573fSAndroid Build Coastguard Worker        $this->expectException(Exception::class);
235*1b3f573fSAndroid Build Coastguard Worker
236*1b3f573fSAndroid Build Coastguard Worker        $pool = DescriptorPool::getGeneratedPool();
237*1b3f573fSAndroid Build Coastguard Worker        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
238*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $desc->getField(0);
239*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc->getMessageType();
240*1b3f573fSAndroid Build Coastguard Worker    }
241*1b3f573fSAndroid Build Coastguard Worker
242*1b3f573fSAndroid Build Coastguard Worker    #########################################################
243*1b3f573fSAndroid Build Coastguard Worker    # Test oneof descriptor.
244*1b3f573fSAndroid Build Coastguard Worker    #########################################################
245*1b3f573fSAndroid Build Coastguard Worker
246*1b3f573fSAndroid Build Coastguard Worker    public function testOneofDescriptor()
247*1b3f573fSAndroid Build Coastguard Worker    {
248*1b3f573fSAndroid Build Coastguard Worker        $pool = DescriptorPool::getGeneratedPool();
249*1b3f573fSAndroid Build Coastguard Worker        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
250*1b3f573fSAndroid Build Coastguard Worker
251*1b3f573fSAndroid Build Coastguard Worker        $fieldDescMap = $this->buildFieldMap($desc);
252*1b3f573fSAndroid Build Coastguard Worker        $fieldDesc = $fieldDescMap[51];
253*1b3f573fSAndroid Build Coastguard Worker
254*1b3f573fSAndroid Build Coastguard Worker        $oneofDesc = $desc->getOneofDecl(0);
255*1b3f573fSAndroid Build Coastguard Worker
256*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame('my_oneof', $oneofDesc->getName());
257*1b3f573fSAndroid Build Coastguard Worker        $fieldDescFromOneof = $oneofDesc->getField(0);
258*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame($fieldDesc, $fieldDescFromOneof);
259*1b3f573fSAndroid Build Coastguard Worker        $this->assertSame(1, $oneofDesc->getFieldCount());
260*1b3f573fSAndroid Build Coastguard Worker    }
261*1b3f573fSAndroid Build Coastguard Worker
262*1b3f573fSAndroid Build Coastguard Worker    private function buildFieldMap($desc)
263*1b3f573fSAndroid Build Coastguard Worker    {
264*1b3f573fSAndroid Build Coastguard Worker        $fieldDescMap = [];
265*1b3f573fSAndroid Build Coastguard Worker        for ($i = 0; $i < $desc->getFieldCount(); $i++) {
266*1b3f573fSAndroid Build Coastguard Worker            $fieldDesc = $desc->getField($i);
267*1b3f573fSAndroid Build Coastguard Worker            $fieldDescMap[$fieldDesc->getNumber()] = $fieldDesc;
268*1b3f573fSAndroid Build Coastguard Worker        }
269*1b3f573fSAndroid Build Coastguard Worker        return $fieldDescMap;
270*1b3f573fSAndroid Build Coastguard Worker    }
271*1b3f573fSAndroid Build Coastguard Worker}
272