public function testService()
 {
     $serviceDesc = new ServiceDescriptorProto();
     $methodDesc = new MethodDescriptorProto();
     // rpc search (SearchRequest) returns (SearchResponse);
     $methodDesc->setName('search');
     $methodDesc->setInputType('.ProtobufCompilerTest.Protos.Service.SearchRequest');
     $methodDesc->setOutputType('.ProtobufCompilerTest.Protos.Service.SearchResponse');
     $serviceDesc->setName('SearchService');
     $serviceDesc->addMethod($methodDesc);
     $context = $this->createContext([['name' => 'service.proto', 'package' => 'ProtobufCompilerTest.Protos.Service', 'values' => ['services' => [$serviceDesc], 'messages' => [['name' => 'SearchRequest', 'fields' => []], ['name' => 'SearchResponse', 'fields' => []]]]]]);
     $expected = $this->getFixtureFileContent('Service/SearchService.tpl');
     $className = 'ProtobufCompilerTest.Protos.Service.SearchService';
     $entity = $context->getEntity($className);
     $generator = new Generator($context);
     $generator->visit($entity);
     // file_put_contents(__DIR__ . '/Fixtures/Service/SearchService.tpl', $entity->getContent());
     $this->assertEquals($expected, $entity->getContent());
 }
 /**
  * @param \Protobuf\Stream $stream
  *
  * @return \Protobuf\Stream
  */
 public function compile(Stream $stream)
 {
     // Parse the request
     $request = CodeGeneratorRequest::fromStream($stream, $this->config);
     $response = new CodeGeneratorResponse();
     $context = $this->createContext($request);
     $entities = $context->getEntities();
     $options = $context->getOptions();
     $generator = new Generator($context);
     // whether or not it will renegerate classes with new extensions
     $regenerate = false;
     $hasExtension = $context->hasProtobufExtension();
     // Run each entity
     foreach ($entities as $key => $entity) {
         $generateImported = $options->getGenerateImported();
         $isFileToGenerate = $entity->isFileToGenerate();
         // Only compile those given to generate, not the imported ones
         if (!$generateImported && !$isFileToGenerate) {
             $this->logger->debug(sprintf('Skipping generation of imported class "%s"', $entity->getClass()));
             continue;
         }
         $this->logger->info(sprintf('Generating class "%s"', $entity->getClass()));
         $generator->visit($entity);
         $file = new File();
         $path = $entity->getPath();
         $content = $entity->getContent();
         $file->setName($path);
         $file->setContent($content);
         $response->addFile($file);
         if ($hasExtension && $this->loadEntityClass($entity)) {
             $regenerate = true;
         }
     }
     if ($regenerate) {
         $this->logger->info('Regenerating classes with new extensions');
         $stream->seek(0);
         // Renegerate classes with new extensions
         return $this->compile($stream);
     }
     $this->logger->info('Generation completed.');
     // Finally serialize the response object
     return $response->toStream($this->config);
 }