@@ -734,6 +734,55 @@ those going through `php-mode-maybe' did not: the same buffer became
734734 (set-buffer-modified-p nil )
735735 (setq buffer-file-name nil ))))))
736736
737+ (defun php-mode-test--derive (file-name &rest body-text )
738+ " Return the mode `php-derivation-major-mode' picks for FILE-NAME.
739+ BODY-TEXT is inserted into the buffer first."
740+ (with-temp-buffer
741+ (setq buffer-file-name (expand-file-name file-name temporary-file-directory))
742+ (unwind-protect
743+ (progn
744+ (apply #'insert body-text)
745+ (php-derivation-major-mode))
746+ (set-buffer-modified-p nil )
747+ (setq buffer-file-name nil ))))
748+
749+ (ert-deftest php-mode-test-blade-template-fallback ()
750+ " A Blade template degrades to an HTML mode when `web-mode' is missing.
751+
752+ A `.blade.php' file is mostly HTML plus Blade directives, so it is not
753+ PHP and `php-default-major-mode' cannot read it. Before the fallback
754+ existed, `php-derivation-major-mode' returned the unavailable
755+ `web-mode' anyway and `php-mode-maybe' then failed with
756+ `void-function' ."
757+ (let ((php-blade-template-major-mode 'php-mode-test--absent-web-mode )
758+ (php-template-mode-alist '((" \\ .blade" . php-mode-test--absent-web-mode))))
759+ (should-not (fboundp 'php-mode-test--absent-web-mode ))
760+ ; ; The chosen fallback must be usable: this is what `php-mode-maybe'
761+ ; ; funcalls, so an unavailable mode would signal `void-function' .
762+ (let ((php-blade-template-major-mode-fallback '(html-mode )))
763+ (should (eq 'html-mode (php-mode-test--derive " welcome.blade.php" " @extends('x')\n " ))))
764+ ; ; Unavailable entries are skipped.
765+ (let ((php-blade-template-major-mode-fallback '(php-mode-test--absent-web-mode html-mode)))
766+ (should (eq 'html-mode (php-mode-test--derive " welcome.blade.php" " @extends('x')\n " ))))
767+ ; ; Opting out falls back on `php-default-major-mode' .
768+ (let ((php-blade-template-major-mode-fallback nil )
769+ (php-default-major-mode 'php-mode ))
770+ (should (eq 'php-mode (php-mode-test--derive " welcome.blade.php" " @extends('x')\n " ))))))
771+
772+ (ert-deftest php-mode-test-html-template-fallback-unchanged ()
773+ " A missing `php-html-template-major-mode' still derives to PHP.
774+
775+ Only Blade degrades to an HTML mode. `php-project-php-file-as-template'
776+ defaults to `auto' , so any .php file holding an HTML tag reaches this
777+ path; sending those to an HTML mode would take most PHP files away from
778+ `php-mode' for anyone without `web-mode' ."
779+ (let ((php-html-template-major-mode 'php-mode-test--absent-web-mode )
780+ (php-project-php-file-as-template 'auto )
781+ (php-default-major-mode 'php-mode )
782+ (php-template-mode-alist nil ))
783+ (should-not (fboundp 'php-mode-test--absent-web-mode ))
784+ (should (eq 'php-mode (php-mode-test--derive " page.php" " <div>\n <?php echo 'hi'; ?>\n </div>\n " )))))
785+
737786(ert-deftest php-mode-test-php74 ()
738787 " Test highlighting language constructs added in PHP 7.4."
739788 (with-php-mode-test (" 7.4/arrow-function.php" :faces t ))
0 commit comments