blob: cedb11eed0213d0cfcfc78a27263985f956383e2 [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.sl.tests;
import static org.apache.poi.sl.tests.SLCommonUtils.openSampleSlideshow;
import static org.apache.poi.sl.tests.SLCommonUtils.xslfOnly;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assumptions.assumeFalse;
import java.awt.geom.Rectangle2D;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.poi.sl.usermodel.Slide;
import org.apache.poi.sl.usermodel.SlideShow;
import org.apache.poi.sl.usermodel.SlideShowFactory;
import org.apache.poi.sl.usermodel.TableCell;
import org.apache.poi.sl.usermodel.TableShape;
import org.apache.poi.sl.usermodel.TextShape.TextDirection;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.junit.jupiter.api.Test;
class TestTable {
@Test
void colWidthRowHeight() throws IOException {
assumeFalse(xslfOnly());
// Test of table dimensions of same slideshow saved as ppt/x
// to check if both return similar (points) value
SlideShow<?,?> ppt = openSampleSlideshow("table_test.ppt");
TableShape<?,?> ts = (TableShape<?,?>)ppt.getSlides().get(0).getShapes().get(0);
SlideShow<?,?> pptx = openSampleSlideshow("table_test.pptx");
TableShape<?,?> tsx = (TableShape<?,?>)pptx.getSlides().get(0).getShapes().get(0);
// assume table shape should be equal to itself
confirmTableShapeEqual(ts, ts);
confirmTableShapeEqual(tsx, tsx);
// assert ppt and pptx versions of the same table have the same shape
confirmTableShapeEqual(ts, tsx);
// change row height and validate again
tsx.setRowHeight(1, 50);
ts.setRowHeight(1, 50);
confirmTableShapeEqual(ts, tsx);
pptx.close();
ppt.close();
}
private void confirmTableShapeEqual(TableShape<?,?> tableA, TableShape<?,?> tableB) {
int cols = tableA.getNumberOfColumns();
int rows = tableA.getNumberOfRows();
int colsx = tableB.getNumberOfColumns();
int rowsx = tableB.getNumberOfRows();
assertEquals(cols, colsx, "tables should have same number of columns");
assertEquals(rows, rowsx, "tables should have same number of rows");
for (int i=0; i<cols; i++) {
assertEquals(tableA.getColumnWidth(i), tableB.getColumnWidth(i), 0.2, "Width of column " + i + " should be equal");
}
for (int i=0; i<rows; i++) {
assertEquals(tableA.getRowHeight(i), tableB.getRowHeight(i), 0.3, "Height of row " + i + " should be equal");
}
}
@Test
void directionHSLF() throws IOException {
assumeFalse(xslfOnly());
SlideShow<?,?> ppt1 = SlideShowFactory.create(false);
testTextDirection(ppt1);
ppt1.close();
}
@Test
void directionXSLF() throws IOException {
SlideShow<?,?> ppt1 = new XMLSlideShow();
testTextDirection(ppt1);
ppt1.close();
}
private void testTextDirection(SlideShow<?,?> ppt1) throws IOException {
TextDirection[] tds = {
TextDirection.HORIZONTAL,
TextDirection.VERTICAL,
TextDirection.VERTICAL_270,
// TextDirection.STACKED is not supported on HSLF
};
TableShape<?,?> tbl1 = ppt1.createSlide().createTable(1, 3);
tbl1.setAnchor(new Rectangle2D.Double(50, 50, 200, 200));
int col = 0;
for (TextDirection td : tds) {
TableCell<?,?> c = tbl1.getCell(0, col++);
if (c != null) {
c.setTextDirection(td);
c.setText("bla");
}
}
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ppt1.write(bos);
ppt1.close();
InputStream is = new ByteArrayInputStream(bos.toByteArray());
SlideShow<?,?> ppt2 = SlideShowFactory.create(is);
TableShape<?,?> tbl2 = (TableShape<?,?>)ppt2.getSlides().get(0).getShapes().get(0);
col = 0;
for (TextDirection td : tds) {
TableCell<?,?> c = tbl2.getCell(0, col++);
assertEquals(td, c.getTextDirection());
}
ppt2.close();
}
@Test
void tableSpan() throws IOException {
String[] files = (xslfOnly()) ? new String[]{"bug60993.pptx"} : new String[]{"bug60993.pptx", "bug60993.ppt"};
for (String f : files) {
SlideShow<?,?> ppt = openSampleSlideshow(f);
Slide<?,?> slide = ppt.getSlides().get(0);
TableShape<?,?> ts = (TableShape<?,?>)slide.getShapes().get(0);
int cols = ts.getNumberOfColumns();
int rows = ts.getNumberOfRows();
for (int r=0; r<rows; r++) {
for (int c=0; c<cols; c++) {
TableCell<?,?> tc = ts.getCell(r, c);
int rc = r*10+c;
String msg = f+" (r"+r+",c"+c+")";
switch (rc) {
case 22:
case 51:
if (f.endsWith("ppt")) {
assertNull(tc, msg);
} else {
assertNotNull(tc, msg);
assertTrue(tc.isMerged(), msg);
}
break;
case 21:
assertNotNull(tc, msg);
assertEquals(1, tc.getRowSpan(), msg);
assertEquals(2, tc.getGridSpan(), msg);
assertFalse(tc.isMerged(), msg);
break;
case 41:
assertNotNull(tc, msg);
assertEquals(2, tc.getRowSpan(), msg);
assertEquals(1, tc.getGridSpan(), msg);
assertFalse(tc.isMerged(), msg);
break;
default:
assertNotNull(tc, msg);
assertEquals(1, tc.getRowSpan(), msg);
assertEquals(1, tc.getGridSpan(), msg);
assertFalse(tc.isMerged(), msg);
break;
}
}
}
ppt.close();
}
}
}