| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 | <?phprequire_once('generated/Descriptors/TestDescriptorsEnum.php');require_once('generated/Descriptors/TestDescriptorsMessage.php');require_once('test_base.php');require_once('test_util.php');use Google\Protobuf\DescriptorPool;use Google\Protobuf\Internal\RepeatedField;use Google\Protobuf\Internal\MapField;use Descriptors\TestDescriptorsEnum;use Descriptors\TestDescriptorsMessage;use Descriptors\TestDescriptorsMessage\Sub;use Foo\TestMessage;use Bar\TestInclude;class DescriptorsTest extends TestBase{    // Redefine these here for compatibility with c extension    const GPBLABEL_OPTIONAL = 1;    const GPBLABEL_REQUIRED = 2;    const GPBLABEL_REPEATED = 3;    const GPBTYPE_DOUBLE   =  1;    const GPBTYPE_FLOAT    =  2;    const GPBTYPE_INT64    =  3;    const GPBTYPE_UINT64   =  4;    const GPBTYPE_INT32    =  5;    const GPBTYPE_FIXED64  =  6;    const GPBTYPE_FIXED32  =  7;    const GPBTYPE_BOOL     =  8;    const GPBTYPE_STRING   =  9;    const GPBTYPE_GROUP    = 10;    const GPBTYPE_MESSAGE  = 11;    const GPBTYPE_BYTES    = 12;    const GPBTYPE_UINT32   = 13;    const GPBTYPE_ENUM     = 14;    const GPBTYPE_SFIXED32 = 15;    const GPBTYPE_SFIXED64 = 16;    const GPBTYPE_SINT32   = 17;    const GPBTYPE_SINT64   = 18;    #########################################################    # Test descriptor pool.    #########################################################    public function testDescriptorPool()    {        $pool = DescriptorPool::getGeneratedPool();        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));        $this->assertInstanceOf('\Google\Protobuf\Descriptor', $desc);        $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));        $this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $enumDesc);    }    public function testDescriptorPoolIncorrectArgs()    {        $pool = DescriptorPool::getGeneratedPool();        $desc = $pool->getDescriptorByClassName('NotAClass');        $this->assertNull($desc);        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsEnum()));        $this->assertNull($desc);        $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsMessage()));        $this->assertNull($enumDesc);    }    #########################################################    # Test descriptor.    #########################################################    public function testDescriptor()    {        $pool = DescriptorPool::getGeneratedPool();        $class = get_class(new TestDescriptorsMessage());        $this->assertSame('Descriptors\TestDescriptorsMessage', $class);        $desc = $pool->getDescriptorByClassName($class);        $this->assertSame('descriptors.TestDescriptorsMessage', $desc->getFullName());        $this->assertSame($class, $desc->getClass());        $this->assertInstanceOf('\Google\Protobuf\FieldDescriptor', $desc->getField(0));        $this->assertSame(7, $desc->getFieldCount());        $this->assertInstanceOf('\Google\Protobuf\OneofDescriptor', $desc->getOneofDecl(0));        $this->assertSame(1, $desc->getOneofDeclCount());    }    public function testDescriptorForIncludedMessage()    {        $pool = DescriptorPool::getGeneratedPool();        $class = get_class(new TestMessage());        $this->assertSame('Foo\TestMessage', $class);        $desc = $pool->getDescriptorByClassName($class);        $fielddesc = $desc->getField(17);        $subdesc = $fielddesc->getMessageType();        $this->assertSame('Bar\TestInclude', $subdesc->getClass());    }    #########################################################    # Test enum descriptor.    #########################################################    public function testEnumDescriptor()    {        // WARNING - we need to do this so that TestDescriptorsEnum is registered!!?        new TestDescriptorsMessage();        $pool = DescriptorPool::getGeneratedPool();        $enumDesc = $pool->getEnumDescriptorByClassName(get_class(new TestDescriptorsEnum()));        // Build map of enum values        $enumDescMap = [];        for ($i = 0; $i < $enumDesc->getValueCount(); $i++) {            $enumValueDesc = $enumDesc->getValue($i);            $this->assertInstanceOf('\Google\Protobuf\EnumValueDescriptor', $enumValueDesc);            $enumDescMap[$enumValueDesc->getNumber()] = $enumValueDesc->getName();        }        $this->assertSame('ZERO', $enumDescMap[0]);        $this->assertSame('ONE', $enumDescMap[1]);        $this->assertSame(2, $enumDesc->getValueCount());    }    #########################################################    # Test field descriptor.    #########################################################    public function testFieldDescriptor()    {        $pool = DescriptorPool::getGeneratedPool();        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));        $fieldDescMap = $this->buildFieldMap($desc);        // Optional int field        $fieldDesc = $fieldDescMap[1];        $this->assertSame('optional_int32', $fieldDesc->getName());        $this->assertSame(1, $fieldDesc->getNumber());        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());        $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());        $this->assertFalse($fieldDesc->isMap());        // Optional enum field        $fieldDesc = $fieldDescMap[16];        $this->assertSame('optional_enum', $fieldDesc->getName());        $this->assertSame(16, $fieldDesc->getNumber());        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());        $this->assertSame(self::GPBTYPE_ENUM, $fieldDesc->getType());        $this->assertInstanceOf('\Google\Protobuf\EnumDescriptor', $fieldDesc->getEnumType());        $this->assertFalse($fieldDesc->isMap());        // Optional message field        $fieldDesc = $fieldDescMap[17];        $this->assertSame('optional_message', $fieldDesc->getName());        $this->assertSame(17, $fieldDesc->getNumber());        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());        $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());        $this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());        $this->assertFalse($fieldDesc->isMap());        // Repeated int field        $fieldDesc = $fieldDescMap[31];        $this->assertSame('repeated_int32', $fieldDesc->getName());        $this->assertSame(31, $fieldDesc->getNumber());        $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());        $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());        $this->assertFalse($fieldDesc->isMap());        // Repeated message field        $fieldDesc = $fieldDescMap[47];        $this->assertSame('repeated_message', $fieldDesc->getName());        $this->assertSame(47, $fieldDesc->getNumber());        $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());        $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());        $this->assertInstanceOf('\Google\Protobuf\Descriptor', $fieldDesc->getMessageType());        $this->assertFalse($fieldDesc->isMap());        // Oneof int field        // Tested further in testOneofDescriptor()        $fieldDesc = $fieldDescMap[51];        $this->assertSame('oneof_int32', $fieldDesc->getName());        $this->assertSame(51, $fieldDesc->getNumber());        $this->assertSame(self::GPBLABEL_OPTIONAL, $fieldDesc->getLabel());        $this->assertSame(self::GPBTYPE_INT32, $fieldDesc->getType());        $this->assertFalse($fieldDesc->isMap());        // Map int-enum field        $fieldDesc = $fieldDescMap[71];        $this->assertSame('map_int32_enum', $fieldDesc->getName());        $this->assertSame(71, $fieldDesc->getNumber());        $this->assertSame(self::GPBLABEL_REPEATED, $fieldDesc->getLabel());        $this->assertSame(self::GPBTYPE_MESSAGE, $fieldDesc->getType());        $this->assertTrue($fieldDesc->isMap());        $mapDesc = $fieldDesc->getMessageType();        $this->assertSame('descriptors.TestDescriptorsMessage.MapInt32EnumEntry', $mapDesc->getFullName());        $this->assertSame(self::GPBTYPE_INT32, $mapDesc->getField(0)->getType());        $this->assertSame(self::GPBTYPE_ENUM, $mapDesc->getField(1)->getType());    }    public function testFieldDescriptorEnumException()    {        $this->expectException(Exception::class);        $pool = DescriptorPool::getGeneratedPool();        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));        $fieldDesc = $desc->getField(0);        $fieldDesc->getEnumType();    }    public function testFieldDescriptorMessageException()    {        $this->expectException(Exception::class);        $pool = DescriptorPool::getGeneratedPool();        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));        $fieldDesc = $desc->getField(0);        $fieldDesc->getMessageType();    }    #########################################################    # Test oneof descriptor.    #########################################################    public function testOneofDescriptor()    {        $pool = DescriptorPool::getGeneratedPool();        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));        $fieldDescMap = $this->buildFieldMap($desc);        $fieldDesc = $fieldDescMap[51];        $oneofDesc = $desc->getOneofDecl(0);        $this->assertSame('my_oneof', $oneofDesc->getName());        $fieldDescFromOneof = $oneofDesc->getField(0);        $this->assertSame($fieldDesc, $fieldDescFromOneof);        $this->assertSame(1, $oneofDesc->getFieldCount());    }    private function buildFieldMap($desc)    {        $fieldDescMap = [];        for ($i = 0; $i < $desc->getFieldCount(); $i++) {            $fieldDesc = $desc->getField($i);            $fieldDescMap[$fieldDesc->getNumber()] = $fieldDesc;        }        return $fieldDescMap;    }}
 |