test-ob-java.el 19 KB

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