ASF Bugzilla – Attachment 29909 Details for
Bug 54508
Implement missing function EDATE
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch including function plus testcase
new_EDATE_function_implemented.patch (text/plain), 4.37 KB, created by
Detlef Brendle
on 2013-01-31 09:17:54 UTC
(
hide
)
Description:
Patch including function plus testcase
Filename:
MIME Type:
Creator:
Detlef Brendle
Created:
2013-01-31 09:17:54 UTC
Size:
4.37 KB
patch
obsolete
>Index: src/java/org/apache/poi/ss/formula/functions/EDate.java >IDEA additional info: >Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP ><+>UTF-8 >=================================================================== >--- src/java/org/apache/poi/ss/formula/functions/EDate.java (revision ) >+++ src/java/org/apache/poi/ss/formula/functions/EDate.java (revision ) >@@ -0,0 +1,41 @@ >+package org.apache.poi.ss.formula.functions; >+ >+import org.apache.poi.ss.formula.OperationEvaluationContext; >+import org.apache.poi.ss.formula.eval.*; >+import org.apache.poi.ss.usermodel.DateUtil; >+ >+import java.util.Calendar; >+import java.util.Date; >+ >+public class EDate implements FreeRefFunction { >+ @Override >+ public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { >+ if (args.length != 2) { >+ return ErrorEval.VALUE_INVALID; >+ } >+ try { >+ double startDateAsNumber = getValue(args[0]); >+ NumberEval offsetInYearsValue = (NumberEval) args[1]; >+ int offsetInMonthAsNumber = (int) offsetInYearsValue.getNumberValue(); >+ >+ Date startDate = DateUtil.getJavaDate(startDateAsNumber); >+ Calendar calendar = Calendar.getInstance(); >+ calendar.setTime(startDate); >+ calendar.add(Calendar.MONTH, offsetInMonthAsNumber); >+ return new NumberEval(DateUtil.getExcelDate(calendar.getTime())); >+ } catch (EvaluationException e) { >+ return e.getErrorEval(); >+ } >+ } >+ >+ private double getValue(ValueEval arg) throws EvaluationException { >+ if (arg instanceof NumberEval) { >+ return ((NumberEval) arg).getNumberValue(); >+ } >+ if (arg instanceof RefEval) { >+ ValueEval innerValueEval = ((RefEval) arg).getInnerValueEval(); >+ return ((NumberEval) innerValueEval).getNumberValue(); >+ } >+ throw new EvaluationException(ErrorEval.REF_INVALID); >+ } >+} >Index: src/testcases/org/apache/poi/ss/formula/functions/TestEDate.java >IDEA additional info: >Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP ><+>UTF-8 >=================================================================== >--- src/testcases/org/apache/poi/ss/formula/functions/TestEDate.java (revision ) >+++ src/testcases/org/apache/poi/ss/formula/functions/TestEDate.java (revision ) >@@ -0,0 +1,51 @@ >+package org.apache.poi.ss.formula.functions; >+ >+import junit.framework.TestCase; >+import org.apache.poi.ss.formula.eval.ErrorEval; >+import org.apache.poi.ss.formula.eval.NumberEval; >+import org.apache.poi.ss.formula.eval.ValueEval; >+import org.apache.poi.ss.usermodel.DateUtil; >+import org.apache.poi.ss.usermodel.ErrorConstants; >+ >+import java.util.Calendar; >+import java.util.Date; >+ >+public class TestEDate extends TestCase{ >+ >+ public void testEDateProperValues() { >+ EDate eDate = new EDate(); >+ NumberEval result = (NumberEval) eDate.evaluate(new ValueEval[]{new NumberEval(1000), new NumberEval(0)}, null); >+ assertEquals(1000d, result.getNumberValue()); >+ } >+ >+ public void testEDateInvalidValues() { >+ EDate eDate = new EDate(); >+ ErrorEval result = (ErrorEval) eDate.evaluate(new ValueEval[]{new NumberEval(1000)}, null); >+ assertEquals(ErrorConstants.ERROR_VALUE, result.getErrorCode()); >+ } >+ >+ public void testEDateIncrease() { >+ EDate eDate = new EDate(); >+ Date startDate = new Date(); >+ int offset = 2; >+ NumberEval result = (NumberEval) eDate.evaluate(new ValueEval[]{new NumberEval(DateUtil.getExcelDate(startDate)), new NumberEval(offset)}, null); >+ Date resultDate = DateUtil.getJavaDate(result.getNumberValue()); >+ Calendar instance = Calendar.getInstance(); >+ instance.setTime(startDate); >+ instance.add(Calendar.MONTH, offset); >+ assertEquals(resultDate, instance.getTime()); >+ >+ } >+ >+ public void testEDateDecrease() { >+ EDate eDate = new EDate(); >+ Date startDate = new Date(); >+ int offset = -2; >+ NumberEval result = (NumberEval) eDate.evaluate(new ValueEval[]{new NumberEval(DateUtil.getExcelDate(startDate)), new NumberEval(offset)}, null); >+ Date resultDate = DateUtil.getJavaDate(result.getNumberValue()); >+ Calendar instance = Calendar.getInstance(); >+ instance.setTime(startDate); >+ instance.add(Calendar.MONTH, offset); >+ assertEquals(resultDate, instance.getTime()); >+ } >+}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 54508
: 29909