From d5bada3d3395062845e42d441379307591a24034 Mon Sep 17 00:00:00 2001 From: Svante Schubert Date: Thu, 23 May 2024 21:10:03 +0200 Subject: [PATCH] Adding test case to prove existence of after roundtrip (save & load) --- .../odftoolkit/odfdom/doc/LoadSaveTest.java | 44 ++++++++++++++++++ .../resources/test-input/svgTitleTest.odt | Bin 0 -> 14073 bytes 2 files changed, 44 insertions(+) create mode 100644 odfdom/src/test/resources/test-input/svgTitleTest.odt diff --git a/odfdom/src/test/java/org/odftoolkit/odfdom/doc/LoadSaveTest.java b/odfdom/src/test/java/org/odftoolkit/odfdom/doc/LoadSaveTest.java index a5def79538..5f0e153f2c 100644 --- a/odfdom/src/test/java/org/odftoolkit/odfdom/doc/LoadSaveTest.java +++ b/odfdom/src/test/java/org/odftoolkit/odfdom/doc/LoadSaveTest.java @@ -41,7 +41,9 @@ public class LoadSaveTest { private static final String SOURCE = "not-only-odf.odt"; + private static final String SOURCE2 = "svgTitleTest.odt"; private static final String TARGET = "loadsavetest.odt"; + private static final String TARGET2 = "loadsavetest2.odt"; private static final String FOREIGN_ATTRIBUTE_NAME = "foreignAttribute"; private static final String FOREIGN_ATTRIBUTE_VALUE = "foreignAttributeValue"; private static final String FOREIGN_ELEMENT_TEXT = "foreignText"; @@ -101,4 +103,46 @@ public void testLoadSave() { Assert.fail(e.getMessage()); } } + + @Test + public void testLoadSave2() { + try { + System.out.println("\n\nStarting SVG Title Test (testLoadSave2)"); + OdfDocument odfDocument = + OdfDocument.loadDocument(ResourceUtilities.getAbsoluteInputPath(SOURCE2)); + Assert.assertTrue(odfDocument.getPackage().contains("content.xml")); + String baseURI1 = odfDocument.getBaseURI(); + System.out.println("SOURCE URI: " + baseURI1); + + OdfFileDom odfContent = odfDocument.getContentDom(); + OfficeDocumentContentElement content = + (OfficeDocumentContentElement) odfContent.getDocumentElement(); + NodeList svgTitleList = + odfContent.getElementsByTagNameNS(OdfDocumentNamespace.SVG.getUri(), "title"); + Assert.assertTrue( + "There should be a single within the document", + svgTitleList.getLength() == 1); + NodeList svgDescList = + odfContent.getElementsByTagNameNS(OdfDocumentNamespace.SVG.getUri(), "desc"); + Assert.assertTrue( + "There should be no within the document", svgDescList.getLength() == 0); + + odfDocument.save(ResourceUtilities.getTestOutputFile(TARGET2)); + odfDocument = OdfDocument.loadDocument(ResourceUtilities.getAbsoluteOutputPath(TARGET2)); + System.out.println("TARGET: " + ResourceUtilities.getAbsoluteOutputPath(TARGET2)); + + odfContent = odfDocument.getContentDom(); + svgTitleList = odfContent.getElementsByTagNameNS(OdfDocumentNamespace.SVG.getUri(), "title"); + Assert.assertTrue( + "There should be a single within the document", + svgTitleList.getLength() == 1); + svgDescList = odfContent.getElementsByTagNameNS(OdfDocumentNamespace.SVG.getUri(), "desc"); + Assert.assertTrue( + "There should be no within the document", svgDescList.getLength() == 0); + } catch (Exception e) { + Logger.getLogger(LoadSaveTest.class.getName()) + .log(Level.SEVERE, e.getMessage() + ExceptionUtils.getStackTrace(e), e); + Assert.fail(e.getMessage()); + } + } } diff --git a/odfdom/src/test/resources/test-input/svgTitleTest.odt b/odfdom/src/test/resources/test-input/svgTitleTest.odt new file mode 100644 index 0000000000000000000000000000000000000000..3cec8562cd4458c1be6bc1b08a3a3780f522cf86 GIT binary patch literal 14073 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