247 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			247 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
require_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;
 | 
						|
 | 
						|
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());
 | 
						|
    }
 | 
						|
 | 
						|
    #########################################################
 | 
						|
    # Test enum descriptor.
 | 
						|
    #########################################################
 | 
						|
 | 
						|
    public function testEnumDescriptor()
 | 
						|
    {
 | 
						|
        // WARNINIG - 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());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @expectedException \Exception
 | 
						|
     */
 | 
						|
    public function testFieldDescriptorEnumException()
 | 
						|
    {
 | 
						|
        $pool = DescriptorPool::getGeneratedPool();
 | 
						|
        $desc = $pool->getDescriptorByClassName(get_class(new TestDescriptorsMessage()));
 | 
						|
        $fieldDesc = $desc->getField(0);
 | 
						|
        $fieldDesc->getEnumType();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @expectedException \Exception
 | 
						|
     */
 | 
						|
    public function testFieldDescriptorMessageException()
 | 
						|
    {
 | 
						|
        $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;
 | 
						|
    }
 | 
						|
}
 |