test-ob-java.el 18 KB

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