/**
  * @dataProvider dataProvider
  */
 public function testFactory($stack, $extra = [])
 {
     $ex = RemoteException::factory($stack);
     for ($i = 0; $i < count($stack); $i++) {
         if (!is_array($stack[$i])) {
             continue;
         }
         $this->assertInstanceOf('\\Matryoshka\\Service\\Api\\Exception\\RemoteException', $ex);
         $this->assertSame(isset($stack[$i]['code']) ? $stack[$i]['code'] : 0, $ex->getCode());
         $this->assertSame(isset($stack[$i]['message']) ? $stack[$i]['message'] : '', $ex->getMessage());
         if (isset($stack[$i]['trace'])) {
             $this->assertSame($stack[$i]['trace'], $ex->getRemoteTrace());
         }
         if (isset($stack[$i]['line'])) {
             $this->assertSame($stack[$i]['line'], $ex->getLine());
         }
         if (isset($stack[$i]['file'])) {
             $this->assertSame($stack[$i]['file'], $ex->getFile());
         }
         $this->assertSame($extra, $ex->getAdditionalDetails());
         $ex = $ex->getPrevious();
     }
     $this->assertNull($ex);
 }
 /**
  * @param array $bodyDecodeResponse
  * @param Response $response
  * @return Exception\ApiProblem\DomainException|Exception\InvalidResponseException
  */
 protected function getInvalidResponseException(array $bodyDecodeResponse, Response $response)
 {
     $contentType = $response->getHeaders()->get('Content-Type');
     if ($contentType instanceof ContentType && $contentType->match('application/problem+*')) {
         $apiProblemDefaults = ['type' => $response->getReasonPhrase(), 'title' => '', 'status' => $response->getStatusCode(), 'detail' => '', 'instance' => ''];
         $bodyDecodeResponse += $apiProblemDefaults;
         //Setup remote exception
         $remoteExceptionStack = isset($bodyDecodeResponse['exception_stack']) && is_array($bodyDecodeResponse['exception_stack']) ? $bodyDecodeResponse['exception_stack'] : [];
         array_unshift($remoteExceptionStack, ['message' => $bodyDecodeResponse['detail'], 'code' => $bodyDecodeResponse['status'], 'trace' => isset($bodyDecodeResponse['trace']) ? $bodyDecodeResponse['trace'] : null]);
         //Setup exception
         $exception = new Exception\ApiProblem\DomainException($bodyDecodeResponse['detail'], $bodyDecodeResponse['status'], Exception\RemoteException::factory($remoteExceptionStack));
         $exception->setType($bodyDecodeResponse['type']);
         $exception->setTitle($bodyDecodeResponse['title']);
         foreach ($apiProblemDefaults as $key => $value) {
             unset($bodyDecodeResponse[$key]);
         }
         $exception->setAdditionalDetails($bodyDecodeResponse);
     } else {
         $exception = new Exception\InvalidResponseException($response->getReasonPhrase(), $response->getStatusCode());
         $exception->setResponse($response);
     }
     return $exception;
 }