public function toTriggerAnError()

in src/ExpectObj.hack [593:649]


  public function toTriggerAnError(
    ?int $level = null,
    ?string $expected_error_message = null,
    ?Str\SprintfFormatString $msg = null,
    mixed ...$args
  ): void where T = (function(): mixed) {
    $captured_errors = new Ref<vec<(int, string)>>(vec[]);
    $error_level = \error_reporting(\E_ALL);
    \set_error_handler((int $level, string $message) ==> {
      $captured_errors->value[] = tuple($level, $message);
    });

    try {
      $return = ($this->var)();
      if ($return is Awaitable<_>) {
        /*HHAST_FIXME[DontUseAsioJoin]
          We cannot safely use await here,
          since we are messing with the error handler.*/
        \HH\Asio\join($return);
      }
    } finally {
      \error_reporting($error_level);
      \restore_error_handler();
    }

    $message = $msg is null ? '' : \vsprintf($msg, $args);
    if (C\is_empty($captured_errors->value)) {
      throw new HackTest\ExpectationFailedException(
        'Expected an error to be triggered, but got none.',
      );
    }

    $errors = $captured_errors->value;

    $passes = C\any(
      $errors,
      $e ==> ($e[0] === $level || $level is null) &&
        (
          $expected_error_message is null ||
          Str\contains($e[1], $expected_error_message)
        ),
    );

    if ($passes) {
      return;
    }

    throw new ExpectationFailedException(
      Str\format(
        "%sFailed asserting that the correct kind of error was triggered:\n Expected level: %s\n Expected message: %s\n Got: %s",
        $message,
        (string)($level ?? '<any>'),
        (string)($expected_error_message ?? '<any>'),
        \var_export($errors, true),
      ),
    );
  }