Added toString methods formatAsString to CellValue. Changed deprecation on CellValue.getRichTextStringValue
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@694881 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
a0769d4082
commit
0c881e7c99
@ -179,7 +179,7 @@ public class HSSFFormulaEvaluator {
|
|||||||
case HSSFCell.CELL_TYPE_NUMERIC:
|
case HSSFCell.CELL_TYPE_NUMERIC:
|
||||||
return new CellValue(cell.getNumericCellValue());
|
return new CellValue(cell.getNumericCellValue());
|
||||||
case HSSFCell.CELL_TYPE_STRING:
|
case HSSFCell.CELL_TYPE_STRING:
|
||||||
return new CellValue(cell.getRichStringCellValue());
|
return new CellValue(cell.getRichStringCellValue().getString());
|
||||||
}
|
}
|
||||||
throw new IllegalStateException("Bad cell type (" + cell.getCellType() + ")");
|
throw new IllegalStateException("Bad cell type (" + cell.getCellType() + ")");
|
||||||
}
|
}
|
||||||
@ -270,7 +270,7 @@ public class HSSFFormulaEvaluator {
|
|||||||
cell.setCellValue(cv.getNumberValue());
|
cell.setCellValue(cv.getNumberValue());
|
||||||
break;
|
break;
|
||||||
case HSSFCell.CELL_TYPE_STRING:
|
case HSSFCell.CELL_TYPE_STRING:
|
||||||
cell.setCellValue(cv.getRichTextStringValue());
|
cell.setCellValue(new HSSFRichTextString(cv.getStringValue()));
|
||||||
break;
|
break;
|
||||||
case HSSFCell.CELL_TYPE_BLANK:
|
case HSSFCell.CELL_TYPE_BLANK:
|
||||||
// never happens - blanks eventually get translated to zero
|
// never happens - blanks eventually get translated to zero
|
||||||
@ -325,7 +325,7 @@ public class HSSFFormulaEvaluator {
|
|||||||
}
|
}
|
||||||
if (eval instanceof StringEval) {
|
if (eval instanceof StringEval) {
|
||||||
StringEval ne = (StringEval) eval;
|
StringEval ne = (StringEval) eval;
|
||||||
return new CellValue(new HSSFRichTextString(ne.getStringValue()));
|
return new CellValue(ne.getStringValue());
|
||||||
}
|
}
|
||||||
if (eval instanceof ErrorEval) {
|
if (eval instanceof ErrorEval) {
|
||||||
return CellValue.getError(((ErrorEval)eval).getErrorCode());
|
return CellValue.getError(((ErrorEval)eval).getErrorCode());
|
||||||
@ -423,7 +423,7 @@ public class HSSFFormulaEvaluator {
|
|||||||
throw new IllegalStateException("evaluation stack not empty");
|
throw new IllegalStateException("evaluation stack not empty");
|
||||||
}
|
}
|
||||||
value = dereferenceValue(value, srcRowNum, srcColNum);
|
value = dereferenceValue(value, srcRowNum, srcColNum);
|
||||||
if (value instanceof BlankEval) {
|
if (value == BlankEval.INSTANCE) {
|
||||||
// Note Excel behaviour here. A blank final final value is converted to zero.
|
// Note Excel behaviour here. A blank final final value is converted to zero.
|
||||||
return NumberEval.ZERO;
|
return NumberEval.ZERO;
|
||||||
// Formulas _never_ evaluate to blank. If a formula appears to have evaluated to
|
// Formulas _never_ evaluate to blank. If a formula appears to have evaluated to
|
||||||
@ -597,15 +597,15 @@ public class HSSFFormulaEvaluator {
|
|||||||
private final int _cellType;
|
private final int _cellType;
|
||||||
private final double _numberValue;
|
private final double _numberValue;
|
||||||
private final boolean _booleanValue;
|
private final boolean _booleanValue;
|
||||||
private final HSSFRichTextString _richTextStringValue;
|
private final String _textValue;
|
||||||
private final int _errorCode;
|
private final int _errorCode;
|
||||||
|
|
||||||
private CellValue(int cellType, double numberValue, boolean booleanValue,
|
private CellValue(int cellType, double numberValue, boolean booleanValue,
|
||||||
HSSFRichTextString textValue, int errorCode) {
|
String textValue, int errorCode) {
|
||||||
_cellType = cellType;
|
_cellType = cellType;
|
||||||
_numberValue = numberValue;
|
_numberValue = numberValue;
|
||||||
_booleanValue = booleanValue;
|
_booleanValue = booleanValue;
|
||||||
_richTextStringValue = textValue;
|
_textValue = textValue;
|
||||||
_errorCode = errorCode;
|
_errorCode = errorCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -616,7 +616,7 @@ public class HSSFFormulaEvaluator {
|
|||||||
/* package*/ static CellValue valueOf(boolean booleanValue) {
|
/* package*/ static CellValue valueOf(boolean booleanValue) {
|
||||||
return booleanValue ? TRUE : FALSE;
|
return booleanValue ? TRUE : FALSE;
|
||||||
}
|
}
|
||||||
/* package*/ CellValue(HSSFRichTextString stringValue) {
|
/* package*/ CellValue(String stringValue) {
|
||||||
this(HSSFCell.CELL_TYPE_STRING, 0.0, false, stringValue, 0);
|
this(HSSFCell.CELL_TYPE_STRING, 0.0, false, stringValue, 0);
|
||||||
}
|
}
|
||||||
/* package*/ static CellValue getError(int errorCode) {
|
/* package*/ static CellValue getError(int errorCode) {
|
||||||
@ -637,12 +637,10 @@ public class HSSFFormulaEvaluator {
|
|||||||
return _numberValue;
|
return _numberValue;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @return Returns the stringValue. This method is deprecated, use
|
* @return Returns the stringValue.
|
||||||
* getRichTextStringValue instead
|
|
||||||
* @deprecated
|
|
||||||
*/
|
*/
|
||||||
public String getStringValue() {
|
public String getStringValue() {
|
||||||
return _richTextStringValue.getString();
|
return _textValue;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @return Returns the cellType.
|
* @return Returns the cellType.
|
||||||
@ -658,9 +656,31 @@ public class HSSFFormulaEvaluator {
|
|||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* @return Returns the richTextStringValue.
|
* @return Returns the richTextStringValue.
|
||||||
|
* @deprecated (Sep 2008) Text formatting is lost during formula evaluation. Use {@link #getStringValue()}
|
||||||
*/
|
*/
|
||||||
public HSSFRichTextString getRichTextStringValue() {
|
public HSSFRichTextString getRichTextStringValue() {
|
||||||
return _richTextStringValue;
|
return new HSSFRichTextString(_textValue);
|
||||||
|
}
|
||||||
|
public String toString() {
|
||||||
|
StringBuffer sb = new StringBuffer(64);
|
||||||
|
sb.append(getClass().getName()).append(" [");
|
||||||
|
sb.append(formatAsString());
|
||||||
|
sb.append("]");
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String formatAsString() {
|
||||||
|
switch (_cellType) {
|
||||||
|
case HSSFCell.CELL_TYPE_NUMERIC:
|
||||||
|
return String.valueOf(_numberValue);
|
||||||
|
case HSSFCell.CELL_TYPE_STRING:
|
||||||
|
return '"' + _textValue + '"';
|
||||||
|
case HSSFCell.CELL_TYPE_BOOLEAN:
|
||||||
|
return _booleanValue ? "TRUE" : "FALSE";
|
||||||
|
case HSSFCell.CELL_TYPE_ERROR:
|
||||||
|
return ErrorEval.getText(_errorCode);
|
||||||
|
}
|
||||||
|
return "<error unexpected cell type " + _cellType + ">";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ public final class TestFormulasFromSpreadsheet extends TestCase {
|
|||||||
break;
|
break;
|
||||||
case HSSFCell.CELL_TYPE_STRING:
|
case HSSFCell.CELL_TYPE_STRING:
|
||||||
assertEquals(msg, HSSFCell.CELL_TYPE_STRING, actual.getCellType());
|
assertEquals(msg, HSSFCell.CELL_TYPE_STRING, actual.getCellType());
|
||||||
assertEquals(msg, expected.getRichStringCellValue().getString(), actual.getRichTextStringValue().getString());
|
assertEquals(msg, expected.getRichStringCellValue().getString(), actual.getStringValue());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,7 +142,7 @@ public final class TestFormulasFromSpreadsheet extends TestCase {
|
|||||||
if (workbook == null) {
|
if (workbook == null) {
|
||||||
workbook = HSSFTestDataSamples.openSampleWorkbook(SS.FILENAME);
|
workbook = HSSFTestDataSamples.openSampleWorkbook(SS.FILENAME);
|
||||||
sheet = workbook.getSheetAt( 0 );
|
sheet = workbook.getSheetAt( 0 );
|
||||||
}
|
}
|
||||||
_functionFailureCount = 0;
|
_functionFailureCount = 0;
|
||||||
_functionSuccessCount = 0;
|
_functionSuccessCount = 0;
|
||||||
_evaluationFailureCount = 0;
|
_evaluationFailureCount = 0;
|
||||||
@ -177,7 +177,7 @@ public final class TestFormulasFromSpreadsheet extends TestCase {
|
|||||||
* Typically pass <code>null</code> to test all functions
|
* Typically pass <code>null</code> to test all functions
|
||||||
*/
|
*/
|
||||||
private void processFunctionGroup(int startRowIndex, String testFocusFunctionName) {
|
private void processFunctionGroup(int startRowIndex, String testFocusFunctionName) {
|
||||||
|
|
||||||
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook);
|
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook);
|
||||||
|
|
||||||
int rowIndex = startRowIndex;
|
int rowIndex = startRowIndex;
|
||||||
@ -248,7 +248,7 @@ public final class TestFormulasFromSpreadsheet extends TestCase {
|
|||||||
result = Result.SOME_EVALUATIONS_FAILED;
|
result = Result.SOME_EVALUATIONS_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,7 +59,7 @@ public final class TestIndexFunctionFromSpreadsheet extends TestCase {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note - multiple failures are aggregated before ending.
|
// Note - multiple failures are aggregated before ending.
|
||||||
// If one or more functions fail, a single AssertionFailedError is thrown at the end
|
// If one or more functions fail, a single AssertionFailedError is thrown at the end
|
||||||
private int _evaluationFailureCount;
|
private int _evaluationFailureCount;
|
||||||
private int _evaluationSuccessCount;
|
private int _evaluationSuccessCount;
|
||||||
@ -95,7 +95,7 @@ public final class TestIndexFunctionFromSpreadsheet extends TestCase {
|
|||||||
assertEquals(expected.getNumericCellValue(), actual.getNumberValue(), 0.0);
|
assertEquals(expected.getNumericCellValue(), actual.getNumberValue(), 0.0);
|
||||||
break;
|
break;
|
||||||
case HSSFCell.CELL_TYPE_STRING:
|
case HSSFCell.CELL_TYPE_STRING:
|
||||||
assertEquals(msg, expected.getRichStringCellValue().getString(), actual.getRichTextStringValue().getString());
|
assertEquals(msg, expected.getRichStringCellValue().getString(), actual.getStringValue());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -103,7 +103,7 @@ public final class TestIndexFunctionFromSpreadsheet extends TestCase {
|
|||||||
|
|
||||||
private static AssertionFailedError wrongTypeError(String msgPrefix, HSSFCell expectedCell, CellValue actualValue) {
|
private static AssertionFailedError wrongTypeError(String msgPrefix, HSSFCell expectedCell, CellValue actualValue) {
|
||||||
return new AssertionFailedError(msgPrefix + " Result type mismatch. Evaluated result was "
|
return new AssertionFailedError(msgPrefix + " Result type mismatch. Evaluated result was "
|
||||||
+ formatValue(actualValue)
|
+ actualValue.formatAsString()
|
||||||
+ " but the expected result was "
|
+ " but the expected result was "
|
||||||
+ formatValue(expectedCell)
|
+ formatValue(expectedCell)
|
||||||
);
|
);
|
||||||
@ -121,7 +121,7 @@ public final class TestIndexFunctionFromSpreadsheet extends TestCase {
|
|||||||
if(actual.getCellType() != HSSFCell.CELL_TYPE_ERROR) {
|
if(actual.getCellType() != HSSFCell.CELL_TYPE_ERROR) {
|
||||||
throw new AssertionFailedError(msgPrefix + " Expected cell error ("
|
throw new AssertionFailedError(msgPrefix + " Expected cell error ("
|
||||||
+ ErrorEval.getText(expectedErrorCode) + ") but actual value was "
|
+ ErrorEval.getText(expectedErrorCode) + ") but actual value was "
|
||||||
+ formatValue(actual));
|
+ actual.formatAsString());
|
||||||
}
|
}
|
||||||
if(expectedErrorCode != actual.getErrorValue()) {
|
if(expectedErrorCode != actual.getErrorValue()) {
|
||||||
throw new AssertionFailedError(msgPrefix + " Expected cell error code ("
|
throw new AssertionFailedError(msgPrefix + " Expected cell error code ("
|
||||||
@ -142,15 +142,6 @@ public final class TestIndexFunctionFromSpreadsheet extends TestCase {
|
|||||||
}
|
}
|
||||||
throw new RuntimeException("Unexpected cell type of expected value (" + expecedCell.getCellType() + ")");
|
throw new RuntimeException("Unexpected cell type of expected value (" + expecedCell.getCellType() + ")");
|
||||||
}
|
}
|
||||||
private static String formatValue(CellValue actual) {
|
|
||||||
switch (actual.getCellType()) {
|
|
||||||
case HSSFCell.CELL_TYPE_BLANK: return "<blank>";
|
|
||||||
case HSSFCell.CELL_TYPE_BOOLEAN: return String.valueOf(actual.getBooleanValue());
|
|
||||||
case HSSFCell.CELL_TYPE_NUMERIC: return String.valueOf(actual.getNumberValue());
|
|
||||||
case HSSFCell.CELL_TYPE_STRING: return actual.getRichTextStringValue().getString();
|
|
||||||
}
|
|
||||||
throw new RuntimeException("Unexpected cell type of evaluated value (" + actual.getCellType() + ")");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected void setUp() {
|
protected void setUp() {
|
||||||
@ -166,13 +157,13 @@ public final class TestIndexFunctionFromSpreadsheet extends TestCase {
|
|||||||
// confirm results
|
// confirm results
|
||||||
String successMsg = "There were "
|
String successMsg = "There were "
|
||||||
+ _evaluationSuccessCount + " function(s) without error";
|
+ _evaluationSuccessCount + " function(s) without error";
|
||||||
if(_evaluationFailureCount > 0) {
|
if(_evaluationFailureCount > 0) {
|
||||||
String msg = _evaluationFailureCount + " evaluation(s) failed. " + successMsg;
|
String msg = _evaluationFailureCount + " evaluation(s) failed. " + successMsg;
|
||||||
throw new AssertionFailedError(msg);
|
throw new AssertionFailedError(msg);
|
||||||
}
|
}
|
||||||
if(false) { // normally no output for successful tests
|
if(false) { // normally no output for successful tests
|
||||||
System.out.println(getClass().getName() + ": " + successMsg);
|
System.out.println(getClass().getName() + ": " + successMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processTestSheet(HSSFWorkbook workbook, String sheetName) {
|
private void processTestSheet(HSSFWorkbook workbook, String sheetName) {
|
||||||
|
@ -37,33 +37,33 @@ import org.apache.poi.hssf.util.CellReference;
|
|||||||
* Tests lookup functions (VLOOKUP, HLOOKUP, LOOKUP, MATCH) as loaded from a test data spreadsheet.<p/>
|
* Tests lookup functions (VLOOKUP, HLOOKUP, LOOKUP, MATCH) as loaded from a test data spreadsheet.<p/>
|
||||||
* These tests have been separated from the common function and operator tests because the lookup
|
* These tests have been separated from the common function and operator tests because the lookup
|
||||||
* functions have more complex test cases and test data setup.
|
* functions have more complex test cases and test data setup.
|
||||||
*
|
*
|
||||||
* Tests for bug fixes and specific/tricky behaviour can be found in the corresponding test class
|
* Tests for bug fixes and specific/tricky behaviour can be found in the corresponding test class
|
||||||
* (<tt>TestXxxx</tt>) of the target (<tt>Xxxx</tt>) implementor, where execution can be observed
|
* (<tt>TestXxxx</tt>) of the target (<tt>Xxxx</tt>) implementor, where execution can be observed
|
||||||
* more easily.
|
* more easily.
|
||||||
*
|
*
|
||||||
* @author Josh Micich
|
* @author Josh Micich
|
||||||
*/
|
*/
|
||||||
public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
||||||
|
|
||||||
private static final class Result {
|
private static final class Result {
|
||||||
public static final int SOME_EVALUATIONS_FAILED = -1;
|
public static final int SOME_EVALUATIONS_FAILED = -1;
|
||||||
public static final int ALL_EVALUATIONS_SUCCEEDED = +1;
|
public static final int ALL_EVALUATIONS_SUCCEEDED = +1;
|
||||||
public static final int NO_EVALUATIONS_FOUND = 0;
|
public static final int NO_EVALUATIONS_FOUND = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class defines constants for navigating around the test data spreadsheet used for these tests.
|
* This class defines constants for navigating around the test data spreadsheet used for these tests.
|
||||||
*/
|
*/
|
||||||
private static final class SS {
|
private static final class SS {
|
||||||
|
|
||||||
/** Name of the test spreadsheet (found in the standard test data folder) */
|
/** Name of the test spreadsheet (found in the standard test data folder) */
|
||||||
public final static String FILENAME = "LookupFunctionsTestCaseData.xls";
|
public final static String FILENAME = "LookupFunctionsTestCaseData.xls";
|
||||||
|
|
||||||
/** Name of the first sheet in the spreadsheet (contains comments) */
|
/** Name of the first sheet in the spreadsheet (contains comments) */
|
||||||
public final static String README_SHEET_NAME = "Read Me";
|
public final static String README_SHEET_NAME = "Read Me";
|
||||||
|
|
||||||
|
|
||||||
/** Row (zero-based) in each sheet where the evaluation cases start. */
|
/** Row (zero-based) in each sheet where the evaluation cases start. */
|
||||||
public static final int START_TEST_CASES_ROW_INDEX = 4; // Row '5'
|
public static final int START_TEST_CASES_ROW_INDEX = 4; // Row '5'
|
||||||
/** Index of the column that contains the function names */
|
/** Index of the column that contains the function names */
|
||||||
@ -71,15 +71,15 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
public static final int COLUMN_INDEX_EVALUATION = 1; // Column 'B'
|
public static final int COLUMN_INDEX_EVALUATION = 1; // Column 'B'
|
||||||
public static final int COLUMN_INDEX_EXPECTED_RESULT = 2; // Column 'C'
|
public static final int COLUMN_INDEX_EXPECTED_RESULT = 2; // Column 'C'
|
||||||
public static final int COLUMN_ROW_COMMENT = 3; // Column 'D'
|
public static final int COLUMN_ROW_COMMENT = 3; // Column 'D'
|
||||||
|
|
||||||
/** Used to indicate when there are no more test cases on the current sheet */
|
/** Used to indicate when there are no more test cases on the current sheet */
|
||||||
public static final String TEST_CASES_END_MARKER = "<end>";
|
public static final String TEST_CASES_END_MARKER = "<end>";
|
||||||
/** Used to indicate that the test on the current row should be ignored */
|
/** Used to indicate that the test on the current row should be ignored */
|
||||||
public static final String SKIP_CURRENT_TEST_CASE_MARKER = "<skip>";
|
public static final String SKIP_CURRENT_TEST_CASE_MARKER = "<skip>";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note - multiple failures are aggregated before ending.
|
// Note - multiple failures are aggregated before ending.
|
||||||
// If one or more functions fail, a single AssertionFailedError is thrown at the end
|
// If one or more functions fail, a single AssertionFailedError is thrown at the end
|
||||||
private int _sheetFailureCount;
|
private int _sheetFailureCount;
|
||||||
private int _sheetSuccessCount;
|
private int _sheetSuccessCount;
|
||||||
@ -105,19 +105,19 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
if(actual.getCellType() != expected.getCellType()) {
|
if(actual.getCellType() != expected.getCellType()) {
|
||||||
throw wrongTypeError(msg, expected, actual);
|
throw wrongTypeError(msg, expected, actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
switch (expected.getCellType()) {
|
switch (expected.getCellType()) {
|
||||||
case HSSFCell.CELL_TYPE_BOOLEAN:
|
case HSSFCell.CELL_TYPE_BOOLEAN:
|
||||||
assertEquals(msg, expected.getBooleanCellValue(), actual.getBooleanValue());
|
assertEquals(msg, expected.getBooleanCellValue(), actual.getBooleanValue());
|
||||||
break;
|
break;
|
||||||
case HSSFCell.CELL_TYPE_FORMULA: // will never be used, since we will call method after formula evaluation
|
case HSSFCell.CELL_TYPE_FORMULA: // will never be used, since we will call method after formula evaluation
|
||||||
throw new AssertionFailedError("Cannot expect formula as result of formula evaluation: " + msg);
|
throw new IllegalStateException("Cannot expect formula as result of formula evaluation: " + msg);
|
||||||
case HSSFCell.CELL_TYPE_NUMERIC:
|
case HSSFCell.CELL_TYPE_NUMERIC:
|
||||||
assertEquals(expected.getNumericCellValue(), actual.getNumberValue(), 0.0);
|
assertEquals(expected.getNumericCellValue(), actual.getNumberValue(), 0.0);
|
||||||
break;
|
break;
|
||||||
case HSSFCell.CELL_TYPE_STRING:
|
case HSSFCell.CELL_TYPE_STRING:
|
||||||
assertEquals(msg, expected.getRichStringCellValue().getString(), actual.getRichTextStringValue().getString());
|
assertEquals(msg, expected.getRichStringCellValue().getString(), actual.getStringValue());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -125,14 +125,14 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
|
|
||||||
private static AssertionFailedError wrongTypeError(String msgPrefix, HSSFCell expectedCell, CellValue actualValue) {
|
private static AssertionFailedError wrongTypeError(String msgPrefix, HSSFCell expectedCell, CellValue actualValue) {
|
||||||
return new AssertionFailedError(msgPrefix + " Result type mismatch. Evaluated result was "
|
return new AssertionFailedError(msgPrefix + " Result type mismatch. Evaluated result was "
|
||||||
+ formatValue(actualValue)
|
+ actualValue.formatAsString()
|
||||||
+ " but the expected result was "
|
+ " but the expected result was "
|
||||||
+ formatValue(expectedCell)
|
+ formatValue(expectedCell)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
private static AssertionFailedError unexpectedError(String msgPrefix, HSSFCell expected, int actualErrorCode) {
|
private static AssertionFailedError unexpectedError(String msgPrefix, HSSFCell expected, int actualErrorCode) {
|
||||||
return new AssertionFailedError(msgPrefix + " Error code ("
|
return new AssertionFailedError(msgPrefix + " Error code ("
|
||||||
+ ErrorEval.getText(actualErrorCode)
|
+ ErrorEval.getText(actualErrorCode)
|
||||||
+ ") was evaluated, but the expected result was "
|
+ ") was evaluated, but the expected result was "
|
||||||
+ formatValue(expected)
|
+ formatValue(expected)
|
||||||
);
|
);
|
||||||
@ -141,15 +141,15 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
|
|
||||||
private static void confirmErrorResult(String msgPrefix, int expectedErrorCode, CellValue actual) {
|
private static void confirmErrorResult(String msgPrefix, int expectedErrorCode, CellValue actual) {
|
||||||
if(actual.getCellType() != HSSFCell.CELL_TYPE_ERROR) {
|
if(actual.getCellType() != HSSFCell.CELL_TYPE_ERROR) {
|
||||||
throw new AssertionFailedError(msgPrefix + " Expected cell error ("
|
throw new AssertionFailedError(msgPrefix + " Expected cell error ("
|
||||||
+ ErrorEval.getText(expectedErrorCode) + ") but actual value was "
|
+ ErrorEval.getText(expectedErrorCode) + ") but actual value was "
|
||||||
+ formatValue(actual));
|
+ actual.formatAsString());
|
||||||
}
|
}
|
||||||
if(expectedErrorCode != actual.getErrorValue()) {
|
if(expectedErrorCode != actual.getErrorValue()) {
|
||||||
throw new AssertionFailedError(msgPrefix + " Expected cell error code ("
|
throw new AssertionFailedError(msgPrefix + " Expected cell error code ("
|
||||||
+ ErrorEval.getText(expectedErrorCode)
|
+ ErrorEval.getText(expectedErrorCode)
|
||||||
+ ") but actual error code was ("
|
+ ") but actual error code was ("
|
||||||
+ ErrorEval.getText(actual.getErrorValue())
|
+ ErrorEval.getText(actual.getErrorValue())
|
||||||
+ ")");
|
+ ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -164,49 +164,40 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
}
|
}
|
||||||
throw new RuntimeException("Unexpected cell type of expected value (" + expecedCell.getCellType() + ")");
|
throw new RuntimeException("Unexpected cell type of expected value (" + expecedCell.getCellType() + ")");
|
||||||
}
|
}
|
||||||
private static String formatValue(CellValue actual) {
|
|
||||||
switch (actual.getCellType()) {
|
|
||||||
case HSSFCell.CELL_TYPE_BLANK: return "<blank>";
|
|
||||||
case HSSFCell.CELL_TYPE_BOOLEAN: return String.valueOf(actual.getBooleanValue());
|
|
||||||
case HSSFCell.CELL_TYPE_NUMERIC: return String.valueOf(actual.getNumberValue());
|
|
||||||
case HSSFCell.CELL_TYPE_STRING: return actual.getRichTextStringValue().getString();
|
|
||||||
}
|
|
||||||
throw new RuntimeException("Unexpected cell type of evaluated value (" + actual.getCellType() + ")");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected void setUp() throws Exception {
|
protected void setUp() {
|
||||||
_sheetFailureCount = 0;
|
_sheetFailureCount = 0;
|
||||||
_sheetSuccessCount = 0;
|
_sheetSuccessCount = 0;
|
||||||
_evaluationFailureCount = 0;
|
_evaluationFailureCount = 0;
|
||||||
_evaluationSuccessCount = 0;
|
_evaluationSuccessCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testFunctionsFromTestSpreadsheet() {
|
public void testFunctionsFromTestSpreadsheet() {
|
||||||
HSSFWorkbook workbook = HSSFTestDataSamples.openSampleWorkbook(SS.FILENAME);
|
HSSFWorkbook workbook = HSSFTestDataSamples.openSampleWorkbook(SS.FILENAME);
|
||||||
|
|
||||||
confirmReadMeSheet(workbook);
|
confirmReadMeSheet(workbook);
|
||||||
int nSheets = workbook.getNumberOfSheets();
|
int nSheets = workbook.getNumberOfSheets();
|
||||||
for(int i=1; i< nSheets; i++) {
|
for(int i=1; i< nSheets; i++) {
|
||||||
int sheetResult = processTestSheet(workbook, i, workbook.getSheetName(i));
|
int sheetResult = processTestSheet(workbook, i, workbook.getSheetName(i));
|
||||||
switch(sheetResult) {
|
switch(sheetResult) {
|
||||||
case Result.ALL_EVALUATIONS_SUCCEEDED: _sheetSuccessCount ++; break;
|
case Result.ALL_EVALUATIONS_SUCCEEDED: _sheetSuccessCount ++; break;
|
||||||
case Result.SOME_EVALUATIONS_FAILED: _sheetFailureCount ++; break;
|
case Result.SOME_EVALUATIONS_FAILED: _sheetFailureCount ++; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// confirm results
|
// confirm results
|
||||||
String successMsg = "There were "
|
String successMsg = "There were "
|
||||||
+ _sheetSuccessCount + " successful sheets(s) and "
|
+ _sheetSuccessCount + " successful sheets(s) and "
|
||||||
+ _evaluationSuccessCount + " function(s) without error";
|
+ _evaluationSuccessCount + " function(s) without error";
|
||||||
if(_sheetFailureCount > 0) {
|
if(_sheetFailureCount > 0) {
|
||||||
String msg = _sheetFailureCount + " sheets(s) failed with "
|
String msg = _sheetFailureCount + " sheets(s) failed with "
|
||||||
+ _evaluationFailureCount + " evaluation(s). " + successMsg;
|
+ _evaluationFailureCount + " evaluation(s). " + successMsg;
|
||||||
throw new AssertionFailedError(msg);
|
throw new AssertionFailedError(msg);
|
||||||
}
|
}
|
||||||
if(false) { // normally no output for successful tests
|
if(false) { // normally no output for successful tests
|
||||||
System.out.println(getClass().getName() + ": " + successMsg);
|
System.out.println(getClass().getName() + ": " + successMsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int processTestSheet(HSSFWorkbook workbook, int sheetIndex, String sheetName) {
|
private int processTestSheet(HSSFWorkbook workbook, int sheetIndex, String sheetName) {
|
||||||
@ -214,7 +205,7 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook);
|
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook);
|
||||||
int maxRows = sheet.getLastRowNum()+1;
|
int maxRows = sheet.getLastRowNum()+1;
|
||||||
int result = Result.NO_EVALUATIONS_FOUND; // so far
|
int result = Result.NO_EVALUATIONS_FOUND; // so far
|
||||||
|
|
||||||
String currentGroupComment = null;
|
String currentGroupComment = null;
|
||||||
for(int rowIndex=SS.START_TEST_CASES_ROW_INDEX; rowIndex<maxRows; rowIndex++) {
|
for(int rowIndex=SS.START_TEST_CASES_ROW_INDEX; rowIndex<maxRows; rowIndex++) {
|
||||||
HSSFRow r = sheet.getRow(rowIndex);
|
HSSFRow r = sheet.getRow(rowIndex);
|
||||||
@ -240,7 +231,7 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
CellValue actualValue = evaluator.evaluate(c);
|
CellValue actualValue = evaluator.evaluate(c);
|
||||||
HSSFCell expectedValueCell = r.getCell(SS.COLUMN_INDEX_EXPECTED_RESULT);
|
HSSFCell expectedValueCell = r.getCell(SS.COLUMN_INDEX_EXPECTED_RESULT);
|
||||||
String rowComment = getRowCommentColumnValue(r);
|
String rowComment = getRowCommentColumnValue(r);
|
||||||
|
|
||||||
String msgPrefix = formatTestCaseDetails(sheetName, r.getRowNum(), c, currentGroupComment, rowComment);
|
String msgPrefix = formatTestCaseDetails(sheetName, r.getRowNum(), c, currentGroupComment, rowComment);
|
||||||
try {
|
try {
|
||||||
confirmExpectedResult(msgPrefix, expectedValueCell, actualValue);
|
confirmExpectedResult(msgPrefix, expectedValueCell, actualValue);
|
||||||
@ -257,22 +248,22 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
printShortStackTrace(System.err, e);
|
printShortStackTrace(System.err, e);
|
||||||
result = Result.SOME_EVALUATIONS_FAILED;
|
result = Result.SOME_EVALUATIONS_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
throw new RuntimeException("Missing end marker '" + SS.TEST_CASES_END_MARKER
|
throw new RuntimeException("Missing end marker '" + SS.TEST_CASES_END_MARKER
|
||||||
+ "' on sheet '" + sheetName + "'");
|
+ "' on sheet '" + sheetName + "'");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static String formatTestCaseDetails(String sheetName, int rowNum, HSSFCell c, String currentGroupComment,
|
private static String formatTestCaseDetails(String sheetName, int rowNum, HSSFCell c, String currentGroupComment,
|
||||||
String rowComment) {
|
String rowComment) {
|
||||||
|
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
CellReference cr = new CellReference(sheetName, rowNum, c.getCellNum(), false, false);
|
CellReference cr = new CellReference(sheetName, rowNum, c.getCellNum(), false, false);
|
||||||
sb.append(cr.formatAsString());
|
sb.append(cr.formatAsString());
|
||||||
sb.append(" {=").append(c.getCellFormula()).append("}");
|
sb.append(" {=").append(c.getCellFormula()).append("}");
|
||||||
|
|
||||||
if(currentGroupComment != null) {
|
if(currentGroupComment != null) {
|
||||||
sb.append(" '");
|
sb.append(" '");
|
||||||
sb.append(currentGroupComment);
|
sb.append(currentGroupComment);
|
||||||
@ -288,13 +279,13 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
sb.append("' ");
|
sb.append("' ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asserts that the 'read me' comment page exists, and has this class' name in one of the
|
* Asserts that the 'read me' comment page exists, and has this class' name in one of the
|
||||||
* cells. This back-link is to make it easy to find this class if a reader encounters the
|
* cells. This back-link is to make it easy to find this class if a reader encounters the
|
||||||
* spreadsheet first.
|
* spreadsheet first.
|
||||||
*/
|
*/
|
||||||
private void confirmReadMeSheet(HSSFWorkbook workbook) {
|
private void confirmReadMeSheet(HSSFWorkbook workbook) {
|
||||||
@ -313,7 +304,7 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
*/
|
*/
|
||||||
private static void printShortStackTrace(PrintStream ps, Throwable e) {
|
private static void printShortStackTrace(PrintStream ps, Throwable e) {
|
||||||
StackTraceElement[] stes = e.getStackTrace();
|
StackTraceElement[] stes = e.getStackTrace();
|
||||||
|
|
||||||
int startIx = 0;
|
int startIx = 0;
|
||||||
// skip any top frames inside junit.framework.Assert
|
// skip any top frames inside junit.framework.Assert
|
||||||
while(startIx<stes.length) {
|
while(startIx<stes.length) {
|
||||||
@ -339,17 +330,17 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
for(int i=startIx; i<endIx; i++) {
|
for(int i=startIx; i<endIx; i++) {
|
||||||
ps.println("\tat " + stes[i].toString());
|
ps.println("\tat " + stes[i].toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getRowCommentColumnValue(HSSFRow r) {
|
private static String getRowCommentColumnValue(HSSFRow r) {
|
||||||
return getCellTextValue(r, SS.COLUMN_ROW_COMMENT, "row comment");
|
return getCellTextValue(r, SS.COLUMN_ROW_COMMENT, "row comment");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getMarkerColumnValue(HSSFRow r) {
|
private static String getMarkerColumnValue(HSSFRow r) {
|
||||||
return getCellTextValue(r, SS.COLUMN_INDEX_MARKER, "marker");
|
return getCellTextValue(r, SS.COLUMN_INDEX_MARKER, "marker");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return <code>null</code> if cell is missing, empty or blank
|
* @return <code>null</code> if cell is missing, empty or blank
|
||||||
*/
|
*/
|
||||||
@ -367,7 +358,7 @@ public final class TestLookupFunctionsFromSpreadsheet extends TestCase {
|
|||||||
if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
|
if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
|
||||||
return cell.getRichStringCellValue().getString();
|
return cell.getRichStringCellValue().getString();
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new RuntimeException("Bad cell type for '" + columnName + "' column: ("
|
throw new RuntimeException("Bad cell type for '" + columnName + "' column: ("
|
||||||
+ cell.getCellType() + ") row (" + (r.getRowNum() +1) + ")");
|
+ cell.getCellType() + ") row (" + (r.getRowNum() +1) + ")");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user