/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.components.excel.common;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import junit.framework.Assert;
import org.apache.commons.io.FileUtils;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import de.rcenvironment.components.excel.common.internal.ExcelServicePOI;
import de.rcenvironment.core.datamodel.api.DataType;
import de.rcenvironment.core.datamodel.api.TypedDatumFactory;
import de.rcenvironment.core.datamodel.testutils.TypedDatumFactoryDefaultStub;
import de.rcenvironment.core.datamodel.types.api.BooleanTD;
import de.rcenvironment.core.datamodel.types.api.FloatTD;
import de.rcenvironment.core.datamodel.types.api.IntegerTD;
import de.rcenvironment.core.datamodel.types.api.ShortTextTD;
import de.rcenvironment.core.datamodel.types.api.SmallTableTD;
/**
* Test class for ExcelFile.
*
* @author Markus Kunde
* @author Oliver Seebach
*/
public class ExcelServicePOITest {
private static final double DELTA = (1/10);
private static final int S15_VAL = 15;
private static final int S123_VAL = 123;
private static final double S123_45_VAL = 123.45;
private static final String TEST_STRING = "Test String";
private static final String EXTERNAL_TEST_EXCELFILE = "externalFiles/ExcelTester_POI.xls";
private static final String EXTERNAL_TEST_EXCELFILE_NOTIMPL = "externalFiles/NotImplementedTest.xls";
private static final String EXTERNAL_TEST_EXCELFILE_NOTIMPL_TEMP = "externalFiles/NotImplementedTest_temp.xls";
private static final String EXTERNAL_TEMP_EXCELFILE = "externalFiles/ExcelTesterTemp.xls";
private static final String EXTERNAL_TEMP2_EXCELFILE = "externalFiles/ExcelTesterTemp2.xls";
private static final String EXTERNAL_TEST_NOTEXCELFILE = "externalFiles/Feedback_Tixi.txt";
private ExcelService excelService;
private File xlFile = new File(EXTERNAL_TEMP_EXCELFILE);
private ExcelAddress addr;
private SmallTableTD values;
private TypedDatumFactory typedDatumFactory = new TypedDatumFactoryDefaultStub();
/**
* Creates temp Excel file.
*
* @throws java.lang.Exception if something goes wrong
*/
@Before
public void setUp() throws Exception {
FileUtils.copyFile(new File(EXTERNAL_TEST_EXCELFILE), new File(EXTERNAL_TEMP_EXCELFILE));
excelService = new ExcelServicePOI(typedDatumFactory);
addr = new ExcelAddress(new File(EXTERNAL_TEMP_EXCELFILE), "Tabelle1!A1:D5");
values = typedDatumFactory.createSmallTable(2, 3);
values.setTypedDatumForCell(typedDatumFactory.createShortText(TEST_STRING), 0, 0);
values.setTypedDatumForCell(typedDatumFactory.createFloat(S123_45_VAL), 0, 1);
values.setTypedDatumForCell(typedDatumFactory.createBoolean(true), 0, 2);
values.setTypedDatumForCell(typedDatumFactory.createDateTime(0), 1, 0);
values.setTypedDatumForCell(typedDatumFactory.createEmpty(), 1, 1);
values.setTypedDatumForCell(typedDatumFactory.createInteger(S123_VAL), 1, 2);
}
/**
* Deletes temp Excel file.
*
* @throws java.lang.Exception if something goes wrong
*/
@After
public void tearDown() throws Exception {
FileUtils.deleteQuietly(new File(EXTERNAL_TEMP_EXCELFILE));
FileUtils.deleteQuietly(new File(EXTERNAL_TEMP2_EXCELFILE));
FileUtils.deleteQuietly(new File(EXTERNAL_TEST_EXCELFILE_NOTIMPL_TEMP));
}
/**
* Test method for
* {@link de.rcenvironment.rce.components.excel.commons.internal.ExcelServicePOI#ExcelFile(java.io.File)}.
*/
@Test
public void testExcelFile() {
excelService = new ExcelServicePOI(typedDatumFactory);
}
/**
* Test method for
* {@link de.rcenvironment.rce.components.excel.commons.internal.ExcelServicePOI#ExcelFile(java.io.File)}.
*/
@Test(expected = ExcelException.class)
public void testExcelFileWrongFile() {
excelService = new ExcelServicePOI(typedDatumFactory);
excelService.getUserDefinedCellNames(new File(EXTERNAL_TEST_NOTEXCELFILE));
}
/**
* Test method for
* {@link de.rcenvironment.rce.components.excel.commons.internal.ExcelServicePOI#ExcelFile(java.io.File)}.
*/
@Test(expected = ExcelException.class)
public void testGetMacros() {
excelService = new ExcelServicePOI(typedDatumFactory);
excelService.getMacros(xlFile);
}
/**
* Test method for
* {@link de.rcenvironment.rce.components.excel.commons.internal.ExcelServicePOI#ExcelFile(java.io.File)}.
*/
@Test(expected = ExcelException.class)
public void testRunMacro() {
excelService = new ExcelServicePOI(typedDatumFactory);
excelService.runMacro(xlFile, TEST_STRING);
}
/**
* Test method for
* {@link de.rcenvironment.rce.components.excel.commons.internal.ExcelServicePOI
* #setValues(de.rcenvironment.components.excel.common.ExcelAddress, de.rcenvironment.rce.component.datatype.ITable)}.
*/
@Test
public void testSetValuesExcelAddressITable() {
excelService.setValues(xlFile, addr, values);
SmallTableTD table = excelService.getValueOfCells(xlFile, addr);
assertEquals(TEST_STRING, ((ShortTextTD) table.getTypedDatumOfCell(0, 0)).getShortTextValue());
assertEquals(S123_VAL, ((IntegerTD) table.getTypedDatumOfCell(1, 2)).getIntValue(), DELTA);
assertEquals(S123_45_VAL, ((FloatTD) table.getTypedDatumOfCell(0, 1)).getFloatValue(), DELTA);
assertEquals("dolor", ((ShortTextTD) table.getTypedDatumOfCell(2, 2)).getShortTextValue());
assertEquals(4, table.getRowCount() - 1);
assertEquals(3, table.getColumnCount() - 1);
}
/**
* Test method for
* {@link de.rcenvironment.rce.components.excel.commons.internal.ExcelServicePOI
* #setValues(de.rcenvironment.components.excel.common.ExcelAddress, java.io.File, de.rcenvironment.rce.component.datatype.ITable)}
* .
*/
@Test
public void testSetValuesExcelAddressFileITable() {
File xlFile2 = new File(EXTERNAL_TEMP2_EXCELFILE);
excelService.setValues(xlFile, xlFile2, addr, values);
ExcelServicePOI excelFile2 = new ExcelServicePOI(typedDatumFactory);
ShortTextTD st =
(ShortTextTD) excelFile2.getValueOfCells(xlFile2, new ExcelAddress(xlFile2, "Tabelle1!A1")).getTypedDatumOfCell(0, 0);
assertEquals(TEST_STRING, st.getShortTextValue());
IntegerTD integer =
(IntegerTD) excelFile2.getValueOfCells(xlFile2, new ExcelAddress(xlFile2, "Tabelle1!A2")).getTypedDatumOfCell(0, 0);
assertEquals(0, integer.getIntValue(), DELTA);
FloatTD floatTD =
(FloatTD) excelFile2.getValueOfCells(xlFile2, new ExcelAddress(xlFile2, "Tabelle1!B1")).getTypedDatumOfCell(0, 0);
assertEquals(S123_45_VAL, floatTD.getFloatValue(), DELTA);
BooleanTD booleanTD =
(BooleanTD) excelFile2.getValueOfCells(xlFile2, new ExcelAddress(xlFile2, "Tabelle1!C1")).getTypedDatumOfCell(0, 0);
assertEquals(true, booleanTD.getBooleanValue());
}
/**
* Test method for
* {@link de.rcenvironment.rce.components.excel.commons.internal.ExcelServicePOI
* #getValueOfCells(de.rcenvironment.components.excel.common.ExcelAddress)}
* .
* @throws IOException io error
* @throws IllegalArgumentException illegal argument
* @throws InvalidFormatException invalid format
*/
@Test
public void testGetValueOfCells() throws InvalidFormatException, IllegalArgumentException, IOException {
SmallTableTD vals = excelService.getValueOfCells(xlFile, new ExcelAddress(xlFile, "Tabelle1!A1:D8"));
assertEquals(1.0, ((IntegerTD) vals.getTypedDatumOfCell(0, 1)).getIntValue(), DELTA);
assertEquals("x", ((ShortTextTD) vals.getTypedDatumOfCell(0, 3)).getShortTextValue());
assertEquals(S15_VAL, ((FloatTD) vals.getTypedDatumOfCell(7, 0)).getFloatValue(), DELTA);
assertEquals(DataType.Empty, vals.getTypedDatumOfCell(7, 3).getDataType());
}
/**
* Test if access to table outside of defined range throws an exception.
*
*/
@Test(expected = ArrayIndexOutOfBoundsException.class)
public void testIndexOutOfBoundsException() {
SmallTableTD vals = excelService.getValueOfCells(xlFile, new ExcelAddress(xlFile, "Tabelle1!A1:D8"));
vals.getTypedDatumOfCell(8, 4);
}
/**
* Test method for
* {@link de.rcenvironment.rce.components.excel.commons.internal.ExcelServicePOI#getUserDefinedCellNames()}.
*/
@Test
public void testGetUserDefinedCellNames() {
List<String> usernamesList = Arrays.asList("I_einzel", "I_Tabelle", "O_Ausgang", "O_MakroAusgang");
assertEquals(usernamesList.size(), excelService.getUserDefinedCellNames(xlFile).length);
for (ExcelAddress address: excelService.getUserDefinedCellNames(xlFile)) {
assertTrue(usernamesList.contains(address.getUserDefinedName()));
}
}
/**
* Test method for
* {@link de.rcenvironment.rce.components.excel.commons.internal.ExcelServicePOI#recalculateFormulas()}.
*/
@Test
public void testrecalculateFormulas() {
excelService.recalculateFormulas(xlFile);
}
/**
* Test method for
* {@link de.rcenvironment.rce.components.excel.commons.internal.ExcelServicePOI#recalculateFormulas()}.
*/
@Test(expected = ExcelException.class)
public void testrecalculateFormulasNotImpl() {
try {
FileUtils.copyFile(new File(EXTERNAL_TEST_EXCELFILE_NOTIMPL), new File(EXTERNAL_TEST_EXCELFILE_NOTIMPL_TEMP));
} catch (IOException e) {
Assert.fail();
}
excelService.recalculateFormulas(new File(EXTERNAL_TEST_EXCELFILE_NOTIMPL_TEMP));
}
}