test-ob-java.el 20 KB

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