Browse Source

ob-lilypond: test suite, all tests passing

Martyn Jago 8 years ago
parent
commit
dacf18e80a

+ 9 - 8
lisp/ob-lilypond.el

@@ -242,14 +242,15 @@ LINE is the erroneous line"
 FILE-NAME is full path to lilypond file.
 LINENO is the number of the erroneous line"
  
-  (set-buffer (get-buffer-create "temp-buf"))
-  (insert-file-contents (ly-switch-extension file-name ".ly")
-                        nil nil nil t)
-  (if (> lineNo 0)
-      (progn
-        (goto-line lineNo)
-        (buffer-substring (point) (point-at-eol)))
-    nil))
+  (with-temp-buffer
+    (insert-file-contents (ly-switch-extension file-name ".ly")
+			  nil nil nil t)
+    (if (> lineNo 0)
+	(progn
+	  (goto-char (point-min))
+	  (forward-line (- lineNo 1))
+	  (buffer-substring (point) (point-at-eol)))
+      nil)))
     
 (defun ly-attempt-to-open-pdf (file-name &optional test)
   "Attempt to display the generated pdf file

+ 31 - 0
testing/examples/ob-lilypond-broken.ly

@@ -0,0 +1,31 @@
+line 1 
+line 2 
+line 3 
+line 4 
+line 5 
+line 6 
+line 7 
+line 8 
+line 9 
+line 10
+line 11
+line 12
+line 13
+line 14
+line 15
+line 16
+line 17
+line 18
+line 19
+line 20
+line 21
+line 22
+line 23
+line 24
+line 25
+line 26
+line 27
+line 28
+line 29
+line 30
+

+ 39 - 0
testing/examples/ob-lilypond-broken.org

@@ -0,0 +1,39 @@
+* Faulty lilypond org file for test purposes (do not adjust)
+line 2
+line 3
+line 4
+line 5
+line 6
+line 7
+line 8
+line 9
+line 10
+line 11
+line 12
+line 13
+line 14
+line 15
+line 16
+line 17
+line 18
+line 19
+line 20
+line 21
+line 22
+line 23
+line 24
+line 25
+line 26
+line 27
+line 28
+line 29
+line 30
+line 31
+line 32
+line 33
+line 34
+line 35
+line 36
+line 37
+line 38
+line 39

+ 15 - 0
testing/examples/ob-lilypond-test.error

@@ -0,0 +1,15 @@
+Processing `xxx'
+Parsing...
+/path/to/tangled/file/test.ly:25:0: error: syntax error, unexpected \score, expecting '='
+
+\score {
+Interpreting music... [8][16][24][32]
+Preprocessing graphical objects...
+Interpreting music... 
+MIDI output to `xxx'
+Finding the ideal number of pages...
+Fitting music on 2 or 3 pages...
+Drawing systems...
+Layout output to `xxx'
+Converting to `xxx'...
+error: failed files: "/Path/to/tangled/file/test.ly/example.ly"

+ 30 - 0
testing/examples/ob-lilypond-test.ly

@@ -0,0 +1,30 @@
+
+% [[file:~/.emacs.d/martyn/martyn/ob-lilypond/test/test-build/test.org::*LilyPond%2520Version][LilyPond-Version:1]]
+
+\version "2.12.3"
+
+% LilyPond-Version:1 ends here
+
+% [[file:~/.emacs.d/martyn/martyn/ob-lilypond/test/test-build/test.org::*lilypond%2520block%2520for%2520test%2520purposes][lilypond-block-for-test-purposes:1]]
+
+\score {
+  \relative c' {
+    c8 d e f g a b c |
+    b a g f e d c4   |
+  }
+
+% lilypond-block-for-test-purposes:1 ends here
+
+% [[file:~/.emacs.d/martyn/martyn/ob-lilypond/test/test-build/test.org::*lilypond%2520block%2520for%2520test%2520purposes][lilypond-block-for-test-purposes:2]]
+
+\layout {
+  }
+  \midi {
+    \context {
+      \Score
+      tempoWholesPerMinute = #(ly:make-moment 150 4)
+    }
+  }
+}
+
+% lilypond-block-for-test-purposes:2 ends here

+ 37 - 0
testing/examples/ob-lilypond-test.org

@@ -0,0 +1,37 @@
+* Test org lilypond file
+
+This is a simple file for test purposes
+
+** LilyPond Version
+
+#+begin_src lilypond
+  
+\version "2.12.3"
+
+#+end_src 
+
+** DONE lilypond block for test purposes
+
+#+begin_src lilypond
+  
+  \score {
+    \relative c' {
+      c8 d e f g a b c |
+      b a g f e d c4   |
+    }
+   
+#+end_src
+
+#+begin_src lilypond
+  
+    \layout {
+      }
+      \midi {
+        \context {
+          \Score
+          tempoWholesPerMinute = #(ly:make-moment 150 4)
+        }
+      }
+    }
+  
+#+end_src

+ 323 - 0
testing/lisp/test-ob-lilypond.el

@@ -0,0 +1,323 @@
+(save-excursion
+  (set-buffer (get-buffer-create "test-ob-lilypond.el"))
+  (setq ly-here
+        (file-name-directory
+         (buffer-file-name
+          (current-buffer)))))
+ 
+(ert-deftest ob-lilypond/assert ()
+  (should t))
+ 
+(ert-deftest ob-lilypond/feature-provision ()
+  (should (featurep 'ob-lilypond)))
+  
+(ert-deftest ob-lilypond/check-lilypond-alias ()
+  (should (fboundp 'lilypond-mode)))
+
+(ert-deftest ob-lilypond/org-babel-tangle-lang-exts ()
+  (let ((found nil)
+        (list org-babel-tangle-lang-exts))
+    (while list
+      (when (equal (car list) '("LilyPond" . "ly"))
+        (setq found t))
+      (setq list (cdr list)))
+    (should found)))
+     
+(ert-deftest ob-lilypond/org-babel-prep-session:lilypond ()
+  (should-error (org-babel-prep-session:lilypond nil nil))
+  :type 'error)
+
+(ert-deftest ob-lilypond/ly-version-const () 
+  (should (boundp 'ly-version)))
+
+(ert-deftest ob-lilypond/ly-version-command ()
+  (should (equal "ob-lilypond version 0.2" (ly-version)))
+  (with-temp-buffer
+    (ly-version t)
+    (should (equal "ob-lilypond version 0.2"
+                   (buffer-substring (point-min) (point-max))))))
+
+(ert-deftest ob-lilypond/ly-compile-lilyfile ()
+  (should (equal
+           `(,(ly-determine-ly-path)    ;program
+             nil                        ;infile
+             "*lilypond*"               ;buffer
+             t                          ;display
+             ,(if ly-gen-png  "--png"  "") ;&rest...
+             ,(if ly-gen-html "--html" "")   
+             ,(if ly-use-eps  "-dbackend=eps" "")
+             ,(if ly-gen-svg  "-dbackend=svg" "")
+             "--output=test-file"
+             "test-file.ly")
+           (ly-compile-lilyfile "test-file.ly" t))))
+
+(ert-deftest ob-lilypond/ly-compile-post-tangle ()
+  (should (boundp 'ly-compile-post-tangle)))
+
+(ert-deftest ob-lilypond/ly-display-pdf-post-tangle ()
+  (should (boundp 'ly-display-pdf-post-tangle)))
+
+(ert-deftest ob-lilypond/ly-play-midi-post-tangle ()
+  (should (boundp 'ly-play-midi-post-tangle)))
+
+(ert-deftest ob-lilypond/ly-OSX-ly-path ()
+  (should (boundp 'ly-OSX-ly-path))
+  (should (stringp ly-OSX-ly-path)))
+
+(ert-deftest ob-lilypond/ly-OSX-pdf-path ()
+  (should (boundp 'ly-OSX-pdf-path))
+  (should (stringp ly-OSX-pdf-path)))
+
+(ert-deftest ob-lilypond/ly-OSX-midi-path ()
+  (should (boundp 'ly-OSX-midi-path))
+  (should (stringp ly-OSX-midi-path)))
+
+(ert-deftest ob-lilypond/ly-nix-ly-path ()
+  (should (boundp 'ly-nix-ly-path))
+  (should (stringp ly-nix-ly-path)))
+
+(ert-deftest ob-lilypond/ly-nix-pdf-path ()
+  (should (boundp 'ly-nix-pdf-path))
+  (should (stringp ly-nix-pdf-path)))
+
+(ert-deftest ob-lilypond/ly-nix-midi-path ()
+  (should (boundp 'ly-nix-midi-path))
+  (should (stringp ly-nix-midi-path)))
+
+(ert-deftest ob-lilypond/ly-win32-ly-path ()
+  (should (boundp 'ly-win32-ly-path))
+  (should (stringp ly-win32-ly-path)))
+
+(ert-deftest ob-lilypond/ly-win32-pdf-path ()
+  (should (boundp 'ly-win32-pdf-path))
+  (should (stringp ly-win32-pdf-path)))
+
+(ert-deftest ob-lilypond/ly-win32-midi-path ()
+  (should (boundp 'ly-win32-midi-path))
+  (should (stringp ly-win32-midi-path)))
+
+(ert-deftest ob-lilypond/ly-gen-png ()
+  (should (boundp 'ly-gen-png)))
+
+(ert-deftest ob-lilypond/ly-gen-svg ()
+  (should (boundp 'ly-gen-svg)))
+
+(ert-deftest ob-lilypond/ly-gen-html ()
+  (should (boundp 'ly-gen-html)))
+
+(ert-deftest ob-lilypond/use-eps ()
+  (should (boundp 'ly-use-eps)))
+
+(ert-deftest ob-lilypond/org-babel-default-header-args:lilypond ()
+  (should (equal  '((:tangle . "yes")
+                    (:noweb . "yes")
+                    (:results . "silent")
+                    (:comments . "yes"))
+                  org-babel-default-header-args:lilypond)))
+
+;;TODO finish...
+(ert-deftest ob-lilypond/org-babel-expand-body:lilypond ()
+  (should (equal "This is a test"
+                 (org-babel-expand-body:lilypond "This is a test" ()))))
+
+;;TODO (ert-deftest ly-test-org-babel-execute:lilypond ())
+(ert-deftest ob-lilypond/ly-check-for-compile-error ()
+  (set-buffer (get-buffer-create "*lilypond*"))
+  (erase-buffer)
+  (should (not (ly-check-for-compile-error nil t)))
+  (insert-file-contents (concat ly-here
+                                "../examples/ob-lilypond-test.error")
+                        nil nil nil t)
+  (goto-char (point-min))
+  (should (ly-check-for-compile-error nil t))
+  (kill-buffer "*lilypond*"))
+
+(ert-deftest ob-lilypond/ly-process-compile-error ()
+  (find-file-other-window (concat
+                           ly-here
+                           "../examples/ob-lilypond-broken.org"))
+  (set-buffer (get-buffer-create "*lilypond*"))
+  (insert-file-contents (concat
+                         ly-here
+                         "../examples/ob-lilypond-test.error")
+                        nil nil nil t)
+  (goto-char (point-min))
+  (search-forward "error:" nil t)
+  (should-error
+   (ly-process-compile-error (concat
+                              ly-here
+                              "../examples/ob-lilypond-broken.ly"))
+   :type 'error)
+  (set-buffer "ob-lilypond-broken.org")
+  (should (equal 238 (point)))
+  (exchange-point-and-mark)
+  (should (equal (+ 238 (length "line 25")) (point)))
+  (kill-buffer "*lilypond*")
+  (kill-buffer "ob-lilypond-broken.org"))
+   
+(ert-deftest ob-lilypond/ly-mark-error-line ()
+  (let ((file-name (concat
+                    ly-here
+                    "../examples/ob-lilypond-broken.org"))
+        (expected-point-min 198)
+        (expected-point-max 205)
+        (line "line 20"))
+    (find-file-other-window file-name)
+    (ly-mark-error-line file-name line)
+    (should (equal expected-point-min (point)))
+  
+    (exchange-point-and-mark)
+    (should (= expected-point-max (point)))
+    (kill-buffer (file-name-nondirectory file-name))))
+
+(ert-deftest ob-lilypond/ly-parse-line-num ()
+  (with-temp-buffer
+    (insert-file-contents (concat
+                           ly-here
+                           "../examples/ob-lilypond-test.error")
+                          nil nil nil t)
+    (goto-char (point-min))
+    (search-forward "error:")
+    (should (equal 25 (ly-parse-line-num (current-buffer))))))
+  
+(ert-deftest ob-lilypond/ly-parse-error-line ()
+  (let ((ly-file (concat
+                  ly-here
+                  "../examples/ob-lilypond-broken.ly")))
+    (should (equal "line 20"
+                   (ly-parse-error-line ly-file 20)))
+    (should (not (ly-parse-error-line ly-file 0)))))
+    
+(ert-deftest ob-lilypond/ly-attempt-to-open-pdf ()
+  (let ((post-tangle ly-display-pdf-post-tangle)
+        (ly-file (concat
+                  ly-here
+                  "../examples/ob-lilypond-test.ly"))
+        (pdf-file (concat
+                   ly-here
+                   "../examples/ob-lilypond-test.pdf")))
+    (setq ly-open-pdf-post-tangle t)
+    (when (not (file-exists-p pdf-file))
+      (set-buffer (get-buffer-create (file-name-nondirectory pdf-file)))
+      (write-file pdf-file))
+    (should (equal 
+             (concat
+              (ly-determine-pdf-path) " " pdf-file)
+             (ly-attempt-to-open-pdf ly-file t)))
+    (delete-file pdf-file)
+    (kill-buffer (file-name-nondirectory pdf-file))
+    (should (equal
+             "No pdf file generated so can't display!"
+             (ly-attempt-to-open-pdf pdf-file)))
+    (setq ly-display-pdf-post-tangle post-tangle)))
+
+(ert-deftest ob-lilypond/ly-attempt-to-play-midi ()
+  (let ((post-tangle ly-play-midi-post-tangle)
+        (ly-file (concat
+                  ly-here
+                  "../examples/ob-lilypond-test.ly"))
+        (midi-file (concat
+                    ly-here
+                    "../examples/ob-lilypond-test.midi")))
+    (setq ly-play-midi-post-tangle t)
+    (when (not (file-exists-p midi-file))
+      (set-buffer (get-buffer-create (file-name-nondirectory midi-file)))
+      (write-file midi-file))
+    (should (equal
+             (concat
+              (ly-determine-midi-path) " " midi-file)
+             (ly-attempt-to-play-midi ly-file t)))
+    (delete-file midi-file)
+    (kill-buffer (file-name-nondirectory midi-file))
+    (should (equal
+             "No midi file generated so can't play!"
+             (ly-attempt-to-play-midi midi-file)))
+    (setq ly-play-midi-post-tangle post-tangle)))
+
+(ert-deftest ob-lilypond/ly-determine-ly-path ()
+  (should (equal ly-OSX-ly-path
+                 (ly-determine-ly-path "darwin")))
+  (should (equal ly-win32-ly-path
+                 (ly-determine-ly-path "win32")))
+  (should (equal ly-nix-ly-path
+                 (ly-determine-ly-path "nix"))))
+
+(ert-deftest ob-lilypond/ly-determine-pdf-path ()
+  (should (equal ly-OSX-pdf-path
+                 (ly-determine-pdf-path "darwin")))
+  (should (equal ly-win32-pdf-path
+                 (ly-determine-pdf-path "win32")))
+  (should (equal ly-nix-pdf-path
+                 (ly-determine-pdf-path "nix"))))
+
+(ert-deftest ob-lilypond/ly-determine-midi-path ()
+  (should (equal ly-OSX-midi-path
+                 (ly-determine-midi-path "darwin")))
+  (should (equal ly-win32-midi-path
+                 (ly-determine-midi-path "win32")))
+  (should (equal ly-nix-midi-path
+                 (ly-determine-midi-path "nix"))))
+ 
+(ert-deftest ob-lilypond/ly-toggle-midi-play-toggles-flag ()
+  (if ly-play-midi-post-tangle
+      (progn
+        (ly-toggle-midi-play)
+         (should (not ly-play-midi-post-tangle))
+        (ly-toggle-midi-play)
+        (should ly-play-midi-post-tangle))
+    (ly-toggle-midi-play)
+    (should ly-play-midi-post-tangle)
+    (ly-toggle-midi-play)
+    (should (not ly-play-midi-post-tangle))))
+
+(ert-deftest ob-lilypond/ly-toggle-pdf-display-toggles-flag ()
+  (if ly-display-pdf-post-tangle
+      (progn
+        (ly-toggle-pdf-display)
+         (should (not ly-display-pdf-post-tangle))
+        (ly-toggle-pdf-display)
+        (should ly-display-pdf-post-tangle))
+    (ly-toggle-pdf-display)
+    (should ly-display-pdf-post-tangle)
+    (ly-toggle-pdf-display)
+    (should (not ly-display-pdf-post-tangle))))
+
+(ert-deftest ob-lilypond/ly-toggle-png-generation-toggles-flag ()
+  (if ly-gen-png
+      (progn
+        (ly-toggle-png-generation)
+         (should (not ly-gen-png))
+        (ly-toggle-png-generation)
+        (should ly-gen-png))
+    (ly-toggle-png-generation)
+    (should ly-gen-png)
+    (ly-toggle-png-generation)
+    (should (not ly-gen-png))))
+
+(ert-deftest ob-lilypond/ly-toggle-html-generation-toggles-flag ()
+  (if ly-gen-html
+      (progn
+        (ly-toggle-html-generation)
+         (should (not ly-gen-html))
+        (ly-toggle-html-generation)
+        (should ly-gen-html))
+    (ly-toggle-html-generation)
+    (should ly-gen-html)
+    (ly-toggle-html-generation)
+    (should (not ly-gen-html))))
+
+(ert-deftest ob-lilypond/ly-switch-extension-with-extensions ()
+  (should (equal "test-name.xyz"
+                 (ly-switch-extension "test-name" ".xyz")))
+  (should (equal "test-name.xyz"
+                 (ly-switch-extension "test-name.abc" ".xyz")))
+  (should (equal "test-name"
+                 (ly-switch-extension "test-name.abc" ""))))
+
+(ert-deftest ob-lilypond/ly-switch-extension-with-paths ()
+  (should (equal "/some/path/to/test-name.xyz"
+                  (ly-switch-extension "/some/path/to/test-name" ".xyz"))))
+
+(provide 'test-ob-lilypond)
+
+;;; test-ob-lilypond.el ends here