public function testGenerateReadPackedEnumStatement() { $options = new FieldOptions(); $context = $this->createContext([['name' => 'simple.proto', 'package' => 'ProtobufCompilerTest.Protos', 'values' => ['messages' => [['name' => 'Simple', 'fields' => [1 => ['status', Field::TYPE_ENUM, Field::LABEL_REPEATED, 'ProtobufCompilerTest.Protos.Type']]], ['name' => 'Type', 'fields' => []]]]]]); $generator = new ReadFieldStatementGenerator($context); $entity = $context->getEntity($this->messageClass); $descritor = $entity->getDescriptor(); $field = $descritor->getFieldList()[0]; $options->setPacked(true); $field->setOptions($options); $actual = $generator->generateFieldReadStatement($entity, $field); $expected = <<<'CODE' $innerSize = $reader->readVarint($stream); $innerLimit = $stream->tell() + $innerSize; if ($this->status === null) { $this->status = new \Protobuf\EnumCollection(); } while ($stream->tell() < $innerLimit) { $this->status->add(\ProtobufCompilerTest\Protos\Type::valueOf($reader->readVarint($stream))); } continue; CODE; $this->assertEquals($expected, implode(PHP_EOL, $actual)); }
public function testGenerateWritePackedEnumRepeatedStatement() { $options = new FieldOptions(); $context = $this->createContext([['name' => 'simple.proto', 'package' => 'ProtobufCompilerTest.Protos', 'values' => ['messages' => [['name' => 'Simple', 'fields' => [1 => ['status', Field::TYPE_ENUM, Field::LABEL_REPEATED, 'ProtobufCompilerTest.Protos.Type']]], ['name' => 'Type', 'fields' => []]]]]]); $entity = $context->getEntity('ProtobufCompilerTest.Protos.Simple'); $generator = new WriteFieldStatementGenerator($context); $descritor = $entity->getDescriptor(); $field = $descritor->getFieldList()[0]; $options->setPacked(true); $field->setOptions($options); $actual = $generator->generateFieldWriteStatement($entity, $field); $expected = <<<'CODE' $innerSize = 0; $calculator = $sizeContext->getSizeCalculator(); foreach ($this->status as $val) { $innerSize += $calculator->computeVarintSize($val->value()); } $writer->writeVarint($stream, 10); $writer->writeVarint($stream, $innerSize); foreach ($this->status as $val) { $writer->writeVarint($stream, $val->value()); } CODE; $this->assertEquals($expected, implode(PHP_EOL, $actual)); }
/** * @param integer $number * @param string $name * @param integer $type * @param integer $label * @param string $typeName * @param array $values * * @return \google\protobuf\FieldDescriptorProto */ protected function createFieldDescriptorProto($number, $name, $type, $label, $typeName = null, array $values = []) { $field = new FieldDescriptorProto(); $options = isset($values['options']) ? $values['options'] : null; $field->setName($name); $field->setNumber($number); $field->setTypeName($typeName); $field->setType(FieldDescriptorProto\Type::valueOf($type)); $field->setLabel(FieldDescriptorProto\Label::valueOf($label)); if (isset($values['default'])) { $field->setDefaultValue($values['default']); } if ($options !== null) { $fieldOptions = new FieldOptions(); if (isset($options['packed'])) { $fieldOptions->setPacked($options['packed']); } $field->setOptions($fieldOptions); } return $field; }