From a0b574bba5f07d25199013de0b8062b247542dd4 Mon Sep 17 00:00:00 2001 From: jomu Date: Sat, 9 Jul 2016 14:45:31 +0000 Subject: [PATCH] generalized tests --- .../shared/pdf/PDFImageContentTest.java | 9 +++-- .../shared/pdf/test/GsonSerialisation.java | 33 +++++++++--------- .../shared/pdf/test/PDFDocumentTest.java | 20 +++++++---- .../pdf/logo-verkehrsverein-hoevelh.jpg | Bin 0 -> 5041 bytes .../pdf/test/logo-verkehrsverein-hoevelh.jpg | Bin 0 -> 5041 bytes 5 files changed, 37 insertions(+), 25 deletions(-) create mode 100644 pdf/src/test/resources/de/muehlencord/shared/pdf/logo-verkehrsverein-hoevelh.jpg create mode 100644 pdf/src/test/resources/de/muehlencord/shared/pdf/test/logo-verkehrsverein-hoevelh.jpg diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/PDFImageContentTest.java b/pdf/src/test/java/de/muehlencord/shared/pdf/PDFImageContentTest.java index 5bd49a8..a8d1d64 100644 --- a/pdf/src/test/java/de/muehlencord/shared/pdf/PDFImageContentTest.java +++ b/pdf/src/test/java/de/muehlencord/shared/pdf/PDFImageContentTest.java @@ -2,6 +2,8 @@ package de.muehlencord.shared.pdf; import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; import org.junit.Test; /** @@ -14,10 +16,13 @@ public class PDFImageContentTest { } @Test - public void testImage() throws IOException { + public void testImage() throws IOException, URISyntaxException { + + URL urlLogo = PDFImageContentTest.class.getResource("logo-verkehrsverein-hoevelh.jpg"); + File imageFile = new File (urlLogo.toURI()); PDFDocument doc = new PDFDocument(PDFPaperSize.A4); - PDFImageContent logoContent = new PDFImageContent(doc, 400F, 700F, 0.6F, new File("c:/temp/logo-verkehrsverein-hoevelh.jpg")); + PDFImageContent logoContent = new PDFImageContent(doc, 400F, 700F, 0.6F, imageFile); System.out.println(GsonUtil.getInstance().toJson(logoContent)); System.out.println(GsonUtil.getInstance().toJson(logoContent)); diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/test/GsonSerialisation.java b/pdf/src/test/java/de/muehlencord/shared/pdf/test/GsonSerialisation.java index b673d40..63a1bac 100644 --- a/pdf/src/test/java/de/muehlencord/shared/pdf/test/GsonSerialisation.java +++ b/pdf/src/test/java/de/muehlencord/shared/pdf/test/GsonSerialisation.java @@ -28,35 +28,36 @@ public class GsonSerialisation { PDFDocument doc = new PDFDocument(PDFPaperSize.A4); doc.addFont("helv12", new PDFFont("Helvetica", 12, 2)); - PDFTableContent userList = new PDFTableContent(doc, doc.getFontByAlias("helv12"),40F, 692F); + PDFTableContent userList = new PDFTableContent(doc, doc.getFontByAlias("helv12"), 40F, 692F); userList.addColumn(50, 300); userList.addListRow("users", "user") .setCellValue("${user.firstName}") .setCellValue("${user.lastName}"); - doc.addContent(userList); - + doc.addContent(userList); + // System.out.println ("*******"); // System.out.println (doc.toJson()); String jsonString = doc.getTemplateString(); - File file = new File("c:/temp/users.ftlh"); - FileUtils.writeStringToFile(file, jsonString, "UTF-8"); - - System.out.println ("*******"); - System.out.println (jsonString); - System.out.println ("*******"); - + String fileName = System.getProperty("java.io.tmpdir") + "/users.ftlh"; + File file = new File(fileName); + FileUtils.writeStringToFile(file, jsonString, "UTF-8"); + + System.out.println("*******"); + System.out.println(jsonString); + System.out.println("*******"); + Configuration cfg = new Configuration(Configuration.VERSION_2_3_24); - cfg.setDirectoryForTemplateLoading(new File("c:/temp")); + cfg.setDirectoryForTemplateLoading(new File(System.getProperty("java.io.tmpdir"))); cfg.setDefaultEncoding("UTF-8"); Template template = cfg.getTemplate("users.ftlh"); PDFTemplate pdfDoc = new PDFTemplate(template); List users = new LinkedList<>(); - users.add (new User ("John", "Doe")); - users.add (new User ("Jane", "Roe")); + users.add(new User("John", "Doe")); + users.add(new User("Jane", "Roe")); pdfDoc.addToDatamodel("users", users); - pdfDoc.create("c:/temp/users.pdf"); - - + fileName = System.getProperty("java.io.tmpdir") + "/users.pdf"; + pdfDoc.create(fileName); + } } diff --git a/pdf/src/test/java/de/muehlencord/shared/pdf/test/PDFDocumentTest.java b/pdf/src/test/java/de/muehlencord/shared/pdf/test/PDFDocumentTest.java index a305fbb..2a26f2e 100644 --- a/pdf/src/test/java/de/muehlencord/shared/pdf/test/PDFDocumentTest.java +++ b/pdf/src/test/java/de/muehlencord/shared/pdf/test/PDFDocumentTest.java @@ -20,6 +20,8 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; import java.util.Date; import javax.imageio.ImageIO; import org.apache.commons.io.FileUtils; @@ -36,7 +38,7 @@ public class PDFDocumentTest { private String jsonString = null; @Test - public void testToJson() throws FileNotFoundException, IOException, ConfigurationException, TemplateException { + public void testToJson() throws FileNotFoundException, IOException, ConfigurationException, TemplateException, URISyntaxException { System.out.println("testToJson"); PDFDocument doc = new PDFDocument(PDFPaperSize.A4); doc.addFont("bold", new PDFFont("Helvetica-Bold", 12, 2)); @@ -104,12 +106,13 @@ public class PDFDocumentTest { jsonString = doc.getTemplateString(); - File file = new File("c:/temp/test.ftlh"); + String fileName = System.getProperty("java.io.tmpdir") + "/test.ftlh"; + File file = new File(fileName); FileUtils.writeStringToFile(file, jsonString, "UTF-8"); // create pdf Configuration cfg = new Configuration(Configuration.VERSION_2_3_24); - cfg.setDirectoryForTemplateLoading(new File("c:/temp")); + cfg.setDirectoryForTemplateLoading(new File(System.getProperty("java.io.tmpdir"))); cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); cfg.setLogTemplateExceptions(false); @@ -124,13 +127,16 @@ public class PDFDocumentTest { invoice.addInvoiceLine(new InvoiceLine("Product 1", "10,00 €", "1", "10,00 €")); invoice.addInvoiceLine(new InvoiceLine("Product 2", "5,00 €", "10", "50,00 €")); invoice.addInvoiceLine(new InvoiceLine("Product 3", "100,00 €", "20", "2000,00 €")); - - String fileName = "c:/temp/logo-verkehrsverein-hoevelh.jpg"; - BufferedImage image = ImageIO.read(new File(fileName)); + + URL urlLogo = PDFDocumentTest.class.getResource("logo-verkehrsverein-hoevelh.jpg"); + File imageFile = new File (urlLogo.toURI()); + BufferedImage image = ImageIO.read(imageFile); invoice.setLogo(ImageUtil.getEncodedString(image)); pdfDoc.addToDatamodel("invoice", invoice); - pdfDoc.create("c:/temp/test.pdf"); + + fileName = System.getProperty("java.io.tmpdir") + "/test.pdf"; + pdfDoc.create(fileName); } } diff --git a/pdf/src/test/resources/de/muehlencord/shared/pdf/logo-verkehrsverein-hoevelh.jpg b/pdf/src/test/resources/de/muehlencord/shared/pdf/logo-verkehrsverein-hoevelh.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ee9295c8ff2b2f9554b575e7fc27a3301cb40229 GIT binary patch literal 5041 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 axJa4p>hzNuBy){