| /************************************************************************ |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| ************************************************************************/ |
| package org.odftoolkit.odfdom.doc; |
| |
| import java.io.InputStream; |
| import java.util.Iterator; |
| import java.util.logging.Level; |
| import java.util.logging.Logger; |
| |
| import junit.framework.Assert; |
| |
| import org.junit.Test; |
| import org.odftoolkit.odfdom.doc.presentation.OdfPresentationNotes; |
| import org.odftoolkit.odfdom.doc.presentation.OdfSlide; |
| import org.odftoolkit.odfdom.dom.OdfDocumentNamespace; |
| import org.odftoolkit.odfdom.dom.element.draw.DrawObjectElement; |
| import org.odftoolkit.odfdom.dom.element.draw.DrawPageElement; |
| import org.odftoolkit.odfdom.dom.element.office.OfficePresentationElement; |
| import org.odftoolkit.odfdom.incubator.doc.draw.OdfDrawImage; |
| import org.odftoolkit.odfdom.pkg.manifest.OdfFileEntry; |
| import org.odftoolkit.odfdom.utils.ResourceUtilities; |
| import org.w3c.dom.NodeList; |
| |
| /** |
| * Test for Presentation Slide API, including get/move/insert/delete slide in one presentation |
| * and the slides operation of two presentations. |
| */ |
| public class SlideTest { |
| |
| private static final Logger LOG = Logger.getLogger(SlideTest.class.getName()); |
| OdfPresentationDocument doc; |
| OdfPresentationDocument doc2; |
| final String TEST_PRESENTATION_FILE_MAIN = "Presentation1.odp"; |
| final String TEST_PRESENTATION_FILE_ANOTHER = "Presentation2.odp"; |
| final String TEST_PRESENTATION_FILE_OUT_PREFIX = "SlideResult"; |
| final String TEST_PRESENTATION_DOCUMENT1 = "SlideTest1.odp"; |
| final String TEST_PRESENTATION_DOCUMENT2 = "SlideTest2.odp"; |
| final String TEST_PRESENTATION_DOCUMENT3 = "SlideTest3.odp"; |
| |
| /** |
| * Initialize the test case. |
| */ |
| public SlideTest() { |
| } |
| |
| /** |
| * Test case for get presentation slide, including get the slide count, get |
| * the slide at the specified position or with the specified name, and get |
| * the collection of slide. |
| * <p> |
| * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp |
| * <b>Method</b> 1)By using OdfPresentationDocument.getSlideCount() to Get the |
| * number of the slides in this presentation. |
| * 2)According to the slide count, get a slide at the specific position of |
| * the loaded presentation document using |
| * OdfPresentationDocument.getSlideByIndex(int index), and the param "index" |
| * should be limited with the slide count. Use OdfDrawPage.getSlideIndex() |
| * method to verify the returned slide. |
| * 3)OdfPresentationDocument.getSlideByName(String name) |
| * 4)Using dfPresentationDocument.getSlides() to get the slide iterator |
| * <b>Covered Element</b> <office:presentation>,<draw:page> |
| * <b>Note</b> OdfPresentationDocument.getContentRoot override OdfDocument.getContentRoot method |
| * will return OfficePresentationElement, rather than OdfOfficePresentation |
| * because of the inheritance relationship broken up between dom and doc element |
| * And because OdfOfficePresentation is useless, so I delete this class |
| * <b>Code Coverage Result</b> |
| * 1)can not catch Exception because it is only used to catch the exception thrown by getContentRoot() |
| */ |
| @Test |
| public void testGetSlide() { |
| try { |
| doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN)); |
| int slideCount = doc.getSlideCount(); |
| Assert.assertTrue(10 == slideCount); |
| OdfSlide page2 = doc.getSlideByIndex(2); |
| Assert.assertTrue(2 == page2.getSlideIndex()); |
| OdfSlide slide3 = doc.getSlideByName("Slide 3"); |
| Assert.assertNull(slide3); |
| slide3 = doc.getSlideByName("page3"); |
| Assert.assertEquals(page2, slide3); |
| Iterator<OdfSlide> slideIter = doc.getSlides(); |
| int i = 0; |
| while (slideIter.hasNext()) { |
| OdfSlide slide = slideIter.next(); |
| Assert.assertTrue(i == slide.getSlideIndex()); |
| String name = "page" + (i + 1); |
| Assert.assertTrue(name.equals(slide.getSlideName())); |
| i++; |
| } |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| |
| OdfSlide slidesNoName = doc.getSlideByName(null); |
| Assert.assertNull(slidesNoName); |
| OdfSlide nullSlide = doc.getSlideByIndex(20); |
| Assert.assertNull(nullSlide); |
| nullSlide = doc.getSlideByIndex(-1); |
| Assert.assertNull(nullSlide); |
| |
| } |
| |
| /** |
| * Test case for get/set slide name to make sure the name is unique in the whole presentation document. |
| * If the loaded presentation document is not valid that contain the same slide name, |
| * we should modified the duplicate slide name to make them unique. |
| * <p> |
| * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp |
| * Using the dom method to make slide index 4 and 8 have the same name, |
| * and delete the "draw:name" attribute of slide 7. |
| * <b>Method</b> |
| * 1)By accessing any slide API to trigger the duplicate slide name check method. |
| * After this operation, slide 8 will change the slide name. |
| * 2)Trigger OdfDrawPage.getSlideName() to make the slide 7 has the unique slide name. |
| * 3)Using OdfDrawPage.setSlideName() to give the slide 1 with the new name. |
| */ |
| @Test |
| public void testSlideName() { |
| try { |
| doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN)); |
| OfficePresentationElement contentRoot = doc.getContentRoot(); |
| NodeList slideNodes = contentRoot.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "page"); |
| DrawPageElement slideEle4 = (DrawPageElement) slideNodes.item(4); |
| Assert.assertEquals(slideEle4.getDrawNameAttribute(), "page5"); |
| DrawPageElement slideEle8 = (DrawPageElement) slideNodes.item(8); |
| slideEle8.setDrawNameAttribute("page5"); |
| OdfSlide slide7 = doc.getSlideByIndex(7); |
| DrawPageElement slideEle7 = (DrawPageElement) slideNodes.item(7); |
| slideEle7.removeAttributeNS(OdfDocumentNamespace.DRAW.getUri(), "name"); |
| |
| OdfSlide slide4 = doc.getSlideByIndex(4); |
| Assert.assertTrue(slide4.getSlideName().equals("page5")); |
| OdfSlide slide8 = doc.getSlideByIndex(8); |
| Assert.assertFalse(slide8.getSlideName().equals("page5")); |
| |
| Assert.assertTrue(slide7.getSlideName().startsWith("page8")); |
| OdfPresentationNotes note7 = slide7.getNotesPage(); |
| note7.addText("This is slide at index" + slide7.getSlideIndex() + " named " + slide7.getSlideName()); |
| |
| OdfSlide slide1 = doc.getSlideByIndex(1); |
| slide1.setSlideName("haha"); |
| slide1.setSlideName("page1"); |
| |
| } catch (IllegalArgumentException ile) { |
| OdfSlide slide1 = doc.getSlideByIndex(1); |
| Assert.assertTrue("the given name page1 is duplicate with the previous slide", slide1.getSlideName().equals("haha")); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| |
| try { |
| doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "SlideName.odp")); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| } |
| |
| /** |
| * Test case for delete presentation slide, including delete slide at the |
| * specified position or with the specified name. |
| * <p> |
| * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp |
| * <b>Method</b> 1)By using OdfPresentationDocument.deleteSlideByIndex(int index) |
| * to delete the slide at the specified position which is present by |
| * param "index", then index of the slide which after the delete slide will change. |
| * 2)Delete slide with the specified name by using |
| * OdfPresentationDocument.deleteSlideByName(String name) |
| * <b>PostCondition</b> Save the modified document at SlideResultDelete.odp |
| * <b>Covered Element</b> 1) <office:presentation>,<draw:page> |
| * 2)All the element that contains "xlink:href" attribute, such as <draw:object>, <draw:image>, etc. |
| * 3)All the style name definition element, |
| * include <style:style>, <text:list-style>, <number:time-style>, <number:date-style>, |
| * <number:boolean-style>, <number:number-style>, <number:currency-style>, |
| * <number:percentage-style>, <number:text-style> |
| * 4)All the <code>OdfStylableElement</code> which have the style name reference, |
| * such as <draw:frame>, <text:p> etc. |
| * <b>Note</b> When the specific slide is delete, if it referred images, ole or styles are not used by other slide |
| * they will all be removed from the package. |
| */ |
| @Test |
| public void testDeleteSlide() { |
| try { |
| doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN)); |
| OdfSlide slide2 = doc.getSlideByIndex(2); |
| OdfSlide slide3 = doc.getSlideByIndex(3); |
| //this slide contains an embed document, remove this slide will also remove the embed document |
| int nEmbedDoc = doc.loadSubDocuments().size(); |
| Assert.assertTrue(doc.deleteSlideByIndex(2)); |
| //slide3 is no longer exist |
| Assert.assertTrue(-1 == slide2.getSlideIndex()); |
| Assert.assertTrue(2 == slide3.getSlideIndex()); |
| Assert.assertTrue(doc.loadSubDocuments().size() == (nEmbedDoc - 1)); |
| Assert.assertTrue(doc.deleteSlideByName("page5")); |
| int count = doc.getSlideCount(); |
| Assert.assertTrue(8 == count); |
| //slide at index 9 contains two images and one embed document, the embed document aslo have the object replacement image |
| //remove this slide will also remove these three images |
| String IMAGE_NAME_1 = "Pictures/10000000000002580000018FB151A5C8.jpg"; |
| String IMAGE_NAME_2 = "Pictures/1000000000000C80000004009305DCA3.jpg"; |
| String IMAGE_NAME_3 = "ObjectReplacements/Object 13"; |
| int nImageCnt = OdfDrawImage.getImageCount(doc); |
| InputStream imageStream1 = doc.getPackage().getInputStream(IMAGE_NAME_1); |
| Assert.assertNotNull(imageStream1); |
| Assert.assertTrue(doc.deleteSlideByIndex(doc.getSlideCount() - 2)); |
| Assert.assertTrue(OdfDrawImage.getImageCount(doc) == (nImageCnt - 3)); |
| imageStream1 = doc.getPackage().getInputStream(IMAGE_NAME_1); |
| Assert.assertNull(imageStream1); |
| InputStream imageStream2 = doc.getPackage().getInputStream(IMAGE_NAME_2); |
| Assert.assertNull(imageStream2); |
| InputStream imageStream3 = doc.getPackage().getInputStream(IMAGE_NAME_3); |
| Assert.assertNull(imageStream3); |
| //slide at index 2 at doc2 contains one image, but it also referred by other slides |
| //so the image of this slide will not be removed |
| doc2 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_ANOTHER)); |
| nImageCnt = OdfDrawImage.getImageCount(doc2); |
| Assert.assertTrue(doc2.deleteSlideByIndex(2)); |
| Assert.assertTrue(OdfDrawImage.getImageCount(doc2) == (nImageCnt - 1)); |
| imageStream1 = doc2.getPackage().getInputStream(IMAGE_NAME_1); |
| Assert.assertNotNull(imageStream1); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| |
| try { |
| Assert.assertTrue(doc.deleteSlideByIndex(20)); |
| Assert.assertTrue(false); |
| } catch (IndexOutOfBoundsException iobe) { |
| Assert.assertTrue("slide index is out of bounds", true); |
| } |
| |
| try { |
| doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Delete.odp")); |
| doc2.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Delete2.odp")); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| } |
| |
| /** |
| * Test case for create new slide at the specified position, with the |
| * specified name and slide template. |
| * <p> |
| * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp |
| * <b>Method</b> |
| * OdfPresentationDocument.newSlide(int index, String name, |
| * OdfDrawPage.SlideLayout slideLayout) is used to new a slide at the specified |
| * position with the specified name, and use the specified slide template. |
| * <b>Postcondition</b> Save the modified document at SlideResultNew.odp |
| * <b>Covered Element</b> |
| * 1) <style:presentation-page-layout> referred by "presentation:presentation-page-layout-name" attribute of <draw:page> |
| * 2) <style:master-page> referred by "draw:master-page-name" attribute of <draw:page> |
| * 3) The placeholder element of <draw:page>, such as title, outline placeholder |
| * <b>Note</b> The new slide will use the same master page style of the previous slide, |
| * and add the placeholder on the slide according to the slide template parameter. |
| */ |
| @Test |
| public void testNewSlide() { |
| try { |
| doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN)); |
| OdfSlide slide5 = doc.getSlideByIndex(5); |
| OdfSlide newSlide1 = doc.newSlide(2, "Slide 2 new", OdfSlide.SlideLayout.BLANK); |
| Assert.assertTrue(2 == newSlide1.getSlideIndex()); |
| OdfSlide newSlide2 = doc.newSlide(0, "", OdfSlide.SlideLayout.TITLE_ONLY); |
| Assert.assertTrue(newSlide2.getSlideName().equals("")); |
| Assert.assertTrue(7 == slide5.getSlideIndex()); |
| doc.newSlide(3, OdfSlide.SlideLayout.TITLE_PLUS_TEXT.toString(), OdfSlide.SlideLayout.enumValueOf("title_text")); |
| OdfSlide newSlide4 = doc.newSlide(4, null, OdfSlide.SlideLayout.TITLE_PLUS_2_TEXT_BLOCK); |
| Assert.assertTrue(newSlide4.getOdfElement().getDrawNameAttribute() != null); |
| OdfSlide.SlideLayout outlineType = OdfSlide.SlideLayout.TITLE_OUTLINE; |
| doc.newSlide(14, OdfSlide.SlideLayout.toString(outlineType), outlineType); |
| doc.newSlide(15, "Default", null); |
| int count = doc.getSlideCount(); |
| Assert.assertTrue(16 == count); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| |
| try { |
| doc.newSlide(20, "Slide 20 new", OdfSlide.SlideLayout.BLANK); |
| } catch (IndexOutOfBoundsException iobe) { |
| Assert.assertTrue("slide index is out of bounds", true); |
| } |
| |
| try { |
| doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "New.odp")); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| } |
| |
| /** |
| * Test case for move the slide from one position to another, or copy a |
| * specified slide and insert it to another specified position. |
| * <p> |
| * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp |
| * test\resources\performance\Presentation1.odp |
| * <b>Method</b> 1)Using OdfPresentationDocument.moveSlide(int current, int destination) |
| * to move a slide at the current position to the destination position. |
| * 2)OdfPresentationDocument.copySlide(int source, int dest, String newName) |
| * is used to make a copy of the slide at a specified position to another |
| * position in this presentation. |
| * <b>Postcondition</b> Save the modified document at |
| * SlideResultMoveAndCopy.odp |
| * <b>Covered Element</b> 1) <office:presentation>,<draw:page> |
| * 2) <presentation:notes> of each slide. |
| * <b>Note</b> Each slide has its own notes page to show its notes view, |
| * while the notes page has the "draw:page-number" attribute to show the notes view of which slide |
| * so when the slide is moved or copied, the index of this slide will be change, |
| * the notes page have to change the "draw:page-number" value. |
| */ |
| @Test |
| public void testMoveAndCopySlide() { |
| try { |
| doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN)); |
| OdfSlide lastSlide = doc.getSlideByIndex(9); |
| OdfSlide firstSlide = doc.getSlideByIndex(0); |
| |
| OdfSlide copyFirstToLastSlide = doc.copySlide(0, 10, firstSlide.getSlideName() + "(copy)"); |
| Assert.assertTrue(10 == copyFirstToLastSlide.getSlideIndex()); |
| |
| OdfSlide copyLastToFirstSlide = doc.copySlide(9, 0, lastSlide.getSlideName() + "(copy)"); |
| Assert.assertTrue(0 == copyLastToFirstSlide.getSlideIndex()); |
| |
| doc.moveSlide(11, 0); |
| doc.moveSlide(1, 12); |
| Assert.assertTrue(1 == firstSlide.getSlideIndex()); |
| Assert.assertTrue(10 == lastSlide.getSlideIndex()); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| |
| try { |
| doc.moveSlide(20, 0); |
| } catch (IndexOutOfBoundsException iobe) { |
| Assert.assertTrue("slide index is out of bounds", true); |
| } |
| |
| try { |
| doc.moveSlide(-1, 0); |
| } catch (IndexOutOfBoundsException iobe) { |
| Assert.assertTrue("slide index is out of bounds", true); |
| } |
| |
| try { |
| doc.copySlide(20, 0, "outofbounds"); |
| } catch (IndexOutOfBoundsException iobe) { |
| Assert.assertTrue("slide index is out of bounds", true); |
| } |
| |
| try { |
| doc.copySlide(-1, 0, "outofbounds"); |
| } catch (IndexOutOfBoundsException iobe) { |
| Assert.assertTrue("slide index is out of bounds", true); |
| } |
| |
| try { |
| doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "MoveAndCopy.odp")); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| } |
| |
| /** |
| * Test case for copy a slide which comes from the other presentation |
| * to the specified position of the current presentation. |
| * <p> |
| * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp & test\resources\performance\Presentation2.odp |
| * <b>Method</b> Using OdfPresentationDocument.copyForeignSlide(int |
| * destIndex,OdfPresentationDocument srcDoc, int srcIndex) to copy a slide |
| * which locates at "srcIndex" position of the "srcDoc" presentation |
| * document and insert it to the current presentation document at "destIndex" position. |
| * <b>Postcondition</b> Save the modified document at SlideResultCopyForeignSlide.odp |
| * <b>Covered Element</b> 1) <office:presentation>,<draw:page> |
| * 2) All the element that contains "xlink:href" attribute, such as <draw:object>, <draw:image>, etc. |
| * 3) Each style definition element of <draw:page> and its all child elements |
| * such as layout style, master page style, object style and text style |
| * the style definition element must contain "style:name" or "draw:name" attribute, include |
| * <style:mater-page>,<style:page-layout>,<style:presentation-page-layout>, |
| * <style:style>, <text:list-style>, <number:time-style>, <number:date-style>, |
| * <number:boolean-style>, <number:number-style>, <number:currency-style>, |
| * <number:percentage-style>, <number:text-style>, <text:outline-style>,<style:font-face>, |
| * 4) the element which refer the style name, that is <draw:page> and all the child elements. |
| * <b>Note</b> If the copied style/image/ole name is duplicated with destination presentation document, |
| * the name definition element and reference element must be renamed then insert to the dest document. |
| */ |
| @Test |
| public void testCopyForeignSlide() { |
| try { |
| doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN)); |
| doc2 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_ANOTHER)); |
| |
| // copy slide at index 2 of doc to the index 2 of doc2 |
| int nEmbedDoc = doc2.loadSubDocuments().size(); |
| String embedDocName = "Object 3/"; |
| OdfFileEntry fileEntry = doc2.getPackage().getFileEntry(embedDocName); |
| Assert.assertNull(fileEntry); |
| OdfSlide newPage1 = doc2.copyForeignSlide(2, doc, 2); |
| Assert.assertTrue(2 == newPage1.getSlideIndex()); |
| // slide at index 2 of doc contains an embedded document called |
| // "Object 3" |
| OdfDocument embedDoc = doc2.loadSubDocument(embedDocName); |
| Assert.assertNotNull(embedDoc); |
| int size = doc2.loadSubDocuments().size(); |
| Assert.assertTrue(size == (nEmbedDoc + 1)); |
| // the copied slide also have an bitmap background, and the image bullet |
| // they should all be copied |
| String BACKGROUND_IMAGE_NAME = "Pictures/1000000000000C80000004009305DCA3.jpg"; |
| String BULLET_IMAGE_NAME = "Pictures/10000000000002580000018FB151A5C8.jpg"; |
| InputStream backgroundImage = doc2.getPackage().getInputStream(BACKGROUND_IMAGE_NAME); |
| Assert.assertNotNull(backgroundImage); |
| // copy the slide at index 2 of doc to the end of doc2 |
| OdfSlide newPage2 = doc2.copyForeignSlide(101, doc, 2); |
| Assert.assertNotNull(doc2.getPackage().getFileEntry(BULLET_IMAGE_NAME)); |
| Assert.assertFalse(newPage1.getSlideName().equals(newPage2.getSlideName())); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| try { |
| doc2.copyForeignSlide(200, doc, 0); |
| } catch (IndexOutOfBoundsException iobe) { |
| Assert.assertTrue("slide index is out of bounds", true); |
| } |
| |
| try { |
| doc2.copyForeignSlide(-1, doc, 0); |
| } catch (IndexOutOfBoundsException iobe) { |
| Assert.assertTrue("slide index is out of bounds", true); |
| } |
| |
| try { |
| doc2.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "CopyForeignSlide2.odp")); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| } |
| |
| /** |
| * Test case for appending all the slide of one presentation to the end of |
| * another presentation. |
| * <p> |
| * <b>Precondition</b> Load Presentation File at test\resources\performance\Presentation1.odp & test\resources\performance\Presentation2.odp |
| * <b>Method</b> Using OdfPresentationDocument.appendPresentation(OdfPresentationDocument aDoc) |
| * to append the specified presentation to the current presentation. |
| * <b>Postcondition</b> Save the modified document at SlideResultMerge.odp |
| * <b>Covered Element</b> |
| * Same with <code>CopyForeignSlide</code> method, |
| * except that it covers all the slide element of the document,rather than specific slide. |
| * <b>Note</b> 1)You'd better check the generated document to look at if there are any object/style is lost. |
| * 2) The generated file size will be larger than we append by using OpenOffice/Symphony, |
| * that is because the styles and images from the different document might have the same content, |
| * but I still append them rather than use one copy, |
| * because compare the odf element content and the image stream might cost much time. |
| */ |
| @Test |
| public void testAppendPresentation() { |
| try { |
| doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN)); |
| doc2 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_ANOTHER)); |
| int slideCount = doc.getSlideCount(); |
| int slideCount2 = doc2.getSlideCount(); |
| //doc, doc2 both have the embed document named "Object 2" |
| //with different content, so after appendPresentation, |
| //the embedded doc "Object 2" of doc will be renamed |
| String EMBEDDOC_NAME = "Object 2"; |
| Assert.assertNotNull(doc.loadSubDocument(EMBEDDOC_NAME)); |
| Assert.assertNotNull(doc2.loadSubDocument(EMBEDDOC_NAME)); |
| doc2.appendPresentation(doc); |
| Assert.assertTrue((slideCount + slideCount2) == doc2.getSlideCount()); |
| //slide at index 3 of doc contains "Object 2", "Object 6" |
| //after appendPresentation, let's check the slide at index 103 of merged document |
| //which is corresponding to the slide at index 3 of doc |
| OdfSlide slide = doc2.getSlideByIndex(103); |
| DrawPageElement slideEle = slide.getOdfElement(); |
| NodeList objectList = slideEle.getElementsByTagNameNS(OdfDocumentNamespace.DRAW.getUri(), "object"); |
| Assert.assertTrue(objectList.getLength() == 2); |
| DrawObjectElement object1 = (DrawObjectElement) objectList.item(0); |
| String linkPath = object1.getXlinkHrefAttribute(); |
| Assert.assertTrue(linkPath.startsWith("./Object 2") && !linkPath.equals("./Object 2")); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| |
| try { |
| doc2.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Merge2.odp")); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| } |
| |
| @Test |
| public void testAnotherMergeDoc() { |
| try { |
| doc = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_MAIN)); |
| doc2 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_FILE_ANOTHER)); |
| doc.appendPresentation(doc2); |
| Assert.assertTrue(doc.getSlideCount() == 110); |
| doc.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "Merge1.odp")); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| } |
| |
| /** |
| * Test case for merge the three presentation document |
| * <p> |
| * <b>Precondition</b> Load Presentation File at test\resources\performance\SlideTest1.odp, |
| * test\resources\performance\SlideTest2.odp and test\resources\performance\SlideTest3.odp |
| * <b>Method</b> copy the slide from SlideTest2.odp and SlideTest3.odp to SlideTest1.odp |
| * <b>Postcondition</b> Save the modified document at SlideResultCopyThreeDoc.odp |
| * <b>Notice</b> |
| * This test case is used to show that the style name can be renamed if they define the different style. |
| */ |
| @Test |
| public void testCopyThreeDoc() { |
| try { |
| //testdoc1 contain "dp1" for draw page style |
| OdfPresentationDocument testdoc1 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_DOCUMENT1)); |
| //testdoc1 contain "dp1" for draw page style |
| OdfPresentationDocument testdoc2 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_DOCUMENT2)); |
| //testdoc1 contain "dp1" for draw page style |
| OdfPresentationDocument testdoc3 = OdfPresentationDocument.loadDocument(ResourceUtilities.getAbsolutePath(TEST_PRESENTATION_DOCUMENT3)); |
| testdoc1.copyForeignSlide(1, testdoc2, 0); |
| testdoc1.copyForeignSlide(2, testdoc3, 0); |
| //after copy foreign slide, the each slide should has its own draw page style |
| DrawPageElement slide1 = testdoc1.getSlideByIndex(0).getOdfElement(); |
| DrawPageElement slide2 = testdoc1.getSlideByIndex(1).getOdfElement(); |
| DrawPageElement slide3 = testdoc1.getSlideByIndex(2).getOdfElement(); |
| String slideStyle1 = slide1.getDrawNameAttribute(); |
| String slideStyle2 = slide2.getDrawNameAttribute(); |
| String slideStyle3 = slide3.getDrawNameAttribute(); |
| LOG.info(slideStyle1); |
| LOG.info(slideStyle2); |
| LOG.info(slideStyle3); |
| testdoc1.save(ResourceUtilities.newTestOutputFile(TEST_PRESENTATION_FILE_OUT_PREFIX + "CopyThreeDoc.odp")); |
| Assert.assertNotSame(slideStyle1, slideStyle2); |
| Assert.assertNotSame(slideStyle2, slideStyle3); |
| } catch (Exception e) { |
| LOG.log(Level.SEVERE, e.getMessage(), e); |
| Assert.fail("Failed with " + e.getClass().getName() + ": '" + e.getMessage() + "'"); |
| } |
| } |
| } |