| /* ==================================================================== |
| 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.apache.poi.xwpf.usermodel; |
| |
| import java.io.ByteArrayInputStream; |
| import java.io.IOException; |
| import java.math.BigInteger; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import junit.framework.TestCase; |
| |
| import org.apache.poi.xwpf.XWPFTestDataSamples; |
| import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBr; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBrClear; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline; |
| import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun; |
| |
| /** |
| * Tests for XWPF Run |
| */ |
| public class TestXWPFRun extends TestCase { |
| public CTR ctRun; |
| public XWPFParagraph p; |
| |
| protected void setUp() { |
| XWPFDocument doc = new XWPFDocument(); |
| p = doc.createParagraph(); |
| |
| this.ctRun = CTR.Factory.newInstance(); |
| } |
| |
| public void testSetGetText() { |
| ctRun.addNewT().setStringValue("TEST STRING"); |
| ctRun.addNewT().setStringValue("TEST2 STRING"); |
| ctRun.addNewT().setStringValue("TEST3 STRING"); |
| |
| assertEquals(3,ctRun.sizeOfTArray()); |
| XWPFRun run = new XWPFRun(ctRun, p); |
| |
| assertEquals("TEST2 STRING",run.getText(1)); |
| |
| run.setText("NEW STRING",0); |
| assertEquals("NEW STRING",run.getText(0)); |
| |
| //run.setText("xxx",14); |
| //fail("Position wrong"); |
| } |
| |
| public void testSetGetBold() { |
| CTRPr rpr = ctRun.addNewRPr(); |
| rpr.addNewB().setVal(STOnOff.TRUE); |
| |
| XWPFRun run = new XWPFRun(ctRun, p); |
| assertEquals(true, run.isBold()); |
| |
| run.setBold(false); |
| assertEquals(STOnOff.FALSE, rpr.getB().getVal()); |
| } |
| |
| public void testSetGetItalic() { |
| CTRPr rpr = ctRun.addNewRPr(); |
| rpr.addNewI().setVal(STOnOff.TRUE); |
| |
| XWPFRun run = new XWPFRun(ctRun, p); |
| assertEquals(true, run.isItalic()); |
| |
| run.setItalic(false); |
| assertEquals(STOnOff.FALSE, rpr.getI().getVal()); |
| } |
| |
| public void testSetGetStrike() { |
| CTRPr rpr = ctRun.addNewRPr(); |
| rpr.addNewStrike().setVal(STOnOff.TRUE); |
| |
| XWPFRun run = new XWPFRun(ctRun, p); |
| assertEquals(true, run.isStrike()); |
| |
| run.setStrike(false); |
| assertEquals(STOnOff.FALSE, rpr.getStrike().getVal()); |
| } |
| |
| public void testSetGetUnderline() { |
| CTRPr rpr = ctRun.addNewRPr(); |
| rpr.addNewU().setVal(STUnderline.DASH); |
| |
| XWPFRun run = new XWPFRun(ctRun, p); |
| assertEquals(UnderlinePatterns.DASH.getValue(), run.getUnderline() |
| .getValue()); |
| |
| run.setUnderline(UnderlinePatterns.NONE); |
| assertEquals(STUnderline.NONE.intValue(), rpr.getU().getVal() |
| .intValue()); |
| } |
| |
| |
| public void testSetGetVAlign() { |
| CTRPr rpr = ctRun.addNewRPr(); |
| rpr.addNewVertAlign().setVal(STVerticalAlignRun.SUBSCRIPT); |
| |
| XWPFRun run = new XWPFRun(ctRun, p); |
| assertEquals(VerticalAlign.SUBSCRIPT, run.getSubscript()); |
| |
| run.setSubscript(VerticalAlign.BASELINE); |
| assertEquals(STVerticalAlignRun.BASELINE, rpr.getVertAlign().getVal()); |
| } |
| |
| |
| public void testSetGetFontFamily() { |
| CTRPr rpr = ctRun.addNewRPr(); |
| rpr.addNewRFonts().setAscii("Times New Roman"); |
| |
| XWPFRun run = new XWPFRun(ctRun, p); |
| assertEquals("Times New Roman", run.getFontFamily()); |
| |
| run.setFontFamily("Verdana"); |
| assertEquals("Verdana", rpr.getRFonts().getAscii()); |
| } |
| |
| |
| public void testSetGetFontSize() { |
| CTRPr rpr = ctRun.addNewRPr(); |
| rpr.addNewSz().setVal(new BigInteger("14")); |
| |
| XWPFRun run = new XWPFRun(ctRun, p); |
| assertEquals(7, run.getFontSize()); |
| |
| run.setFontSize(24); |
| assertEquals(48, rpr.getSz().getVal().longValue()); |
| } |
| |
| |
| public void testSetGetTextForegroundBackground() { |
| CTRPr rpr = ctRun.addNewRPr(); |
| rpr.addNewPosition().setVal(new BigInteger("4000")); |
| |
| XWPFRun run = new XWPFRun(ctRun, p); |
| assertEquals(4000, run.getTextPosition()); |
| |
| run.setTextPosition(2400); |
| assertEquals(2400, rpr.getPosition().getVal().longValue()); |
| } |
| |
| public void testSetGetColor() { |
| XWPFRun run = new XWPFRun(ctRun, p); |
| run.setColor("0F0F0F"); |
| String clr = run.getColor(); |
| assertEquals("0F0F0F", clr); |
| } |
| |
| public void testAddCarriageReturn() { |
| ctRun.addNewT().setStringValue("TEST STRING"); |
| ctRun.addNewCr(); |
| ctRun.addNewT().setStringValue("TEST2 STRING"); |
| ctRun.addNewCr(); |
| ctRun.addNewT().setStringValue("TEST3 STRING"); |
| assertEquals(2, ctRun.sizeOfCrArray()); |
| |
| XWPFRun run = new XWPFRun(CTR.Factory.newInstance(), p); |
| run.setText("T1"); |
| run.addCarriageReturn(); |
| run.addCarriageReturn(); |
| run.setText("T2"); |
| run.addCarriageReturn(); |
| assertEquals(3, run.getCTR().sizeOfCrArray()); |
| |
| assertEquals("T1\n\nT2\n", run.toString()); |
| } |
| |
| public void testAddTabsAndLineBreaks() { |
| ctRun.addNewT().setStringValue("TEST STRING"); |
| ctRun.addNewCr(); |
| ctRun.addNewT().setStringValue("TEST2 STRING"); |
| ctRun.addNewTab(); |
| ctRun.addNewT().setStringValue("TEST3 STRING"); |
| assertEquals(1, ctRun.sizeOfCrArray()); |
| assertEquals(1, ctRun.sizeOfTabArray()); |
| |
| XWPFRun run = new XWPFRun(CTR.Factory.newInstance(), p); |
| run.setText("T1"); |
| run.addCarriageReturn(); |
| run.setText("T2"); |
| run.addTab(); |
| run.setText("T3"); |
| assertEquals(1, run.getCTR().sizeOfCrArray()); |
| assertEquals(1, run.getCTR().sizeOfTabArray()); |
| |
| assertEquals("T1\nT2\tT3", run.toString()); |
| } |
| |
| public void testAddPageBreak() { |
| ctRun.addNewT().setStringValue("TEST STRING"); |
| ctRun.addNewBr(); |
| ctRun.addNewT().setStringValue("TEST2 STRING"); |
| CTBr breac=ctRun.addNewBr(); |
| breac.setClear(STBrClear.LEFT); |
| ctRun.addNewT().setStringValue("TEST3 STRING"); |
| assertEquals(2, ctRun.sizeOfBrArray()); |
| |
| XWPFRun run = new XWPFRun(CTR.Factory.newInstance(), p); |
| run.setText("TEXT1"); |
| run.addBreak(); |
| run.setText("TEXT2"); |
| run.addBreak(BreakType.TEXT_WRAPPING); |
| assertEquals(2, run.getCTR().sizeOfBrArray()); |
| } |
| |
| /** |
| * Test that on an existing document, we do the |
| * right thing with it |
| * @throws IOException |
| */ |
| public void testExisting() throws IOException { |
| XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("TestDocument.docx"); |
| XWPFParagraph p; |
| XWPFRun run; |
| |
| |
| // First paragraph is simple |
| p = doc.getParagraphArray(0); |
| assertEquals("This is a test document.", p.getText()); |
| assertEquals(2, p.getRuns().size()); |
| |
| run = p.getRuns().get(0); |
| assertEquals("This is a test document", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| assertEquals(null, run.getCTR().getRPr()); |
| |
| run = p.getRuns().get(1); |
| assertEquals(".", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| assertEquals(null, run.getCTR().getRPr()); |
| |
| |
| // Next paragraph is all in one style, but a different one |
| p = doc.getParagraphArray(1); |
| assertEquals("This bit is in bold and italic", p.getText()); |
| assertEquals(1, p.getRuns().size()); |
| |
| run = p.getRuns().get(0); |
| assertEquals("This bit is in bold and italic", run.toString()); |
| assertEquals(true, run.isBold()); |
| assertEquals(true, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| assertEquals(true, run.getCTR().getRPr().isSetB()); |
| assertEquals(false, run.getCTR().getRPr().getB().isSetVal()); |
| |
| |
| // Back to normal |
| p = doc.getParagraphArray(2); |
| assertEquals("Back to normal", p.getText()); |
| assertEquals(1, p.getRuns().size()); |
| |
| run = p.getRuns().get(0); |
| assertEquals("Back to normal", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| assertEquals(null, run.getCTR().getRPr()); |
| |
| |
| // Different styles in one paragraph |
| p = doc.getParagraphArray(3); |
| assertEquals("This contains BOLD, ITALIC and BOTH, as well as RED and YELLOW text.", p.getText()); |
| assertEquals(11, p.getRuns().size()); |
| |
| run = p.getRuns().get(0); |
| assertEquals("This contains ", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| assertEquals(null, run.getCTR().getRPr()); |
| |
| run = p.getRuns().get(1); |
| assertEquals("BOLD", run.toString()); |
| assertEquals(true, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| |
| run = p.getRuns().get(2); |
| assertEquals(", ", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| assertEquals(null, run.getCTR().getRPr()); |
| |
| run = p.getRuns().get(3); |
| assertEquals("ITALIC", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(true, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| |
| run = p.getRuns().get(4); |
| assertEquals(" and ", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| assertEquals(null, run.getCTR().getRPr()); |
| |
| run = p.getRuns().get(5); |
| assertEquals("BOTH", run.toString()); |
| assertEquals(true, run.isBold()); |
| assertEquals(true, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| |
| run = p.getRuns().get(6); |
| assertEquals(", as well as ", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| assertEquals(null, run.getCTR().getRPr()); |
| |
| run = p.getRuns().get(7); |
| assertEquals("RED", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| |
| run = p.getRuns().get(8); |
| assertEquals(" and ", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| assertEquals(null, run.getCTR().getRPr()); |
| |
| run = p.getRuns().get(9); |
| assertEquals("YELLOW", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| |
| run = p.getRuns().get(10); |
| assertEquals(" text.", run.toString()); |
| assertEquals(false, run.isBold()); |
| assertEquals(false, run.isItalic()); |
| assertEquals(false, run.isStrike()); |
| assertEquals(null, run.getCTR().getRPr()); |
| } |
| |
| public void testPictureInHeader() throws IOException { |
| XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("headerPic.docx"); |
| XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy(); |
| |
| XWPFHeader header = policy.getDefaultHeader(); |
| |
| int count = 0; |
| |
| for (XWPFParagraph p : header.getParagraphs()) { |
| for (XWPFRun r : p.getRuns()) { |
| List<XWPFPicture> pictures = r.getEmbeddedPictures(); |
| |
| for (XWPFPicture pic : pictures) { |
| assertNotNull(pic.getPictureData()); |
| assertEquals("DOZOR", pic.getDescription()); |
| } |
| |
| count+= pictures.size(); |
| } |
| } |
| |
| assertEquals(1, count); |
| } |
| |
| public void testAddPicture() throws Exception { |
| XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("TestDocument.docx"); |
| XWPFParagraph p = doc.getParagraphArray(2); |
| XWPFRun r = p.getRuns().get(0); |
| |
| assertEquals(0, doc.getAllPictures().size()); |
| assertEquals(0, r.getEmbeddedPictures().size()); |
| |
| r.addPicture(new ByteArrayInputStream(new byte[0]), Document.PICTURE_TYPE_JPEG, "test.jpg", 21, 32); |
| |
| assertEquals(1, doc.getAllPictures().size()); |
| assertEquals(1, r.getEmbeddedPictures().size()); |
| } |
| |
| /** |
| * Bugzilla #52288 - setting the font family on the |
| * run mustn't NPE |
| */ |
| public void testSetFontFamily_52288() throws Exception { |
| XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("52288.docx"); |
| final Iterator<XWPFParagraph> paragraphs = doc.getParagraphsIterator(); |
| while (paragraphs.hasNext()) { |
| final XWPFParagraph paragraph = paragraphs.next(); |
| for (final XWPFRun run : paragraph.getRuns()) { |
| if (run != null) { |
| final String text = run.getText(0); |
| if (text != null) { |
| run.setFontFamily("Times New Roman"); |
| } |
| } |
| } |
| } |
| } |
| } |