test-ob-java.el 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. ;;; test-ob-java.el --- tests for ob-java.el
  2. ;; Copyright (c) 2020 Free Software Foundation, Inc.
  3. ;; Authors: Eric Schulte
  4. ;; Dan Davison
  5. ;; Maintainer: Ian Martins <ianxm@jhu.edu>
  6. ;; This file is not part of GNU Emacs.
  7. ;; This program is free software; you can redistribute it and/or modify
  8. ;; it under the terms of the GNU General Public License as published by
  9. ;; the Free Software Foundation, either version 3 of the License, or
  10. ;; (at your option) any later version.
  11. ;; This program is distributed in the hope that it will be useful,
  12. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. ;; GNU General Public License for more details.
  15. ;; You should have received a copy of the GNU General Public License
  16. ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. ;;; Code:
  18. (require 'org-test)
  19. (require 'ob-core)
  20. (defvar org-babel-temporary-directory ; from ob-core
  21. (if (boundp 'org-babel-temporary-directory)
  22. org-babel-temporary-directory
  23. (temporary-file-directory)))
  24. (org-test-for-executable "java")
  25. (org-test-for-executable "javac")
  26. (unless (featurep 'ob-java)
  27. (signal 'missing-test-dependency "Support for java code blocks"))
  28. ; simple tests
  29. (ert-deftest ob-java/simple ()
  30. "Hello world program that writes output."
  31. (org-test-with-temp-text
  32. "#+begin_src java :results output silent
  33. System.out.print(42);
  34. #+end_src"
  35. (should (string= "42" (org-babel-execute-src-block)))))
  36. (ert-deftest ob-java/simple-with-bracket ()
  37. "Hello world program that outputs an open square bracket."
  38. (org-test-with-temp-text
  39. "#+begin_src java :results output silent
  40. System.out.print(\"[42\");
  41. #+end_src"
  42. (should (string= "[42" (org-babel-execute-src-block)))))
  43. (ert-deftest ob-java/simple-with-quote ()
  44. "Hello world program that writes quotes."
  45. (org-test-with-temp-text
  46. "#+begin_src java :results output silent
  47. System.out.print(\"\\\"42\\\"\");
  48. #+end_src"
  49. (should (string= "\"42\"" (org-babel-execute-src-block)))))
  50. (ert-deftest ob-java/simple-return-int ()
  51. "Hello world program that returns an int value."
  52. (org-test-with-temp-text
  53. "#+begin_src java :results silent
  54. return 42;
  55. #+end_src"
  56. (should (eq 42 (org-babel-execute-src-block)))))
  57. (ert-deftest ob-java/simple-return-float ()
  58. "Hello world program that returns a float value."
  59. (org-test-with-temp-text
  60. "#+begin_src java :results silent
  61. return 42.0;
  62. #+end_src"
  63. (should (equal 42.0 (org-babel-execute-src-block)))))
  64. (ert-deftest ob-java/simple-return-string ()
  65. "Hello world program that returns a string value."
  66. (org-test-with-temp-text
  67. "#+begin_src java :results silent
  68. return \"forty two\";
  69. #+end_src"
  70. (should (string= "forty two" (org-babel-execute-src-block)))))
  71. (ert-deftest ob-java/simple-with-main ()
  72. "Hello world program that defines a main function."
  73. (org-test-with-temp-text
  74. "#+begin_src java :results output silent
  75. public static void main(String[] args) {
  76. System.out.print(42);
  77. }
  78. #+end_src"
  79. (should (string= "42" (org-babel-execute-src-block)))))
  80. (ert-deftest ob-java/simple-with-two-methods ()
  81. "Hello world program with two methods and no class."
  82. (org-test-with-temp-text
  83. "#+begin_src java :results output silent
  84. public static void main(String[] args) {
  85. System.out.print(foo());
  86. }
  87. public static int foo() {
  88. return 42;
  89. }
  90. #+end_src"
  91. (should (string= "42" (org-babel-execute-src-block)))))
  92. (ert-deftest ob-java/simple-with-no-main ()
  93. "Hello world program with no main method. Babel adds a dummy one so it can run without error."
  94. (org-test-with-temp-text
  95. "#+begin_src java :results output silent
  96. public static int foo() {
  97. return 42;
  98. }
  99. #+end_src"
  100. (should (string= "success" (org-babel-execute-src-block)))))
  101. (ert-deftest ob-java/simple-with-main-args-array ()
  102. "Hello world program that defines a main function with the square brackets after `args'."
  103. (org-test-with-temp-text
  104. "#+begin_src java :results output silent
  105. public static void main(String args[]) {
  106. System.out.print(42);
  107. }
  108. #+end_src"
  109. (should (string= "42" (org-babel-execute-src-block)))))
  110. (ert-deftest ob-java/simple-with-class ()
  111. "Hello world program that defines a class."
  112. (org-test-with-temp-text
  113. "#+begin_src java :results output silent
  114. public class Simple {
  115. public static void main(String[] args) {
  116. System.out.print(42);
  117. }
  118. }
  119. #+end_src"
  120. (should (string= "42" (org-babel-execute-src-block)))))
  121. (ert-deftest ob-java/simple-with-non-public-class ()
  122. "Hello world program that defines a non-public class."
  123. (org-test-with-temp-text
  124. "#+begin_src java :results output silent
  125. class Simple {
  126. public static void main(String[] args) {
  127. System.out.print(42);
  128. }
  129. }
  130. #+end_src"
  131. (should (string= "42" (org-babel-execute-src-block)))))
  132. (ert-deftest ob-java/simple-with-class-and-package ()
  133. "Hello world program that defines a class and package."
  134. (org-test-with-temp-text
  135. "#+begin_src java :results output silent
  136. package pkg;
  137. public class Simple {
  138. public static void main(String[] args) {
  139. System.out.print(42);
  140. }
  141. }
  142. #+end_src"
  143. (should (string= "42" (org-babel-execute-src-block)))))
  144. (ert-deftest ob-java/simple-with-class-attr ()
  145. "Hello world program with class header attribute."
  146. (org-test-with-temp-text
  147. "#+begin_src java :results output silent :classname Simple
  148. public static void main(String[] args) {
  149. System.out.print(42);
  150. }
  151. #+end_src"
  152. (should (string= "42" (org-babel-execute-src-block)))))
  153. (ert-deftest ob-java/simple-with-class-attr-with-package ()
  154. "Hello world program with class attr with package."
  155. (org-test-with-temp-text
  156. "#+begin_src java :results output silent :classname pkg.Simple
  157. public static void main(String[] args) {
  158. System.out.print(42);
  159. }
  160. #+end_src"
  161. (should (string= "42" (org-babel-execute-src-block)))))
  162. (ert-deftest ob-java/one-arg ()
  163. "Command line arg."
  164. (org-test-with-temp-text
  165. "#+begin_src java :results output silent :cmdargs \"fortytwo\"
  166. System.out.print(args[0]);
  167. #+end_src"
  168. (should (string= "fortytwo" (org-babel-execute-src-block)))))
  169. (ert-deftest ob-java/args-quoted-string ()
  170. "Two command line args, first contains a space."
  171. (org-test-with-temp-text
  172. "#+begin_src java :results output silent :cmdargs \"\\\"forty two\\\" 42\"
  173. System.out.println(args[0]);
  174. System.out.println(args[1]);
  175. #+end_src"
  176. (should (string= "forty two\n42\n" (org-babel-execute-src-block)))))
  177. ;; var tests
  178. (ert-deftest ob-java/integer-var ()
  179. "Read and write an integer variable."
  180. (org-test-with-temp-text
  181. "#+begin_src java :var a=42 :results output silent
  182. System.out.print(a);
  183. #+end_src"
  184. (should (string= "42" (org-babel-execute-src-block)))))
  185. (ert-deftest ob-java/var-with-main ()
  186. "Read and write an integer variable, with main function provided."
  187. (org-test-with-temp-text
  188. "#+begin_src java :var a=42 :results output silent
  189. public static void main(String[] args) {
  190. System.out.print(a);
  191. }
  192. #+end_src"
  193. (should (string= "42" (org-babel-execute-src-block)))))
  194. (ert-deftest ob-java/var-with-class ()
  195. "Read and write an integer variable, with class provided."
  196. (org-test-with-temp-text
  197. "#+begin_src java :var a=42 :results output silent
  198. public class Main {
  199. public static void main(String[] args) {
  200. System.out.print(a);
  201. }
  202. }
  203. #+end_src"
  204. (should (string= "42" (org-babel-execute-src-block)))))
  205. (ert-deftest ob-java/var-with-class-and-package ()
  206. "Read and write an integer variable, with class and package provided."
  207. (org-test-with-temp-text
  208. "#+begin_src java :var a=42 :results output silent
  209. package pkg;
  210. public class Main {
  211. public static void main(String[] args) {
  212. System.out.print(a);
  213. }
  214. }
  215. #+end_src"
  216. (should (string= "42" (org-babel-execute-src-block)))))
  217. (ert-deftest ob-java/var-with-class-and-hanging-curlies ()
  218. "Read and write an integer variable, with class with hanging curlies."
  219. (org-test-with-temp-text
  220. "#+begin_src java :var a=42 :results output silent
  221. public class Main
  222. {
  223. public static void main(String[] args)
  224. {
  225. System.out.print(a);
  226. }
  227. }
  228. #+end_src"
  229. (should (string= "42" (org-babel-execute-src-block)))))
  230. (ert-deftest ob-java/two-vars ()
  231. "Read two integer variables, combine and write them."
  232. (org-test-with-temp-text
  233. "#+begin_src java :var a=21 b=2 :results output silent
  234. System.out.print(a*b);
  235. #+end_src"
  236. (should (string= "42" (org-babel-execute-src-block)))))
  237. (ert-deftest ob-java/string-var ()
  238. "Read and write a string variable."
  239. (org-test-with-temp-text
  240. "#+begin_src java :var a=\"forty two\" :results output silent
  241. System.out.print(String.format(\"%s, len=%d\", a, a.length()));
  242. #+end_src"
  243. (should (string= "forty two, len=9" (org-babel-execute-src-block)))))
  244. (ert-deftest ob-java/multiline-string-var ()
  245. "Java doesn't support multiline string literals, so this errors."
  246. (org-test-with-temp-text
  247. "#+begin_src java :var a=\"forty\ntwo\" :results output silent
  248. System.out.print(String.format(\"%s, len=%d\", a, a.length()));
  249. #+end_src"
  250. (should-error (org-babel-execute-src-block)))
  251. :type 'error)
  252. ;; return list
  253. (ert-deftest ob-java/return-vector-using-list ()
  254. "Return a vector using a list."
  255. (org-test-with-temp-text
  256. "#+begin_src java :results vector silent
  257. import java.util.List;
  258. import java.util.Arrays;
  259. List<List<Integer>> a = Arrays.asList(Arrays.asList(4),
  260. Arrays.asList(2));
  261. return a;
  262. #+end_src"
  263. (should (equal '((4) (2))
  264. (org-babel-execute-src-block)))))
  265. (ert-deftest ob-java/return-vector-using-array ()
  266. "Return a vector using an array."
  267. (org-test-with-temp-text
  268. "#+begin_src java :results vector silent
  269. Integer[][] a = {{4}, {2}};
  270. return a;
  271. #+end_src"
  272. (should (equal '((4) (2))
  273. (org-babel-execute-src-block)))))
  274. (ert-deftest ob-java/read-return-list ()
  275. "Read and return a list."
  276. (org-test-with-temp-text
  277. "#+begin_src java :var a=java_list :results silent
  278. import java.util.List;
  279. import java.util.Arrays;
  280. List<String> b = Arrays.asList(a.get(0).get(0),
  281. a.get(1).get(0));
  282. return b;
  283. #+end_src
  284. #+name: java_list
  285. - forty
  286. - two"
  287. (should (equal '("forty" "two")
  288. (org-babel-execute-src-block)))))
  289. (ert-deftest ob-java/read-list-return-array ()
  290. "Read a list and return an array."
  291. (org-test-with-temp-text
  292. "#+begin_src java :var a=java_list :results silent
  293. String[] b = {a.get(0).get(0), a.get(1).get(0)};
  294. return b;
  295. #+end_src
  296. #+name: java_list
  297. - forty
  298. - two"
  299. (should (equal '("forty" "two")
  300. (org-babel-execute-src-block)))))
  301. (ert-deftest ob-java/read-return-list-with-package ()
  302. "Return a vector."
  303. (org-test-with-temp-text
  304. "#+begin_src java :var a=java_list :results silent
  305. package pkg;
  306. import java.util.List;
  307. import java.util.Arrays;
  308. List<String> b = Arrays.asList(a.get(0).get(0),
  309. a.get(1).get(0));
  310. return b;
  311. #+end_src
  312. #+name: java_list
  313. - forty
  314. - two"
  315. (should (equal '("forty" "two")
  316. (org-babel-execute-src-block)))))
  317. (ert-deftest ob-java/output-list-with-spaces ()
  318. "Return a vector."
  319. (org-test-with-temp-text
  320. "#+begin_src java :results output list raw silent
  321. System.out.println(\"forty two\");
  322. System.out.println(\"forty two\");
  323. #+end_src"
  324. (should (equal "forty two\nforty two\n"
  325. (org-babel-execute-src-block)))))
  326. ;; list vars
  327. (ert-deftest ob-java/list-var ()
  328. "Read and write a list variable."
  329. (org-test-with-temp-text
  330. "#+begin_src java :var a='(\"forty\" \"two\") :results silent
  331. import java.util.List;
  332. List<String> b = a;
  333. return b;
  334. #+end_src"
  335. (should (equal '("forty" "two")
  336. (org-babel-execute-src-block)))))
  337. (ert-deftest ob-java/vector-var ()
  338. "Read and write a vector variable."
  339. (org-test-with-temp-text
  340. "#+begin_src java :var a='[\"forty\" \"two\"] :results silent
  341. import java.util.List;
  342. List<String> b = a;
  343. return b;
  344. #+end_src"
  345. (should (equal '("forty" "two")
  346. (org-babel-execute-src-block)))))
  347. (ert-deftest ob-java/matrix-var ()
  348. "Read and write matrix variable."
  349. (org-test-with-temp-text
  350. "#+begin_src java :var a=java_matrix :results silent
  351. import java.util.List;
  352. import java.util.Arrays;
  353. List<List<Integer>> b = Arrays.asList(Arrays.asList(a.get(0).get(0), a.get(1).get(0)),
  354. Arrays.asList(a.get(0).get(1), a.get(1).get(1)));
  355. return b; // transpose
  356. #+end_src
  357. #+name: java_matrix
  358. | 2 | 1 |
  359. | 4 | 2 |"
  360. (should (equal '((2 4) (1 2))
  361. (org-babel-execute-src-block)))))
  362. (ert-deftest ob-java/matrix-var-with-header ()
  363. "Read matrix variable and write it with header."
  364. (org-test-with-temp-text
  365. "#+begin_src java :var a=java_matrix :results value table silent
  366. import java.util.List;
  367. import java.util.Arrays;
  368. List<List> b = Arrays.asList(Arrays.asList(\"col1\", \"col2\"),
  369. null,
  370. Arrays.asList(a.get(0).get(0), a.get(1).get(0)),
  371. Arrays.asList(a.get(0).get(1), a.get(1).get(1)));
  372. return b; // transpose
  373. #+end_src
  374. #+name: java_matrix
  375. | 2 | 1 |
  376. | 4 | 2 |"
  377. (should (equal '(("col1" "col2") hline (2 4) (1 2))
  378. (org-babel-execute-src-block)))))
  379. ;; output table
  380. (ert-deftest ob-java/output-table-with-header ()
  381. "Write a table that includes a header."
  382. (org-test-with-temp-text
  383. "#+begin_src java :var a=java_matrix :results output raw table silent
  384. System.out.println(\"|col1|col2|\");
  385. System.out.println(\"|-\");
  386. for (int ii=0; ii<a.size(); ii++) {
  387. for (int jj=0; jj<a.get(0).size(); jj++) {
  388. System.out.print(\"|\" + a.get(ii).get(jj));
  389. }
  390. System.out.println(\"\");
  391. }
  392. #+end_src
  393. #+name: java_matrix
  394. | 2 | 1 |
  395. | 4 | 2 |"
  396. (should (equal "|col1|col2|\n|-\n|2|1\n|4|2\n"
  397. (org-babel-execute-src-block)))))
  398. (ert-deftest ob-java/inhomogeneous_table ()
  399. "Read and write an inhomogeneous table."
  400. (org-test-with-temp-text
  401. "#+begin_src java :var a=java_table :results silent
  402. import java.util.List;
  403. import java.util.Arrays;
  404. List<List> b = Arrays.asList(Arrays.asList(a.get(0).get(0),
  405. Integer.parseInt(a.get(0).get(1))*2),
  406. Arrays.asList(a.get(1).get(0),
  407. Integer.parseInt(a.get(1).get(1))*2));
  408. return b;
  409. #+end_src
  410. #+name: java_table
  411. | string | number |
  412. |--------+--------|
  413. | forty | 2 |
  414. | two | 1 |"
  415. (should (equal
  416. '(("forty" 4) ("two" 2))
  417. (org-babel-execute-src-block)))))
  418. ;; imports
  419. (ert-deftest ob-java/import_library ()
  420. "Import a standard java library."
  421. (org-test-with-temp-text
  422. "#+begin_src java :results output silent :imports java.util.Base64
  423. byte[] encoded = Base64.getEncoder().encode(\"42\".getBytes());
  424. String decoded = new String(Base64.getDecoder().decode(encoded));
  425. System.out.print(String.format(\"encoded=%s, decoded=%s\", new String(encoded), decoded));
  426. #+end_src"
  427. (should (string=
  428. "encoded=NDI=, decoded=42"
  429. (org-babel-execute-src-block)))))
  430. (ert-deftest ob-java/import_library_inline ()
  431. "Import a standard java library."
  432. (org-test-with-temp-text
  433. "#+begin_src java :results output silent
  434. import java.util.Base64;
  435. byte[] encoded = Base64.getEncoder().encode(\"42\".getBytes());
  436. String decoded = new String(Base64.getDecoder().decode(encoded));
  437. System.out.print(String.format(\"encoded=%s, decoded=%s\", new String(encoded), decoded));
  438. #+end_src"
  439. (should (string=
  440. "encoded=NDI=, decoded=42"
  441. (org-babel-execute-src-block)))))
  442. ;; tangle
  443. (ert-deftest ob-java/tangle ()
  444. "Tangle a source block."
  445. (org-test-with-temp-text-in-file
  446. "#+begin_src java :tangle \"Tangle.java\" :results value :classname Tangle
  447. return \"tangled\";
  448. #+end_src"
  449. (should
  450. (string=
  451. "public class Tangle {
  452. public static void main(String[] args) {
  453. return \"tangled\";
  454. }
  455. }
  456. "
  457. (unwind-protect
  458. (progn (org-babel-tangle)
  459. (with-temp-buffer
  460. (insert-file-contents "Tangle.java")
  461. (untabify (point-min) (point-max))
  462. (buffer-string)))
  463. (delete-file "Tangle.java"))))))
  464. (ert-deftest ob-java/tangle-with-package ()
  465. "Tangle a source block."
  466. (org-test-with-temp-text-in-file
  467. "#+begin_src java :tangle \"tangle/Tangle.java\" :results value :classname tangle.Tangle
  468. return \"tangled\";
  469. #+end_src"
  470. (should
  471. (string=
  472. "package tangle;
  473. public class Tangle {
  474. public static void main(String[] args) {
  475. return \"tangled\";
  476. }
  477. }
  478. "
  479. (unwind-protect
  480. (progn
  481. (make-directory "tangle")
  482. (org-babel-tangle)
  483. (with-temp-buffer
  484. (insert-file-contents "tangle/Tangle.java")
  485. (untabify (point-min) (point-max))
  486. (buffer-string)))
  487. (delete-file "tangle/Tangle.java")
  488. (delete-directory "tangle"))))))
  489. ;; specify output dir
  490. (ert-deftest ob-java/simple-dir ()
  491. "Hello world program that writes output."
  492. (org-test-with-temp-text
  493. (format "#+begin_src java :results output silent :dir %s
  494. System.out.print(42);
  495. #+end_src" org-babel-temporary-directory)
  496. (should (string=
  497. "42"
  498. (unwind-protect
  499. (org-babel-execute-src-block)
  500. (delete-file (concat (file-name-as-directory org-babel-temporary-directory)
  501. "Main.java"))
  502. (delete-file (concat (file-name-as-directory org-babel-temporary-directory)
  503. "Main.class")))))))
  504. (ert-deftest ob-java/simple-dir-with-package ()
  505. "Hello world program that writes output."
  506. (org-test-with-temp-text
  507. (format "#+begin_src java :results output silent :dir %s
  508. package pkg;
  509. public class Main {
  510. public static void main(String[] args) {
  511. System.out.print(42);
  512. }
  513. }
  514. #+end_src" org-babel-temporary-directory)
  515. (should (string=
  516. "42"
  517. (unwind-protect
  518. (org-babel-execute-src-block)
  519. (delete-file (concat (file-name-as-directory org-babel-temporary-directory)
  520. "pkg/Main.java"))
  521. (delete-file (concat (file-name-as-directory org-babel-temporary-directory)
  522. "pkg/Main.class"))
  523. (delete-directory (concat (file-name-as-directory org-babel-temporary-directory)
  524. "pkg")))))))
  525. ;;; test-ob-java.el ends here