From mboxrd@z Thu Jan 1 00:00:00 1970 From: Martyn Jago Subject: Re: ob-lilypond Date: Fri, 1 Jul 2011 14:43:28 +0100 Message-ID: References: <87k4c79kdg.fsf@gmail.com> <87d3hyl15p.fsf@gnu.org> <874o3al0ib.fsf@gnu.org> <87zkl1bs7s.fsf@gmail.com> <87r56c5ogi.fsf@gmail.com> <87ei2b8a1z.fsf@gmail.com> Mime-Version: 1.0 (Apple Message framework v1084) Content-Type: multipart/mixed; boundary=Apple-Mail-22-508127287 Return-path: Received: from eggs.gnu.org ([140.186.70.92]:53031) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qce0O-00072Y-GK for emacs-orgmode@gnu.org; Fri, 01 Jul 2011 09:43:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qce0M-0003A6-E7 for emacs-orgmode@gnu.org; Fri, 01 Jul 2011 09:43:36 -0400 Received: from nm1.bt.bullet.mail.ird.yahoo.com ([212.82.108.232]:42724) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1Qce0L-00038e-7n for emacs-orgmode@gnu.org; Fri, 01 Jul 2011 09:43:34 -0400 In-Reply-To: <87ei2b8a1z.fsf@gmail.com> List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Eric Schulte Cc: emacs-orgmode@gnu.org --Apple-Mail-22-508127287 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii Hi > > That's good to hear. Are you up for trying to merge them into the rest > of the Org-mode test suite? This should be as simple as placing any > org-mode example files you have in > > org-mode/testing/examples/ > > placing the .el file defining your tests into > > org-mode/testing/lisp/ > > and renaming all of your tests so that they start with the prefix > "ob-lilypond/" > > I fully understand if you don't have the time to do this, and I should > be able to take a shot at it some time in the not-too-distant future. Hopefully this patch will work for you... --Apple-Mail-22-508127287 Content-Disposition: attachment; filename=port-test-ob-lilypond.patch Content-Type: application/octet-stream; name="port-test-ob-lilypond.patch" Content-Transfer-Encoding: 7bit diff --git a/lisp/ob-lilypond.el b/lisp/ob-lilypond.el index 031eb8f..39aa78c 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 0000000..e836f6d --- /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 0000000..557418b --- /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 0000000..ceae291 --- /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 0000000..745600d --- /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 0000000..cd8587a --- /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 0000000..16d6f09 --- /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 --Apple-Mail-22-508127287 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=us-ascii It looks like noweb parsing has very recently become very brittle, since it broke the noweb in my lilypond example. This does not appear to be restricted to lilypond blocks. The error is (wrong-type-argument consp nil) I fixed for my songs by changing... #+srcname: gen_arpeggio(key,root) to... #+srcname: gen_arpeggio (key,root) and... <> to... <> I believe #+call: is affected too. Unfortunately I won't be able to investigate further until next week. Regards Martyn --Apple-Mail-22-508127287--