]> source.dussan.org Git - poi.git/commitdiff
Fix from Josh from bug #44421 - Update Match function to properly support Area references
authorNick Burch <nick@apache.org>
Fri, 15 Feb 2008 12:13:25 +0000 (12:13 +0000)
committerNick Burch <nick@apache.org>
Fri, 15 Feb 2008 12:13:25 +0000 (12:13 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@628035 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/changes.xml
src/documentation/content/xdocs/status.xml
src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Match.java
src/scratchpad/testcases/org/apache/poi/hssf/record/formula/functions/TestMatch.java

index f7e9714e5bd944de715a7b952debaf34d88032fd..f951a7817616bac40cb2409c05cf15abc5a8880c 100644 (file)
@@ -36,6 +36,7 @@
 
                <!-- Don't forget to update status.xml too! -->
         <release version="3.1-beta1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">44421 - Update Match function to properly support Area references</action>
            <action dev="POI-DEVELOPERS" type="fix">44417 - Improved handling of references for the need to quote the sheet name for some formulas, but not when fetching a sheet by name</action>
            <action dev="POI-DEVELOPERS" type="fix">44413 - Fix for circular references in INDEX, OFFSET, VLOOKUP formulas, where a cell is actually allowed to reference itself</action>
            <action dev="POI-DEVELOPERS" type="fix">44403 - Fix for Mid function handling its arguments wrong</action>
index 22eca6da818cf023e18e60843ace1e554c224b41..2202a0fc872c1e46ade08fdfe7f5c8410a47b642 100644 (file)
@@ -33,6 +33,7 @@
        <!-- Don't forget to update changes.xml too! -->
     <changes>
         <release version="3.1-beta1" date="2008-??-??">
+           <action dev="POI-DEVELOPERS" type="fix">44421 - Update Match function to properly support Area references</action>
            <action dev="POI-DEVELOPERS" type="fix">44417 - Improved handling of references for the need to quote the sheet name for some formulas, but not when fetching a sheet by name</action>
            <action dev="POI-DEVELOPERS" type="fix">44413 - Fix for circular references in INDEX, OFFSET, VLOOKUP formulas, where a cell is actually allowed to reference itself</action>
            <action dev="POI-DEVELOPERS" type="fix">44403 - Fix for Mid function handling its arguments wrong</action>
index b2b252c4f0cc1de95618ec2aa8b24f425e8c9a16..a3ad49b194a15d70b89db3e6f6f8713fc94c646e 100644 (file)
@@ -26,7 +26,6 @@ import org.apache.poi.hssf.record.formula.eval.NumericValueEval;
 import org.apache.poi.hssf.record.formula.eval.RefEval;
 import org.apache.poi.hssf.record.formula.eval.StringEval;
 import org.apache.poi.hssf.record.formula.eval.ValueEval;
-import org.apache.poi.hssf.util.AreaReference;
 
 /**
  * Implementation for the MATCH() Excel function.<p/>
@@ -188,7 +187,7 @@ public final class Match implements Function {
        private static double evaluateMatchTypeArg(Eval arg, int srcCellRow, short srcCellCol) 
                        throws EvalEx {
                Eval match_type = arg;
-               if(arg instanceof AreaReference) {
+               if(arg instanceof AreaEval) {
                        AreaEval ae = (AreaEval) arg;
                        // an area ref can work as a scalar value if it is 1x1
                        if(ae.isColumn() &&  ae.isRow()) {
index 7ad528d61ff8c31f079c100a9bd4c54fa2af9303..d275e5f333b8c61bcb4fd20e20204bc2c5bb4af2 100755 (executable)
@@ -21,6 +21,7 @@ import junit.framework.TestCase;
 
 import org.apache.poi.hssf.record.formula.AreaPtg;
 import org.apache.poi.hssf.record.formula.eval.Area2DEval;
+import org.apache.poi.hssf.record.formula.eval.AreaEval;
 import org.apache.poi.hssf.record.formula.eval.BoolEval;
 import org.apache.poi.hssf.record.formula.eval.ErrorEval;
 import org.apache.poi.hssf.record.formula.eval.Eval;
@@ -53,6 +54,13 @@ public final class TestMatch extends TestCase {
                NumericValueEval nve = (NumericValueEval)actualEval;
                assertEquals(expected, nve.getNumberValue(), 0);
        }
+       /**
+        * Convenience method
+        * @return <code>new Area2DEval(new AreaPtg(ref), values)</code>
+        */
+       private static AreaEval createAreaEval(String ref, ValueEval[] values) {
+               return new Area2DEval(new AreaPtg(ref), values);
+       }
        
        public void testSimpleNumber() {
                
@@ -64,9 +72,7 @@ public final class TestMatch extends TestCase {
                        new NumberEval(25),     
                };
                
-               AreaPtg areaPtg = new AreaPtg("A1:A5");
-               Area2DEval ae = new Area2DEval(areaPtg, values);
-               
+               AreaEval ae = createAreaEval("A1:A5", values);
                
                confirmInt(2, invokeMatch(new NumberEval(5), ae, MATCH_LARGEST_LTE));
                confirmInt(2, invokeMatch(new NumberEval(5), ae, MATCH_EXACT));
@@ -86,9 +92,7 @@ public final class TestMatch extends TestCase {
                        new NumberEval(4),      
                };
                
-               AreaPtg areaPtg = new AreaPtg("A1:A5");
-               Area2DEval ae = new Area2DEval(areaPtg, values);
-               
+               AreaEval ae = createAreaEval("A1:A5", values);
                
                confirmInt(2, invokeMatch(new NumberEval(10), ae, MATCH_SMALLEST_GTE));
                confirmInt(2, invokeMatch(new NumberEval(10), ae, MATCH_EXACT));
@@ -108,8 +112,7 @@ public final class TestMatch extends TestCase {
                        new StringEval("Ian"),  
                };
                
-               AreaPtg areaPtg = new AreaPtg("A1:A5");
-               Area2DEval ae = new Area2DEval(areaPtg, values);
+               AreaEval ae = createAreaEval("A1:A5", values);
                
                // Note String comparisons are case insensitive
                confirmInt(3, invokeMatch(new StringEval("Ed"), ae, MATCH_LARGEST_LTE));
@@ -129,8 +132,7 @@ public final class TestMatch extends TestCase {
                                BoolEval.TRUE,  
                };
                
-               AreaPtg areaPtg = new AreaPtg("A1:A4");
-               Area2DEval ae = new Area2DEval(areaPtg, values);
+               AreaEval ae = createAreaEval("A1:A4", values);
                
                // Note String comparisons are case insensitive
                confirmInt(2, invokeMatch(BoolEval.FALSE, ae, MATCH_LARGEST_LTE));
@@ -157,8 +159,7 @@ public final class TestMatch extends TestCase {
                                new StringEval("Ed"),   
                };
                
-               AreaPtg areaPtg = new AreaPtg("A1:A13");
-               Area2DEval ae = new Area2DEval(areaPtg, values);
+               AreaEval ae = createAreaEval("A1:A13", values);
                
                assertEquals(ErrorEval.NA, invokeMatch(new StringEval("Aaron"), ae, MATCH_LARGEST_LTE));
                
@@ -181,4 +182,34 @@ public final class TestMatch extends TestCase {
                confirmInt(12, invokeMatch(BoolEval.TRUE, ae, MATCH_LARGEST_LTE));
        }
        
+
+       /**
+        * Ensures that the match_type argument can be an <tt>AreaEval</tt>.<br/>
+        * Bugzilla 44421
+        */
+       public void testMatchArgTypeArea() {
+               
+               ValueEval[] values = {
+                       new NumberEval(4),      
+                       new NumberEval(5),      
+                       new NumberEval(10),     
+                       new NumberEval(10),     
+                       new NumberEval(25),     
+               };
+               
+               AreaEval ae = createAreaEval("A1:A5", values);
+
+               AreaEval matchAE = createAreaEval("C1:C1", new ValueEval[] { MATCH_LARGEST_LTE, });
+               
+               try {
+                       confirmInt(4, invokeMatch(new NumberEval(10), ae, matchAE));
+               } catch (RuntimeException e) {
+                       if(e.getMessage().startsWith("Unexpected match_type type")) {
+                               // identified bug 44421 
+                               fail(e.getMessage());
+                       }
+                       // some other error ??
+                       throw e;
+               }
+       }
 }