/**
  * Setup and return a service with operations and types.
  *
  * @return Service
  */
 private function givenServiceWithOperations()
 {
     // Response GetBook types
     $responseBookName = new ComplexType($this->config, 'Method_Get_Book_Response_BOOK_BOOK_NAME');
     $responseBookName->addMember('string', 'bookName', false);
     $responseBook = new ComplexType($this->config, 'Method_Get_Book_Response_BOOK');
     $responseBook->addMember('int', 'bookId', false);
     // Base type example
     $responseBook->setBaseType($responseBookName);
     $returnGetBookType = new ComplexType($this->config, 'Get_Book_Type_Response');
     $returnGetBookType->addMember('Method_Get_Book_Response_BOOK', 'book_response', false);
     // Request GetBook types
     $bookType = new Enum($this->config, 'Book_Type_Enumeration', 'string');
     $bookType->addValue('fiction');
     $bookType->addValue('comedy');
     $requestBook = new ComplexType($this->config, 'Method_Get_Book_Request_BOOK');
     $requestBook->addMember('int', 'bookId', false);
     $requestBook->addMember('Book_Type_Enumeration', 'genre', false);
     $requestGetBook = new ComplexType($this->config, 'Get_Book_Type_Request');
     $requestGetBook->addMember('Method_Get_Book_Request_BOOK', 'book_request', false);
     // Operation GetBook
     $getBookOperation = new Operation('GetBook', 'Get_Book_Type_Request $request', 'Get Book', 'Get_Book_Type_Response');
     // Response GetAuthors type
     $responseAuthor = new ComplexType($this->config, 'Get_Authors_Response_Author');
     $responseAuthor->addMember('int', 'authorId', false);
     $responseAuthor->addMember('string', 'authorName', false);
     $returnGetAuthors = new ComplexType($this->config, 'Method_Get_Authors_Response');
     $returnGetAuthors->addMember('Get_Authors_Response_Author[]', 'Get_Authors_Response_Author', false);
     // Request GetAuthors type
     $requestGetAuthor = new ComplexType($this->config, 'Method_Get_Authors_Request');
     $requestGetAuthor->addMember('Method_Get_Book_Request_BOOK', 'book_request', false);
     // Operation GetAuthors
     $getAuthorsOperator = new Operation('GetAuthor', 'Method_Get_Authors_Request $request', 'Get Authors', 'Method_Get_Authors_Response');
     // Service creation
     $types = array($responseBookName, $responseBook, $returnGetBookType, $requestBook, $requestGetBook, $responseAuthor, $returnGetAuthors, $requestGetAuthor, $bookType);
     $service = new Service($this->config, 'Book_Shell', $types, 'Book shells');
     $service->addOperation($getBookOperation);
     $service->addOperation($getAuthorsOperator);
     return $service;
 }
 /**
  * Test classes that extend themselves.
  */
 public function testExtendingOwnClass()
 {
     // It is actually possible to have a type which extends itself. This is caused by the poor understanding of PHP
     // namespaces. Two types with the same name but in different namespaces will have the same identifier.
     $config = new Config(array('inputFile' => null, 'outputDir' => null));
     $type = new ComplexType($config, 'ExtendOwn');
     $type->setBaseType($type);
     $this->generateClass($type);
     $object = new \ExtendOwn();
     $class = new \ReflectionClass($object);
     $this->assertEmpty($class->getParentClass());
 }