/** * The contents of this file are subject to the OpenMRS Public License * Version 1.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://license.openmrs.org * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. * * Copyright (C) OpenMRS, LLC. All Rights Reserved. */ package org.openmrs.module.reporting.common; import org.junit.Assert; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.junit.Test; import org.openmrs.test.BaseModuleContextSensitiveTest; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * Testing the ExcelUtil class. */ public class ExcelUtilTest extends BaseModuleContextSensitiveTest { protected Log log = LogFactory.getLog(this.getClass()); @Test public void shouldGetCellContents() throws Exception { Workbook wb = ExcelUtil.loadWorkbookFromResource("org/openmrs/module/reporting/common/ExcelUtilTest.xls"); Sheet sheet = wb.getSheet("Testing"); testCellContentsToTheRightOf(sheet, "String", "This is a String"); testCellContentsToTheRightOf(sheet, "Bold String", "This is a bold String"); testCellContentsToTheRightOf(sheet, "Integer", 100); testCellContentsToTheRightOf(sheet, "Number", 100.5); testCellContentsToTheRightOf(sheet, "Boolean", true); testCellContentsToTheRightOf(sheet, "Formula", "B5*2"); testCellContentsToTheRightOf(sheet, "Date", DateUtil.getDateTime(2011,10,31)); testCellContentsToTheRightOf(sheet, "Time", DateUtil.getDateTime(2011,10,31,11,32,0,0)); } @Test public void shouldSetCellContents() throws Exception { Workbook wb = ExcelUtil.loadWorkbookFromResource("org/openmrs/module/reporting/common/ExcelUtilTest.xls"); Sheet sheet = wb.getSheet("Testing"); Date testDate = DateUtil.getDateTime(1999,3,17); int testDateExcel = (int)ExcelUtil.getDateAsNumber(testDate); testSettingCellContents(sheet, "String", "New String", Cell.CELL_TYPE_STRING, "New String"); testSettingCellContents(sheet, "String", 100, Cell.CELL_TYPE_NUMERIC, 100); testSettingCellContents(sheet, "Integer", 20.2, Cell.CELL_TYPE_NUMERIC, 20.2); testSettingCellContents(sheet, "Boolean", Boolean.FALSE, Cell.CELL_TYPE_BOOLEAN, false); testSettingCellContents(sheet, "Date", testDate, Cell.CELL_TYPE_NUMERIC, testDate); testSettingCellContents(sheet, "String", testDate, Cell.CELL_TYPE_NUMERIC, testDateExcel); testSettingCellContents(sheet, "Formula", "B5*3", Cell.CELL_TYPE_FORMULA, "B5*3"); } @Test public void shouldAddStyle() throws Exception { Workbook wb = ExcelUtil.loadWorkbookFromResource("org/openmrs/module/reporting/common/ExcelUtilTest.xls"); Sheet sheet = wb.getSheet("Testing"); // Test Fonts Cell cell = getCellToTheRightOf(sheet, "String"); Assert.assertEquals("This is a String", ExcelUtil.getCellContents(cell)); Assert.assertEquals(Font.BOLDWEIGHT_NORMAL, ExcelUtil.getFont(cell).getBoldweight()); cell.setCellStyle(ExcelUtil.createCellStyle(wb, "bold")); Assert.assertEquals(Font.BOLDWEIGHT_BOLD, ExcelUtil.getFont(cell).getBoldweight()); Assert.assertFalse(ExcelUtil.getFont(cell).getItalic()); Assert.assertEquals(Font.U_NONE, ExcelUtil.getFont(cell).getUnderline()); cell.setCellStyle(ExcelUtil.createCellStyle(wb, "italic,underline")); Assert.assertTrue(ExcelUtil.getFont(cell).getItalic()); Assert.assertEquals(Font.U_SINGLE, ExcelUtil.getFont(cell).getUnderline()); int fontSize = ExcelUtil.getFont(cell).getFontHeightInPoints() + 1; cell.setCellStyle(ExcelUtil.createCellStyle(wb, "size="+fontSize)); Assert.assertEquals((short)fontSize, ExcelUtil.getFont(cell).getFontHeightInPoints()); // Test other styles Assert.assertFalse(cell.getCellStyle().getWrapText()); Assert.assertEquals(CellStyle.ALIGN_GENERAL, cell.getCellStyle().getAlignment()); Assert.assertEquals(CellStyle.BORDER_NONE, cell.getCellStyle().getBorderBottom()); cell.setCellStyle(ExcelUtil.createCellStyle(wb, "wraptext,align=center,border=bottom")); Assert.assertTrue(cell.getCellStyle().getWrapText()); Assert.assertEquals(CellStyle.ALIGN_CENTER, cell.getCellStyle().getAlignment()); Assert.assertEquals(CellStyle.BORDER_THIN, cell.getCellStyle().getBorderBottom()); // Test Date Date date = DateUtil.getDateTime(2013, 10, 31); cell.setCellValue(date); ExcelUtil.formatAsDate(cell); Assert.assertEquals(Cell.CELL_TYPE_NUMERIC, cell.getCellType()); Assert.assertTrue(ExcelUtil.isCellDateFormatted(cell)); Assert.assertEquals(date, ExcelUtil.getCellContents(cell)); } @Test public void shouldFormatSheetTitle() throws Exception { Assert.assertEquals("TestSheet", ExcelUtil.formatSheetTitle("TestSheet")); Assert.assertEquals("Sheet", ExcelUtil.formatSheetTitle(null)); Assert.assertEquals("Illegal Characters", ExcelUtil.formatSheetTitle("Illegal [Characters]")); Assert.assertEquals("This is a title with over 31 ch", ExcelUtil.formatSheetTitle("This is a title with over 31 characters")); Set<String> usedTitles = new HashSet<String>(); String startingTitle = "Starting Title With Too Many Characters"; String title1 = ExcelUtil.formatSheetTitle(startingTitle, usedTitles); Assert.assertEquals("Starting Title With Too Many Ch", title1); usedTitles.add(title1); String title2 = ExcelUtil.formatSheetTitle(startingTitle, usedTitles); Assert.assertEquals("Starting Title With Too Many-1", title2); usedTitles.add(title2); String title3 = ExcelUtil.formatSheetTitle(startingTitle, usedTitles); Assert.assertEquals("Starting Title With Too Many-2", title3); usedTitles.add(title3); } @Test public void shouldCheckWhetherCellValueIsSet() throws Exception { ExcelBuilder builder = new ExcelBuilder(); builder.newSheet("Sheet1"); builder.addCell("One"); assertFalse(ExcelUtil.cellHasValueSet(builder.getCurrentRow().getCell(1))); builder.addCell("Two"); assertTrue(ExcelUtil.cellHasValueSet(builder.getCurrentRow().getCell(1))); } protected void testCellContentsToTheRightOf(Sheet sheet, String contentsBefore, Object contentsToTest) { Cell c = getCellToTheRightOf(sheet, contentsBefore); Object contentsToCheck = ExcelUtil.getCellContents(c); Assert.assertEquals(contentsToTest, contentsToCheck); } protected void testSettingCellContents(Sheet sheet, String contentsBefore, Object valueToSet, int expectedCellType, Object expectedContents) { Cell cell = getCellToTheRightOf(sheet, contentsBefore); ExcelUtil.setCellContents(cell, valueToSet); Assert.assertEquals(expectedCellType, cell.getCellType()); Object actualContents = ExcelUtil.getCellContents(cell); Assert.assertEquals(expectedContents, actualContents); } protected Cell getCellToTheRightOf(Sheet sheet, Object contents) { for (Iterator<Row> ri = sheet.rowIterator(); ri.hasNext();) { Row row = ri.next(); for (Iterator<Cell> ci = row.cellIterator(); ci.hasNext();) { Cell cell = ci.next(); if (contents.equals(ExcelUtil.getCellContents(cell))) { return ci.next(); } } } return null; } }