blob: 36d0277568d111d14ea67fb8e2de57198092f942 [file] [log] [blame]
/*
* ====================================================================
* 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 static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.List;
import org.apache.poi.xwpf.XWPFTestDataSamples;
import org.apache.poi.xwpf.usermodel.XWPFTableCell.XWPFVertAlign;
import org.apache.xmlbeans.XmlCursor;
import org.junit.jupiter.api.Test;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTHMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTShd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcBorders;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTcPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTVerticalJc;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STShd;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalJc;
class TestXWPFTableCell {
@Test
void testSetGetVertAlignment() {
// instantiate the following classes so they'll get picked up by
// the XmlBean process and added to the jar file. they are required
// for the following XWPFTableCell methods.
CTShd ctShd = CTShd.Factory.newInstance();
assertNotNull(ctShd);
CTVerticalJc ctVjc = CTVerticalJc.Factory.newInstance();
assertNotNull(ctVjc);
STShd stShd = STShd.Factory.newInstance();
assertNotNull(stShd);
STVerticalJc stVjc = STVerticalJc.Factory.newInstance();
assertNotNull(stVjc);
// create a table
XWPFDocument doc = new XWPFDocument();
CTTbl ctTable = CTTbl.Factory.newInstance();
XWPFTable table = new XWPFTable(ctTable, doc);
// table has a single row by default; grab it
XWPFTableRow tr = table.getRow(0);
assertNotNull(tr);
// row has a single cell by default; grab it
XWPFTableCell cell = tr.getCell(0);
cell.setVerticalAlignment(XWPFVertAlign.BOTH);
XWPFVertAlign al = cell.getVerticalAlignment();
assertEquals(XWPFVertAlign.BOTH, al);
}
@Test
void testSetGetColor() {
// create a table
XWPFDocument doc = new XWPFDocument();
CTTbl ctTable = CTTbl.Factory.newInstance();
XWPFTable table = new XWPFTable(ctTable, doc);
// table has a single row by default; grab it
XWPFTableRow tr = table.getRow(0);
assertNotNull(tr);
// row has a single cell by default; grab it
XWPFTableCell cell = tr.getCell(0);
cell.setColor("F0000F");
String clr = cell.getColor();
assertEquals("F0000F", clr);
}
/**
* ensure that CTHMerge and CTTcBorders go in poi-ooxml.jar
*/
@Test
void test54099() {
XWPFDocument doc = new XWPFDocument();
CTTbl ctTable = CTTbl.Factory.newInstance();
XWPFTable table = new XWPFTable(ctTable, doc);
XWPFTableRow tr = table.getRow(0);
XWPFTableCell cell = tr.getCell(0);
CTTc ctTc = cell.getCTTc();
CTTcPr tcPr = ctTc.addNewTcPr();
CTHMerge hMerge = tcPr.addNewHMerge();
hMerge.setVal(STMerge.RESTART);
CTTcBorders tblBorders = tcPr.addNewTcBorders();
assertNotNull(tblBorders);
CTVMerge vMerge = tcPr.addNewVMerge();
assertNotNull(vMerge);
}
@Test
void testCellVerticalAlign() throws Exception{
try (XWPFDocument docx = XWPFTestDataSamples.openSampleDocument("59030.docx")) {
List<XWPFTable> tables = docx.getTables();
assertEquals(1, tables.size());
XWPFTable table = tables.get(0);
List<XWPFTableRow> tableRows = table.getRows();
assertEquals(2, tableRows.size());
assertNull(tableRows.get(0).getCell(0).getVerticalAlignment());
assertEquals(XWPFVertAlign.BOTTOM, tableRows.get(0).getCell(1).getVerticalAlignment());
assertEquals(XWPFVertAlign.CENTER, tableRows.get(1).getCell(0).getVerticalAlignment());
assertNull(tableRows.get(1).getCell(1).getVerticalAlignment()); // should return null since alignment isn't set
}
}
@Test
void testCellVerticalAlignShouldNotThrowNPE() throws Exception {
try (XWPFDocument docx = XWPFTestDataSamples.openSampleDocument("TestTableCellAlign.docx")) {
String[] act = docx.getTables().stream()
.flatMap(t -> t.getRows().stream())
.flatMap(r -> r.getTableICells().stream())
.map(XWPFTableCell.class::cast)
.map(XWPFTableCell::getVerticalAlignment)
.map(e -> e == null ? null : e.name())
.toArray(String[]::new);
String[] exp = { null, "BOTTOM", "CENTER", null};
assertArrayEquals(exp, act);
}
}
@Test
void testCellGetSetWidth() throws Exception {
XWPFDocument doc = new XWPFDocument();
XWPFTable table = doc.createTable();
XWPFTableRow tr = table.createRow();
XWPFTableCell cell = tr.addNewTableCell();
cell.setWidth("50%");
assertEquals(TableWidthType.PCT, cell.getWidthType());
assertEquals(50.0, cell.getWidthDecimal(), 0.0);
assertEquals(2500, cell.getWidth());
doc.close();
}
@Test
void testAddParagraph() throws Exception {
XWPFDocument doc = new XWPFDocument();
XWPFTable table = doc.createTable();
XWPFTableRow tr = table.createRow();
XWPFTableCell cell = tr.addNewTableCell();
// now paragraph or body element initially
assertEquals(0, cell.getParagraphs().size());
assertEquals(0, cell.getBodyElements().size());
XWPFParagraph p = cell.addParagraph();
assertEquals(1, cell.getParagraphs().size());
assertEquals(1, cell.getBodyElements().size());
assertSame(p, cell.getParagraphArray(0));
assertEquals(cell.getParagraphArray(0), cell.getBodyElements().get(0));
doc.close();
}
@Test
void testRemoveParagraph() throws Exception {
XWPFDocument doc = new XWPFDocument();
XWPFTable table = doc.createTable();
XWPFTableRow tr = table.createRow();
XWPFTableCell cell = tr.addNewTableCell();
// cell have no paragraph by default
assertNull(cell.getParagraphArray(0));
XWPFParagraph p0 = cell.addParagraph();
XWPFParagraph p1 = cell.addParagraph();
cell.addParagraph();
// remove 3rd
cell.removeParagraph(2);
assertEquals(2, cell.getParagraphs().size());
assertEquals(2, cell.getBodyElements().size());
assertEquals(p0, cell.getParagraphArray(0));
assertEquals(p1, cell.getParagraphArray(1));
assertEquals(p0, cell.getBodyElements().get(0));
assertEquals(p1, cell.getBodyElements().get(1));
// remove 2nd
cell.removeParagraph(1);
assertEquals(1, cell.getParagraphs().size());
assertEquals(1, cell.getBodyElements().size());
assertEquals(p0, cell.getParagraphArray(0));
assertEquals(p0, cell.getBodyElements().get(0));
doc.close();
}
@Test
void testRemoveTable() throws Exception {
XWPFDocument doc = new XWPFDocument();
XWPFTable table = doc.createTable();
XWPFTableRow tr = table.createRow();
XWPFTableCell cell = tr.addNewTableCell();
// cell should not have any elements by default
assertTrue(cell.getParagraphs().isEmpty());
XWPFParagraph p = cell.addParagraph();
assertNotNull(p);
XWPFParagraph p0 = cell.getParagraphArray(0);
XmlCursor newCursor = p0.getCTP().newCursor();
cell.insertNewTbl(newCursor);
newCursor.dispose();
assertEquals(1, cell.getTables().size());
assertEquals(2, cell.getBodyElements().size());
// remove table
cell.removeTable(0);
assertEquals(0, cell.getTables().size());
assertEquals(1, cell.getBodyElements().size());
assertEquals(p0, cell.getBodyElements().get(0));
doc.close();
}
@Test
void testBug63624() throws Exception {
XWPFDocument doc = new XWPFDocument();
XWPFTable table = doc.createTable(1, 1);
XWPFTableRow row = table.getRow(0);
XWPFTableCell cell = row.getCell(0);
String expected = "this must not be empty";
cell.setText(expected);
String actual = cell.getText();
assertEquals(expected, actual);
doc.close();
}
@Test
void test63624() {
XWPFDocument doc = new XWPFDocument();
XWPFTable table = doc.createTable(1, 1);
XWPFTableRow row = table.getRow(0);
XWPFTableCell cell = row.getCell(0);
cell.setText("test text 1");
assertEquals("test text 1", cell.getText());
// currently the text is added, I am not sure if this is expected or not...
cell.setText("test text 2");
assertEquals("test text 1test text 2", cell.getText());
}
}