added tests, and fixed uncovered bugs

tests currently cover the following all of which are passing
  - basic execution
  - referencing tables
  - referencing other source blocks
This commit is contained in:
Eric Schulte 2009-05-11 19:41:56 -07:00
parent 480c22bbeb
commit 75ca370de8
5 changed files with 156 additions and 29 deletions

View File

@ -92,10 +92,11 @@ return nil."
(let ((case-fold-search t)
type args new-ref) ;; case search?
;; assign any arguments to pass to source block
(when (string-match "\\(.+\\)\(\\(.+\\)\)" ref)
(when (string-match "\\(.+\\)\(\\(.*\\)\)" ref)
(save-match-data
(setq args (mapcar (lambda (ref) (cons :var ref))
(split-string (match-string 2 ref) ",[ \f\t\n\r\v]*"))))
(if (> (length (match-string 2)) 0)
(setq args (mapcar (lambda (ref) (cons :var ref))
(split-string (match-string 2 ref) ",[ \f\t\n\r\v]*")))))
(setq ref (match-string 1 ref)))
(when (string-match "\\(.+\\):\\(.+\\)" ref)
(find-file (match-string 1 ref))

View File

@ -48,7 +48,8 @@ automatically generated wrapper for `litorgy-script-execute'.")
def main
%s
end
puts main().inspect
results = main()
puts (results.class == String) ? results : results.inspect
")
(defvar litorgy-script-python-wrapper-method
@ -108,12 +109,17 @@ Emacs-lisp table, otherwise return the results as a string."
(if (string-match "^\\[.+\\]$" results)
;; somewhat hacky, but thanks to similarities between languages
;; it seems to work
(replace-regexp-in-string
(litorgy-read
(replace-regexp-in-string
"\\[" "(" (replace-regexp-in-string
"\\]" ")" (replace-regexp-in-string
", " " " (replace-regexp-in-string
"'" "\"" results))))
results)))
"'" "\"" results)))))
;; strip trailing endline
(progn
(while (string= "\n" (substring results -1))
(setq results (substring results 0 -1)))
results))))
(provide 'litorgy-script)
;;; litorgy-script.el ends here

View File

@ -68,16 +68,19 @@ source code block.
#+begin_src emacs-lisp :var results=source-block(n=2, m=3) :results silent
results
#+end_src"
(let ((params (eval `(litorgy-parse-header-arguments
(concat ":var results="
(symbol-name ,source-block)
"("
(mapconcat (lambda (var-spec)
(format "%S=%s" (first var-spec) (second var-spec)))
',variables ", ")
")")))))
(litorgy-execute-src-block
nil (list "emacs-lisp" "results" (org-combine-plists params '((:results . "silent")))))))
(unless (stringp source-block) (setq source-block (symbol-name source-block)))
(if (and source-block (> (length source-block) 0))
(let ((params (eval `(litorgy-parse-header-arguments
(concat ":var results="
,source-block
"("
(mapconcat (lambda (var-spec)
(format "%S=%s" (first var-spec) (second var-spec)))
',variables ", ")
")")))))
(litorgy-execute-src-block
nil (list "emacs-lisp" "results" (org-combine-plists params '((:results . "silent"))))))
""))
(provide 'litorgy-table)
;;; litorgy-table.el ends here

View File

@ -121,8 +121,9 @@ the header arguments specified at the source code block."
(error "Language is not in `litorgy-interpreters': %s" lang))
(setq result (funcall cmd body params))
(if arg
(progn (message (format "%S" result)) result)
(litorgy-insert-result result (cdr (assoc :results params))))))
(message (if (stringp result) result (format "%S" result)))
(litorgy-insert-result result (cdr (assoc :results params))))
result))
(defun litorgy-eval-buffer (&optional arg)
"Replace EVAL snippets in the entire buffer."
@ -264,17 +265,17 @@ string.
This is taken almost directly from `org-read-prop'."
(if (and (stringp cell) (not (equal cell "")))
(let ((out (string-to-number cell)))
(if (equal out 0)
(if (or (equal "(" (substring cell 0 1))
(equal "'" (substring cell 0 1)))
(read cell)
(if (string-match "^\\(+0\\|-0\\|0\\)$" cell)
0
(progn (set-text-properties 0 (length cell) nil cell)
cell)))
out))
(if (litorgy-number-p cell)
(string-to-number cell)
(if (or (equal "(" (substring cell 0 1))
(equal "'" (substring cell 0 1)))
(read cell)
(progn (set-text-properties 0 (length cell) nil cell) cell)))
cell))
(defun litorgy-number-p (string)
"Return t if STRING represents a number"
(string-match "^[[:digit:]]*\\.?[[:digit:]]*$" string))
(provide 'litorgy)
;;; litorgy.el ends here

116
rorg.org
View File

@ -355,6 +355,122 @@ recognition of ruby arrays as such.
| 1 | 2 | 3 | 4 |
* Tests
Evaluate all the cells in this table for a comprehensive test of the
litorgy functionality.
#+TBLNAME: litorgy-tests
| functionality | block | expected | results | pass |
|-------------------------+------------------+-------------+-------------+------|
| basic evaluation | | | | pass |
|-------------------------+------------------+-------------+-------------+------|
| emacs lisp | basic-elisp | 5 | 5 | pass |
| shell | basic-shell | 6 | 6 | pass |
| ruby | basic-ruby | litorgy | litorgy | pass |
| python | basic-python | hello world | hello world | pass |
| R | basic-R | 13 | 13 | pass |
|-------------------------+------------------+-------------+-------------+------|
| tables | | | | pass |
|-------------------------+------------------+-------------+-------------+------|
| emacs lisp | table-elisp | 3 | 3 | pass |
| ruby | table-ruby | 1-2-3 | 1-2-3 | pass |
| python | table-python | 5 | 5 | pass |
| R | table-R | 3.5 | 3.5 | pass |
|-------------------------+------------------+-------------+-------------+------|
| source block references | | | | pass |
|-------------------------+------------------+-------------+-------------+------|
| all languages | chained-ref-last | Array | Array | pass |
#+TBLFM: $4='(sbe $2)::$5='(if (string= $3 $4) "pass" (format "expected %S but was %S" $3 $4))
** basic tests
#+srcname: basic-elisp
#+begin_src emacs-lisp :results silent
(+ 1 4)
#+end_src
#+srcname: basic-shell
#+begin_src sh :results silent
expr 1 + 5
#+end_src
#+srcname: basic-ruby
#+begin_src ruby :results silent
"litorgy"
#+end_src
#+srcname: basic-python
#+begin_src python :results silent
'hello world'
#+end_src
#+srcname: basic-R
#+begin_src R :results silent
b <- 9
b + 4
#+end_src
** read tables
#+tblname: test-table
| 1 | 2 | 3 |
| 4 | 5 | 6 |
#+srcname: table-elisp
#+begin_src emacs-lisp :results silent :var table=test-table
(length (car table))
#+end_src
#+srcname: table-ruby
#+begin_src ruby :results silent :var table=test-table
table.first.join("-")
#+end_src
#+srcname: table-python
#+begin_src python :var table=test-table
table[1][1]
#+end_src
#+srcname: table-R
#+begin_src R :var table=test-table
mean(mean(table))
#+end_src
** references
Lets pass a references through all of our languages...
Lets start by reversing the table from the previous examples
#+srcname: chained-ref-first
#+begin_src python :var table = test-table
table.reverse
#+end_src
Take the first part of the list
#+srcname: chained-ref-second
#+begin_src R :var table = chained-ref-first
table[1]
#+end_src
Turn the numbers into string
#+srcname: chained-ref-third
#+begin_src emacs-lisp :var table = chained-ref-second
(mapcar (lambda (el) (format "%S" el)) table)
#+end_src
and Check that it is still a list
#+srcname: chained-ref-last
#+begin_src ruby :var table=chained-ref-third
table.class.name
#+end_src
* Sandbox
:PROPERTIES:
:CUSTOM_ID: sandbox