test-ob-java.el 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  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-class-and-package ()
  120. "Hello world program that defines a class and package."
  121. (org-test-with-temp-text
  122. "#+begin_src java :results output silent
  123. package pkg;
  124. public class Simple {
  125. public static void main(String[] args) {
  126. System.out.print(42);
  127. }
  128. }
  129. #+end_src"
  130. (should (string= "42" (org-babel-execute-src-block)))))
  131. (ert-deftest ob-java/simple-with-class-attr ()
  132. "Hello world program with class header attribute."
  133. (org-test-with-temp-text
  134. "#+begin_src java :results output silent :classname Simple
  135. public static void main(String[] args) {
  136. System.out.print(42);
  137. }
  138. #+end_src"
  139. (should (string= "42" (org-babel-execute-src-block)))))
  140. (ert-deftest ob-java/simple-with-class-attr-with-package ()
  141. "Hello world program with class attr with package."
  142. (org-test-with-temp-text
  143. "#+begin_src java :results output silent :classname pkg.Simple
  144. public static void main(String[] args) {
  145. System.out.print(42);
  146. }
  147. #+end_src"
  148. (should (string= "42" (org-babel-execute-src-block)))))
  149. (ert-deftest ob-java/one-arg ()
  150. "Command line arg."
  151. (org-test-with-temp-text
  152. "#+begin_src java :results output silent :cmdargs \"fortytwo\"
  153. System.out.print(args[0]);
  154. #+end_src"
  155. (should (string= "fortytwo" (org-babel-execute-src-block)))))
  156. (ert-deftest ob-java/args-quoted-string ()
  157. "Two command line args, first contains a space."
  158. (org-test-with-temp-text
  159. "#+begin_src java :results output silent :cmdargs \"\\\"forty two\\\" 42\"
  160. System.out.println(args[0]);
  161. System.out.println(args[1]);
  162. #+end_src"
  163. (should (string= "forty two\n42\n" (org-babel-execute-src-block)))))
  164. ;; var tests
  165. (ert-deftest ob-java/integer-var ()
  166. "Read and write an integer variable."
  167. (org-test-with-temp-text
  168. "#+begin_src java :var a=42 :results output silent
  169. System.out.print(a);
  170. #+end_src"
  171. (should (string= "42" (org-babel-execute-src-block)))))
  172. (ert-deftest ob-java/var-with-main ()
  173. "Read and write an integer variable, with main function provided."
  174. (org-test-with-temp-text
  175. "#+begin_src java :var a=42 :results output silent
  176. public static void main(String[] args) {
  177. System.out.print(a);
  178. }
  179. #+end_src"
  180. (should (string= "42" (org-babel-execute-src-block)))))
  181. (ert-deftest ob-java/var-with-class ()
  182. "Read and write an integer variable, with class provided."
  183. (org-test-with-temp-text
  184. "#+begin_src java :var a=42 :results output silent
  185. public class Main {
  186. public static void main(String[] args) {
  187. System.out.print(a);
  188. }
  189. }
  190. #+end_src"
  191. (should (string= "42" (org-babel-execute-src-block)))))
  192. (ert-deftest ob-java/var-with-class-and-package ()
  193. "Read and write an integer variable, with class and package provided."
  194. (org-test-with-temp-text
  195. "#+begin_src java :var a=42 :results output silent
  196. package pkg;
  197. public class Main {
  198. public static void main(String[] args) {
  199. System.out.print(a);
  200. }
  201. }
  202. #+end_src"
  203. (should (string= "42" (org-babel-execute-src-block)))))
  204. (ert-deftest ob-java/var-with-class-and-hanging-curlies ()
  205. "Read and write an integer variable, with class with hanging curlies."
  206. (org-test-with-temp-text
  207. "#+begin_src java :var a=42 :results output silent
  208. public class Main
  209. {
  210. public static void main(String[] args)
  211. {
  212. System.out.print(a);
  213. }
  214. }
  215. #+end_src"
  216. (should (string= "42" (org-babel-execute-src-block)))))
  217. (ert-deftest ob-java/two-vars ()
  218. "Read two integer variables, combine and write them."
  219. (org-test-with-temp-text
  220. "#+begin_src java :var a=21 b=2 :results output silent
  221. System.out.print(a*b);
  222. #+end_src"
  223. (should (string= "42" (org-babel-execute-src-block)))))
  224. (ert-deftest ob-java/string-var ()
  225. "Read and write a string variable."
  226. (org-test-with-temp-text
  227. "#+begin_src java :var a=\"forty two\" :results output silent
  228. System.out.print(String.format(\"%s, len=%d\", a, a.length()));
  229. #+end_src"
  230. (should (string= "forty two, len=9" (org-babel-execute-src-block)))))
  231. (ert-deftest ob-java/multiline-string-var ()
  232. "Java doesn't support multiline string literals, so this errors."
  233. (org-test-with-temp-text
  234. "#+begin_src java :var a=\"forty\ntwo\" :results output silent
  235. System.out.print(String.format(\"%s, len=%d\", a, a.length()));
  236. #+end_src"
  237. (should-error (org-babel-execute-src-block)))
  238. :type 'error)
  239. ;; return list
  240. (ert-deftest ob-java/return-vector-using-list ()
  241. "Return a vector using a list."
  242. (org-test-with-temp-text
  243. "#+begin_src java :results vector silent
  244. import java.util.List;
  245. import java.util.Arrays;
  246. List<List<Integer>> a = Arrays.asList(Arrays.asList(4),
  247. Arrays.asList(2));
  248. return a;
  249. #+end_src"
  250. (should (equal '((4) (2))
  251. (org-babel-execute-src-block)))))
  252. (ert-deftest ob-java/return-vector-using-array ()
  253. "Return a vector using an array."
  254. (org-test-with-temp-text
  255. "#+begin_src java :results vector silent
  256. Integer[][] a = {{4}, {2}};
  257. return a;
  258. #+end_src"
  259. (should (equal '((4) (2))
  260. (org-babel-execute-src-block)))))
  261. (ert-deftest ob-java/read-return-list ()
  262. "Read and return a list."
  263. (org-test-with-temp-text
  264. "#+begin_src java :var a=java_list :results silent
  265. import java.util.List;
  266. import java.util.Arrays;
  267. List<String> b = Arrays.asList(a.get(0).get(0),
  268. a.get(1).get(0));
  269. return b;
  270. #+end_src
  271. #+name: java_list
  272. - forty
  273. - two"
  274. (should (equal '("forty" "two")
  275. (org-babel-execute-src-block)))))
  276. (ert-deftest ob-java/read-list-return-array ()
  277. "Read a list and return an array."
  278. (org-test-with-temp-text
  279. "#+begin_src java :var a=java_list :results silent
  280. String[] b = {a.get(0).get(0), a.get(1).get(0)};
  281. return b;
  282. #+end_src
  283. #+name: java_list
  284. - forty
  285. - two"
  286. (should (equal '("forty" "two")
  287. (org-babel-execute-src-block)))))
  288. (ert-deftest ob-java/read-return-list-with-package ()
  289. "Return a vector."
  290. (org-test-with-temp-text
  291. "#+begin_src java :var a=java_list :results silent
  292. package pkg;
  293. import java.util.List;
  294. import java.util.Arrays;
  295. List<String> b = Arrays.asList(a.get(0).get(0),
  296. a.get(1).get(0));
  297. return b;
  298. #+end_src
  299. #+name: java_list
  300. - forty
  301. - two"
  302. (should (equal '("forty" "two")
  303. (org-babel-execute-src-block)))))
  304. (ert-deftest ob-java/output-list-with-spaces ()
  305. "Return a vector."
  306. (org-test-with-temp-text
  307. "#+begin_src java :results output list raw silent
  308. System.out.println(\"forty two\");
  309. System.out.println(\"forty two\");
  310. #+end_src"
  311. (should (equal "forty two\nforty two\n"
  312. (org-babel-execute-src-block)))))
  313. ;; list vars
  314. (ert-deftest ob-java/list-var ()
  315. "Read and write a list variable."
  316. (org-test-with-temp-text
  317. "#+begin_src java :var a='(\"forty\" \"two\") :results silent
  318. import java.util.List;
  319. List<String> b = a;
  320. return b;
  321. #+end_src"
  322. (should (equal '("forty" "two")
  323. (org-babel-execute-src-block)))))
  324. (ert-deftest ob-java/vector-var ()
  325. "Read and write a vector variable."
  326. (org-test-with-temp-text
  327. "#+begin_src java :var a='[\"forty\" \"two\"] :results silent
  328. import java.util.List;
  329. List<String> b = a;
  330. return b;
  331. #+end_src"
  332. (should (equal '("forty" "two")
  333. (org-babel-execute-src-block)))))
  334. (ert-deftest ob-java/matrix-var ()
  335. "Read and write matrix variable."
  336. (org-test-with-temp-text
  337. "#+begin_src java :var a=java_matrix :results silent
  338. import java.util.List;
  339. import java.util.Arrays;
  340. List<List<Integer>> b = Arrays.asList(Arrays.asList(a.get(0).get(0), a.get(1).get(0)),
  341. Arrays.asList(a.get(0).get(1), a.get(1).get(1)));
  342. return b; // transpose
  343. #+end_src
  344. #+name: java_matrix
  345. | 2 | 1 |
  346. | 4 | 2 |"
  347. (should (equal '((2 4) (1 2))
  348. (org-babel-execute-src-block)))))
  349. (ert-deftest ob-java/matrix-var-with-header ()
  350. "Read matrix variable and write it with header."
  351. (org-test-with-temp-text
  352. "#+begin_src java :var a=java_matrix :results value table silent
  353. import java.util.List;
  354. import java.util.Arrays;
  355. List<List> b = Arrays.asList(Arrays.asList(\"col1\", \"col2\"),
  356. null,
  357. Arrays.asList(a.get(0).get(0), a.get(1).get(0)),
  358. Arrays.asList(a.get(0).get(1), a.get(1).get(1)));
  359. return b; // transpose
  360. #+end_src
  361. #+name: java_matrix
  362. | 2 | 1 |
  363. | 4 | 2 |"
  364. (should (equal '(("col1" "col2") hline (2 4) (1 2))
  365. (org-babel-execute-src-block)))))
  366. ;; output table
  367. (ert-deftest ob-java/output-table-with-header ()
  368. "Write a table that includes a header."
  369. (org-test-with-temp-text
  370. "#+begin_src java :var a=java_matrix :results output raw table silent
  371. System.out.println(\"|col1|col2|\");
  372. System.out.println(\"|-\");
  373. for (int ii=0; ii<a.size(); ii++) {
  374. for (int jj=0; jj<a.get(0).size(); jj++) {
  375. System.out.print(\"|\" + a.get(ii).get(jj));
  376. }
  377. System.out.println(\"\");
  378. }
  379. #+end_src
  380. #+name: java_matrix
  381. | 2 | 1 |
  382. | 4 | 2 |"
  383. (should (equal "|col1|col2|\n|-\n|2|1\n|4|2\n"
  384. (org-babel-execute-src-block)))))
  385. (ert-deftest ob-java/inhomogeneous_table ()
  386. "Read and write an inhomogeneous table."
  387. (org-test-with-temp-text
  388. "#+begin_src java :var a=java_table :results silent
  389. import java.util.List;
  390. import java.util.Arrays;
  391. List<List> b = Arrays.asList(Arrays.asList(a.get(0).get(0),
  392. Integer.parseInt(a.get(0).get(1))*2),
  393. Arrays.asList(a.get(1).get(0),
  394. Integer.parseInt(a.get(1).get(1))*2));
  395. return b;
  396. #+end_src
  397. #+name: java_table
  398. | string | number |
  399. |--------+--------|
  400. | forty | 2 |
  401. | two | 1 |"
  402. (should (equal
  403. '(("forty" 4) ("two" 2))
  404. (org-babel-execute-src-block)))))
  405. ;; imports
  406. (ert-deftest ob-java/import_library ()
  407. "Import a standard java library."
  408. (org-test-with-temp-text
  409. "#+begin_src java :results output silent :imports java.util.Base64
  410. byte[] encoded = Base64.getEncoder().encode(\"42\".getBytes());
  411. String decoded = new String(Base64.getDecoder().decode(encoded));
  412. System.out.print(String.format(\"encoded=%s, decoded=%s\", new String(encoded), decoded));
  413. #+end_src"
  414. (should (string=
  415. "encoded=NDI=, decoded=42"
  416. (org-babel-execute-src-block)))))
  417. (ert-deftest ob-java/import_library_inline ()
  418. "Import a standard java library."
  419. (org-test-with-temp-text
  420. "#+begin_src java :results output silent
  421. import java.util.Base64;
  422. byte[] encoded = Base64.getEncoder().encode(\"42\".getBytes());
  423. String decoded = new String(Base64.getDecoder().decode(encoded));
  424. System.out.print(String.format(\"encoded=%s, decoded=%s\", new String(encoded), decoded));
  425. #+end_src"
  426. (should (string=
  427. "encoded=NDI=, decoded=42"
  428. (org-babel-execute-src-block)))))
  429. ;; tangle
  430. (ert-deftest ob-java/tangle ()
  431. "Tangle a source block."
  432. (org-test-with-temp-text-in-file
  433. "#+begin_src java :tangle \"Tangle.java\" :results value :classname Tangle
  434. return \"tangled\";
  435. #+end_src"
  436. (should
  437. (string=
  438. "public class Tangle {
  439. public static void main(String[] args) {
  440. return \"tangled\";
  441. }
  442. }
  443. "
  444. (unwind-protect
  445. (progn (org-babel-tangle)
  446. (with-temp-buffer
  447. (insert-file-contents "Tangle.java")
  448. (untabify (point-min) (point-max))
  449. (buffer-string)))
  450. (delete-file "Tangle.java"))))))
  451. (ert-deftest ob-java/tangle-with-package ()
  452. "Tangle a source block."
  453. (org-test-with-temp-text-in-file
  454. "#+begin_src java :tangle \"tangle/Tangle.java\" :results value :classname tangle.Tangle
  455. return \"tangled\";
  456. #+end_src"
  457. (should
  458. (string=
  459. "package tangle;
  460. public class Tangle {
  461. public static void main(String[] args) {
  462. return \"tangled\";
  463. }
  464. }
  465. "
  466. (unwind-protect
  467. (progn
  468. (make-directory "tangle")
  469. (org-babel-tangle)
  470. (with-temp-buffer
  471. (insert-file-contents "tangle/Tangle.java")
  472. (untabify (point-min) (point-max))
  473. (buffer-string)))
  474. (delete-file "tangle/Tangle.java")
  475. (delete-directory "tangle"))))))
  476. ;; specify output dir
  477. (ert-deftest ob-java/simple-dir ()
  478. "Hello world program that writes output."
  479. (org-test-with-temp-text
  480. (format "#+begin_src java :results output silent :dir %s
  481. System.out.print(42);
  482. #+end_src" org-babel-temporary-directory)
  483. (should (string=
  484. "42"
  485. (unwind-protect
  486. (org-babel-execute-src-block)
  487. (delete-file (concat (file-name-as-directory org-babel-temporary-directory)
  488. "Main.java"))
  489. (delete-file (concat (file-name-as-directory org-babel-temporary-directory)
  490. "Main.class")))))))
  491. (ert-deftest ob-java/simple-dir-with-package ()
  492. "Hello world program that writes output."
  493. (org-test-with-temp-text
  494. (format "#+begin_src java :results output silent :dir %s
  495. package pkg;
  496. public class Main {
  497. public static void main(String[] args) {
  498. System.out.print(42);
  499. }
  500. }
  501. #+end_src" org-babel-temporary-directory)
  502. (should (string=
  503. "42"
  504. (unwind-protect
  505. (org-babel-execute-src-block)
  506. (delete-file (concat (file-name-as-directory org-babel-temporary-directory)
  507. "pkg/Main.java"))
  508. (delete-file (concat (file-name-as-directory org-babel-temporary-directory)
  509. "pkg/Main.class"))
  510. (delete-directory (concat (file-name-as-directory org-babel-temporary-directory)
  511. "pkg")))))))
  512. ;;; test-ob-java.el ends here