packages feed

structured-haskell-mode-1.0.4: elisp/shm-tests.el

;;; shm.el --- Tests for structured-haskell-mode

;; Copyright (c) 2013 Chris Done. All rights reserved.

;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.

;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with this program.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; A big list of tests.

;;; Code:

(defvar shm-tests-that-dont-run-in-batch-mode
  (list
   (list :name "swinging-expr-yanking"
         :start-buffer-content "main = do
  x
  z
  y

foo = undefined
"
         :start-cursor 8
         :finish-cursor 17
         :current-node-overlay '(17 31)
         :end-buffer-content "main = a

foo = do
  x
  z
  y
"
         :kbd [134217739 97 1 14 14 6 6 6 6 6 6 delete 25])
   (list :name "yanking"
         :start-buffer-content "main = (case undefined of
          _ -> undefined
       ,putStrLn (if undefined
                     then undefined
                     else undefined)
       ,23 * 45)
"
         :start-cursor 9
         :finish-cursor 9
         :current-node-overlay '(9 11)
         :end-buffer-content "main = (23 * 45
       ,putStrLn (if undefined
                     then undefined
                     else undefined)
       ,case undefined of
          _ -> undefined)
"
         :kbd "\371\371\371\371\371\371")))

(defvar shm-tests
  (list
   (list :name "don't re-indent dependent rhs"
         :start-buffer-content "foo bar baz =
     bar + baz
"
         :start-cursor 4
         :finish-cursor 9
         :current-node-overlay '(1 9)
         :end-buffer-content "foohello bar baz =
     bar + baz
"
         :kbd "hello")
   (list :name "add-initial-type-constraint"
         :start-buffer-content "fn :: a -> b
"
         :start-cursor 13
         :finish-cursor 7
         :current-node-overlay '(7 12)
         :end-buffer-content "fn ::  => a -> b
"
         :kbd [41 134217848 115 104 109 47 109 111 100 tab return])

   (list :name "add-additional-type-constraint-no-parens"
         :start-buffer-content "fn :: Eq a => a -> a
"
         :start-cursor 21
         :finish-cursor 14
         :current-node-overlay '(11 15)
         :end-buffer-content "fn :: (Eq a, ) => a -> a
"
         :kbd [41 41 134217848 115 104 109 47 109 111 tab return])

   (list :name "add-addtional-type-constraint-parens"
         :start-buffer-content "fn :: (Ord s, Eq a, Monad m) => StateT s m a
"
         :start-cursor 45
         :finish-cursor 30
         :current-node-overlay '(27 30)
         :end-buffer-content "fn :: (Ord s, Eq a, Monad m, ) => StateT s m a
"
         :kbd [41 41 134217848 115 104 109 47 109 111 tab return])

   (list :name "newline-indent-type-sig-arrows"
         :start-buffer-content "outputWith :: Show a => String -> String -> String -> IO ()
"
         :start-cursor 22
         :finish-cursor 56
         :current-node-overlay '(37 84)
         :end-buffer-content "outputWith :: Show a \n           => String \n           -> String -> String -> IO ()
"
         :kbd "
\346
")
   (list :name "newline-indent-type-sig"
         :start-buffer-content "outputWith :: String -> String -> String -> IO ()
"
         :start-cursor 25
         :finish-cursor 40
         :current-node-overlay '(40 46)
         :end-buffer-content "outputWith :: String -> \n              String -> String -> IO ()
"
         :kbd "
")
   (list :name "qualify-import"
         :start-buffer-content "import qualified Data.Conduit.List as CL
"
         :start-cursor 31
         :finish-cursor 31
         :current-node-overlay '(18 35)
         :end-buffer-content "import qualified Data.Conduit.List as CL
"
         :kbd "")
   (list :name "split-list"
         :start-buffer-content "main = print [foo,bar,mu]
"
         :start-cursor 19
         :finish-cursor 21
         :current-node-overlay '(21 24)
         :end-buffer-content "main = print [foo] [bar,mu]
"
         :kbd [134217848 115 104 109 47 115 112 108 105 116 45 108 105 115 116 return])
   (list :name "wrap-delimiters"
         :start-buffer-content "main = do bar
          mu
          zot
"
         :start-cursor 8
         :finish-cursor 9
         :current-node-overlay '(9 44)
         :end-buffer-content "main = [do bar
           mu
           zot]
"
         :kbd [201326624 91])
   (list :name "move-by-paragraphs"
         :start-buffer-content "clockOut config project task reason = foo
-- | Clock in or out.
clock :: Config -> Entry -> IO ()

"
         :start-cursor 1
         :finish-cursor 1
         :current-node-overlay '(1 9)
         :end-buffer-content "clockOut config project task reason = foo
-- | Clock in or out.
clock :: Config -> Entry -> IO ()

"
         :kbd "\375\375\375\375\375\373\373\373\373\373")
   (list :name "skip-trailing-comments"
         :start-buffer-content "foo = do foo
         let bar = 23
             bob = 23
         -- bar
         -- test
         bar

"
         :start-cursor 23
         :finish-cursor 57
         :current-node-overlay '(55 57)
         :end-buffer-content "foo = do foo
         let bar = 23
             bob = 23
         -- bar
         -- test
         bar

"
         :kbd "\206")
   (list :name "kill-with-whitespace"
         :start-buffer-content "foo = 123

bar = 123

mu = 123

"
         :start-cursor 11
         :finish-cursor 22
         :current-node-overlay '(22 25)
         :end-buffer-content "foo = 123

mu = 123

bar = 123

"
         :kbd [67108896 14 5 23 4 14 5 return return 25])
   (list :name "space-reindent"
         :start-buffer-content "main = do let x = 123
          undefined

"
         :start-cursor 5
         :finish-cursor 6
         :current-node-overlay '(1 6)
         :end-buffer-content "main  = do let x = 123
           undefined

"
         :kbd " ")
   (list :name "goto-parent"
         :end-buffer-content "main = x
"
         :start-cursor 9
         :finish-cursor 6
         :current-node-overlay '(6 9)
         :start-buffer-content "main = x
"
         :kbd "\341")
   (list :name "goto-parent-in-do-notation"
         :end-buffer-content "main = do return ()
          print ()
"
         :start-cursor 39
         :finish-cursor 8
         :current-node-overlay '(8 39)
         :start-buffer-content "main = do return ()
          print ()
"
         :kbd "\341\341")
   (list :name "goto-parent-end"
         :end-buffer-content "main = return ()
"
         :start-cursor 16
         :finish-cursor 17
         :current-node-overlay '(8 17)
         :start-buffer-content "main = return ()
"
         :kbd ")")
   (list :name "goto-parent-in-function-application"
         :start-buffer-content "main = foo bar mu zot
"
         :start-cursor 19
         :finish-cursor 8
         :current-node-overlay '(8 22)
         :end-buffer-content "main = foo bar mu zot
"
         :kbd "\341")
   (list :name "newline-indent-in-do"
         :end-buffer-content "main = do foo bar
          mu zot
"
         :start-cursor 18
         :finish-cursor 35
         :current-node-overlay '(32 35)
         :start-buffer-content "main = do foo bar
"
         :kbd ")
mu zot")
   (list :name "make-string"
         :start-buffer-content "main = putStrLn
"
         :start-cursor 16
         :finish-cursor 18
         :current-node-overlay '(17 19)
         :end-buffer-content "main = putStrLn \"\"
"
         :kbd "\"")
   (list :name "in-string-delete-empty"
         :start-buffer-content "main = putStrLn \"\"
"
         :start-cursor 18
         :finish-cursor 16
         :current-node-overlay 'nil
         :end-buffer-content "main = putStrLn
"
         :kbd [backspace backspace])
   (list :name "open-double-quote"
         :start-buffer-content "main = return"
         :start-cursor 14
         :finish-cursor 16
         :current-node-overlay '(15 17)
         :end-buffer-content "main = return ()"
         :kbd "(")
   (list :name "wrap-parens"
         :start-buffer-content "main = return
"
         :start-cursor 8
         :finish-cursor 9
         :current-node-overlay '(9 15)
         :end-buffer-content "main = (return)
"
         :kbd "\250")
   (list :name "open-bracket"
         :start-buffer-content "main = print
"
         :start-cursor 13
         :finish-cursor 15
         :current-node-overlay '(14 16)
         :end-buffer-content "main = print []
"
         :kbd "[")
   (list :name "delete-parens"
         :start-buffer-content "main = ()"
         :start-cursor 9
         :finish-cursor 8
         :current-node-overlay '(8 8)
         :end-buffer-content "main = "
         :kbd [backspace])
   (list :name "delete-brackets"
         :start-buffer-content "main = []"
         :start-cursor 9
         :finish-cursor 8
         :current-node-overlay '(8 8)
         :end-buffer-content "main = "
         :kbd [backspace])
   (list :name "delete-braces"
         :start-buffer-content "main = {}"
         :start-cursor 9
         :finish-cursor 8
         :current-node-overlay '(8 8)
         :end-buffer-content "main = "
         :kbd [backspace])
   (list :name "open-brace"
         :start-buffer-content "foo = Foo
"
         :start-cursor 10
         :finish-cursor 12
         :current-node-overlay '(7 13)
         :end-buffer-content "foo = Foo {}
"
         :kbd "{")
   (list :name "comma-in-list"
         :start-buffer-content "main = print [foo]
"
         :start-cursor 18
         :finish-cursor 36
         :current-node-overlay '(33 36)
         :end-buffer-content "main = print [foo
             ,bar]
"
         :kbd "
bar")
   (list :name "new-list-item-on-single-line"
         :start-buffer-content "main = print [a,b,c]
"
         :start-cursor 20
         :finish-cursor 36
         :current-node-overlay '(35 36)
         :end-buffer-content "main = print [a,b,c
             ,x]
"
         :kbd "
x")
   (list :name "newline-indent-function-app"
         :start-buffer-content "main = foo bar
"
         :start-cursor 15
         :finish-cursor 30
         :current-node-overlay '(27 30)
         :end-buffer-content "main = foo bar
           zot
"
         :kbd "
zot")
   (list :name "delete-node"
         :start-buffer-content "main = do return ()
"
         :start-cursor 19
         :finish-cursor 17
         :current-node-overlay '(11 17)
         :end-buffer-content "main = do return
"
         :kbd [delete backspace])
   (list :name "kill-line"
         :start-buffer-content "main = do putStrLn (f bar mu)
"
         :start-cursor 21
         :finish-cursor 21
         :current-node-overlay '(20 22)
         :end-buffer-content "main = do putStrLn ()
"
         :kbd "")
   (list :name "kill-line-rest"
         :start-buffer-content "main = do putStrLn
             (foo bar mu)
          case x y z of
            Just p -> x

"
         :start-cursor 56
         :finish-cursor 56
         :current-node-overlay 'nil
         :end-buffer-content "main = do putStrLn
             (foo bar mu)\n          \n"
         :kbd "")
   (list :name "isearch"
         :start-buffer-content "main = do foo
          bar
"
         :start-cursor 11
         :finish-cursor 32
         :current-node-overlay '(29 32)
         :end-buffer-content "main = do foo
          bar bob
"
         :kbd "bar
 bob")
   (list :name "auto-reindentation"
         :start-buffer-content "main = do foo
          bar
"
         :start-cursor 5
         :finish-cursor 3
         :current-node-overlay '(1 3)
         :end-buffer-content "ma = do foo
        bar
"
         :kbd [97 98 99 backspace backspace backspace backspace backspace])
   (list :name "raise"
         :start-buffer-content "main = case x of
         p -> foo (bar bu)
"
         :start-cursor 37
         :finish-cursor 8
         :current-node-overlay '(8 11)
         :end-buffer-content "main = bar bu
"
         :kbd "\341\362\341\362")
   (list :name "splice"
      :start-buffer-content "main = foo (bar)
"
      :start-cursor 13
      :finish-cursor 12
      :current-node-overlay '(12 15)
      :end-buffer-content "main = foo bar
"
      :kbd "\363")
   (list :name "kill-line"
         :start-buffer-content "main = do foo
          bar
          mu
"
         :start-cursor 11
         :finish-cursor 11
         :current-node-overlay '(11 14)
         :end-buffer-content "main = do foo
          bar
          mu
"
         :kbd "")
   (list :name "kill-line-gobble"
         :start-buffer-content "foo = do
  bar mu
      zot
  bob bill
      ben
  lal dat
      bob

"
         :start-cursor 12
         :finish-cursor 12
         :current-node-overlay '(12 15)
         :end-buffer-content "foo = do
  bar mu
      zot
  bob bill
      ben
  lal dat
      bob

"
         :kbd "")
   (list :name "kill-line-case-example"
         :start-buffer-content "parseModulePragma :: ParseMode -> String -> ParseResult (ModulePragma SrcSpanInfo)
parseModulePragma mode code =
  case parseModuleWithMode mode (code ++ \"\\nmodule X where\") of
    ParseOk (Module _ _ [p] _ _) -> return p
    ParseOk _ -> ParseFailed noLoc \"parseModulePragma\"
    ParseFailed x y -> ParseFailed x y
"
         :start-cursor 182
         :finish-cursor 182
         :current-node-overlay '(182 189)
         :end-buffer-content "parseModulePragma :: ParseMode -> String -> ParseResult (ModulePragma SrcSpanInfo)
parseModulePragma mode code =
  case parseModuleWithMode mode (code ++ \"\\nmodule X where\") of
    ParseOk (Module _ _ [p] _ _) -> return p
    ParseOk _ -> ParseFailed noLoc \"parseModulePragma\"
    ParseFailed x y -> ParseFailed x y
"
         :kbd "")
   (list :name "add-operand"
         :start-buffer-content "main = a <|> b <|> c
"
         :start-cursor 14
         :finish-cursor 15
         :current-node-overlay '(14 15)
         :end-buffer-content "main = a <|> x <|> b <|> c
"
         :kbd [67108907 120])
   (list :name "wrapping-parens-reindent"
         :start-buffer-content "main = foo bar
           mu
"
         :start-cursor 8
         :finish-cursor 9
         :current-node-overlay '(9 12)
         :end-buffer-content "main = (foo bar
            mu)
"
         :kbd "\341\250")
   (list :name "copy/paste"
         :start-buffer-content "main = foo (bar mu
                zot)
  where g = y
"
         :start-cursor 12
         :finish-cursor 26
         :current-node-overlay '(26 57)
         :end-buffer-content "main = foo
  where g = y (bar mu
                   zot)
"
         :kbd [11 backspace 14 5 32 25])
   (list :name "auto-insert-type-sig"
         :start-buffer-content "main
"
         :start-cursor 5
         :finish-cursor 10
         :current-node-overlay '(9 10)
         :end-buffer-content "main :: X
"
         :kbd ":X")
   (list :name "slide-over-used-equal"
         :start-buffer-content "main = x
"
         :start-cursor 8
         :finish-cursor 5
         :current-node-overlay '(1 5)
         :end-buffer-content "main = x
"
         :kbd [backspace])
   (list :name "swing-up"
         :start-buffer-content "hai = do
  foo bar
  mu zot
"
         :start-cursor 8
         :finish-cursor 10
         :current-node-overlay '(10 13)
         :end-buffer-content "hai = do foo bar
         mu zot
"
         :kbd "")
   (list :name "pragmas"
         :start-buffer-content "{}
"
         :start-cursor 2
         :finish-cursor 23
         :current-node-overlay 'nil
         :end-buffer-content "{-# LANGUAGE Haskell98 #-}
"
         :kbd "-#")
   (list :name "where-clause"
         :start-buffer-content "fn :: a -> b
fn x = y + y
"
         :start-cursor 19
         :finish-cursor 36
         :current-node-overlay 'nil
         :end-buffer-content "fn :: a -> b
fn x = y + y
  where y
"
         :kbd [?\M-x ?s ?h ?m ?/ ?g ?o ?t ?o ?- ?w ?h ?e ?r ?e return ?y])
   (list :name "where-clause with indentation"
         :start-buffer-content "fn :: a -> b
fn x = y + y
"
         :start-cursor 19
         :finish-cursor 40
         :current-node-overlay 'nil
         :end-buffer-content "fn :: a -> b
fn x = y + y
  where
    y
"
         :kbd [?\M-x ?s ?h ?m ?/ ?g ?o ?t ?o ?- ?w ?h ?e ?r ?e return ?y]
         :customizations
         '((shm-indent-point-after-adding-where-clause t)))))

(provide 'shm-tests)

;;; shm-tests.el ends here