View | Details | Raw Unified | Return to bug 54508
Collapse All | Expand All

(-)src/java/org/apache/poi/ss/formula/functions/EDate.java (+41 lines)
Line 0 Link Here
1
package org.apache.poi.ss.formula.functions;
2
3
import org.apache.poi.ss.formula.OperationEvaluationContext;
4
import org.apache.poi.ss.formula.eval.*;
5
import org.apache.poi.ss.usermodel.DateUtil;
6
7
import java.util.Calendar;
8
import java.util.Date;
9
10
public class EDate implements FreeRefFunction {
11
    @Override
12
    public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) {
13
        if (args.length != 2) {
14
            return ErrorEval.VALUE_INVALID;
15
        }
16
        try {
17
            double startDateAsNumber = getValue(args[0]);
18
            NumberEval offsetInYearsValue = (NumberEval) args[1];
19
            int offsetInMonthAsNumber = (int) offsetInYearsValue.getNumberValue();
20
21
            Date startDate = DateUtil.getJavaDate(startDateAsNumber);
22
            Calendar calendar = Calendar.getInstance();
23
            calendar.setTime(startDate);
24
            calendar.add(Calendar.MONTH, offsetInMonthAsNumber);
25
            return new NumberEval(DateUtil.getExcelDate(calendar.getTime()));
26
        } catch (EvaluationException e) {
27
            return e.getErrorEval();
28
        }
29
    }
30
31
    private double getValue(ValueEval arg) throws EvaluationException {
32
        if (arg instanceof NumberEval) {
33
            return ((NumberEval) arg).getNumberValue();
34
        }
35
        if (arg instanceof RefEval) {
36
            ValueEval innerValueEval = ((RefEval) arg).getInnerValueEval();
37
            return ((NumberEval) innerValueEval).getNumberValue();
38
        }
39
        throw new EvaluationException(ErrorEval.REF_INVALID);
40
    }
41
}
(-)src/testcases/org/apache/poi/ss/formula/functions/TestEDate.java (+51 lines)
Line 0 Link Here
1
package org.apache.poi.ss.formula.functions;
2
3
import junit.framework.TestCase;
4
import org.apache.poi.ss.formula.eval.ErrorEval;
5
import org.apache.poi.ss.formula.eval.NumberEval;
6
import org.apache.poi.ss.formula.eval.ValueEval;
7
import org.apache.poi.ss.usermodel.DateUtil;
8
import org.apache.poi.ss.usermodel.ErrorConstants;
9
10
import java.util.Calendar;
11
import java.util.Date;
12
13
public class TestEDate extends TestCase{
14
15
    public void testEDateProperValues() {
16
        EDate eDate = new EDate();
17
        NumberEval result = (NumberEval) eDate.evaluate(new ValueEval[]{new NumberEval(1000), new NumberEval(0)}, null);
18
        assertEquals(1000d, result.getNumberValue());
19
    }
20
21
    public void testEDateInvalidValues() {
22
        EDate eDate = new EDate();
23
        ErrorEval result = (ErrorEval) eDate.evaluate(new ValueEval[]{new NumberEval(1000)}, null);
24
        assertEquals(ErrorConstants.ERROR_VALUE, result.getErrorCode());
25
    }
26
27
    public void testEDateIncrease() {
28
        EDate eDate = new EDate();
29
        Date startDate = new Date();
30
        int offset = 2;
31
        NumberEval result = (NumberEval) eDate.evaluate(new ValueEval[]{new NumberEval(DateUtil.getExcelDate(startDate)), new NumberEval(offset)}, null);
32
        Date resultDate = DateUtil.getJavaDate(result.getNumberValue());
33
        Calendar instance = Calendar.getInstance();
34
        instance.setTime(startDate);
35
        instance.add(Calendar.MONTH, offset);
36
        assertEquals(resultDate, instance.getTime());
37
38
    }
39
40
    public void testEDateDecrease() {
41
        EDate eDate = new EDate();
42
        Date startDate = new Date();
43
        int offset = -2;
44
        NumberEval result = (NumberEval) eDate.evaluate(new ValueEval[]{new NumberEval(DateUtil.getExcelDate(startDate)), new NumberEval(offset)}, null);
45
        Date resultDate = DateUtil.getJavaDate(result.getNumberValue());
46
        Calendar instance = Calendar.getInstance();
47
        instance.setTime(startDate);
48
        instance.add(Calendar.MONTH, offset);
49
        assertEquals(resultDate, instance.getTime());
50
    }
51
}

Return to bug 54508