PageRenderTime 64ms CodeModel.GetById 31ms RepoModel.GetById 0ms app.codeStats 0ms

/test/camelot/test/fo.clj

https://github.com/democracyworks/camelot
Clojure | 576 lines | 560 code | 16 blank | 0 comment | 25 complexity | 434e441598a807455ad3d7c004a3350b MD5 | raw file
  1. (ns camelot.test.fo
  2. (:use [clojure.test]
  3. [camelot.test.helpers]
  4. [camelot.fo] :reload)
  5. (:require [clojure.data.xml :as xml])
  6. (:import [java.io File]
  7. [org.apache.pdfbox.util PDFTextStripper]
  8. [org.apache.pdfbox.pdmodel PDDocument]))
  9. (deftest test-layout
  10. (is (= (layout {})
  11. #clojure.data.xml.Element{
  12. :tag :fo:layout-master-set
  13. :attrs {}
  14. :content
  15. (#clojure.data.xml.Element{
  16. :tag :fo:simple-page-master
  17. :attrs {:master-name "first"
  18. :margin-right "1.5cm"
  19. :margin-left "1.5cm"
  20. :margin-bottom "2cm"
  21. :margin-top "1cm"
  22. :page-width "211mm"
  23. :page-height "297mm"}
  24. :content
  25. (#clojure.data.xml.Element{
  26. :tag :fo:region-body
  27. :attrs {:margin-top "0cm"}
  28. :content ()}
  29. #clojure.data.xml.Element{
  30. :tag :fo:region-before
  31. :attrs {:extent "1cm"}
  32. :content ()}
  33. #clojure.data.xml.Element{
  34. :tag :fo:region-after
  35. :attrs {:extent "1.5cm"}
  36. :content ()})})}))
  37. (is (= (layout {:margin-right "1:42cm"
  38. :margin-left "2:42cm"
  39. :margin-bottom "3:42cm"
  40. :margin-top "4:42cm"
  41. :page-width "5:42mm"
  42. :page-height "6:42mm"
  43. :region-body {:margin-top "3cm"}
  44. :region-before {:extent "2cm"}
  45. :region-after {:extent "1cm"}})
  46. #clojure.data.xml.Element{
  47. :tag :fo:layout-master-set
  48. :attrs {}
  49. :content
  50. (#clojure.data.xml.Element{
  51. :tag :fo:simple-page-master
  52. :attrs {:master-name "first"
  53. :margin-right "1:42cm"
  54. :margin-left "2:42cm"
  55. :margin-bottom "3:42cm"
  56. :margin-top "4:42cm"
  57. :page-width "5:42mm"
  58. :page-height "6:42mm"}
  59. :content
  60. (#clojure.data.xml.Element{
  61. :tag :fo:region-body
  62. :attrs {:margin-top "3cm"}
  63. :content ()}
  64. #clojure.data.xml.Element{
  65. :tag :fo:region-before
  66. :attrs {:extent "2cm"}
  67. :content ()}
  68. #clojure.data.xml.Element{
  69. :tag :fo:region-after
  70. :attrs {:extent "1cm"}
  71. :content ()})})})))
  72. (deftest test-block?
  73. (are [v] (not (block? v))
  74. nil
  75. {:tag :fo:block}
  76. (xml/element :fo:not-block {} "hey"))
  77. (are [v] (block? v)
  78. (xml/element :fo:block {} "hey")
  79. (block "hey")))
  80. (deftest test-block
  81. (is (= (block "Hic sunt dracones.")
  82. #clojure.data.xml.Element{
  83. :tag :fo:block
  84. :attrs {:text-align "left"
  85. :font-size "10pt"
  86. :line-height "14pt"}
  87. :content ("Hic sunt dracones.")}))
  88. (is (= (block {:space-before.optimum "10pt"
  89. :space-after.optimum "20pt"
  90. :text-align "end"}
  91. "Hic sunt dracones.")
  92. #clojure.data.xml.Element{
  93. :tag :fo:block
  94. :attrs {:text-align "end"
  95. :font-size "10pt"
  96. :line-height "14pt"
  97. :space-before.optimum "10pt"
  98. :space-after.optimum "20pt"}
  99. :content ("Hic sunt dracones.")}))
  100. (is (= (block [(block "A") (block "B")])
  101. #clojure.data.xml.Element{
  102. :tag :fo:block
  103. :attrs {:text-align "left"
  104. :font-size "10pt"
  105. :line-height "14pt"}
  106. :content (#clojure.data.xml.Element{
  107. :tag :fo:block
  108. :attrs {:text-align "left"
  109. :font-size "10pt"
  110. :line-height "14pt"}
  111. :content ("A")}
  112. #clojure.data.xml.Element{
  113. :tag :fo:block
  114. :attrs {:text-align "left"
  115. :font-size "10pt"
  116. :line-height "14pt"}
  117. :content ("B")})})))
  118. (deftest test-table-cell
  119. (is (= (table-cell "Foo")
  120. #clojure.data.xml.Element{
  121. :tag :fo:table-cell
  122. :attrs {}
  123. :content (#clojure.data.xml.Element{
  124. :tag :fo:block
  125. :attrs {:text-align "left"
  126. :font-size "10pt"
  127. :line-height "14pt"}
  128. :content ("Foo")})}))
  129. (is (= (table-cell (block {:text-align "right"} "Foo"))
  130. #clojure.data.xml.Element{
  131. :tag :fo:table-cell
  132. :attrs {}
  133. :content (#clojure.data.xml.Element{
  134. :tag :fo:block
  135. :attrs {:text-align "right"
  136. :font-size "10pt"
  137. :line-height "14pt"}
  138. :content ("Foo")})})))
  139. (deftest test-table-row-has-attributes?
  140. (is (table-row-has-attributes? [{:foo "bar"} "A" "B" "C"]))
  141. (are [v] (not (table-row-has-attributes? v))
  142. [(block "A") "B" "C"]
  143. ["A" "B" "C"]))
  144. (deftest test-table-row
  145. (is (= (table-row "A" "B" "C")
  146. #clojure.data.xml.Element{
  147. :tag :fo:table-row
  148. :attrs {}
  149. :content (#clojure.data.xml.Element{
  150. :tag :fo:table-cell
  151. :attrs {}
  152. :content (#clojure.data.xml.Element{
  153. :tag :fo:block
  154. :attrs {:text-align "left"
  155. :font-size "10pt"
  156. :line-height "14pt"}
  157. :content ("A")})}
  158. #clojure.data.xml.Element{
  159. :tag :fo:table-cell
  160. :attrs {}
  161. :content (#clojure.data.xml.Element{
  162. :tag :fo:block
  163. :attrs {:text-align "left"
  164. :font-size "10pt"
  165. :line-height "14pt"}
  166. :content ("B")})}
  167. #clojure.data.xml.Element{
  168. :tag :fo:table-cell
  169. :attrs {}
  170. :content (#clojure.data.xml.Element{
  171. :tag :fo:block
  172. :attrs {:text-align "left"
  173. :font-size "10pt"
  174. :line-height "14pt"}
  175. :content ("C")})})}))
  176. (is (= (table-row (block {:font-weight "bold"} "A") "B" "C")
  177. #clojure.data.xml.Element{
  178. :tag :fo:table-row
  179. :attrs {}
  180. :content (#clojure.data.xml.Element{
  181. :tag :fo:table-cell
  182. :attrs {}
  183. :content (#clojure.data.xml.Element{
  184. :tag :fo:block
  185. :attrs {:text-align "left"
  186. :font-size "10pt"
  187. :line-height "14pt"
  188. :font-weight "bold"}
  189. :content ("A")})}
  190. #clojure.data.xml.Element{
  191. :tag :fo:table-cell
  192. :attrs {}
  193. :content (#clojure.data.xml.Element{
  194. :tag :fo:block
  195. :attrs {:text-align "left"
  196. :font-size "10pt"
  197. :line-height "14pt"}
  198. :content ("B")})}
  199. #clojure.data.xml.Element{
  200. :tag :fo:table-cell
  201. :attrs {}
  202. :content (#clojure.data.xml.Element{
  203. :tag :fo:block
  204. :attrs {:text-align "left"
  205. :font-size "10pt"
  206. :line-height "14pt"}
  207. :content ("C")})})}))
  208. (is (= (table-row {:border-width "0.5pt" :keep-with-next "always"}
  209. (block {:font-weight "bold"} "A"))
  210. #clojure.data.xml.Element{
  211. :tag :fo:table-row
  212. :attrs {:border-width "0.5pt"
  213. :keep-with-next "always"}
  214. :content (#clojure.data.xml.Element{
  215. :tag :fo:table-cell
  216. :attrs {}
  217. :content (#clojure.data.xml.Element{
  218. :tag :fo:block
  219. :attrs {:text-align "left"
  220. :font-size "10pt"
  221. :line-height "14pt"
  222. :font-weight "bold"}
  223. :content ("A")})})})))
  224. (deftest test-table-column
  225. (is (= (table-column "10cm")
  226. #clojure.data.xml.Element{:tag :fo:table-column
  227. :attrs {:column-width "10cm"}
  228. :content ()}))
  229. (is (= (table-column {:column-height "3cm"} "10cm")
  230. #clojure.data.xml.Element{:tag :fo:table-column
  231. :attrs {:column-width "10cm"
  232. :column-height "3cm"}
  233. :content ()})))
  234. (deftest test-table
  235. (is (= (table ["5cm" "5cm"] [["a" "b"] ["c" "d"]])
  236. #clojure.data.xml.Element{
  237. :tag :fo:table
  238. :attrs {:border-width "0.5pt"}
  239. :content
  240. (#clojure.data.xml.Element{
  241. :tag :fo:table-column
  242. :attrs {:column-width "5cm"}
  243. :content ()}
  244. #clojure.data.xml.Element{
  245. :tag :fo:table-column
  246. :attrs {:column-width "5cm"}
  247. :content ()}
  248. #clojure.data.xml.Element{
  249. :tag :fo:table-body
  250. :attrs {}
  251. :content
  252. (#clojure.data.xml.Element{
  253. :tag :fo:table-row
  254. :attrs {:border-width "0.5pt"
  255. :keep-with-next "always"}
  256. :content
  257. (#clojure.data.xml.Element{
  258. :tag :fo:table-cell
  259. :attrs {}
  260. :content
  261. (#clojure.data.xml.Element{
  262. :tag :fo:block
  263. :attrs {:text-align "left"
  264. :font-size "10pt"
  265. :line-height "14pt"}
  266. :content ("a")})}
  267. #clojure.data.xml.Element{
  268. :tag :fo:table-cell
  269. :attrs {}
  270. :content
  271. (#clojure.data.xml.Element{
  272. :tag :fo:block
  273. :attrs {:text-align "left"
  274. :font-size "10pt"
  275. :line-height "14pt"}
  276. :content ("b")})})}
  277. #clojure.data.xml.Element{
  278. :tag :fo:table-row
  279. :attrs {}
  280. :content
  281. (#clojure.data.xml.Element{
  282. :tag :fo:table-cell
  283. :attrs {}
  284. :content
  285. (#clojure.data.xml.Element{
  286. :tag :fo:block
  287. :attrs {:text-align "left"
  288. :font-size "10pt"
  289. :line-height "14pt"}
  290. :content ("c")})}
  291. #clojure.data.xml.Element{
  292. :tag :fo:table-cell
  293. :attrs {}
  294. :content
  295. (#clojure.data.xml.Element{
  296. :tag :fo:block
  297. :attrs {:text-align "left"
  298. :font-size "10pt"
  299. :line-height "14pt"}
  300. :content ("d")})})})})}))
  301. (is (= (table {:foo "bar"} ["5cm" "5cm"] [["a" "b"] ["c" "d"]])
  302. #clojure.data.xml.Element{
  303. :tag :fo:table
  304. :attrs {:foo "bar"}
  305. :content
  306. (#clojure.data.xml.Element{
  307. :tag :fo:table-column
  308. :attrs {:column-width "5cm"}
  309. :content ()}
  310. #clojure.data.xml.Element{
  311. :tag :fo:table-column
  312. :attrs {:column-width "5cm"}
  313. :content ()}
  314. #clojure.data.xml.Element{
  315. :tag :fo:table-body
  316. :attrs {}
  317. :content
  318. (#clojure.data.xml.Element{
  319. :tag :fo:table-row
  320. :attrs {:border-width "0.5pt"
  321. :keep-with-next "always"}
  322. :content
  323. (#clojure.data.xml.Element{
  324. :tag :fo:table-cell
  325. :attrs {}
  326. :content
  327. (#clojure.data.xml.Element{
  328. :tag :fo:block
  329. :attrs {:text-align "left"
  330. :font-size "10pt"
  331. :line-height "14pt"}
  332. :content ("a")})}
  333. #clojure.data.xml.Element{
  334. :tag :fo:table-cell
  335. :attrs {}
  336. :content
  337. (#clojure.data.xml.Element{
  338. :tag :fo:block
  339. :attrs {:text-align "left"
  340. :font-size "10pt"
  341. :line-height "14pt"}
  342. :content ("b")})})}
  343. #clojure.data.xml.Element{
  344. :tag :fo:table-row
  345. :attrs {}
  346. :content
  347. (#clojure.data.xml.Element{
  348. :tag :fo:table-cell
  349. :attrs {}
  350. :content
  351. (#clojure.data.xml.Element{
  352. :tag :fo:block
  353. :attrs {:text-align "left"
  354. :font-size "10pt"
  355. :line-height "14pt"}
  356. :content ("c")})}
  357. #clojure.data.xml.Element{
  358. :tag :fo:table-cell
  359. :attrs {}
  360. :content
  361. (#clojure.data.xml.Element{
  362. :tag :fo:block
  363. :attrs {:text-align "left"
  364. :font-size "10pt"
  365. :line-height "14pt"}
  366. :content ("d")})})})})}))
  367. (is (= (table ["5cm" "5cm"] [[{:foo "bar"} "a" "b"] ["c" "d"]])
  368. #clojure.data.xml.Element{
  369. :tag :fo:table
  370. :attrs {:border-width "0.5pt"}
  371. :content
  372. (#clojure.data.xml.Element{
  373. :tag :fo:table-column
  374. :attrs {:column-width "5cm"}
  375. :content ()}
  376. #clojure.data.xml.Element{
  377. :tag :fo:table-column
  378. :attrs {:column-width "5cm"}
  379. :content ()}
  380. #clojure.data.xml.Element{
  381. :tag :fo:table-body
  382. :attrs {}
  383. :content
  384. (#clojure.data.xml.Element{
  385. :tag :fo:table-row
  386. :attrs {:foo "bar"}
  387. :content
  388. (#clojure.data.xml.Element{
  389. :tag :fo:table-cell
  390. :attrs {}
  391. :content
  392. (#clojure.data.xml.Element{
  393. :tag :fo:block
  394. :attrs {:text-align "left"
  395. :font-size "10pt"
  396. :line-height "14pt"}
  397. :content ("a")})}
  398. #clojure.data.xml.Element{
  399. :tag :fo:table-cell
  400. :attrs {}
  401. :content
  402. (#clojure.data.xml.Element{
  403. :tag :fo:block
  404. :attrs {:text-align "left"
  405. :font-size "10pt"
  406. :line-height "14pt"}
  407. :content ("b")})})}
  408. #clojure.data.xml.Element{
  409. :tag :fo:table-row
  410. :attrs {}
  411. :content
  412. (#clojure.data.xml.Element{
  413. :tag :fo:table-cell
  414. :attrs {}
  415. :content
  416. (#clojure.data.xml.Element{
  417. :tag :fo:block
  418. :attrs {:text-align "left"
  419. :font-size "10pt"
  420. :line-height "14pt"}
  421. :content ("c")})}
  422. #clojure.data.xml.Element{
  423. :tag :fo:table-cell
  424. :attrs {}
  425. :content
  426. (#clojure.data.xml.Element{
  427. :tag :fo:block
  428. :attrs {:text-align "left"
  429. :font-size "10pt"
  430. :line-height "14pt"}
  431. :content ("d")})})})})})))
  432. (deftest test-region
  433. (is (= (region :static-content "xsl-region-before")
  434. (header)
  435. #clojure.data.xml.Element{:tag :fo:static-content
  436. :attrs {:flow-name "xsl-region-before"}
  437. :content ()}))
  438. (is (= (region :static-content "xsl-region-before" (block "A") (block "B"))
  439. (header (block "A") (block "B"))
  440. #clojure.data.xml.Element{:tag :fo:static-content
  441. :attrs {:flow-name "xsl-region-before"}
  442. :content
  443. (#clojure.data.xml.Element{
  444. :tag :fo:block
  445. :attrs {:text-align "left"
  446. :font-size "10pt"
  447. :line-height "14pt"}
  448. :content ("A")}
  449. #clojure.data.xml.Element{
  450. :tag :fo:block
  451. :attrs {:text-align "left"
  452. :font-size "10pt"
  453. :line-height "14pt"}
  454. :content ("B")})}))
  455. (is (= (region :static-content "xsl-region-after")
  456. (footer)
  457. #clojure.data.xml.Element{:tag :fo:static-content
  458. :attrs {:flow-name "xsl-region-after"}
  459. :content ()}))
  460. (is (= (region :static-content "xsl-region-after" (block "A") (block "B"))
  461. (footer (block "A") (block "B"))
  462. #clojure.data.xml.Element{:tag :fo:static-content
  463. :attrs {:flow-name "xsl-region-after"}
  464. :content
  465. (#clojure.data.xml.Element{
  466. :tag :fo:block
  467. :attrs {:text-align "left"
  468. :font-size "10pt"
  469. :line-height "14pt"}
  470. :content ("A")}
  471. #clojure.data.xml.Element{
  472. :tag :fo:block
  473. :attrs {:text-align "left"
  474. :font-size "10pt"
  475. :line-height "14pt"}
  476. :content ("B")})}))
  477. (is (= (region :flow "xsl-region-body")
  478. (body)
  479. #clojure.data.xml.Element{:tag :fo:flow
  480. :attrs {:flow-name "xsl-region-body"}
  481. :content ()}))
  482. (is (= (region :flow "xsl-region-body" (block "A") (block "B"))
  483. (body (block "A") (block "B"))
  484. #clojure.data.xml.Element{:tag :fo:flow
  485. :attrs {:flow-name "xsl-region-body"}
  486. :content
  487. (#clojure.data.xml.Element{
  488. :tag :fo:block
  489. :attrs {:text-align "left"
  490. :font-size "10pt"
  491. :line-height "14pt"}
  492. :content ("A")}
  493. #clojure.data.xml.Element{
  494. :tag :fo:block
  495. :attrs {:text-align "left"
  496. :font-size "10pt"
  497. :line-height "14pt"}
  498. :content ("B")})})))
  499. (deftest test-document
  500. (is (= (slurp "resources/fo/dummy-invoice.fo")
  501. (xml/indent-str
  502. (document {:header-blocks (map #(block {:text-align "end"} %)
  503. ["Telephone: +31 (0)6 48012240"
  504. "Street: IJskelderstraat 30"
  505. "Postal code: 5046 NK"
  506. "City: Tilburg"
  507. "Chamber of Commerce: 18068751"
  508. "VAT: 1903.14.849.B01"
  509. "Bank: Rabobank 3285.04.165"])}
  510. (block {:font-size "35pt"
  511. :space-before.optimum "0pt"
  512. :space-after.optimum "15pt"}
  513. "Vixu.com")
  514. (block {:space-before.optimum "100pt"
  515. :space-after.optimum "20pt"}
  516. (map block ["BigCo"
  517. "Mr. John Doe"
  518. "Harteveltstraat 1"
  519. "2586 EL Den Haag"
  520. "The Netherlands"]))
  521. (block {:font-weight "bold"
  522. :font-size "16"
  523. :space-after.optimum "20pt"}
  524. "Invoice")
  525. (table {:border-width "0.5pt" :space-after.optimum "30pt"}
  526. ["4cm" "5cm"]
  527. [["Date:" "05/02/2012"]
  528. ["Invoice number:" "BAZ01"]])
  529. (table {:border-width "0.5pt"}
  530. ["14cm" "3cm"]
  531. [[(str "Vixu.com basic subscription from "
  532. "March 1st 2012 to March 1st 2013:")
  533. (block {:text-align "right"} "€ 1188.00")]
  534. ["Discount (10%):"
  535. (block {:text-align "right"} "- € 118.80")]
  536. ["Subtotal:"
  537. (block {:text-align "right"} "€ 1070.00")]
  538. ["Value Added Tax (19%):"
  539. (block {:text-align "right"} "€ 203.30")]
  540. [{:font-weight "bold"}
  541. "Total:"
  542. (block {:text-align "right"} "€ 1273.30")]])
  543. (block {:space-before.optimum "35pt"}
  544. (str "You are kindly requested to pay within 7 days. "
  545. "Please wire the amount due to Rabobank account "
  546. "number 3285.04.165.")))))))
  547. (deftest test-write-pdf!
  548. (let [filename (temp-pdf-filename)]
  549. (do
  550. (write-pdf!
  551. (document {}
  552. (block {:font-size "35pt"
  553. :space-before.optimum "0pt"
  554. :space-after.optimum "15pt"}
  555. "Vixu.com"))
  556. filename))
  557. (is (= (.getText (PDFTextStripper.)
  558. (PDDocument/load
  559. (File. filename)))
  560. "Vixu.com\n"))))