You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
phpinspect.el/test/test-eldoc.el

136 lines
5.4 KiB
EmacsLisp

;;; test-eldoc.el --- Unit tests for phpinspect.el -*- lexical-binding: t; -*-
(require 'phpinspect)
(require 'phpinspect-eldoc)
(require 'phpinspect-test-env
(expand-file-name "phpinspect-test-env.el"
(file-name-directory (macroexp-file-name))))
(ert-deftest phpinspect-eld-method-call ()
(setq phpinspect-load-stubs nil)
(with-temp-buffer
(phpinspect-purge-cache)
(let* ((php-code "<?php
class Thing
{
function getThis(\\DateTime $moment, Thing $thing, $other): static
{
return $this;
}
function doStuff()
{
$this->getThis(new \\DateTime(), bla)")
(phpinspect-project-root-function (lambda () "phpinspect-test"))
(phpinspect-eldoc-word-width 100)
(project (phpinspect--make-project :autoload (phpinspect-make-autoloader) :worker 'nil-worker))
(buffer (phpinspect-make-buffer :buffer (current-buffer) :-project project))
second-arg-pos inside-nested-list-pos first-arg-pos)
(setq-local phpinspect-current-buffer buffer)
(insert php-code)
(backward-char)
(setq second-arg-pos (point))
(backward-char 6)
(setq inside-nested-list-pos (point))
(backward-char 8)
(setq first-arg-pos (point))
(phpinspect-buffer-reindex buffer)
;; Strategy should not trigger inside constructor/function arguments
(let ((query (phpinspect-make-eldoc-query :point inside-nested-list-pos :buffer buffer))
(strat (phpinspect-make-eld-function-args))
(rctx (phpinspect-get-resolvecontext project (phpinspect-buffer-parse-map buffer) inside-nested-list-pos)))
(should-not (phpinspect-eld-strategy-execute strat query rctx)))
(dolist (expected (list (cons second-arg-pos 1) (cons first-arg-pos 0)))
;; Test strat separately to ensure it is not erroneous
(let ((query (phpinspect-make-eldoc-query :point (car expected) :buffer buffer))
(strat (phpinspect-make-eld-function-args))
(rctx (phpinspect-get-resolvecontext project (phpinspect-buffer-parse-map buffer) (car expected))))
;; Subject is correct
(should (phpinspect-word-p (car (phpinspect--resolvecontext-subject rctx))))
;; Enclosing token is correct
(should (phpinspect-list-p (car (phpinspect--resolvecontext-enclosing-tokens rctx))))
;; Statement is correctly determined
(should (equal (cdr (phpinspect-parse-string "$this->getThis(new \\DateTime(), bla)"))
(mapcar #'phpinspect-meta-token
(phpinspect--determine-function-call-statement
rctx query (car (phpinspect--resolvecontext-enclosing-metadata
rctx))))))
;; Strategy correctly signals support
(should (phpinspect-eld-strategy-supports strat query rctx))
;; Strategy correctly returns result
(should (phpinspect-eld-strategy-execute strat query rctx)))
;; Test query execution
(let ((result (seq-find #'phpinspect-function-doc-p
(phpinspect-eldoc-query-execute
(phpinspect-make-eldoc-query :point (car expected) :buffer buffer)))))
(should (phpinspect-function-doc-p result))
(should (= (cdr expected) (phpinspect-function-doc-arg-pos result)))
(should (string= "getThis" (phpinspect--function-name (phpinspect-function-doc-fn result)))))))))
(ert-deftest phpinspect-eldoc-function-for-object-method ()
(phpinspect-purge-cache)
(let* ((php-code "
class Thing
{
function getThis(\\DateTime $moment, Thing $thing, $other): static
{
return $this;
}
function doStuff()
{
$this->getThis(new \\DateTime(), bla)")
(tokens (phpinspect-parse-string php-code))
(index (phpinspect--index-tokens tokens))
(project (phpinspect--make-dummy-project))
(phpinspect-eldoc-word-width 100))
(phpinspect-project-add-index project index)
(should (string= "getThis: ($moment DateTime, $thing Thing, $other): Thing"
(with-temp-buffer
(insert php-code)
(backward-char)
(setq-local phpinspect-current-buffer
(phpinspect-make-buffer :buffer (current-buffer) :-project project))
(phpinspect-buffer-parse phpinspect-current-buffer)
(phpinspect-eldoc-function))))))
(ert-deftest phpinspect-eldoc-function-for-static-method ()
(phpinspect-purge-cache)
(let* ((php-code "
class Thing
{
static function doThing(\\DateTime $moment, Thing $thing, $other): static
{
return $this;
}
function doStuff()
{
self::doThing(")
(tokens (phpinspect-parse-string php-code))
(index (phpinspect--index-tokens tokens))
(project (phpinspect--make-dummy-project))
(phpinspect-eldoc-word-width 100))
(phpinspect-project-add-index project index)
(should (string= "doThing: ($moment DateTime, $thing Thing, $other): Thing"
(with-temp-buffer
(insert php-code)
(setq-local phpinspect-current-buffer
(phpinspect-make-buffer :buffer (current-buffer)))
(phpinspect-eldoc-function))))))