/** * */ package org.nuxeo.labs.images.test; import static org.junit.Assert.*; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.nuxeo.common.utils.FileUtils; import org.nuxeo.ecm.automation.AutomationService; import org.nuxeo.ecm.automation.OperationChain; import org.nuxeo.ecm.automation.OperationContext; import org.nuxeo.ecm.automation.test.AutomationFeature; import org.nuxeo.ecm.core.api.Blob; import org.nuxeo.ecm.core.api.CoreSession; import org.nuxeo.ecm.core.api.DocumentModel; import org.nuxeo.ecm.core.api.DocumentModelList; import org.nuxeo.ecm.core.api.impl.blob.FileBlob; import org.nuxeo.ecm.core.event.EventService; import org.nuxeo.labs.images.ImagesSheetBuilder; import org.nuxeo.labs.images.ImagesSheetBuilderCustomOp; import org.nuxeo.labs.images.ImagesSheetBuilderOp; import org.nuxeo.runtime.test.runner.Deploy; import org.nuxeo.runtime.test.runner.Features; import org.nuxeo.runtime.test.runner.FeaturesRunner; import org.nuxeo.runtime.test.runner.LocalDeploy; import org.nuxeo.runtime.transaction.TransactionHelper; import com.google.inject.Inject; /** * @author Thibaud Arguillere */ @Ignore @RunWith(FeaturesRunner.class) @Features({ AutomationFeature.class }) @Deploy({ "nuxeo-labs-images", "org.nuxeo.ecm.platform.picture.core", "org.nuxeo.ecm.platform.picture.convert", "org.nuxeo.ecm.platform.picture.api", "org.nuxeo.ecm.platform.commandline.executor","org.nuxeo.ecm.platform.rendition.core" }) @LocalDeploy({ "nuxeo-labs-images:test-custom-commandline.xml" }) public class ImagesSheetTest { protected static final int NUMBER_OF_TEST_IMAGES = 10; @Inject CoreSession session; @Inject AutomationService automationService; @Inject EventService eventService; protected DocumentModel folder; @Before public void initRepo() throws Exception { session.removeChildren(session.getRootDocument().getRef()); session.save(); folder = session.createDocumentModel("/", "Folder", "Folder"); folder.setPropertyValue("dc:title", "Folder"); folder = session.createDocument(folder); session.save(); folder = session.getDocument(folder.getRef()); for (int i = 1; i <= NUMBER_OF_TEST_IMAGES; ++i) { createPictureDocument("test-" + i + ".jpg", "Example #" + i); } session.save(); TransactionHelper.commitOrRollbackTransaction(); TransactionHelper.startTransaction(); // Wait for PictureViews to be generated eventService.waitForAsyncCompletion(); } @After public void cleanup() { session.removeChildren(session.getRootDocument().getRef()); session.save(); } protected void createPictureDocument(String fileName, String docTitle) { String title = docTitle; DocumentModel pict = session.createDocumentModel("/Folder", fileName, "Picture"); pict.setPropertyValue("dc:title", title); File f = FileUtils.getResourceFileFromContext(fileName); pict.setPropertyValue("file:content", new FileBlob(f)); pict = session.createDocument(pict); } protected void checkImage1WiderImage2Higher(Blob b1, Blob b2) throws Exception { BufferedImage bi1 = ImageIO.read(b1.getStream()); BufferedImage bi2 = ImageIO.read(b2.getStream()); assertTrue(bi1.getWidth() > bi2.getWidth()); assertTrue(bi1.getHeight() < bi2.getHeight()); } @Test public void testBuildSheet() throws Exception { DocumentModelList docs = session.query("SELECT * FROM Picture"); assertEquals(NUMBER_OF_TEST_IMAGES, docs.size()); // Using default values ImagesSheetBuilder isb = new ImagesSheetBuilder(docs); Blob result1 = isb.build(); assertNotNull(result1); // Test with some custom parameters. For example, 2 tiles/row // Must have a smaller width and a bigger height than previous one isb = new ImagesSheetBuilder(docs); isb.setTile("2"); Blob result2 = isb.build(); assertNotNull(result2); checkImage1WiderImage2Higher(result1, result2); } @Test public void testOperation() throws Exception { DocumentModelList docs = session.query("SELECT * FROM Picture"); assertEquals(NUMBER_OF_TEST_IMAGES, docs.size()); OperationChain chain; OperationContext ctx = new OperationContext(session); ctx.setInput(docs); chain = new OperationChain("testChain1"); // Default parameters chain.add(ImagesSheetBuilderOp.ID); Blob result1 = (Blob) automationService.run(ctx, chain); assertNotNull(result1); // Customize the tile ctx.setInput(docs); chain = new OperationChain("testChain2"); chain.add(ImagesSheetBuilderOp.ID).set("tile", "2").set("useDocTitle", true); Blob result2 = (Blob) automationService.run(ctx, chain); assertNotNull(result1); checkImage1WiderImage2Higher(result1, result2); } @Test public void testOperationCustomCommandline() throws Exception { DocumentModelList docs = session.query("SELECT * FROM Picture"); assertEquals(NUMBER_OF_TEST_IMAGES, docs.size()); OperationChain chain; OperationContext ctx = new OperationContext(session); ctx.setInput(docs); chain = new OperationChain("testChain3"); chain.add(ImagesSheetBuilderCustomOp.ID) .set("commandLine", "test-montage") .set("parameters", "tile=5\ngeometry=" + ImagesSheetBuilder.DEFAULT_GEOMETRY); Blob result1 = (Blob) automationService.run(ctx, chain); assertNotNull(result1); // DIfferent tile ctx.setInput(docs); chain = new OperationChain("testChain4"); chain.add(ImagesSheetBuilderCustomOp.ID) .set("commandLine", "test-montage") .set("parameters", "tile=2\ngeometry=" + ImagesSheetBuilder.DEFAULT_GEOMETRY); Blob result2 = (Blob) automationService.run(ctx, chain); assertNotNull(result1); checkImage1WiderImage2Higher(result1, result2); } }