package org.docx4j.openpackaging.parts.relationships; import static org.junit.Assert.assertTrue; import org.docx4j.jaxb.Context; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.relationships.AlteredParts.Alterations; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class AlteredPartsTest { protected static Logger log = LoggerFactory.getLogger(AlteredPartsTest.class); private static String resourceDir = System.getProperty("user.dir") + "/src/test/resources/AlteredParts/"; /* All of the docx in resourceDir have had their docprops parts stripped * (using StripParts). */ /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception { } /** * @throws java.lang.Exception */ @After public void tearDown() throws Exception { } @Test public void initJaxbContext() throws Exception { // Do this first, so it is not included // in timing of first test. Context.getWmlObjectFactory(); } @Test public void testSimpleDocx() throws Exception { // Should return no differences log.warn("\ntestSimpleDocx\n"); String inputfilepath = resourceDir + "paragraph-single.docx"; WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath)); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath)); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); assertTrue( alterations.getPartsAdded().size()==0 ); // assertTrue( alterations.getPartsModified().size()==0 ); // FIXME assertTrue( alterations.getPartsDeleted().size()==0 ); } @Test public void testExtraParagraph() throws Exception { // Only document.xml should be different log.warn("\ntestExtraParagraph\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "paragraph-single.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "paragraph-two.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==0 ); assertTrue( alterations.getPartsModified().size()==1 ); assertTrue( alterations.getPartsDeleted().size()==0 ); } @Test public void testHyperlink() throws Exception { // document.xml and rels should be different, // and styles, since hyperlink style is now in use log.warn("\ntestHyperlink\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "hyperlink.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "paragraph-single.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==0 ); assertTrue( alterations.getPartsModified().size()==3 ); assertTrue( alterations.getPartsDeleted().size()==0 ); } @Test public void testImageScaled() throws Exception { // document.xml should be different, log.warn("\ntestImageScaled\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "image-png1.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "image-png1-scaled.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==0 ); assertTrue( alterations.getPartsModified().size()==1 ); assertTrue( alterations.getPartsDeleted().size()==0 ); } @Test public void testImagesDifferentPng() throws Exception { // document.xml and image part should be different, // but rels unchanged log.warn("\testImagesDifferentPng\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "image-png1.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "image-png2.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==0 ); assertTrue( alterations.getPartsModified().size()==2 ); assertTrue( alterations.getPartsDeleted().size()==0 ); } @Test public void testImagesRelId() throws Exception { // a jpg inserted before, so the png's relId is now different // document.xml and rels should be different, // and extra image reported // Because we currently match images on name only, and // png is now called image2.png, that has changed as well. log.warn("\ntestImagesDifferentPng\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "images-jpg then png2.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "image-png2.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==2 ); assertTrue( alterations.getPartsModified().size()==2 ); assertTrue( alterations.getPartsDeleted().size()==1 ); } @Test public void testImagesOrderSwapped() throws Exception { // document.xml and rels should be different; // Because we currently match images on name only, // both image names have changed as well. log.warn("\ntestImagesOrderSwapped\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "images-jpg then png2.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "images-png2 then jpg.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==2 ); assertTrue( alterations.getPartsModified().size()==2 ); assertTrue( alterations.getPartsDeleted().size()==2 ); } @Test public void testHeaderAdded() throws Exception { // document.xml and rels should be different, // and headers added: Word adds 3 x headers, 3 x footers, endnotes, and footnotes // plus header style log.warn("\ntestHeaderAdded\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "header-simple.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "paragraph-single.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==8 ); assertTrue( alterations.getPartsModified().size()==3 ); assertTrue( alterations.getPartsDeleted().size()==0 ); } @Test public void testHeaderAddedSection2() throws Exception { // document.xml and rels should be different, // and headers added: doc now contains 2 x headers, 0 x footers, endnotes, and footnotes // Interesting that the number of header parts is reduced (and content of header1.xml changed) log.warn("\ntestHeaderAddedSection2\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "header-section2.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "header-simple.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==0 ); // one of the existing header parts is re-purposed assertTrue( alterations.getPartsModified().size()==4 ); assertTrue( alterations.getPartsDeleted().size()==4 ); } @Test public void testHeaderImageAdded() throws Exception { // the affected header should be different, // plus image + header rels log.warn("\ntestHeaderImageAdded\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "header-simple-plus-image.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "header-simple.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==1 ); // assertTrue( alterations.getPartsModified().size()==2 ); // FIXME assertTrue( alterations.getPartsDeleted().size()==0 ); } @Test public void testComment() throws Exception { // document.xml + rels + added comments part should be different, // also styles log.warn("\ntestComment\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "comments-one.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "paragraph-single.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==1 ); assertTrue( alterations.getPartsModified().size()==3 ); assertTrue( alterations.getPartsDeleted().size()==0 ); } @Test public void testComment2() throws Exception { // document.xml + comments part should be different log.warn("\ntestComment2\n"); WordprocessingMLPackage thisPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "comments-two.docx")); WordprocessingMLPackage otherPackage = WordprocessingMLPackage.load( new java.io.File(resourceDir + "comments-one.docx")); Alterations alterations = AlteredParts.start(thisPackage, otherPackage); alterations.debug(); assertTrue( alterations.getPartsAdded().size()==0 ); assertTrue( alterations.getPartsModified().size()==2 ); assertTrue( alterations.getPartsDeleted().size()==0 ); } }