Adjust Bin2Dec similar to what we did for Hex2Dec in Bug 57196 and fix some smaller problems in the implementation found while adding full unit tests

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1650654 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2015-01-09 20:37:11 +00:00
parent 3403bef5a8
commit 113edb1a76
7 changed files with 559 additions and 24 deletions

View File

@ -20,6 +20,7 @@ import org.apache.poi.ss.formula.OperationEvaluationContext;
import org.apache.poi.ss.formula.eval.ErrorEval; import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.eval.NumberEval; import org.apache.poi.ss.formula.eval.NumberEval;
import org.apache.poi.ss.formula.eval.OperandResolver; import org.apache.poi.ss.formula.eval.OperandResolver;
import org.apache.poi.ss.formula.eval.RefEval;
import org.apache.poi.ss.formula.eval.ValueEval; import org.apache.poi.ss.formula.eval.ValueEval;
/** /**
@ -44,7 +45,13 @@ public class Bin2Dec extends Fixed1ArgFunction implements FreeRefFunction {
public static final FreeRefFunction instance = new Bin2Dec(); public static final FreeRefFunction instance = new Bin2Dec();
public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval numberVE) { public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval numberVE) {
String number = OperandResolver.coerceValueToString(numberVE); final String number;
if (numberVE instanceof RefEval) {
RefEval re = (RefEval) numberVE;
number = OperandResolver.coerceValueToString(re.getInnerValueEval(re.getFirstSheetIndex()));
} else {
number = OperandResolver.coerceValueToString(numberVE);
}
if (number.length() > 10) { if (number.length() > 10) {
return ErrorEval.NUM_ERROR; return ErrorEval.NUM_ERROR;
} }
@ -62,23 +69,26 @@ public class Bin2Dec extends Fixed1ArgFunction implements FreeRefFunction {
} }
String value; String value;
int sum; try {
if (isPositive) { if (isPositive) {
//bit9*2^8 + bit8*2^7 + bit7*2^6 + bit6*2^5 + bit5*2^4+ bit3*2^2+ bit2*2^1+ bit1*2^0 //bit9*2^8 + bit8*2^7 + bit7*2^6 + bit6*2^5 + bit5*2^4+ bit3*2^2+ bit2*2^1+ bit1*2^0
sum = getDecimalValue(unsigned); int sum = getDecimalValue(unsigned);
value = String.valueOf(sum); value = String.valueOf(sum);
} else { } else {
//The leftmost bit is 1 -- this is negative number //The leftmost bit is 1 -- this is negative number
//Inverse bits [1-9] //Inverse bits [1-9]
String inverted = toggleBits(unsigned); String inverted = toggleBits(unsigned);
// Calculate decimal number // Calculate decimal number
sum = getDecimalValue(inverted); int sum = getDecimalValue(inverted);
//Add 1 to obtained number //Add 1 to obtained number
sum++; sum++;
value = "-" + String.valueOf(sum); value = "-" + String.valueOf(sum);
} }
} catch (NumberFormatException e) {
return ErrorEval.NUM_ERROR;
}
return new NumberEval(Long.parseLong(value)); return new NumberEval(Long.parseLong(value));
} }

View File

@ -52,8 +52,8 @@ public class Dec2Bin extends Var1or2ArgFunction implements FreeRefFunction {
public static final FreeRefFunction instance = new Dec2Bin(); public static final FreeRefFunction instance = new Dec2Bin();
private final static long MIN_VALUE = Long.parseLong("-512"); private final static long MIN_VALUE = -512;
private final static long MAX_VALUE = Long.parseLong("512"); private final static long MAX_VALUE = 511;
private final static int DEFAULT_PLACES_VALUE = 10; private final static int DEFAULT_PLACES_VALUE = 10;
public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval numberVE, ValueEval placesVE) { public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval numberVE, ValueEval placesVE) {

View File

@ -1974,6 +1974,11 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
XSSFSheet sheet = wb.createSheet("Sheet1"); XSSFSheet sheet = wb.createSheet("Sheet1");
XSSFRow row = sheet.createRow(0); XSSFRow row = sheet.createRow(0);
XSSFCell cell = row.createCell(0); XSSFCell cell = row.createCell(0);
cell.setCellValue("0");
cell = row.createCell(1);
cell.setCellValue(0);
cell = row.createCell(2);
cell.setCellValue(0);
// simple formula worked // simple formula worked
cell.setCellFormula("DEC2HEX(O2+D2)"); cell.setCellFormula("DEC2HEX(O2+D2)");
@ -2004,6 +2009,30 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
workbookEvaluator.setDebugEvaluationOutputForNextEval(true); workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
workbookEvaluator.evaluate(new XSSFEvaluationCell(cell)); workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
// what other similar functions
cell.setCellFormula("DEC2BIN(O8)-O2+D2");
workbookEvaluator.clearAllCachedResultValues();
workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
// what other similar functions
cell.setCellFormula("DEC2BIN(A1)");
workbookEvaluator.clearAllCachedResultValues();
workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
// what other similar functions
cell.setCellFormula("BIN2DEC(B1)");
workbookEvaluator.clearAllCachedResultValues();
workbookEvaluator = new WorkbookEvaluator(XSSFEvaluationWorkbook.create(wb), null, null);
workbookEvaluator.setDebugEvaluationOutputForNextEval(true);
workbookEvaluator.evaluate(new XSSFEvaluationCell(cell));
} finally { } finally {
System.clearProperty("org.apache.poi.util.POILogger"); System.clearProperty("org.apache.poi.util.POILogger");
System.clearProperty("poi.log.level"); System.clearProperty("poi.log.level");

View File

@ -0,0 +1,113 @@
/* ====================================================================
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.formula.functions;
import junit.framework.TestCase;
import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.IStabilityClassifier;
import org.apache.poi.ss.formula.OperationEvaluationContext;
import org.apache.poi.ss.formula.WorkbookEvaluator;
import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.eval.NumberEval;
import org.apache.poi.ss.formula.eval.StringEval;
import org.apache.poi.ss.formula.eval.ValueEval;
/**
* Tests for {@link Bin2Dec}
*
* @author cedric dot walter @ gmail dot com
*/
public final class TestBin2Dec extends TestCase {
private static ValueEval invokeValue(String number1) {
ValueEval[] args = new ValueEval[] { new StringEval(number1) };
return new Bin2Dec().evaluate(args, -1, -1);
}
private static void confirmValue(String msg, String number1, String expected) {
ValueEval result = invokeValue(number1);
assertEquals("Had: " + result.toString(), NumberEval.class, result.getClass());
assertEquals(msg, expected, ((NumberEval) result).getStringValue());
}
private static void confirmValueError(String msg, String number1, ErrorEval numError) {
ValueEval result = invokeValue(number1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(msg, numError, result);
}
public void testBasic() {
confirmValue("Converts binary '00101' to decimal (5)", "00101", "5");
confirmValue("Converts binary '1111111111' to decimal (-1)", "1111111111", "-1");
confirmValue("Converts binary '1111111110' to decimal (-2)", "1111111110", "-2");
confirmValue("Converts binary '0111111111' to decimal (511)", "0111111111", "511");
}
public void testErrors() {
confirmValueError("does not support more than 10 digits","01010101010", ErrorEval.NUM_ERROR);
confirmValueError("not a valid binary number","GGGGGGG", ErrorEval.NUM_ERROR);
confirmValueError("not a valid binary number","3.14159", ErrorEval.NUM_ERROR);
}
public void testEvalOperationEvaluationContext() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0) };
ValueEval result = new Bin2Dec().evaluate(args, ctx);
assertEquals(NumberEval.class, result.getClass());
assertEquals("0", ((NumberEval) result).getStringValue());
}
public void testEvalOperationEvaluationContextFails() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 0) };
ValueEval result = new Bin2Dec().evaluate(args, ctx);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.VALUE_INVALID, result);
}
private OperationEvaluationContext createContext() {
HSSFWorkbook wb = new HSSFWorkbook();
wb.createSheet();
HSSFEvaluationWorkbook workbook = HSSFEvaluationWorkbook.create(wb);
WorkbookEvaluator workbookEvaluator = new WorkbookEvaluator(workbook, new IStabilityClassifier() {
public boolean isCellFinal(int sheetIndex, int rowIndex, int columnIndex) {
return true;
}
}, null);
OperationEvaluationContext ctx = new OperationEvaluationContext(workbookEvaluator,
workbook, 0, 0, 0, null);
return ctx;
}
public void testRefs() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0) };
ValueEval result = new Bin2Dec().evaluate(args, -1, -1);
assertEquals(NumberEval.class, result.getClass());
assertEquals("0", ((NumberEval) result).getStringValue());
}
}

View File

@ -0,0 +1,240 @@
/* ====================================================================
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.formula.functions;
import junit.framework.TestCase;
import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.IStabilityClassifier;
import org.apache.poi.ss.formula.OperationEvaluationContext;
import org.apache.poi.ss.formula.WorkbookEvaluator;
import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.eval.NumberEval;
import org.apache.poi.ss.formula.eval.StringEval;
import org.apache.poi.ss.formula.eval.ValueEval;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
/**
* Tests for {@link Dec2Bin}
*
* @author cedric dot walter @ gmail dot com
*/
public final class TestDec2Bin extends TestCase {
private static ValueEval invokeValue(String number1) {
ValueEval[] args = new ValueEval[] { new StringEval(number1) };
return new Dec2Bin().evaluate(args, -1, -1);
}
private static ValueEval invokeBack(String number1) {
ValueEval[] args = new ValueEval[] { new StringEval(number1) };
return new Bin2Dec().evaluate(args, -1, -1);
}
private static void confirmValue(String msg, String number1, String expected) {
ValueEval result = invokeValue(number1);
assertEquals("Had: " + result.toString(), StringEval.class, result.getClass());
assertEquals(msg, expected, ((StringEval) result).getStringValue());
}
private static void confirmValueError(String msg, String number1, ErrorEval numError) {
ValueEval result = invokeValue(number1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(msg, numError, result);
}
public void testBasic() {
confirmValue("Converts binary '00101' from binary (5)", "5", "101");
confirmValue("Converts binary '1111111111' from binary (-1)", "-1", "1111111111");
confirmValue("Converts binary '1111111110' from binary (-2)", "-2", "1111111110");
confirmValue("Converts binary '0111111111' from binary (511)", "511", "111111111");
confirmValue("Converts binary '1000000000' from binary (511)", "-512", "1000000000");
}
public void testErrors() {
confirmValueError("fails for >= 512 or < -512","512", ErrorEval.NUM_ERROR);
confirmValueError("fails for >= 512 or < -512","-513", ErrorEval.NUM_ERROR);
confirmValueError("not a valid decimal number","GGGGGGG", ErrorEval.VALUE_INVALID);
confirmValueError("not a valid decimal number","3.14159a", ErrorEval.VALUE_INVALID);
}
public void testEvalOperationEvaluationContext() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0) };
ValueEval result = new Dec2Bin().evaluate(args, ctx);
assertEquals(StringEval.class, result.getClass());
assertEquals("1101", ((StringEval) result).getStringValue());
}
public void testEvalOperationEvaluationContextFails() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ErrorEval.VALUE_INVALID };
ValueEval result = new Dec2Bin().evaluate(args, ctx);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.VALUE_INVALID, result);
}
private OperationEvaluationContext createContext() {
HSSFWorkbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("13.43");
cell = row.createCell(1);
cell.setCellValue("8");
cell = row.createCell(2);
cell.setCellValue("-8");
cell = row.createCell(3);
cell.setCellValue("1");
HSSFEvaluationWorkbook workbook = HSSFEvaluationWorkbook.create(wb);
WorkbookEvaluator workbookEvaluator = new WorkbookEvaluator(workbook, new IStabilityClassifier() {
public boolean isCellFinal(int sheetIndex, int rowIndex, int columnIndex) {
return true;
}
}, null);
OperationEvaluationContext ctx = new OperationEvaluationContext(workbookEvaluator,
workbook, 0, 0, 0, null);
return ctx;
}
public void testRefs() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0) };
ValueEval result = new Dec2Bin().evaluate(args, -1, -1);
assertEquals("Had: " + result.toString(), StringEval.class, result.getClass());
assertEquals("1101", ((StringEval) result).getStringValue());
}
public void testWithPlacesIntInt() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 1) };
ValueEval result = new Dec2Bin().evaluate(args, -1, -1);
assertEquals("Had: " + result.toString(), StringEval.class, result.getClass());
// TODO: documentation and behavior do not match here!
assertEquals("1101", ((StringEval) result).getStringValue());
}
public void testWithPlaces() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 1) };
ValueEval result = new Dec2Bin().evaluate(args, ctx);
assertEquals("Had: " + result.toString(), StringEval.class, result.getClass());
// TODO: documentation and behavior do not match here!
assertEquals("1101", ((StringEval) result).getStringValue());
}
public void testWithToShortPlaces() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 3) };
ValueEval result = new Dec2Bin().evaluate(args, -1, -1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.NUM_ERROR, result);
}
public void testWithTooManyParamsIntInt() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 1), ctx.getRefEval(0, 1) };
ValueEval result = new Dec2Bin().evaluate(args, -1, -1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.VALUE_INVALID, result);
}
public void testWithTooManyParams() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 1), ctx.getRefEval(0, 1) };
ValueEval result = new Dec2Bin().evaluate(args, ctx);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.VALUE_INVALID, result);
}
public void testWithErrorPlaces() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ErrorEval.NULL_INTERSECTION };
ValueEval result = new Dec2Bin().evaluate(args, -1, -1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.NULL_INTERSECTION, result);
}
public void testWithNegativePlaces() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 2) };
ValueEval result = new Dec2Bin().evaluate(args, -1, -1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.NUM_ERROR, result);
}
public void testWithZeroPlaces() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), new NumberEval(0.0) };
ValueEval result = new Dec2Bin().evaluate(args, -1, -1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.NUM_ERROR, result);
}
public void testWithEmptyPlaces() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(1, 0) };
ValueEval result = new Dec2Bin().evaluate(args, -1, -1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.VALUE_INVALID, result);
}
public void testBackAndForth() {
for (int i = -512; i < 512; i++) {
ValueEval result = invokeValue(Integer.toString(i));
assertEquals("Had: " + result.toString(), StringEval.class,
result.getClass());
ValueEval back = invokeBack(((StringEval) result).getStringValue());
assertEquals("Had: " + back.toString(), NumberEval.class,
back.getClass());
assertEquals(Integer.toString(i),
((NumberEval) back).getStringValue());
}
}
}

View File

@ -18,9 +18,19 @@
package org.apache.poi.ss.formula.functions; package org.apache.poi.ss.formula.functions;
import junit.framework.TestCase; import junit.framework.TestCase;
import org.apache.poi.hssf.usermodel.HSSFEvaluationWorkbook;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.formula.IStabilityClassifier;
import org.apache.poi.ss.formula.OperationEvaluationContext;
import org.apache.poi.ss.formula.WorkbookEvaluator;
import org.apache.poi.ss.formula.eval.ErrorEval; import org.apache.poi.ss.formula.eval.ErrorEval;
import org.apache.poi.ss.formula.eval.NumberEval;
import org.apache.poi.ss.formula.eval.StringEval; import org.apache.poi.ss.formula.eval.StringEval;
import org.apache.poi.ss.formula.eval.ValueEval; import org.apache.poi.ss.formula.eval.ValueEval;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
/** /**
* Tests for {@link Dec2Hex} * Tests for {@link Dec2Hex}
@ -34,6 +44,11 @@ public final class TestDec2Hex extends TestCase {
return new Dec2Hex().evaluate(args, -1, -1); return new Dec2Hex().evaluate(args, -1, -1);
} }
private static ValueEval invokeBack(String number1) {
ValueEval[] args = new ValueEval[] { new StringEval(number1) };
return new Hex2Dec().evaluate(args, -1, -1);
}
private static ValueEval invokeValue(String number1) { private static ValueEval invokeValue(String number1) {
ValueEval[] args = new ValueEval[] { new StringEval(number1), }; ValueEval[] args = new ValueEval[] { new StringEval(number1), };
return new Dec2Hex().evaluate(args, -1, -1); return new Dec2Hex().evaluate(args, -1, -1);
@ -75,4 +90,132 @@ public final class TestDec2Hex extends TestCase {
confirmValueError("negative places not allowed","549755813888","-10", ErrorEval.NUM_ERROR); confirmValueError("negative places not allowed","549755813888","-10", ErrorEval.NUM_ERROR);
confirmValueError("non number places not allowed","ABCDEF","0", ErrorEval.VALUE_INVALID); confirmValueError("non number places not allowed","ABCDEF","0", ErrorEval.VALUE_INVALID);
} }
public void testEvalOperationEvaluationContextFails() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ErrorEval.VALUE_INVALID };
ValueEval result = new Dec2Hex().evaluate(args, ctx);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.VALUE_INVALID, result);
}
private OperationEvaluationContext createContext() {
HSSFWorkbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("123.43");
cell = row.createCell(1);
cell.setCellValue("8");
cell = row.createCell(2);
cell.setCellValue("-8");
HSSFEvaluationWorkbook workbook = HSSFEvaluationWorkbook.create(wb);
WorkbookEvaluator workbookEvaluator = new WorkbookEvaluator(workbook, new IStabilityClassifier() {
public boolean isCellFinal(int sheetIndex, int rowIndex, int columnIndex) {
return true;
}
}, null);
OperationEvaluationContext ctx = new OperationEvaluationContext(workbookEvaluator,
workbook, 0, 0, 0, null);
return ctx;
}
public void testRefs() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0) };
ValueEval result = new Dec2Hex().evaluate(args, -1, -1);
assertEquals("Had: " + result.toString(), StringEval.class, result.getClass());
assertEquals("7B", ((StringEval) result).getStringValue());
}
public void testWithPlacesIntInt() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 1) };
ValueEval result = new Dec2Hex().evaluate(args, -1, -1);
assertEquals("Had: " + result.toString(), StringEval.class, result.getClass());
assertEquals("0000007B", ((StringEval) result).getStringValue());
}
public void testWithPlaces() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 1) };
ValueEval result = new Dec2Hex().evaluate(args, ctx);
assertEquals("Had: " + result.toString(), StringEval.class, result.getClass());
assertEquals("0000007B", ((StringEval) result).getStringValue());
}
public void testWithTooManyParamsIntInt() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 1), ctx.getRefEval(0, 1) };
ValueEval result = new Dec2Hex().evaluate(args, -1, -1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.VALUE_INVALID, result);
}
public void testWithTooManyParams() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 1), ctx.getRefEval(0, 1) };
ValueEval result = new Dec2Hex().evaluate(args, ctx);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.VALUE_INVALID, result);
}
public void testWithErrorPlaces() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ErrorEval.NULL_INTERSECTION };
ValueEval result = new Dec2Hex().evaluate(args, -1, -1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.NULL_INTERSECTION, result);
}
public void testWithNegativePlaces() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(0, 2) };
ValueEval result = new Dec2Hex().evaluate(args, -1, -1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.NUM_ERROR, result);
}
public void testWithEmptyPlaces() {
OperationEvaluationContext ctx = createContext();
ValueEval[] args = new ValueEval[] { ctx.getRefEval(0, 0), ctx.getRefEval(1, 0) };
ValueEval result = new Dec2Hex().evaluate(args, -1, -1);
assertEquals(ErrorEval.class, result.getClass());
assertEquals(ErrorEval.VALUE_INVALID, result);
}
public void testBackAndForth() {
for (int i = -512; i < 512; i++) {
ValueEval result = invokeValue(Integer.toString(i));
assertEquals("Had: " + result.toString(), StringEval.class,
result.getClass());
ValueEval back = invokeBack(((StringEval) result).getStringValue());
assertEquals("Had: " + back.toString(), NumberEval.class,
back.getClass());
assertEquals(Integer.toString(i),
((NumberEval) back).getStringValue());
}
}
} }

View File

@ -54,14 +54,14 @@ public final class TestHex2Dec extends TestCase {
} }
public void testBasic() { public void testBasic() {
confirmValue("Converts octal 'A5' to decimal (165)", "A5", "165"); confirmValue("Converts hex 'A5' to decimal (165)", "A5", "165");
confirmValue("Converts octal FFFFFFFF5B to decimal (-165)", "FFFFFFFF5B", "-165"); confirmValue("Converts hex FFFFFFFF5B to decimal (-165)", "FFFFFFFF5B", "-165");
confirmValue("Converts octal 3DA408B9 to decimal (-165)", "3DA408B9", "1034160313"); confirmValue("Converts hex 3DA408B9 to decimal (-165)", "3DA408B9", "1034160313");
} }
public void testErrors() { public void testErrors() {
confirmValueError("not a valid octal number","GGGGGGG", ErrorEval.NUM_ERROR); confirmValueError("not a valid hex number","GGGGGGG", ErrorEval.NUM_ERROR);
confirmValueError("not a valid octal number","3.14159", ErrorEval.NUM_ERROR); confirmValueError("not a valid hex number","3.14159", ErrorEval.NUM_ERROR);
} }
public void testEvalOperationEvaluationContext() { public void testEvalOperationEvaluationContext() {