emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/phps-mode ee211dac6a 084/212: Started on indentation te


From: Christian Johansson
Subject: [elpa] externals/phps-mode ee211dac6a 084/212: Started on indentation tests
Date: Wed, 26 Jan 2022 01:50:58 -0500 (EST)

branch: externals/phps-mode
commit ee211dac6a36d2b18114a6023970fab325a90890
Author: Christian Johansson <christian@cvj.se>
Commit: Christian Johansson <christian@cvj.se>

    Started on indentation tests
---
 Makefile                      |   6 +-
 phps-mode-indent.el           | 198 ++++++++++
 test/phps-mode-test-indent.el | 817 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 1020 insertions(+), 1 deletion(-)

diff --git a/Makefile b/Makefile
index f425653679..f5e8f3d390 100644
--- a/Makefile
+++ b/Makefile
@@ -20,12 +20,16 @@ compile:
        find . -name "*.el" -exec $(EMACS_CMD) -f batch-byte-compile {} \;
 
 .PHONY: tests
-tests: test-integration test-lexer test-lex-analyzer test-parser 
test-syntax-table test-ast
+tests: test-integration test-lexer test-lex-analyzer test-parser 
test-syntax-table test-ast test-indent
 
 .PHONY: test-ast
 test-ast:
        $(EMACS_CMD) -l test/phps-mode-test-ast.el
 
+.PHONY: test-indent
+test-indent:
+       $(EMACS_CMD) -l test/phps-mode-test-indent.el
+
 .PHONY: test-integration
 test-integration:
        $(EMACS_CMD) -l test/phps-mode-test-integration.el
diff --git a/phps-mode-indent.el b/phps-mode-indent.el
new file mode 100644
index 0000000000..4e85d52a40
--- /dev/null
+++ b/phps-mode-indent.el
@@ -0,0 +1,198 @@
+;;; phps-mode-indent.el -- Indentation for phps-mode -*- lexical-binding: t -*-
+
+;; Copyright (C) 2018-2021  Free Software Foundation, Inc.
+
+
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+(defun phps-mode-indent-line (&optional point)
+  "Apply alternative indentation at POINT here."
+  (unless point
+    (setq point (point)))
+  (let ((new-indentation 0)
+        (point-at-end-of-line (equal point (line-end-position))))
+    (save-excursion
+      (let ((line-number (line-number-at-pos point))
+            (move-length 0)
+            (line-is-empty t)
+            line-beginning-position
+            line-end-position
+            line-string
+            current-line-string)
+        (goto-char point)
+        (setq
+         current-line-string
+         (buffer-substring-no-properties
+          (line-beginning-position)
+          (line-end-position))
+         )
+        (if (> line-number 1)
+            (progn
+              (while (and
+                      (> line-number 0)
+                      line-is-empty)
+                (forward-line -1)
+                (setq line-number (1- line-number))
+                (beginning-of-line)
+                (setq line-beginning-position (line-beginning-position))
+                (setq line-end-position (line-end-position))
+                (setq
+                 line-string
+                 (buffer-substring-no-properties line-beginning-position 
line-end-position))
+                (setq line-is-empty (string-match-p "^[ \t\f\r\n]*$" 
line-string))
+                (setq move-length (1+ move-length)))
+
+              (unless line-is-empty
+                (let* ((old-indentation (current-indentation))
+                       (current-line-starts-with-closing-bracket 
(phps-mode-indent--string-starts-with-closing-bracket-p current-line-string))
+                       (line-starts-with-closing-bracket 
(phps-mode-indent--string-starts-with-closing-bracket-p line-string))
+                       (line-starts-with-opening-doc-comment 
(phps-mode-indent--string-starts-with-opening-doc-comment-p line-string))
+                       (line-ends-with-assignment 
(phps-mode-indent--string-ends-with-assignment-p line-string))
+                       (line-ends-with-opening-bracket 
(phps-mode-indent--string-ends-with-opening-bracket-p line-string))
+                       (line-ends-with-terminus 
(phps-mode-indent--string-ends-with-terminus-p line-string))
+                       (bracket-level 
(phps-mode-indent--get-string-brackets-count line-string)))
+                  (setq new-indentation old-indentation)
+                  (goto-char point)
+
+                  (when (> bracket-level 0)
+                    (if (< bracket-level tab-width)
+                        (setq new-indentation (+ new-indentation 1))
+                      (setq new-indentation (+ new-indentation tab-width))))
+
+                  (when (= bracket-level -1)
+                    (setq new-indentation (1- new-indentation)))
+
+                  (when (and (= bracket-level 0)
+                             line-starts-with-closing-bracket)
+                    (setq new-indentation (+ new-indentation tab-width)))
+
+                  (when current-line-starts-with-closing-bracket
+                    (setq new-indentation (- new-indentation tab-width)))
+
+                  (when line-starts-with-opening-doc-comment
+                    (setq new-indentation (+ new-indentation 1)))
+
+                  (when (and
+                         line-ends-with-assignment
+                         (<= bracket-level 0))
+                    (setq new-indentation (+ new-indentation tab-width)))
+
+                  (when (and
+                         line-ends-with-opening-bracket
+                         (< bracket-level 0))
+                    (setq new-indentation (+ new-indentation tab-width)))
+
+                  (when line-ends-with-terminus
+                    ;; Back-trace buffer from previous line
+                    ;; Determine if semi-colon ended an assignment or 
bracket-less command or not
+                    (forward-line (* -1 move-length))
+                    (end-of-line)
+                    (forward-char -1)
+                    (let ((not-found t)
+                          (is-assignment nil)
+                          (parenthesis-level 0)
+                          (is-bracket-less-command nil))
+                      (while (and
+                              not-found
+                              (search-backward-regexp 
"\\(;\\|{\\|(\\|)\\|=\\|echo[\t ]+\\|print[\t ]+\\)" nil t))
+                        (let ((match (buffer-substring-no-properties 
(match-beginning 0) (match-end 0))))
+                          (when (string= match ")")
+                            (setq parenthesis-level (1- parenthesis-level)))
+                          (when (= parenthesis-level 0)
+                            (setq is-assignment (string= match "="))
+                            (setq is-bracket-less-command
+                                  (string-match-p
+                                   "\\(echo[\t ]+\\|print[\t ]+\\)"
+                                   match))
+                            (setq not-found nil))
+
+                          (when (string= match "(")
+                            (setq parenthesis-level (1+ parenthesis-level)))))
+                      ;; If it ended an assignment on a previous line, 
decrease indentation
+                      (when
+                          (and
+                           (or
+                            (and
+                             is-assignment
+                             (> bracket-level -1))
+                            is-bracket-less-command)
+                           (not (= line-number (line-number-at-pos))))
+                        ;; NOTE stuff like $var = array(\n    4\n);\n
+                        ;; will end assignment but also decrease bracket-level
+                        (setq new-indentation (- new-indentation tab-width))))
+
+                    (goto-char point))
+
+                  ;; Decrease indentation if current line decreases in bracket 
level
+                  (when (< new-indentation 0)
+                    (setq new-indentation 0))
+
+                  (indent-line-to new-indentation))))
+          (indent-line-to 0))))
+    ;; Only move to end of line if point is the current point and is at end of 
line
+    (when (equal point (point))
+      (if point-at-end-of-line
+          (end-of-line)
+        (back-to-indentation)))
+    new-indentation))
+
+(defun phps-mode-indent--get-string-brackets-count (string)
+  "Get bracket count for STRING."
+  (let ((bracket-level 0)
+        (start 0)
+        (line-is-empty
+         (string-match-p "^[ \t\f\r\n]*$" string)))
+    (unless line-is-empty
+      (while (string-match
+              "\\([\]{}()[]\\|<[a-zA-Z]+\\|</[a-zA-Z]+\\|/>\\|^[\t 
]/\\*\\*\\|^[\t\\* ]*\\*/\\)"
+              string
+              start)
+        (setq start (match-end 0))
+        (let ((bracket (substring string (match-beginning 0) (match-end 0))))
+          (cond
+           ((or
+             (string= bracket "{")
+             (string= bracket "[")
+             (string= bracket "(")
+             (string= bracket "<")
+             (string-match "<[a-zA-Z]+" bracket))
+            (setq bracket-level (+ bracket-level tab-width)))
+           ((string-match "^[\t\\* ]*\\*/" bracket )
+            (setq bracket-level (- bracket-level 1)))
+           ((or
+             (string-match "^/\\*\\*" bracket)
+             (string-match "^[\t ]*\\*" bracket))
+            (setq bracket-level (+ bracket-level 1)))
+           (t
+            (setq bracket-level (- bracket-level tab-width)))))))
+    bracket-level))
+
+(defun phps-mode-indent--string-starts-with-closing-bracket-p (string)
+  "Get bracket count for STRING."
+  (string-match-p "^[\t ]*\\([\]})[]\\|</[a-zA-Z]+\\|/>\\)" string))
+
+(defun phps-mode-indent--string-starts-with-opening-doc-comment-p (string)
+  "Does STRING start with opening doc comment?"
+  (string-match-p "^[\t ]*/\\*\\*" string))
+
+(defun phps-mode-indent--string-ends-with-opening-bracket-p (string)
+  "Get bracket count for STRING."
+  (string-match-p "\\([\[{(]\\|<[a-zA-Z]+\\)[\t ]*$" string))
+
+(defun phps-mode-indent--string-ends-with-assignment-p (string)
+  "Get bracket count for STRING."
+  (string-match-p "=>?[\t ]*$" string))
+
+(defun phps-mode-indent--string-ends-with-terminus-p (string)
+  "Get bracket count for STRING."
+  (string-match-p "\\(;\\|,\\)[\t ]*$" string))
+
+
+(provide 'phps-mode-indent)
+
+;;; phps-mode-indent.el ends here
diff --git a/test/phps-mode-test-indent.el b/test/phps-mode-test-indent.el
new file mode 100644
index 0000000000..f5ee27e694
--- /dev/null
+++ b/test/phps-mode-test-indent.el
@@ -0,0 +1,817 @@
+;;; phps-mode-test-indent.el --- Tests for indentation -*- lexical-binding: t 
-*-
+
+;; Copyright (C) 2018-2021  Free Software Foundation, Inc.
+
+
+;;; Commentary:
+
+
+;; Run from terminal make test-indent
+
+
+;;; Code:
+
+
+(require 'ert)
+(require 'phps-mode)
+(require 'phps-mode-indent)
+(require 'phps-mode-test)
+
+(defun phps-mode-test-indent--indent-whole-buffer ()
+  "Use alternative indentation of every line of buffer."
+  (goto-char (point-min))
+  (phps-mode-indent-line)
+  (while (search-forward "\n" nil t nil)
+    (phps-mode-indent-line)))
+
+(defun phps-mode-test-indent--should-equal (string name)
+  "Test indent of whole buffer containing STRING with NAME."
+  (phps-mode-test--with-buffer
+   string
+   name
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (message "Indented buffer:\n%S" buffer-contents)
+     (should (equal
+              buffer-contents
+              string)))))
+
+(defun phps-mode-test-indent--get-lines-indent ()
+  "Test indent function."
+  
+  (phps-mode-test-indent--should-equal
+   "<?php\n/**\n * Bla\n */"
+   "DOC-COMMENT")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nmyFunction(array(\n    23,\n    [\n        25\n    ]\n    )\n);"
+   "Round and square bracket expressions")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nvar_dump(array(<<<EOD\nfoobar!\nEOD\n));\n?>"
+   "HEREDOC in arguments example")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$str = <<<'EOD'\nExample of string\nspanning multiple lines\nusing 
nowdoc syntax.\nEOD;\n"
+   "Multi-line NOWDOC string")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$var = \"A line\nmore text here\nlast line here\";"
+   "Multi-line double-quoted string")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$var = 'A line\nmore text here\nlast line here';"
+   "Multi-line single-quoted string")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho \"A line\" .\n    \"more text here\" .\n    \"last line 
here\";"
+   "Concatenated double-quoted-string spanning multiple-lines")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho myFunction(\"A line\" .\n    \"more text here\" .\n    \"last 
line here\");"
+   "Concatenated double-quoted-string spanning multiple-lines inside function")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho \"A line\"\n    . \"more text here\"\n    . \"last line 
here\";"
+   "Concatenated double-quoted-string spanning multiple-lines 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho myFunction(\"A line\" .\n    \"more text here\" .\n    \"last 
line here\");"
+   "Concatenated double-quoted-string spanning multiple-lines inside function 
2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho 'A line' .\n    'more text here' .\n    'last line here';"
+   "Concatenated single-quoted-string spanning multiple-lines")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho myFunction('A line' .\n    'more text here' .\n    'last line 
here');"
+   "Concatenated single-quoted-string spanning multiple-lines inside function")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho 'A line'\n    . 'more text here'\n    . 'last line here';"
+   "Concatenated single-quoted-string spanning multiple-lines 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho myFunction('A line'\n    . 'more text here'\n    . 'last line 
here');"
+   "Concatenated single-quoted-string spanning multiple-lines inside function 
2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho <<<EOD\nExample of string\nspanning multiple lines\nusing 
heredoc syntax.\nEOD;\n"
+   "Multi-line HEREDOC string outside assignment")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n/**\n * @var string\n */\necho 'was here';\n"
+   "Statement after doc-comment")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n/** @define _SYSTEM_START_TIME_     Startup time for system 
*/\ndefine('_SYSTEM_START_TIME_', microtime(true));\necho 'statement';\n"
+   "Statement after a define() with a doc-comment")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nfunction myFunction($parameters = null)\n{\n    echo 
'statement';\n}\n"
+   "Statement after one-lined function declaration with optional argument")
+
+  (phps-mode-test-indent--should-equal
+   "<?php if (true) { ?>\n    <?php echo 'here'; ?>\n<?php } ?>"
+   "Regular if-expression but inside scripting tags")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\ndo {\n    echo 'true';\n} while ($number > 0\n    && $letter > 
0\n);"
+   "Do while loop with multi-line condition")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\ndo {\n    echo 'true';\n} while ($number > 0\n    && $letter > 
0\n);"
+   "Do while loop with multi-line condition")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$myVar = 'blaha'\n    . 'ijeije' . __(\n        'okeoke'\n    ) . 
'okeoke';\n?>"
+   "Concatenated assignment string with function call")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$myVar = 'blaha'\n    . 'ijeije' . __(\n        'okeoke'\n    )\n   
 . 'okeoke';\n?>"
+   "Concatenated assignment string with function call")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho 'blaha'\n    . 'ijeije' . __(\n        'okeoke'\n    ) . 
'okeoke';\n?>"
+   "Concatenated echo string with function call")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\necho 'blaha'\n    . 'ijeije' . __(\n        'okeoke'\n    )\n    . 
'okeoke';\n?>"
+   "Concatenated echo string with function call")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$options = [\n    0 => [\n        'label' => __('No'),\n        
'value' => 0,\n    ],\n];"
+   "Assignment with square bracketed array")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$options = array(\n    'blaha' .\n        'blaha',\n    123,\n    
'blaha'\n);"
+   "Assignment with square bracketed array")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nreturn $variable\n    && $variable;"
+   "Multi-line return statement")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$options = myFunction(\n    array(array(\n        'options' => 
123\n    ))\n);"
+   "Assignment with double-dimensional array with double arrow assignment 
inside function call")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nswitch ($condition) {\n    case 34:\n        if ($item['Random'] % 
10 == 0) {\n            $attributes['item'] = ($item['IntegerValue'] / 10);\n   
     } else {\n            $attributes['item'] =\n                
number_format(($item['IntegerValue'] / 10), 1, '.', '');\n        }\n        
break;\n}\n"
+   "Switch case with conditional modulo expression")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$options = array(\n    'options' => array(array(\n        
'errorTo'\n    ))\n);"
+   "Assignment with three-dimensional array with double arrow assignment")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif ($myCondition) {\n    $myObject->myMethod(myClass::class)\n      
  ->myMethod2($myArgument2);\n    }"
+   "Object-oriented file with bracket-less namespace with multiple levels, 
class that extends and implements and functions with optional arguments")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$myObj->myFunction()\n    ->mySecondaryFunction();"
+   "Indentation of chained class method calls outside of assignments and 
conditionals")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n\n$myVar = $myClass->meMethod()\n    ->mySecondMethod()\n    
->myThirdMethod()\n->myFourthFunction(\n    $myVariable\n);"
+   "Indentation for chained object operators in assignment with method call 
with arguments")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n\n$myResult = !empty($myVar->myMethod3)\n    && $myVar->myMethod\n  
      && $myVar->myMethod2;\n"
+   "Indentation for chained object operators in assignment")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$array = [\n    'second' => [\n        'hello' => true\n        
]\n];\n\n$array = array(\n    'second' => array(\n        'third' => true\n     
   )\n);"
+   "Indent multi-dimensional arrays without trailing commas")
+
+  (phps-mode-test-indent--should-equal
+   "<html>\n    <head>\n        <?php echo $title; ?>\n    </head>\n    
<body>\n    <?php\n\n    if ($myTest) {\n        doSomething();\n    }\n\n    
?>\n    </body>\n</html>"
+   "A mixed HTML and PHP file.")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n\n    if ($fullInfo) $fullInfo = unserialize ($fullInfo);\n    else 
array();\n\n"
+   "Indentation for single-line inline control structures.")
+
+  (phps-mode-test-indent--should-equal
+   "<?php
\n\nif (true) {\n    // Was here\n}"
+   "If condition after a mixed newline encoded file")
+
+  )
+
+(defun phps-mode-test-indent--get-lines-indent-psr-2 ()
+  "Test PSR-2 examples from: https://www.php-fig.org/psr/psr-2/.";
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace Vendor\\Package;\n\nuse FooInterface;\nuse BarClass as 
Bar;\nuse OtherVendor\\OtherPackage\\BazClass;\n\nclass Foo extends Bar 
implements FooInterface\n{\n    public function sampleMethod($a, $b = null)\n   
 {\n        if ($a === $b) {\n            bar();\n        } elseif ($a > $b) 
{\n            $foo->bar($arg1);\n        } else {\n            
BazClass::bar($arg2, $arg3);\n        }\n    }\n\n    final public static 
function bar()\n    {\n        // method body\n   [...]
+   "PSR-2 : 1.1. Example")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace Vendor\\Package;\n\nuse FooClass;\nuse BarClass as 
Bar;\nuse OtherVendor\\OtherPackage\\BazClass;\n\n// ... additional PHP code 
..."
+   "PSR-2 : 3. Namespace and Use Declarations")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace Vendor\\Package;\n\nuse FooClass;\nuse BarClass as 
Bar;\nuse OtherVendor\\OtherPackage\\BazClass;\n\nclass ClassName extends 
ParentClass implements \\ArrayAccess, \\Countable\n{\n    // constants, 
properties, methods\n}"
+   "PSR-2 : 4.1. Extends and Implements : Example 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace Vendor\\Package;\n\nuse FooClass;\nuse BarClass as 
Bar;\nuse OtherVendor\\OtherPackage\\BazClass;\n\nclass ClassName extends 
ParentClass implements\n    \\ArrayAccess,\n    \\Countable,\n    
\\Serializable\n{\n    // constants, properties, methods\n}"
+   "PSR-2 : 4.1. Extends and Implements : Example 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace Vendor\\Package;\n\nclass ClassName\n{\n    public $foo = 
null;\n}"
+   "PSR-2 : 4.2. Properties")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace Vendor\\Package;\n\nclass ClassName\n{\n    public 
function fooBarBaz($arg1, &$arg2, $arg3 = [])\n    {\n        // method body\n  
  }\n}"
+   "PSR-2 : 4.3. Methods")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace Vendor\\Package;\n\nclass ClassName\n{\n    public 
function foo($arg1, &$arg2, $arg3 = [])\n    {\n        // method body\n    
}\n}"
+   "PSR-2 : 4.4. Method Arguments : Example 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace Vendor\\Package;\n\nclass ClassName\n{\n    public 
function aVeryLongMethodName(\n        ClassTypeHint $arg1,\n        &$arg2,\n  
      array $arg3 = []\n    ) {\n        // method body\n    }\n}"
+   "PSR-2 : 4.4. Method Arguments : Example 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace Vendor\\Package;\n\nabstract class ClassName\n{\n    
protected static $foo;\n\n    abstract protected function zim();\n\n    final 
public static function bar()\n    {\n        // method body\n    }\n}"
+   "PSR-2 ; 4.5. abstract, final, and static")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nbar();\n$foo->bar($arg1);\nFoo::bar($arg2, $arg3);"
+   "PSR-2 : 4.6. Method and Function Calls : Example 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$foo->bar(\n    $longArgument,\n    $longerArgument,\n    
$muchLongerArgument\n);"
+   "PSR-2 : 4.6. Method and Function Calls : Example 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif ($expr1) {\n    // if body\n} elseif ($expr2) {\n    // elseif 
body\n} else {\n    // else body;\n}"
+   "PSR-2 : 5.1. if, elseif, else")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nswitch ($expr) {\n    case 0:\n        echo 'First case, with a 
break';\n        break;\n    case 1:\n        echo 'Second case, which falls 
through';\n        // no break\n    case 2:\n    case 3:\n    case 4:\n        
echo 'Third case, return instead of break';\n        return;\n    default:\n    
    echo 'Default case';\n        break;\n}"
+   "PSR-2 : 5.2. switch, case")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nwhile ($expr) {\n    // structure body\n}"
+   "PSR-2 : 5.3. while, do while : Example 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\ndo {\n    // structure body;\n} while ($expr);"
+   "PSR-2 : 5.3. while, do while : Example 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nfor ($i = 0; $i < 10; $i++) {\n    // for body\n}"
+   "PSR-2 : 5.4. for")
+  
+  (phps-mode-test-indent--should-equal
+   "<?php\nforeach ($iterable as $key => $value) {\n    // foreach body\n}"
+   "PSR-2 : 5.5. foreach")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\ntry {\n    // try body\n} catch (FirstExceptionType $e) {\n    // 
catch body\n} catch (OtherExceptionType $e) {\n    // catch body\n}"
+   "PSR-2 : 5.6. try, catch")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$closureWithArgs = function ($arg1, $arg2) {\n    // 
body\n};\n\n$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, 
$var2) {\n    // body\n};"
+   "PSR-2 : 6. Closures : Example 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$longArgs_noVars = function (\n    $longArgument,\n    
$longerArgument,\n    $muchLongerArgument\n) {\n    // 
body\n};\n\n$noArgs_longVars = function () use (\n    $longVar1,\n    
$longerVar2,\n    $muchLongerVar3\n) {\n    // body\n};\n\n$longArgs_longVars = 
function (\n    $longArgument,\n    $longerArgument,\n    
$muchLongerArgument\n) use (\n    $longVar1,\n    $longerVar2,\n    
$muchLongerVar3\n) {\n    // body\n};\n\n$longArgs_shortVars = function (\n    
$longArgument,\n [...]
+   "PSR-2 : 6. Closures : Example 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$foo->bar(\n    $arg1,\n    function ($arg2) use ($var1) {\n        
// body\n    },\n    $arg3\n);"
+   "PSR-2 : 6. Closures : Example 3")
+
+  )
+
+(defun phps-mode-test-indent--get-lines-indent-multi-line-assignments ()
+  "Test for multi-line assignments."
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$variable = array(\n    'random4'\n);\n$variable = true;\n"
+   "Array assignment on three lines")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$variable = array(\n    'random4' =>\n        'hello'\n);"
+   "Array assignment with double arrow elements on four lines")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$variable = array(\n    'random4');\n$variable = true;\n"
+   "Array assignment on two lines")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$var = 'A line' .\n    'more text here' .\n    'last line here';"
+   "Concatenated single-quoted-string multiple-lines in assignment")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$var .=\n    'A line';"
+   "Concatenated equal single-quoted-string on multiple-lines in assignment")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$var *=\n    25;"
+   "Multiplication equal assignment on multiple-lines")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$str = <<<EOD\nExample of string\nspanning multiple lines\nusing 
heredoc syntax.\nEOD;\n"
+   "Multi-line HEREDOC string in assignment")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$var =\n    500 .\n    \"200\" .\n    100.0 .\n    '200' .\n    
$this->getTail()\n    ->getBottom();"
+   "Multi-line assignments")
+
+  )
+
+(defun phps-mode-test-indent--get-lines-indent-inline-if ()
+  "Test for inline if indentations."
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (true)\n    echo 'Something';\nelse\n    echo 'Something 
else';\necho true;\n"
+   "Inline control structures if else")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (true)\n    echo 'Something';\nelse if (true)\n    echo 
'Something else';\necho true;\n"
+   "Inline control structures if else if")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nwhile (true)\n    echo 'Something';"
+   "Inline control structures while")
+
+  )
+
+(defun phps-mode-test-indent--get-lines-indent-alternative-if ()
+  "Test for alternative if indentations."
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (true):\n    echo 'Something';\nelseif (true):\n    echo 
'Something';\nelse:\n    echo 'Something else';\n    echo 'Something else 
again';\nendif;\necho true;\n"
+   "Alternative control structures")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (true):\n    echo 'Something';\nelseif (true\n    && true\n):\n  
  echo 'Something';\nelse:\n    echo 'Something else';\n    echo 'Something 
else again';\nendif;\necho true;\n"
+   "Alternative control structures with multi-line elseif 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (true):\n    echo 'Something';\nelseif (true\n    && true):\n    
echo 'Something';\nelse:\n    echo 'Something else';\n    echo 'Something else 
again';\nendif;\necho true;\n"
+   "Alternative control structures with multi-line elseif 2")
+
+  )
+
+(defun phps-mode-test-indent--get-lines-indent-classes ()
+  "Test for class indent."
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace myNamespace\n{\n    class myClass\n    {\n        public 
function myFunction()\n        {\n            echo 'my statement';\n        }\n 
   }\n}\n"
+   "Regular PHP with namespaces, classes and functions")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nnamespace myNamespace\n{\n    class myClass {\n        public 
function myFunction()\n        {\n            echo 'my statement';\n        }\n 
   }\n}\n"
+   "Regular PHP with namespaces, classes and functions")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nclass MyClass extends MyAbstract implements\n    myInterface,\n    
myInterface2\n{\n}\n"
+   "Class multi-line implements")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nclass MyClass\n    extends MyAbstract\n    implements myInterface, 
myInterface2\n{\n}\n"
+   "Class multi-line extends and implements")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n/**\n *\n */\nnamespace Aomebo\n{\n    /**\n     *\n     */\n    
class Base\n    {\n    }\n}\n"
+   "Namespace and class with doc-comments")
+
+  )
+
+(defun phps-mode-test-indent--get-lines-indent-if ()
+  "Test for multi-line if expressions."
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (\n    true\n    && true\n) {\n    echo 'was here';\n}\n"
+   "If expression spanning multiple lines 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n// Can we load configuration?\nif ($configuration::load(\n    
self::getParameter(self::PARAMETER_CONFIGURATION_INTERNAL_FILENAME),\n    
self::getParameter(self::PARAMETER_CONFIGURATION_EXTERNAL_FILENAME),\n    
self::getParameter(self::PARAMETER_STRUCTURE_INTERNAL_FILENAME),\n    
self::getParameter(self::PARAMETER_STRUCTURE_EXTERNAL_FILENAME)\n)) {\n    echo 
'was here';\n}\n"
+   "If expression spanning multiple lines 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (true) {\n    if ($configuration::load(\n        
self::getParameter(self::PARAMETER_CONFIGURATION_INTERNAL_FILENAME),\n        
self::getParameter(self::PARAMETER_CONFIGURATION_EXTERNAL_FILENAME),\n        
self::getParameter(self::PARAMETER_STRUCTURE_INTERNAL_FILENAME),\n        
self::getParameter(self::PARAMETER_STRUCTURE_EXTERNAL_FILENAME))\n    ) {\n     
   echo 'was here';\n    }\n}\n"
+   "If expression spanning multiple lines 3")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (myFunction(true)\n) {\n    echo 'was here';\n}\n"
+   "If expression spanning multiple lines 4")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (myFunction(\n    true)\n) {\n    echo 'was here';\n}\n"
+   "If expression spanning multiple lines 5")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (true) {\n    if (myFunction(\n        true)\n    ) {\n        
echo 'was here';\n    }\n}\n"
+   "Nested if expression spanning multiple lines 6")
+
+  (phps-mode-test-indent--should-equal
+   "<html><head><title><?php if ($myCondition) {\n    if ($mySeconCondition) 
{\n        echo $title2;\n        \n    } ?></title><body>Bla bla</body></html>"
+   "Mixed HTML/PHP with if expression and token-less lines")
+
+  (phps-mode-test-indent--should-equal
+   "<html><head><title><?php\nif ($myCondition) {\n    if ($mySecondCondition) 
{\n        echo $title;\n    } else if ($mySecondCondition) {\n        echo 
$title4;\n    } else {\n        echo $title2;\n        echo $title3;\n    }\n} 
?></title><body>Bla bla</body></html>"
+   "Mixed HTML/PHP with if expression 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (myFirstCondition()) {\n    $this->var = 'abc123';\n} else {\n   
 $this->var = 'def456';\n}\n"
+   "Regular else expression indent calculation")
+
+  )
+
+(defun phps-mode-test-indent--get-lines-indent-switch-case ()
+  "Test for switch-case indentation."
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nswitch ($condition) {\n    case true:\n        echo 'here';\n       
 echo 'here 2';\n    case false:\n        echo 'here 4';\n    default:\n        
echo 'here 3';\n}\n"
+   "Switch, case, default")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nswitch ($condition):\n    case true:\n        echo 'here';\n        
echo 'here 2';\n    case false:\n        echo 'here 4';\n    default:\n        
echo 'here 3';\nendswitch;\n"
+   "Switch, case, default with alternative control structure")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (true) {\n    switch ($condition):\n        case true:\n         
   echo 'here';\n            echo 'here 2';\n        case false:\n            
echo 'here 4';\n        default:\n            echo 'here 3';\n    endswitch;\n  
  sprintf(__(\n        'Error: %s',\n        $error\n    ));\n}\n"
+   "Alternative switch, case, default with exception after it")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (true) {\n    switch ($condition) {\n        case true:\n        
    echo 'here';\n            echo 'here 2';\n        case false:\n            
echo 'here 4';\n        default:\n            echo 'here 3';\n    }\n    
sprintf(__(\n        'Error: %s',\n        $error\n    ));\n}\n"
+   "Curly switch, case, default with exception after it")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$product_path = \"${filename[0]}/${filename[1]}/\";\necho 'here';\n"
+   "Double-quoted string with multiple indexed variables in it")
+
+  )
+
+(defun phps-mode-test-indent--indent-line ()
+  "Test for indentation."
+
+  ;; Curly bracket tests
+  (phps-mode-test-indent--should-equal
+   "<html><head><title><?php if ($myCondition) {\nif ($mySeconCondition) {\n   
 echo $title;\n\n} ?></title><body>Bla bla</body></html>"
+   "Curly bracket test")
+
+  (phps-mode-test-indent--should-equal
+   "<html><head><title><?php if ($myCondition) {\nif ($mySeconCondition) 
{\necho $title2;\n\n} ?></title><body>Bla bla</body></html>"
+   "Curly bracket test 3")
+
+  (phps-mode-test-indent--should-equal
+   "<html><head><title><?php if ($myCondition) {\nif ($mySeconCondition) 
{\necho $title3;\n\n}\n?>\n</title><body>Bla bla</body></html>"
+   "Curly bracket test 4")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$variable = array(\n'random3'\n);\n$variable = true;\n"
+   "Assignment test 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$variable = array(\n    'random2'\n    );\n$variable = true;\n"
+   "Assignment test 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n/**\n* My first line\n* My second line\n**/\n"
+   "Doc-comment test 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n/**\n* My first line\n* My second line\n**/\n"
+   "Doc-comment test 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n/**\n* My first line\n* My second line\n**/\n"
+   "Doc-comment test 3")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$variable = array(\n  'random4');\n$variable = true;\n"
+   "Round bracket test 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nadd_filter(\n\"views_{$screen->id}\",'__return_empty_array'\n);"
+   "Round bracket test 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (random_expression(\ntrue\n)) {\nsome_logic_here();\n}"
+   "Round bracket test 3")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (empty(\n$this->var\n) && !empty($this->var)\n) {\n$this->var = 
'abc123';\n}\n"
+   "Nested if-expression")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (myFirstCondition()) {\n    $this->var = 'abc123';\n    } else 
{\n    $this->var = 'def456';\n}\n"
+   "Regular else expression")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (myFirstCondition()) {\n    $this->var = 'abc123';\n    } else 
if (mySeconCondition()) {\n    $this->var = 'def456';\n}\n"
+   "Regular else if test")
+
+  ;; Square bracket
+  (phps-mode-test-indent--should-equal
+   "<?php\n$var = [\n    'random' => [\n        'hello',\n],\n];\n"
+   "Square bracket test 1")
+  
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (myRandomCondition()):\necho 'Something here';\n    else:\n    
echo 'Something else here 8';\nendif;\n"
+   "Alternative else test")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nswitch (myRandomCondition()) {\ncase 'Something here':\necho 
'Something else here';\n}\n"
+   "Switch case indentation test")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nswitch (myRandomCondition()): \ncase 'Something here':\necho 
'Something else here';\nendswitch;\n"
+   "Alternative switch case indentation test 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (myRandomCondition())\necho 'Something here';\necho 'Something 
else here';\n"
+   "Inline control structure indentation")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (myRandomCondition())\n    echo 'Something here';\n    echo 
'Something else here';\n"
+   "Inline control structure indentation 2")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (myRandomCondition()):\necho 'Something here';\n    echo 
'Something else here';\nendif;\n"
+   "Alternative control structure indentation 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nmyFunction(\n    array(\n        'random' => 'abc',\n        ),\n   
 $var5\n);\n"
+   "Function arguments with associate array indentation")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$var = $var2->getHead()\n->getTail();\n"
+   "Multi-line assignment indentation test 1")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n$var =\n'random string';\n"
+   "Single-line assignment indentation test")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (empty($this->var)):\n$this->var = 'abc123';\n    endif;"
+   "Alternative control structure if expression")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif (empty($this->var)):\n$this->var = 'abc123';\nendif;"
+   "Alternative control structure test")
+
+  (phps-mode-test-indent--should-equal
+   "<html>\n<head>\n<title><?php echo $title; 
?></title>\n</head>\n<body>\n<div class=\"contents\"><?php echo $body; 
?></div>\n</body>\n</html>"
+   "A mixed HTML and PHP file, each PHP command is inside HTML markup")
+
+  (phps-mode-test-indent--should-equal
+   "<html>\n<head>\n<title><?php echo $title; ?></title>\n</head>\n<body 
class=\"<?php echo $class; ?>\">\n<div class=\"contents\"><?php echo $body; 
?></div>\n</body>\n</html>"
+   "A mixed HTML and PHP file, each PHP command is inside HTML markup, one PHP 
inside markup tag")
+
+  (phps-mode-test-indent--should-equal
+   "<html>\n    <head>\n        <title><?php $myTitle; ?></title>\n    
</head>\n    <body>\n        <?php echo 'test'; ?>\n        <h1>My title</h1>\n 
       <?php if ($myTest): ?>\n        <div>\n            A lot of other 
stuff.\n        </div>\n        <?php endif; ?>\n    </body>\n</html>"
+   "Indent mixed HTML and one-line PHP lines.")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\nif ($here) {\n    $var = \"abc $b[abc] def\";\n// Was here\n}\n\n"
+   "Indentation after line with square brackets inside double quoted string")
+
+  (phps-mode-test-indent--should-equal
+   "<?php\n\n// Adjust days to delivery accorind to document\nswitch 
($dayOfWeek)\n{\n    case 1: // Monday\n    case 2: // Tuesday\n    case 3: // 
Wednesday\n    case 7: // Sunday\n        $daysToDelivery = 3;\n        
break;\n    case 4: // Thursday\n    case 5: // Friday\n        $daysToDelivery 
= 5;\n        break;\n    case 6: // Saturday\n        $daysToDelivery = 4;\n   
     break;\n    default:\n        throw new \Exception(sprintf(\n            
'day of week above interval (1-7): [...]
+   "Switch case with default case and trailing comments")
+
+  (phps-mode-test--with-buffer
+   "<?php\nif ($myCondition) {\necho 'I was here';\n}"
+   "Alternative indentation inside if block"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif ($myCondition) {\n    echo 'I was here';\n}"))))
+
+  (phps-mode-test--with-buffer
+   "<?php\nif ($myCondition) {\necho 'I was here';\necho 'I was here 
again';\n}"
+   "Alternative indentation on closing if block"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif ($myCondition) {\n    echo 'I was here';\n    echo 'I 
was here again';\n}"))))
+
+  (phps-mode-test--with-buffer
+   "<?php\nif ($test) {\nif ($test2) {\n\n}\n}"
+   "Alternative indentation on nested if block with empty contents"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif ($test) {\n    if ($test2) {\n        \n    }\n}"))))
+
+  (phps-mode-test--with-buffer
+   "<?php\nif ($test) {\nif ($test2) {\n\n}\n\n}"
+   "Alternative indentation on multiple closing brackets"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif ($test) {\n    if ($test2) {\n        \n    }\n    
\n}"))))
+
+  (phps-mode-test--with-buffer
+   "<?php\nif ($test) {\n\n} else if ($test) {\n\n}\n"
+   "Alternative indentation on elseif block"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif ($test) {\n    \n} else if ($test) {\n    \n}\n"))))
+
+  (phps-mode-test--with-buffer
+   "if ($true) {\nif ($true) {\n}\n}"
+   "Alternative indentation on closing bracket inside parent bracket"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "if ($true) {\n    if ($true) {\n    }\n}"))))
+
+  (phps-mode-test--with-buffer
+   "/**\n*\n*/"
+   "Alternative indentation on last line of doc comment block"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "/**\n *\n */"))))
+
+  (phps-mode-test--with-buffer
+   "    $var = 'abc';\n        // Comment"
+   "Alternative indentation on single-line assignment"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "$var = 'abc';\n// Comment"))))
+
+  (phps-mode-test--with-buffer
+   "$var =\n'abc';\n$var =\n'abc'\n. 'def';\n// Comment\n"
+   "Alternative indentation on multi-line assignment"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "$var =\n    'abc';\n$var =\n    'abc'\n    . 'def';\n// 
Comment\n"))))
+
+  (phps-mode-test--with-buffer
+   "<?php\nif ($here) {\nif ($wasHere)\n{\n\n}\n}\n\n"
+   "Alternative indentation on line after condition"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif ($here) {\n    if ($wasHere)\n    {\n        \n    
}\n}\n\n"))))
+
+  (phps-mode-test--with-buffer
+   "<?php\nif ($myCondition)\n{\n$var = array(\n'was here'\n);\n// Was 
here\n}\n"
+   "Alternative indentation on line after array declaration"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif ($myCondition)\n{\n    $var = array(\n        'was 
here'\n    );\n    // Was here\n}\n"
+              ))))
+
+  (phps-mode-test--with-buffer
+   "<?php\nif ($myCondition == 2) {\necho 'store_vars: <pre>' . 
print_r($store_vars, true) . '</pre>';\necho 'search_ids: <pre>' . 
print_r($search_ids, true) . '</pre>';\n}"
+   "Alternative indentation on line echo"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif ($myCondition == 2) {\n    echo 'store_vars: <pre>' . 
print_r($store_vars, true) . '</pre>';\n    echo 'search_ids: <pre>' . 
print_r($search_ids, true) . '</pre>';\n}"
+              ))))
+
+  (phps-mode-test--with-buffer
+   "<?php\nif (is_array(\n$array\n)) {\necho 'was here';\n}"
+   "Alternative indentation after trailing opening bracket while closing two 
earlier on line"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif (is_array(\n    $array\n)) {\n    echo 'was here';\n}"
+              ))))
+
+  (phps-mode-test--with-buffer
+   "<?php\n\n$var = array(\n'123' =>\n'def',\n);"
+   "Alternative indentation on lines after lines ending with T_DOUBLE_ARROW"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\n\n$var = array(\n    '123' =>\n        'def',\n);"
+              ))))
+
+  (phps-mode-test--with-buffer
+   "<?php\n$var = array(\n'123' => true,\n\n);"
+   "Alternative indentation after comma ended double arrow assignment"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\n$var = array(\n    '123' => true,\n    \n);"
+              ))))
+
+  (phps-mode-test--with-buffer
+   "<?php\nfunction myFunction(\n$arg = true,\n$arg2 = false\n) {\n\n}"
+   "Line after function argument with default value"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nfunction myFunction(\n    $arg = true,\n    $arg2 = 
false\n) {\n    \n}"
+              ))))
+
+  (phps-mode-test--with-buffer
+   "$random = get_post_meta(\n                $postId,\n            '_random', 
// TODO Here\n            true // TODO Here\n        );"
+   "Line in multi-line function call"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "$random = get_post_meta(\n    $postId,\n    '_random', // TODO 
Here\n    true // TODO Here\n);"
+              ))))
+
+  (phps-mode-test--with-buffer
+   "$cartPrice = round(\n    $cartPrice,\n2 // TODO Here\n);"
+   "Assignment with multi-line function call"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "$cartPrice = round(\n    $cartPrice,\n    2 // TODO Here\n);"
+              ))))
+
+  (phps-mode-test--with-buffer
+   "$applications =\n    $transaction->getResponseBodyDecoded();\n    // TODO 
Here\n"
+   "Line after multi-line assignment with object-operator"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "$applications =\n    
$transaction->getResponseBodyDecoded();\n// TODO Here\n"
+              ))))
+
+  (phps-mode-test--with-buffer
+   "<?php\necho '<dl><dt>' . __('Data', 'something')\n    . ':</dt><dd><pre>' 
. print_r($decodedData, true) . '</pre></dd></dl>';\necho '<div class=\"meta 
actions\">';\n"
+   "Two echo statements, one spans two lines"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\necho '<dl><dt>' . __('Data', 'something')\n    . 
':</dt><dd><pre>' . print_r($decodedData, true) . '</pre></dd></dl>';\necho 
'<div class=\"meta actions\">';\n    "
+              ))))
+
+  (phps-mode-test--with-buffer
+   "<?php\nif ($shippingMethod->id ===\n        \\MyClass::METHOD_ID\n    ) 
{\n"
+   "Multi-line if statement testing equality in two lines"
+   (phps-mode-test-indent--indent-whole-buffer)
+   (let ((buffer-contents (buffer-substring-no-properties (point-min) 
(point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif ($shippingMethod->id ===\n    \\MyClass::METHOD_ID\n) 
{\n    "
+              ))))
+
+  (phps-mode-test--with-buffer
+   ""
+   "Multi-line if block after opening parenthesis"
+   (execute-kbd-macro "<?php")
+   (execute-kbd-macro (kbd "<return>"))
+   (execute-kbd-macro "if (true) {")
+   (execute-kbd-macro (kbd "<return>"))
+   (execute-kbd-macro "if (")
+   (execute-kbd-macro (kbd "<return>"))
+   (let ((buffer-contents
+          (buffer-substring-no-properties
+           (point-min)
+           (point-max))))
+     (should (equal
+              buffer-contents
+              "<?php\nif (true) {\n    if (\n        \n    )\n}"
+              ))))
+
+  )
+
+(defun phps-mode-test-indent ()
+  "Run test for functions."
+  ;; (setq debug-on-error t)
+  (phps-mode-test-indent--get-lines-indent-if)
+  (phps-mode-test-indent--get-lines-indent-classes)
+  (phps-mode-test-indent--get-lines-indent-inline-if)
+  (phps-mode-test-indent--get-lines-indent-alternative-if)
+  (phps-mode-test-indent--get-lines-indent-multi-line-assignments)
+  (phps-mode-test-indent--get-lines-indent-switch-case)
+  (phps-mode-test-indent--get-lines-indent-psr-2)
+  (phps-mode-test-indent--get-lines-indent)
+  (phps-mode-test-indent--indent-line))
+
+(phps-mode-test-indent)
+
+(provide 'phps-mode-test-indent)
+
+;;; phps-mode-test-indent.el ends here



reply via email to

[Prev in Thread] Current Thread [Next in Thread]