poi/src/testcases/org/apache/poi/ss/util/BaseTestCellUtil.java

415 lines
17 KiB
Java

/* ====================================================================
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.ss.util;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.poi.ss.ITestDataProvider;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;
/**
* Tests Spreadsheet CellUtil
*
* @see org.apache.poi.ss.util.CellUtil
*/
public class BaseTestCellUtil {
protected final ITestDataProvider _testDataProvider;
protected BaseTestCellUtil(ITestDataProvider testDataProvider) {
_testDataProvider = testDataProvider;
}
@Test
public void setCellStyleProperty() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
Sheet s = wb.createSheet();
Row r = s.createRow(0);
Cell c = r.createCell(0);
// Add a border should create a new style
int styCnt1 = wb.getNumCellStyles();
CellUtil.setCellStyleProperty(c, CellUtil.BORDER_BOTTOM, BorderStyle.THIN);
int styCnt2 = wb.getNumCellStyles();
assertEquals(styCnt1+1, styCnt2);
// Add same border to another cell, should not create another style
c = r.createCell(1);
CellUtil.setCellStyleProperty(c, CellUtil.BORDER_BOTTOM, BorderStyle.THIN);
int styCnt3 = wb.getNumCellStyles();
assertEquals(styCnt2, styCnt3);
wb.close();
}
@Test(expected=RuntimeException.class)
public void setCellStylePropertyWithInvalidValue() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
try {
Sheet s = wb.createSheet();
Row r = s.createRow(0);
Cell c = r.createCell(0);
// An invalid BorderStyle constant
CellUtil.setCellStyleProperty(c, CellUtil.BORDER_BOTTOM, 42);
} finally {
wb.close();
}
}
@Test()
public void setCellStylePropertyBorderWithShortAndEnum() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
Sheet s = wb.createSheet();
Row r = s.createRow(0);
Cell c = r.createCell(0);
// A valid BorderStyle constant, as a Short
CellUtil.setCellStyleProperty(c, CellUtil.BORDER_BOTTOM, BorderStyle.DASH_DOT.getCode());
assertEquals(BorderStyle.DASH_DOT, c.getCellStyle().getBorderBottom());
// A valid BorderStyle constant, as an Enum
CellUtil.setCellStyleProperty(c, CellUtil.BORDER_TOP, BorderStyle.MEDIUM_DASH_DOT);
assertEquals(BorderStyle.MEDIUM_DASH_DOT, c.getCellStyle().getBorderTop());
wb.close();
}
@Test
public void setCellStyleProperties() throws IOException {
System.out.println("setCellStyleProps start");
Workbook wb = _testDataProvider.createWorkbook();
Sheet s = wb.createSheet();
Row r = s.createRow(0);
Cell c = r.createCell(0);
// Add multiple border properties to cell should create a single new style
int styCnt1 = wb.getNumCellStyles();
Map<String, Object> props = new HashMap<String, Object>();
props.put(CellUtil.BORDER_TOP, BorderStyle.THIN);
props.put(CellUtil.BORDER_BOTTOM, BorderStyle.THIN);
props.put(CellUtil.BORDER_LEFT, BorderStyle.THIN);
props.put(CellUtil.BORDER_RIGHT, BorderStyle.THIN);
props.put(CellUtil.ALIGNMENT, HorizontalAlignment.CENTER.getCode()); // try it both with a Short (deprecated)
props.put(CellUtil.VERTICAL_ALIGNMENT, VerticalAlignment.CENTER); // and with an enum
CellUtil.setCellStyleProperties(c, props);
int styCnt2 = wb.getNumCellStyles();
assertEquals("Only one additional style should have been created", styCnt1 + 1, styCnt2);
// Add same border another to same cell, should not create another style
c = r.createCell(1);
CellUtil.setCellStyleProperties(c, props);
int styCnt3 = wb.getNumCellStyles();
System.out.println("setCellStyleProps nearing end");
assertEquals("No additional styles should have been created", styCnt2, styCnt3);
wb.close();
}
@Test
public void getRow() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
Sheet sh = wb.createSheet();
Row row1 = sh.createRow(0);
// Get row that already exists
Row r1 = CellUtil.getRow(0, sh);
assertNotNull(r1);
assertSame("An existing row should not be recreated", row1, r1);
// Get row that does not exist yet
assertNotNull(CellUtil.getRow(1, sh));
wb.close();
}
@Test
public void getCell() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
Sheet sh = wb.createSheet();
Row row = sh.createRow(0);
Cell A1 = row.createCell(0);
// Get cell that already exists
Cell a1 = CellUtil.getCell(row, 0);
assertNotNull(a1);
assertSame("An existing cell should not be recreated", A1, a1);
// Get cell that does not exist yet
assertNotNull(CellUtil.getCell(row, 1));
wb.close();
}
@Test
public void createCell() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
Sheet sh = wb.createSheet();
Row row = sh.createRow(0);
CellStyle style = wb.createCellStyle();
style.setWrapText(true);
// calling createCell on a non-existing cell should create a cell and set the cell value and style.
Cell F1 = CellUtil.createCell(row, 5, "Cell Value", style);
assertSame(row.getCell(5), F1);
assertEquals("Cell Value", F1.getStringCellValue());
assertEquals(style, F1.getCellStyle());
// should be assertSame, but a new HSSFCellStyle is returned for each getCellStyle() call.
// HSSFCellStyle wraps an underlying style record, and the underlying
// style record is the same between multiple getCellStyle() calls.
// calling createCell on an existing cell should return the existing cell and modify the cell value and style.
Cell f1 = CellUtil.createCell(row, 5, "Overwritten cell value", null);
assertSame(row.getCell(5), f1);
assertSame(F1, f1);
assertEquals("Overwritten cell value", f1.getStringCellValue());
assertEquals("Overwritten cell value", F1.getStringCellValue());
assertEquals("cell style should be unchanged with createCell(..., null)", style, f1.getCellStyle());
assertEquals("cell style should be unchanged with createCell(..., null)", style, F1.getCellStyle());
// test createCell(row, column, value) (no CellStyle)
f1 = CellUtil.createCell(row, 5, "Overwritten cell with default style");
assertSame(F1, f1);
wb.close();
}
/**
* @deprecated by {@link #setAlignmentEnum()}
*
* @throws IOException
*
*/
@SuppressWarnings("deprecated")
@Test
public void setAlignment() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
Sheet sh = wb.createSheet();
Row row = sh.createRow(0);
Cell A1 = row.createCell(0);
Cell B1 = row.createCell(1);
// Assumptions
assertEquals(A1.getCellStyle(), B1.getCellStyle());
// should be assertSame, but a new HSSFCellStyle is returned for each getCellStyle() call.
// HSSFCellStyle wraps an underlying style record, and the underlying
// style record is the same between multiple getCellStyle() calls.
assertEquals(CellStyle.ALIGN_GENERAL, A1.getCellStyle().getAlignment());
assertEquals(CellStyle.ALIGN_GENERAL, B1.getCellStyle().getAlignment());
// get/set alignment modifies the cell's style
CellUtil.setAlignment(A1, null, CellStyle.ALIGN_RIGHT);
assertEquals(CellStyle.ALIGN_RIGHT, A1.getCellStyle().getAlignment());
// get/set alignment doesn't affect the style of cells with
// the same style prior to modifying the style
assertNotEquals(A1.getCellStyle(), B1.getCellStyle());
assertEquals(CellStyle.ALIGN_GENERAL, B1.getCellStyle().getAlignment());
wb.close();
}
@Test
public void setAlignmentEnum() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
Sheet sh = wb.createSheet();
Row row = sh.createRow(0);
Cell A1 = row.createCell(0);
Cell B1 = row.createCell(1);
// Assumptions
assertEquals(A1.getCellStyle(), B1.getCellStyle());
// should be assertSame, but a new HSSFCellStyle is returned for each getCellStyle() call.
// HSSFCellStyle wraps an underlying style record, and the underlying
// style record is the same between multiple getCellStyle() calls.
assertEquals(HorizontalAlignment.GENERAL, A1.getCellStyle().getAlignmentEnum());
assertEquals(HorizontalAlignment.GENERAL, B1.getCellStyle().getAlignmentEnum());
// get/set alignment modifies the cell's style
CellUtil.setAlignment(A1, HorizontalAlignment.RIGHT);
assertEquals(HorizontalAlignment.RIGHT, A1.getCellStyle().getAlignmentEnum());
// get/set alignment doesn't affect the style of cells with
// the same style prior to modifying the style
assertNotEquals(A1.getCellStyle(), B1.getCellStyle());
assertEquals(HorizontalAlignment.GENERAL, B1.getCellStyle().getAlignmentEnum());
wb.close();
}
@Test
public void setVerticalAlignmentEnum() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
Sheet sh = wb.createSheet();
Row row = sh.createRow(0);
Cell A1 = row.createCell(0);
Cell B1 = row.createCell(1);
// Assumptions
assertEquals(A1.getCellStyle(), B1.getCellStyle());
// should be assertSame, but a new HSSFCellStyle is returned for each getCellStyle() call.
// HSSFCellStyle wraps an underlying style record, and the underlying
// style record is the same between multiple getCellStyle() calls.
assertEquals(VerticalAlignment.BOTTOM, A1.getCellStyle().getVerticalAlignmentEnum());
assertEquals(VerticalAlignment.BOTTOM, B1.getCellStyle().getVerticalAlignmentEnum());
// get/set alignment modifies the cell's style
CellUtil.setVerticalAlignment(A1, VerticalAlignment.TOP);
assertEquals(VerticalAlignment.TOP, A1.getCellStyle().getVerticalAlignmentEnum());
// get/set alignment doesn't affect the style of cells with
// the same style prior to modifying the style
assertNotEquals(A1.getCellStyle(), B1.getCellStyle());
assertEquals(VerticalAlignment.BOTTOM, B1.getCellStyle().getVerticalAlignmentEnum());
wb.close();
}
@Test
public void setFont() throws IOException {
Workbook wb = _testDataProvider.createWorkbook();
Sheet sh = wb.createSheet();
Row row = sh.createRow(0);
Cell A1 = row.createCell(0);
Cell B1 = row.createCell(1);
final short defaultFontIndex = 0;
Font font = wb.createFont();
font.setItalic(true);
final short customFontIndex = font.getIndex();
// Assumptions
assertNotEquals(defaultFontIndex, customFontIndex);
assertEquals(A1.getCellStyle(), B1.getCellStyle());
// should be assertSame, but a new HSSFCellStyle is returned for each getCellStyle() call.
// HSSFCellStyle wraps an underlying style record, and the underlying
// style record is the same between multiple getCellStyle() calls.
assertEquals(defaultFontIndex, A1.getCellStyle().getFontIndex());
assertEquals(defaultFontIndex, B1.getCellStyle().getFontIndex());
// get/set alignment modifies the cell's style
CellUtil.setFont(A1, font);
assertEquals(customFontIndex, A1.getCellStyle().getFontIndex());
// get/set alignment doesn't affect the style of cells with
// the same style prior to modifying the style
assertNotEquals(A1.getCellStyle(), B1.getCellStyle());
assertEquals(defaultFontIndex, B1.getCellStyle().getFontIndex());
wb.close();
}
@Test
public void setFontFromDifferentWorkbook() throws IOException {
Workbook wb1 = _testDataProvider.createWorkbook();
Workbook wb2 = _testDataProvider.createWorkbook();
Font font1 = wb1.createFont();
Font font2 = wb2.createFont();
// do something to make font1 and font2 different
// so they are not same or equal.
font1.setItalic(true);
Cell A1 = wb1.createSheet().createRow(0).createCell(0);
// okay
CellUtil.setFont(A1, font1);
// font belongs to different workbook
try {
CellUtil.setFont(A1, font2);
fail("setFont not allowed if font belongs to a different workbook");
} catch (final IllegalArgumentException e) {
// one specific message is expected
if (!e.getMessage().startsWith("Font does not belong to this workbook")) {
throw e;
}
} finally {
wb1.close();
wb2.close();
}
}
/**
* bug 55555
* @deprecated Replaced by {@link #setFillForegroundColorBeforeFillBackgroundColorEnum()}
* @since POI 3.15 beta 3
*/
// bug 55555
@Test
public void setFillForegroundColorBeforeFillBackgroundColor() throws IOException {
Workbook wb1 = _testDataProvider.createWorkbook();
Cell A1 = wb1.createSheet().createRow(0).createCell(0);
Map<String, Object> properties = new HashMap<String, Object>();
// FIXME: Use FillPatternType.BRICKS enum
properties.put(CellUtil.FILL_PATTERN, CellStyle.BRICKS);
properties.put(CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.BLUE.index);
properties.put(CellUtil.FILL_BACKGROUND_COLOR, IndexedColors.RED.index);
CellUtil.setCellStyleProperties(A1, properties);
CellStyle style = A1.getCellStyle();
// FIXME: Use FillPatternType.BRICKS enum
assertEquals("fill pattern", CellStyle.BRICKS, style.getFillPattern());
assertEquals("fill foreground color", IndexedColors.BLUE, IndexedColors.fromInt(style.getFillForegroundColor()));
assertEquals("fill background color", IndexedColors.RED, IndexedColors.fromInt(style.getFillBackgroundColor()));
wb1.close();
}
/**
* bug 55555
* @since POI 3.15 beta 3
*/
@Test
public void setFillForegroundColorBeforeFillBackgroundColorEnum() throws IOException {
Workbook wb1 = _testDataProvider.createWorkbook();
Cell A1 = wb1.createSheet().createRow(0).createCell(0);
Map<String, Object> properties = new HashMap<String, Object>();
// FIXME: Use FillPatternType.BRICKS enum
properties.put(CellUtil.FILL_PATTERN, FillPatternType.BRICKS);
properties.put(CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.BLUE.index);
properties.put(CellUtil.FILL_BACKGROUND_COLOR, IndexedColors.RED.index);
CellUtil.setCellStyleProperties(A1, properties);
CellStyle style = A1.getCellStyle();
// FIXME: Use FillPatternType.BRICKS enum
assertEquals("fill pattern", FillPatternType.BRICKS, style.getFillPatternEnum());
assertEquals("fill foreground color", IndexedColors.BLUE, IndexedColors.fromInt(style.getFillForegroundColor()));
assertEquals("fill background color", IndexedColors.RED, IndexedColors.fromInt(style.getFillBackgroundColor()));
wb1.close();
}
}