From dacf18e80a906166a601e13d8e33c2ef0365c7b9 Mon Sep 17 00:00:00 2001 From: Martyn Jago Date: Fri, 1 Jul 2011 12:22:05 -0700 Subject: [PATCH] ob-lilypond: test suite, all tests passing --- lisp/ob-lilypond.el | 17 +- testing/examples/ob-lilypond-broken.ly | 31 +++ testing/examples/ob-lilypond-broken.org | 39 +++ testing/examples/ob-lilypond-test.error | 15 ++ testing/examples/ob-lilypond-test.ly | 30 +++ testing/examples/ob-lilypond-test.org | 37 +++ testing/lisp/test-ob-lilypond.el | 323 ++++++++++++++++++++++++ 7 files changed, 484 insertions(+), 8 deletions(-) create mode 100644 testing/examples/ob-lilypond-broken.ly create mode 100644 testing/examples/ob-lilypond-broken.org create mode 100644 testing/examples/ob-lilypond-test.error create mode 100644 testing/examples/ob-lilypond-test.ly create mode 100644 testing/examples/ob-lilypond-test.org create mode 100644 testing/lisp/test-ob-lilypond.el diff --git a/lisp/ob-lilypond.el b/lisp/ob-lilypond.el index 031eb8f29..39aa78ccf 100644 --- a/lisp/ob-lilypond.el +++ b/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 diff --git a/testing/examples/ob-lilypond-broken.ly b/testing/examples/ob-lilypond-broken.ly new file mode 100644 index 000000000..e836f6db2 --- /dev/null +++ b/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 + diff --git a/testing/examples/ob-lilypond-broken.org b/testing/examples/ob-lilypond-broken.org new file mode 100644 index 000000000..557418bc8 --- /dev/null +++ b/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 diff --git a/testing/examples/ob-lilypond-test.error b/testing/examples/ob-lilypond-test.error new file mode 100644 index 000000000..ceae291cc --- /dev/null +++ b/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" diff --git a/testing/examples/ob-lilypond-test.ly b/testing/examples/ob-lilypond-test.ly new file mode 100644 index 000000000..745600d6e --- /dev/null +++ b/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 diff --git a/testing/examples/ob-lilypond-test.org b/testing/examples/ob-lilypond-test.org new file mode 100644 index 000000000..cd8587aea --- /dev/null +++ b/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 diff --git a/testing/lisp/test-ob-lilypond.el b/testing/lisp/test-ob-lilypond.el new file mode 100644 index 000000000..16d6f0959 --- /dev/null +++ b/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