PDFGeneratorTests.swift 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. //
  2. // PDFGeneratorTests.swift
  3. // PDFGeneratorTests
  4. //
  5. // Created by Suguru Kishimoto on 2016/02/04.
  6. //
  7. //
  8. import XCTest
  9. @testable import PDFGenerator
  10. class Mock {
  11. struct ImageName {
  12. static let testImage1 = "test_image1"
  13. }
  14. class func view(_ size: CGSize) -> UIView {
  15. return UIView(frame: CGRect(origin: CGPoint.zero, size: size))
  16. }
  17. class func scrollView(_ size: CGSize) -> UIScrollView {
  18. return { () -> UIScrollView in
  19. let v = UIScrollView(frame: CGRect(origin: CGPoint.zero, size: size))
  20. v.contentSize = v.frame.size
  21. return v
  22. }()
  23. }
  24. class func imagePath(_ name: String) -> String{
  25. return Bundle(for: self).path(forResource: name, ofType: "png")!
  26. }
  27. class func image(_ name: String) -> UIImage {
  28. return UIImage(contentsOfFile: imagePath(name))!
  29. }
  30. }
  31. class PDFGeneratorTests: XCTestCase {
  32. func isExistPDF(_ path: String) -> Bool {
  33. return FileManager.default.fileExists(atPath: path)
  34. }
  35. func PDFDirectoryPath() -> String {
  36. return NSHomeDirectory() + "/test/"
  37. }
  38. func PDFfilePath(_ fileName: String) -> String {
  39. return PDFDirectoryPath() + "/\(fileName)"
  40. }
  41. override func setUp() {
  42. super.setUp()
  43. try! FileManager.default.createDirectory(
  44. atPath: PDFDirectoryPath(),
  45. withIntermediateDirectories: true,
  46. attributes: nil
  47. )
  48. }
  49. override func tearDown() {
  50. _ = try? FileManager.default.removeItem(atPath: PDFDirectoryPath())
  51. super.tearDown()
  52. }
  53. // MARK: UIView -> PDF
  54. func testViewToPDF() {
  55. let view = Mock.view(CGSize(width: 100, height: 100))
  56. let view2 = Mock.scrollView(CGSize(width: 100, height: 100))
  57. let path1 = PDFfilePath("test_sample1.pdf")
  58. _ = try? PDFGenerator.generate(view, to: path1)
  59. XCTAssertTrue(isExistPDF(path1))
  60. let path2 = PDFfilePath("hoge/test_sample2.pdf")
  61. _ = try? PDFGenerator.generate(view, to: path2)
  62. XCTAssertFalse(isExistPDF(path2))
  63. let path3 = PDFfilePath("test_sample3.pdf")
  64. _ = try? PDFGenerator.generate(view, to: path3)
  65. XCTAssertTrue(isExistPDF(path3))
  66. XCTAssertNotNil(try? PDFGenerator.generated(by: view))
  67. XCTAssertNotNil(try? PDFGenerator.generated(by: [view]))
  68. XCTAssertNotNil(try? PDFGenerator.generated(by: [view, view2]))
  69. }
  70. // MARK: UIImage -> PDF
  71. func testImageToPDF() {
  72. let image1 = Mock.image("test_image1")
  73. let image2 = Mock.image("test_image1")
  74. let path1 = PDFfilePath("test_sample1.pdf")
  75. _ = try? PDFGenerator.generate(image1, to: path1)
  76. XCTAssertTrue(isExistPDF(path1))
  77. let path2 = PDFfilePath("hoge/test_sample2.pdf")
  78. _ = try? PDFGenerator.generate(image1, to: path2)
  79. XCTAssertFalse(isExistPDF(path2))
  80. let path3 = PDFfilePath("test_sample3.pdf")
  81. _ = try? PDFGenerator.generate([image1, image2], to: path3)
  82. XCTAssertTrue(isExistPDF(path3))
  83. XCTAssertNotNil(try? PDFGenerator.generated(by: image1))
  84. XCTAssertNotNil(try? PDFGenerator.generated(by: [image1]))
  85. XCTAssertNotNil(try? PDFGenerator.generated(by: [image1, image2]))
  86. }
  87. // MARK: ImagePath(String) -> PDF
  88. func testImagePathToPDF() {
  89. let image1 = Mock.imagePath("test_image1")
  90. let image2 = Mock.imagePath("test_image1")
  91. let path1 = PDFfilePath("test_sample1.pdf")
  92. _ = try? PDFGenerator.generate(image1, to: path1)
  93. XCTAssertTrue(isExistPDF(path1))
  94. let path2 = PDFfilePath("hoge/test_sample2.pdf")
  95. _ = try? PDFGenerator.generate(image1, to: path2)
  96. XCTAssertFalse(isExistPDF(path2))
  97. let path3 = PDFfilePath("test_sample3.pdf")
  98. _ = try? PDFGenerator.generate([image1, image2], to: path3)
  99. XCTAssertTrue(isExistPDF(path3))
  100. XCTAssertNotNil(try? PDFGenerator.generated(by: image1))
  101. XCTAssertNotNil(try? PDFGenerator.generated(by: [image1]))
  102. XCTAssertNotNil(try? PDFGenerator.generated(by: [image1, image2]))
  103. }
  104. // MARK: PDFPage -> PDF
  105. func testMixedPageToPDF() {
  106. let p1 = PDFPage.view(Mock.view(CGSize(width: 100, height: 100)))
  107. let p2 = PDFPage.image(Mock.image(Mock.ImageName.testImage1))
  108. let p3 = PDFPage.imagePath(Mock.imagePath(Mock.ImageName.testImage1))
  109. let p4 = PDFPage.whitePage(CGSize(width: 100, height: 100))
  110. let p5 = PDFPage.imageRef(Mock.image(Mock.ImageName.testImage1).cgImage!)
  111. let p6 = PDFPage.binary(UIImagePNGRepresentation(Mock.image(Mock.ImageName.testImage1))!)
  112. let path1 = PDFfilePath("test_sample1.pdf")
  113. _ = try? PDFGenerator.generate(p1, to: path1)
  114. XCTAssertTrue(isExistPDF(path1))
  115. let path2 = PDFfilePath("hoge/test_sample2.pdf")
  116. _ = try? PDFGenerator.generate(p2, to: path2)
  117. XCTAssertFalse(isExistPDF(path2))
  118. let path3 = PDFfilePath("test_sample3.pdf")
  119. _ = try? PDFGenerator.generate([p1, p2, p3, p4], to: path3)
  120. XCTAssertTrue(isExistPDF(path3))
  121. XCTAssertNotNil(try? PDFGenerator.generated(by: p1))
  122. XCTAssertNotNil(try? PDFGenerator.generated(by: [p2]))
  123. XCTAssertNotNil(try? PDFGenerator.generated(by: [p3, p4]))
  124. XCTAssertNotNil(try? PDFGenerator.generated(by: [p5, p6]))
  125. }
  126. // swiftlint:disable function_body_length
  127. func testErrors() {
  128. let view = Mock.view(CGSize(width: 100, height: 100))
  129. let image = Mock.image(Mock.ImageName.testImage1)
  130. let imagePath = Mock.imagePath(Mock.ImageName.testImage1)
  131. let viewPage = PDFPage.view(Mock.view(CGSize(width: 100, height: 100)))
  132. let imagePage = PDFPage.image(Mock.image(Mock.ImageName.testImage1))
  133. let imagePathPage = PDFPage.imagePath(Mock.imagePath(Mock.ImageName.testImage1))
  134. let whitePage = PDFPage.whitePage(CGSize(width: 100, height: 100))
  135. let views = [
  136. Mock.view(CGSize(width: 100, height: 100)),
  137. Mock.view(CGSize(width: 100, height: 100))
  138. ]
  139. let images = [
  140. Mock.image(Mock.ImageName.testImage1),
  141. Mock.image(Mock.ImageName.testImage1)
  142. ]
  143. let imagePaths = [
  144. Mock.imagePath(Mock.ImageName.testImage1),
  145. Mock.imagePath(Mock.ImageName.testImage1)
  146. ]
  147. let pages = [
  148. PDFPage.view(Mock.view(CGSize(width: 100, height: 100))),
  149. PDFPage.image(Mock.image(Mock.ImageName.testImage1)),
  150. PDFPage.imagePath(Mock.imagePath(Mock.ImageName.testImage1)),
  151. PDFPage.whitePage(CGSize(width: 100, height: 100))
  152. ]
  153. let mocks: [Any] = [
  154. view,
  155. image,
  156. imagePath,
  157. viewPage,
  158. imagePage,
  159. imagePathPage,
  160. whitePage,
  161. views,
  162. images,
  163. imagePaths,
  164. pages
  165. ]
  166. let emptyMocks: [Any] = [
  167. [UIView](),
  168. [UIImage](),
  169. [String](),
  170. [PDFPage]()
  171. ]
  172. // MARK: check EmptyOutputPath
  173. mocks.forEach {
  174. do {
  175. if let page = $0 as? UIView {
  176. try PDFGenerator.generate(page, to: "")
  177. } else if let page = $0 as? UIImage {
  178. try PDFGenerator.generate(page, to: "")
  179. } else if let page = $0 as? String {
  180. try PDFGenerator.generate(page, to: "")
  181. } else if let page = $0 as? PDFPage {
  182. try PDFGenerator.generate(page, to: "")
  183. } else if let pages = $0 as? [UIView] {
  184. try PDFGenerator.generate(pages, to: "")
  185. } else if let pages = $0 as? [UIImage] {
  186. try PDFGenerator.generate(pages, to: "")
  187. } else if let pages = $0 as? [String] {
  188. try PDFGenerator.generate(pages, to: "")
  189. } else if let pages = $0 as? [PDFPage] {
  190. try PDFGenerator.generate(pages, to: "")
  191. } else {
  192. XCTFail("invalid page(s) type found.")
  193. }
  194. XCTFail("[\($0)] No create PDF from empty name image path.")
  195. } catch PDFGenerateError.emptyOutputPath {
  196. // Right Error
  197. } catch (let e) {
  198. XCTFail("[\($0)] Unknown or wrong error occurred.\(e)")
  199. }
  200. }
  201. // MARK: check EmptyPage
  202. emptyMocks.forEach {
  203. do {
  204. let path = PDFfilePath("test_sample1.pdf")
  205. if let pages = $0 as? [UIView] {
  206. try PDFGenerator.generate(pages, to: path)
  207. } else if let pages = $0 as? [UIImage] {
  208. try PDFGenerator.generate(pages, to: path)
  209. } else if let pages = $0 as? [String] {
  210. try PDFGenerator.generate(pages, to: path)
  211. } else if let pages = $0 as? [PDFPage] {
  212. try PDFGenerator.generate(pages, to: path)
  213. } else {
  214. XCTFail("invalid pages type found.")
  215. }
  216. XCTFail("[\($0)] No create PDF from empty name image path.")
  217. } catch PDFGenerateError.emptyPage {
  218. // Right Error
  219. } catch (let e) {
  220. XCTFail("[\($0)] Unknown or wrong error occurred.\(e)")
  221. }
  222. }
  223. // MARK: check EmptyPage
  224. emptyMocks.forEach {
  225. do {
  226. if let pages = $0 as? [UIView] {
  227. _ = try PDFGenerator.generated(by: pages)
  228. } else if let pages = $0 as? [UIImage] {
  229. _ = try PDFGenerator.generated(by: pages)
  230. } else if let pages = $0 as? [String] {
  231. _ = try PDFGenerator.generated(by: pages)
  232. } else if let pages = $0 as? [PDFPage] {
  233. _ = try PDFGenerator.generated(by: pages)
  234. } else {
  235. XCTFail("invalid pages type found.")
  236. }
  237. XCTFail("[\($0)] No create PDF from empty name image path.")
  238. } catch PDFGenerateError.emptyPage {
  239. // Right Error
  240. } catch (let e) {
  241. XCTFail("[\($0)] Unknown or wrong error occurred.\(e)")
  242. }
  243. }
  244. // MARK: check ZeroSizeView
  245. let emptyView = Mock.view(CGSize.zero)
  246. do {
  247. let path = PDFfilePath("test_sample2.pdf")
  248. try PDFGenerator.generate(emptyView, to: path)
  249. } catch PDFGenerateError.zeroSizeView(let v) {
  250. XCTAssertEqual(emptyView, v)
  251. } catch (let e) {
  252. XCTFail("Unknown or wrong error occurred.\(e)")
  253. }
  254. do {
  255. _ = try PDFGenerator.generated(by: emptyView)
  256. } catch PDFGenerateError.zeroSizeView(let v) {
  257. XCTAssertEqual(emptyView, v)
  258. } catch (let e) {
  259. XCTFail("Unknown or wrong error occurred.\(e)")
  260. }
  261. do {
  262. _ = try PDFGenerator.generated(by: [emptyView])
  263. } catch PDFGenerateError.zeroSizeView(let v) {
  264. XCTAssertEqual(emptyView, v)
  265. } catch (let e) {
  266. XCTFail("Unknown or wrong error occurred.\(e)")
  267. }
  268. let emptyViewPage = PDFPage.view(emptyView)
  269. do {
  270. let path = PDFfilePath("test_sample3.pdf")
  271. try PDFGenerator.generate(emptyViewPage, to: path)
  272. } catch PDFGenerateError.zeroSizeView(let v) {
  273. XCTAssertEqual(emptyView, v)
  274. } catch (let e) {
  275. XCTFail("Unknown or wrong error occurred.\(e)")
  276. }
  277. do {
  278. _ = try PDFGenerator.generated(by: emptyViewPage)
  279. } catch PDFGenerateError.zeroSizeView(let v) {
  280. XCTAssertEqual(emptyView, v)
  281. } catch (let e) {
  282. XCTFail("Unknown or wrong error occurred.\(e)")
  283. }
  284. do {
  285. _ = try PDFGenerator.generated(by: [emptyViewPage])
  286. } catch PDFGenerateError.zeroSizeView(let v) {
  287. XCTAssertEqual(emptyView, v)
  288. } catch (let e) {
  289. XCTFail("Unknown or wrong error occurred.\(e)")
  290. }
  291. // MARK: check ImageLoadFailed
  292. let wrongImagePath = "wrong/image.png"
  293. do {
  294. let path = PDFfilePath("test_sample4.pdf")
  295. try PDFGenerator.generate(wrongImagePath, to: path)
  296. } catch PDFGenerateError.imageLoadFailed(let ip) {
  297. XCTAssertEqual(wrongImagePath, ip as? String)
  298. } catch (let e) {
  299. XCTFail("Unknown or wrong error occurred.\(e)")
  300. }
  301. do {
  302. _ = try PDFGenerator.generated(by: wrongImagePath)
  303. } catch PDFGenerateError.imageLoadFailed(let ip) {
  304. XCTAssertEqual(wrongImagePath, ip as? String)
  305. } catch (let e) {
  306. XCTFail("Unknown or wrong error occurred.\(e)")
  307. }
  308. do {
  309. _ = try PDFGenerator.generated(by: [wrongImagePath])
  310. } catch PDFGenerateError.imageLoadFailed(let ip) {
  311. XCTAssertEqual(wrongImagePath, ip as? String)
  312. } catch (let e) {
  313. XCTFail("Unknown or wrong error occurred.\(e)")
  314. }
  315. let wrongImagePathPage = PDFPage.imagePath(wrongImagePath)
  316. do {
  317. let path = PDFfilePath("test_sample5.pdf")
  318. try PDFGenerator.generate(wrongImagePathPage, to: path)
  319. } catch PDFGenerateError.imageLoadFailed(let ip) {
  320. XCTAssertEqual(wrongImagePath, ip as? String)
  321. } catch (let e) {
  322. XCTFail("Unknown or wrong error occurred.\(e)")
  323. }
  324. do {
  325. _ = try PDFGenerator.generated(by: wrongImagePathPage)
  326. } catch PDFGenerateError.imageLoadFailed(let ip) {
  327. XCTAssertEqual(wrongImagePath, ip as? String)
  328. } catch (let e) {
  329. XCTFail("Unknown or wrong error occurred.\(e)")
  330. }
  331. do {
  332. _ = try PDFGenerator.generated(by: [wrongImagePathPage])
  333. } catch PDFGenerateError.imageLoadFailed(let ip) {
  334. XCTAssertEqual(wrongImagePath, ip as? String)
  335. } catch (let e) {
  336. XCTFail("Unknown or wrong error occurred.\(e)")
  337. }
  338. let wrongData = Data()
  339. do {
  340. _ = try PDFGenerator.generated(by: PDFPage.binary(wrongData))
  341. } catch PDFGenerateError.imageLoadFailed(let data) {
  342. XCTAssertEqual(wrongData, data as? Data)
  343. } catch (let e) {
  344. XCTFail("Unknown or wrong error occurred.\(e)")
  345. }
  346. }
  347. // swiftlint:enable function_body_length
  348. func testPDFPassword() {
  349. let view = Mock.view(CGSize(width: 100, height: 100))
  350. let view2 = Mock.view(CGSize(width: 100, height: 100))
  351. let path1 = PDFfilePath("test_sample1.pdf")
  352. _ = try? PDFGenerator.generate(view, to: path1, password: "abcdef")
  353. XCTAssertTrue(isExistPDF(path1))
  354. let path2 = PDFfilePath("test_sample2.pdf")
  355. _ = try? PDFGenerator.generate(view, to: path2, password: "⌘123456")
  356. XCTAssertFalse(isExistPDF(path2))
  357. let path3 = PDFfilePath("test_sample3.pdf")
  358. do {
  359. try PDFGenerator.generate([view, view2], to: path3, password: "123456")
  360. } catch {
  361. XCTFail()
  362. }
  363. let path4 = PDFfilePath("test_sample4.pdf")
  364. do {
  365. try PDFGenerator.generate([view, view2], to: path4, password: "⌘123456")
  366. XCTFail()
  367. } catch PDFGenerateError.invalidPassword(let password) {
  368. XCTAssertEqual(password, "⌘123456")
  369. } catch {
  370. XCTFail()
  371. }
  372. let path5 = PDFfilePath("test_sample5.pdf")
  373. do {
  374. try PDFGenerator.generate([view, view2], to: path5, password: "0123456789abcdef0123456789abcdefA")
  375. XCTFail()
  376. } catch PDFGenerateError.tooLongPassword(let length) {
  377. XCTAssertEqual(length, 33)
  378. } catch {
  379. XCTFail()
  380. }
  381. XCTAssertNotNil(try? PDFGenerator.generated(by: view, password: "abcdef"))
  382. XCTAssertNil(try? PDFGenerator.generated(by: [view], password: "⌘123456"))
  383. do {
  384. _ = try PDFGenerator.generated(by: [view], password: "123456")
  385. } catch {
  386. XCTFail()
  387. }
  388. do {
  389. _ = try PDFGenerator.generated(by: [view], password: "⌘123456")
  390. } catch PDFGenerateError.invalidPassword(let password) {
  391. XCTAssertEqual(password, "⌘123456")
  392. } catch {
  393. XCTFail()
  394. }
  395. do {
  396. _ = try PDFGenerator.generated(by: [view], password: "0123456789abcdef0123456789abcdefA")
  397. XCTFail()
  398. } catch PDFGenerateError.tooLongPassword(let length) {
  399. XCTAssertEqual(length, 33)
  400. } catch {
  401. XCTFail()
  402. }
  403. }
  404. }