[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/projectile 139cb02e20 4/9: Fix tests
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/projectile 139cb02e20 4/9: Fix tests |
Date: |
Mon, 27 Dec 2021 07:58:01 -0500 (EST) |
branch: elpa/projectile
commit 139cb02e20894cdf874d7a65659ef58d4b8f268b
Author: lWarne <laurencewarne@gmail.com>
Commit: Bozhidar Batsov <bozhidar@batsov.dev>
Fix tests
---
projectile.el | 83 ++++++++++++++++++++++++++++++++-----------------
test/projectile-test.el | 41 +++++++++++++++++++++---
2 files changed, 90 insertions(+), 34 deletions(-)
diff --git a/projectile.el b/projectile.el
index 7280ebed18..c2b3e33356 100644
--- a/projectile.el
+++ b/projectile.el
@@ -3387,8 +3387,10 @@ string) are replaced with the current project type's
src-dir property
(which should be a string) to obtain the new directory.
Nil is returned if either the src-dir or test-dir properties are not strings."
- (let ((test-dir (projectile-test-directory (projectile-project-type)))
- (impl-dir (projectile-src-directory (projectile-project-type))))
+ (let ((test-dir (projectile-project-type-attribute
+ (projectile-project-type) 'test-dir))
+ (impl-dir (projectile-project-type-attribute
+ (projectile-project-type) 'src-dir)))
(when (and (stringp test-dir) (stringp impl-dir))
(projectile-complementary-dir test-dir-path test-dir impl-dir))))
@@ -3400,8 +3402,10 @@ string) are replaced with the current project type's
test-dir property
(which should be a string) to obtain the new directory.
Nil is returned if either the src-dir or test-dir properties are not strings."
- (let ((test-dir (projectile-test-directory (projectile-project-type)))
- (impl-dir (projectile-src-directory (projectile-project-type))))
+ (let ((test-dir (projectile-project-type-attribute
+ (projectile-project-type) 'test-dir))
+ (impl-dir (projectile-project-type-attribute
+ (projectile-project-type) 'src-dir)))
(when (and (stringp test-dir) (stringp impl-dir))
(projectile-complementary-dir impl-dir-path impl-dir test-dir))))
@@ -3426,6 +3430,7 @@ Nil is returned if either the src-dir or test-dir
properties are not strings."
If `projectile-create-missing-test-files' is non-nil, create the missing
test file."
(unless file-name (error "The current buffer is not visiting a file"))
+ (unless (projectile-project-type) (projectile-ensure-project nil))
(if (projectile-test-file-p file-name)
;; find the matching impl file
(let ((impl-file (projectile-find-matching-file file-name)))
@@ -3440,11 +3445,11 @@ test file."
(projectile-project-type)))
(test-file (projectile-find-matching-test file-name))
(expanded-test-file (projectile-expand-root test-file)))
- (cond ((file-exists-p expanded-test-file) expanded-test-file)
- (projectile-create-missing-test-files
- (projectile--create-directories-for expanded-test-file)
- expanded-test-file)
- (t (error error-msg)))
+ (cond ((file-exists-p expanded-test-file) expanded-test-file)
+ (projectile-create-missing-test-files
+ (projectile--create-directories-for expanded-test-file)
+ expanded-test-file)
+ (t (progn (error error-msg))))
(error error-msg))))
;;;###autoload
@@ -3544,25 +3549,29 @@ Fallback to DEFAULT-VALUE for missing attributes."
"Apply DIR-FN and FILENAME-FN to the directory and name of FILE-PATH.
More specifically, return DIR-FN applied to the directory of FILE-PATH
-concatenated with FILENAME-FN applied to the file name of FILE-PATH."
- (let* ((filename (file-name-nondirectory file-path))
- (complementary-filename (funcall filename-fn filename))
- (dir (funcall dir-fn (file-name-directory file-path))))
+concatenated with FILENAME-FN applied to the file name of FILE-PATH.
+
+If either function returns nil, return nil."
+ (when-let* ((filename (file-name-nondirectory file-path))
+ (complementary-filename (funcall filename-fn filename))
+ (dir (funcall dir-fn (file-name-directory file-path))))
(concat (file-name-as-directory dir) complementary-filename)))
(defun projectile--impl-file-from-src-dir-str (file-name)
- "Attempt to build a path for the impl file of FILE-NAME using the src-dir
and test-dir properties of the current project type which should be strings,
nil returned if this is not the case."
- (projectile--complementary-file
- file-name
- #'projectile--test-to-impl-dir
- #'projectile--impl-name-for-test-name))
+ "Return a path relative to the project root for the impl file of FILE-NAME
using the src-dir and test-dir properties of the current project type which
should be strings, nil returned if this is not the case."
+ (when-let ((complementary-file (projectile--complementary-file
+ file-name
+ #'projectile--test-to-impl-dir
+ #'projectile--impl-name-for-test-name)))
+ (file-relative-name complementary-file (projectile-project-root))))
(defun projectile--test-file-from-test-dir-str (file-name)
- "Attempt to build a path for the test file of FILE-NAME using the src-dir
and test-dir properties of the current project type which should be strings,
nil returned if this is not the case."
- (projectile--complementary-file
- file-name
- #'projectile--impl-to-test-dir
- #'projectile--test-name-for-impl-name))
+ "Return a path relative to the project root for the test file of FILE-NAME
using the src-dir and test-dir properties of the current project type which
should be strings, nil returned if this is not the case."
+ (when-let (complementary-file (projectile--complementary-file
+ file-name
+ #'projectile--impl-to-test-dir
+ #'projectile--test-name-for-impl-name))
+ (file-relative-name complementary-file (projectile-project-root))))
(defun projectile--impl-file-from-src-dir-fn (test-file)
"Return the implementation file path for the absolute path TEST-FILE
relative to the project root in the case the current project type's src-dir has
been set to a custom function, return nil if this is not the case or the path
points to a file that does not exist."
@@ -3587,13 +3596,21 @@ concatenated with FILENAME-FN applied to the file name
of FILE-PATH."
(projectile-project-root)))))
(defun projectile--find-matching-test (impl-file)
- "Return a list of test files for IMPL-FILE."
+ "Return a list of test files for IMPL-FILE.
+
+The precendence for determining test files to return is:
+
+1. Use the project type's test-dir property if it's set to a function
+2. Use the project type's related-files-fn property if set
+3. Use the project type's test-dir property if it's set to a string
+4. Default to a fallback which matches all project files against
+ `projectile--impl-to-test-predicate'"
(if-let ((test-file-from-test-dir-fn
(projectile--test-file-from-test-dir-fn impl-file)))
(list test-file-from-test-dir-fn)
(if-let ((plist (projectile--related-files-plist-by-kind impl-file :test)))
(projectile--related-files-from-plist plist)
- (if-let (test-file (projectile--test-file-from-test-dir-str impl-file))
+ (if-let ((test-file (projectile--test-file-from-test-dir-str impl-file)))
(list test-file)
(when-let ((predicate (projectile--impl-to-test-predicate impl-file)))
(projectile--best-or-all-candidates-based-on-parents-dirs
@@ -3610,17 +3627,25 @@ concatenated with FILENAME-FN applied to the file name
of FILE-PATH."
(when test-suffix (string-equal (concat name test-suffix)
basename)))))))
(defun projectile--find-matching-file (test-file)
- "Return a list of impl files tested by TEST-FILE."
+ "Return a list of impl files tested by TEST-FILE.
+
+The precendence for determining implementation files to return is:
+
+1. Use the project type's src-dir property if it's set to a function
+2. Use the project type's related-files-fn property if set
+3. Use the project type's src-dir property if it's set to a string
+4. Default to a fallback which matches all project files against
+ `projectile--test-to-impl-predicate'"
(if-let ((impl-file-from-src-dir-fn
(projectile--impl-file-from-src-dir-fn test-file)))
(list impl-file-from-src-dir-fn)
(if-let ((plist (projectile--related-files-plist-by-kind test-file :impl)))
(projectile--related-files-from-plist plist)
- (if-let (impl-file (projectile--impl-file-from-impl-dir-str test-file))
+ (if-let ((impl-file (projectile--impl-file-from-src-dir-str test-file)))
(list impl-file)
(when-let ((predicate (projectile--test-to-impl-predicate test-file)))
- (projectile--best-or-all-candidates-based-on-parents-dirs
- test-file (cl-remove-if-not predicate
(projectile-current-project-files))))))))
+ (projectile--best-or-all-candidates-based-on-parents-dirs
+ test-file (cl-remove-if-not predicate
(projectile-current-project-files))))))))
(defun projectile--choose-from-candidates (candidates)
"Choose one item from CANDIDATES."
diff --git a/test/projectile-test.el b/test/projectile-test.el
index 2624af248d..77799f0a7a 100644
--- a/test/projectile-test.el
+++ b/test/projectile-test.el
@@ -1163,8 +1163,23 @@ Just delegates OPERATION and ARGS for all operations
except for`shell-command`'.
"spec/foo/foo.service.spec.js"
"spec/bar/bar.service.spec.js")
(:test-suffix ".spec" :test-dir "spec/" :src-dir "source/")
- (expect (projectile--find-matching-test "source/foo/foo.service.js")
:to-equal '("spec/foo/foo.service.spec.js"))
- (expect (projectile--find-matching-file
"spec/bar/bar.service.spec.js") :to-equal '("source/bar/bar.service.js")))))
+ (expect (projectile--find-matching-test
+ "project/source/foo/foo.service.js")
+ :to-equal '("spec/foo/foo.service.spec.js"))
+ (expect (projectile--find-matching-file
+ "project/spec/bar/bar.service.spec.js")
+ :to-equal '("source/bar/bar.service.js")))))
+
+ (it "finds matching test with dirs and inexistent test file"
+ (projectile-test-with-sandbox
+ (projectile-test-with-files-using-custom-project
+ ("project/src/main/scala/bar/package.scala"
+ "project/src/main/scala/foo/package.scala"
+ "project/src/test/scala/foo/packageSpec.scala")
+ (:test-suffix "Spec" :test-dir "test" :src-dir "main")
+ (expect (projectile--find-matching-test
+ "project/src/main/scala/bar/package.scala")
+ :to-equal '("src/test/scala/bar/packageSpec.scala")))))
(it "finds matching test or file based on the paths returned by
:related-files-fn option"
(defun -my/related-files(file)
@@ -1721,7 +1736,8 @@ projectile-process-current-project-buffers-current to
have similar behaviour"
((symbol-function 'file-exists-p) #'ignore)
((symbol-function 'projectile-expand-root) #'identity)
((symbol-function 'projectile-find-matching-test) (lambda (file)
"dir/foo"))
- (projectile-create-missing-test-files nil))
+ (projectile-create-missing-test-files nil)
+ (projectile-project-type 'foo))
(expect (projectile-find-implementation-or-test "foo") :to-throw))))
(describe "projectile--impl-file-from-src-dir-fn"
@@ -1808,11 +1824,26 @@ projectile-process-current-project-buffers-current to
have similar behaviour"
((symbol-function 'projectile-project-type) (lambda () 'foo))
(projectile-project-types mock-projectile-project-types))
(expect (projectile--impl-to-test-dir "/foo/src/Foo") :to-equal
"/foo/test/")))
- (it "error signalled when test dir property is not a string"
+ (it "nil returned when test-dir property is not a string"
+ (cl-letf (((symbol-function 'projectile-project-root) (lambda () "bar"))
+ ((symbol-function 'projectile-project-type) (lambda () 'bar))
+ (projectile-project-types mock-projectile-project-types))
+ (expect (projectile--impl-to-test-dir "/bar/src/bar") :to-be nil))))
+
+(describe "projectile--test-to-impl-dir"
+ :var ((mock-projectile-project-types
+ '((foo test-dir "test" src-dir "src")
+ (bar test-dir "test" src-dir identity))))
+ (it "replaces occurrences of test-dir with src-dir"
+ (cl-letf (((symbol-function 'projectile-project-root) (lambda () "foo"))
+ ((symbol-function 'projectile-project-type) (lambda () 'foo))
+ (projectile-project-types mock-projectile-project-types))
+ (expect (projectile--test-to-impl-dir "/foo/test/Foo") :to-equal
"/foo/src/")))
+ (it "nil returned when src-dir property is not a string"
(cl-letf (((symbol-function 'projectile-project-root) (lambda () "bar"))
((symbol-function 'projectile-project-type) (lambda () 'bar))
(projectile-project-types mock-projectile-project-types))
- (expect (projectile--impl-to-test-dir "/bar/src/bar") :to-throw))))
+ (expect (projectile--test-to-impl-dir "/bar/test/bar") :to-be nil))))
(describe "projectile-run-shell-command-in-root"
(describe "when called directly in elisp"
- [nongnu] elpa/projectile updated (ac60885f2a -> 24de2940a8), ELPA Syncer, 2021/12/27
- [nongnu] elpa/projectile fab2c546fd 8/9: Tweak a changelog entry, ELPA Syncer, 2021/12/27
- [nongnu] elpa/projectile f753cdbcf8 5/9: Update documentation around test/src-dir and update sbt project type, ELPA Syncer, 2021/12/27
- [nongnu] elpa/projectile cd8bcbcb15 2/9: Merge pull request #1735 from eggert/timestamp, ELPA Syncer, 2021/12/27
- [nongnu] elpa/projectile f7eba5e164 6/9: Fix emacs 25 incompat in projectile--complementary-file, ELPA Syncer, 2021/12/27
- [nongnu] elpa/projectile 24de2940a8 9/9: Merge commit 'ac60885f2a', ELPA Syncer, 2021/12/27
- [nongnu] elpa/projectile b7937e212d 7/9: [#1734] Add a changelog entry, ELPA Syncer, 2021/12/27
- [nongnu] elpa/projectile 43decc573b 1/9: Port projectile-time-seconds to future Emacs, ELPA Syncer, 2021/12/27
- [nongnu] elpa/projectile fad389aecf 3/9: Make src/test-dir as strings take priority over fallback, ELPA Syncer, 2021/12/27
- [nongnu] elpa/projectile 139cb02e20 4/9: Fix tests,
ELPA Syncer <=