-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

hi,

enclosed is a patch for the function PROPER implemented in
org.apache.poi.hssf.record.formula.functions.Proper according to your
guidelines http://jakarta.apache.org/poi/hssf/eval-devguide.html.

regards,

- --
Marko Lauke
Diplom-Informatiker
tel: +49 8031 228 278
mobil: +49 179 4458 304
fax: +49 1212 511 204 726
e-mail: [EMAIL PROTECTED]
icq: 157108161
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (MingW32)

iD8DBQFF0k4C6+OecltctaYRAln8AKChdOuyP4+eOQvSLgARS/VbDmUQ7QCfbyZr
XLqthAv5WYiHGq8YDAES9wU=
=28sF
-----END PGP SIGNATURE-----
Index: 
C:/development/apache-poi-source/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Proper.java
===================================================================
--- 
C:/development/apache-poi-source/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Proper.java
        (revision 507233)
+++ 
C:/development/apache-poi-source/src/scratchpad/src/org/apache/poi/hssf/record/formula/functions/Proper.java
        (working copy)
@@ -1,29 +1,79 @@
 /*
-* 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.
-*/
+ * 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.
+ */
 /*
  * Created on May 15, 2005
  *
  */
 package org.apache.poi.hssf.record.formula.functions;
 
+import org.apache.poi.hssf.record.formula.eval.BlankEval;
+import org.apache.poi.hssf.record.formula.eval.ErrorEval;
+import org.apache.poi.hssf.record.formula.eval.Eval;
+import org.apache.poi.hssf.record.formula.eval.StringEval;
+import org.apache.poi.hssf.record.formula.eval.StringValueEval;
+import org.apache.poi.hssf.record.formula.eval.ValueEval;
+
 /**
- * @author 
- *
+ * @author <a href="mailto:[EMAIL PROTECTED]">m.lauke</a>
+ * 
  */
-public class Proper extends NotImplementedFunction {
+public class Proper extends TextFunction {
 
+       public Eval evaluate(Eval[] pOperands, int pSrcCellRow, short 
pSrcCellCol) {
+               ValueEval retval = null;
+               String s = null;
+               switch (pOperands.length) {
+               default:
+                       retval = ErrorEval.VALUE_INVALID;
+                       break;
+               case 1:
+                       ValueEval ve = singleOperandEvaluate(pOperands[0], 
pSrcCellRow,
+                                       pSrcCellCol);
+                       if (ve instanceof StringValueEval) {
+                               StringValueEval sve = (StringValueEval) ve;
+                               s = sve.getStringValue();
+                       } else if (ve instanceof BlankEval) {
+                       } else {
+                               retval = ErrorEval.VALUE_INVALID;
+                               break;
+                       }
+               }
+               if (retval == null) {
+                       s = (s == null) ? EMPTY_STRING : s;
+                       retval = new StringEval(makeProper(s));
+               }
+               return retval;
+       }
+
+       protected String makeProper(String pString) {
+               StringBuffer sb = new StringBuffer();
+               boolean upper = true;
+               for (int i = 0, n = pString.length(); i < n; i++) {
+                       char c = pString.charAt(i);
+                       if (c == ' ' || c == '-' || Character.isDigit(c)) {
+                               upper = true;
+                       } else if (upper) {
+                               c = Character.toUpperCase(c);
+                               upper = false;
+                       } else {
+                               c = Character.toLowerCase(c);
+                       }
+                       sb.append(c);
+               }
+               return sb.toString();
+       }
 }
Index: 
C:/development/apache-poi-source/src/scratchpad/testcases/org/apache/poi/hssf/data/FormulaEvalTestData.xls
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Index: 
C:/development/apache-poi-source/src/scratchpad/testcases/org/apache/poi/hssf/record/formula/eval/TestEverything.java
===================================================================
--- 
C:/development/apache-poi-source/src/scratchpad/testcases/org/apache/poi/hssf/record/formula/eval/TestEverything.java
       (revision 507233)
+++ 
C:/development/apache-poi-source/src/scratchpad/testcases/org/apache/poi/hssf/record/formula/eval/TestEverything.java
       (working copy)
@@ -1,49 +1,60 @@
 /*
-* 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.
-*/
+ * 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.
+ */
 /*
  * Created on May 11, 2005
  *
  */
 package org.apache.poi.hssf.record.formula.eval;
 
+import junit.framework.Test;
 import junit.framework.TestSuite;
 
 /**
  * @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
- *
+ * 
  */
 public class TestEverything extends TestSuite {
 
-    public static TestSuite suite() throws Exception {
-        TestSuite suite = new TestSuite("Tests for OperationEval concrete 
implementation classes.");
-        suite.addTest(new GenericFormulaTestCase("D23"));
-        suite.addTest(new GenericFormulaTestCase("D27"));
-        suite.addTest(new GenericFormulaTestCase("D31"));
-        suite.addTest(new GenericFormulaTestCase("D35"));
-        suite.addTest(new GenericFormulaTestCase("D39"));
-        suite.addTest(new GenericFormulaTestCase("D43"));
-        suite.addTest(new GenericFormulaTestCase("D47"));
-        suite.addTest(new GenericFormulaTestCase("D51"));
-        suite.addTest(new GenericFormulaTestCase("D55"));
-        suite.addTest(new GenericFormulaTestCase("D59"));
-        suite.addTest(new GenericFormulaTestCase("D63"));
-        suite.addTest(new GenericFormulaTestCase("D67"));
-        suite.addTest(new GenericFormulaTestCase("D71"));
-        suite.addTest(new GenericFormulaTestCase("D75"));
-        return suite;
-    }
+       public static TestSuite suite() throws Exception {
+               TestSuite suite = new TestSuite(
+                               "Tests for OperationEval concrete 
implementation classes.");
+               suite.addTest(createGenericTest("D23"));
+               suite.addTest(createGenericTest("D27"));
+               suite.addTest(createGenericTest("D31"));
+               suite.addTest(createGenericTest("D35"));
+               suite.addTest(createGenericTest("D39"));
+               suite.addTest(createGenericTest("D43"));
+               suite.addTest(createGenericTest("D47"));
+               suite.addTest(createGenericTest("D51"));
+               suite.addTest(createGenericTest("D55"));
+               suite.addTest(createGenericTest("D59"));
+               suite.addTest(createGenericTest("D63"));
+               suite.addTest(createGenericTest("D67"));
+               suite.addTest(createGenericTest("D71"));
+               suite.addTest(createGenericTest("D75"));
+
+               suite.addTest(createGenericTest("D1072"));
+               return suite;
+       }
+
+       private static Test createGenericTest(String pCellReference)
+                       throws Exception {
+               TestSuite suite = new TestSuite("Test " + pCellReference);
+               suite.addTest(new GenericFormulaTestCase(pCellReference));
+               return suite;
+       }
 }
Index: 
C:/development/apache-poi-source/src/scratchpad/testcases/org/apache/poi/hssf/record/formula/eval/GenericFormulaTestCase.java
===================================================================
--- 
C:/development/apache-poi-source/src/scratchpad/testcases/org/apache/poi/hssf/record/formula/eval/GenericFormulaTestCase.java
       (revision 507233)
+++ 
C:/development/apache-poi-source/src/scratchpad/testcases/org/apache/poi/hssf/record/formula/eval/GenericFormulaTestCase.java
       (working copy)
@@ -1,19 +1,19 @@
 /*
-* 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.
-*/
+ * 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.
+ */
 /*
  * Created on May 11, 2005
  *
@@ -21,6 +21,7 @@
 package org.apache.poi.hssf.record.formula.eval;
 
 import java.io.FileInputStream;
+import java.io.InputStream;
 
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
@@ -35,113 +36,142 @@
 
 /**
  * @author Amol S. Deshmukh &lt; amolweb at ya hoo dot com &gt;
- *
+ * 
  */
 public class GenericFormulaTestCase extends TestCase {
 
-    protected final static String FILENAME = 
System.getProperty("HSSF.testdata.path")+ "/FormulaEvalTestData.xls";
+       protected final static String FILENAME = System
+                       .getProperty("HSSF.testdata.path", "")
+                       + "/FormulaEvalTestData.xls";
 
-    protected static HSSFWorkbook workbook = null;
+       protected static HSSFWorkbook workbook = null;
 
-    protected CellReference beginCell;
-    protected int getBeginRow() {
-        return beginCell.getRow();
-    }
-    
-    protected short getBeginCol() {
-        return beginCell.getCol();
-    }
+       protected CellReference beginCell;
 
-    protected final HSSFCell getExpectedValueCell(HSSFSheet sheet, HSSFRow 
row, HSSFCell cell) {
-        HSSFCell retval = null;
-        if (sheet != null) {
-            row = sheet.getRow(row.getRowNum()+1);
-            if (row != null) {
-                retval = row.getCell(cell.getCellNum());
-            }
-        }
-        
-        return retval;
-    }
+       protected int getBeginRow() {
+               return beginCell.getRow();
+       }
 
-    protected void assertEquals(String msg, HSSFCell expected, 
HSSFFormulaEvaluator.CellValue actual) {
-        if (expected != null && actual!=null) {
-            if (expected!=null && expected.getCellType() == 
HSSFCell.CELL_TYPE_STRING) {
-                String value = expected.getRichStringCellValue().getString();
-                if (value.startsWith("#")) {
-                    expected.setCellType(HSSFCell.CELL_TYPE_ERROR);
-                }
-            }
-            if (!(expected == null || actual == null)) {
-                switch (expected.getCellType()) {
-                case HSSFCell.CELL_TYPE_BLANK:
-                    assertEquals(msg, HSSFCell.CELL_TYPE_BLANK, 
actual.getCellType());
-                    break;
-                case HSSFCell.CELL_TYPE_BOOLEAN:
-                    assertEquals(msg, HSSFCell.CELL_TYPE_BOOLEAN, 
actual.getCellType());
-                    assertEquals(msg, expected.getBooleanCellValue(), 
actual.getBooleanValue());
-                    break;
-                case HSSFCell.CELL_TYPE_ERROR:
-                    assertEquals(msg, HSSFCell.CELL_TYPE_ERROR, 
actual.getCellType()); // TODO: check if exact error matches
-                    break;
-                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);
-                case HSSFCell.CELL_TYPE_NUMERIC:
-                    assertEquals(msg, HSSFCell.CELL_TYPE_NUMERIC, 
actual.getCellType());
-                    TestMathX.assertEquals(msg, 
expected.getNumericCellValue(), actual.getNumberValue(), TestMathX.POS_ZERO, 
TestMathX.DIFF_TOLERANCE_FACTOR);
-//                    double delta = 
Math.abs(expected.getNumericCellValue()-actual.getNumberValue());
-//                    double pctExpected = 
Math.abs(0.00001*expected.getNumericCellValue());
-//                    assertTrue(msg, delta <= pctExpected);
-                    break;
-                case HSSFCell.CELL_TYPE_STRING:
-                    assertEquals(msg, HSSFCell.CELL_TYPE_STRING, 
actual.getCellType());
-                    assertEquals(msg, 
expected.getRichStringCellValue().getString(), 
actual.getRichTextStringValue().getString());
-                    break;
-                }
-            }
-            else {
-                throw new AssertionFailedError("expected: " + expected + " 
got:" + actual);
-            }
-        }
-    }
+       protected short getBeginCol() {
+               return beginCell.getCol();
+       }
 
-    public GenericFormulaTestCase(String beginCell) throws Exception {
-        super("genericTest");
-        if (workbook == null) {
-          FileInputStream fin = new FileInputStream( FILENAME );
-          workbook = new HSSFWorkbook( fin );
-          fin.close();        
-        }
-        this.beginCell = new CellReference(beginCell);
-    }
-    
-    public void setUp() {
-    }
-    
-    public void genericTest() throws Exception {
-        HSSFSheet s = workbook.getSheetAt( 0 );
-        HSSFRow r = s.getRow(getBeginRow());
-        short endcolnum = r.getLastCellNum();
-        HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(s, workbook);
-        evaluator.setCurrentRow(r);
+       protected final HSSFCell getExpectedValueCell(HSSFSheet sheet, HSSFRow 
row,
+                       HSSFCell cell) {
+               HSSFCell retval = null;
+               if (sheet != null) {
+                       row = sheet.getRow(row.getRowNum() + 1);
+                       if (row != null) {
+                               retval = row.getCell(cell.getCellNum());
+                       }
+               }
 
-        HSSFCell c = null;
-        for (short colnum=getBeginCol(); colnum < endcolnum; colnum++) {
-            try {
-            c = r.getCell(colnum);
-            if (c==null || c.getCellType() != HSSFCell.CELL_TYPE_FORMULA)
-                continue;
-            
-            HSSFFormulaEvaluator.CellValue actualValue = evaluator.evaluate(c);
-            
-            HSSFCell expectedValueCell = getExpectedValueCell(s, r, c);
-            assertEquals("Formula: " + c.getCellFormula() 
-                    + " @ " + getBeginRow() + ":" + colnum, 
-                    expectedValueCell, actualValue);
-            } catch (RuntimeException re) {
-                throw new 
RuntimeException("CELL["+getBeginRow()+","+colnum+"]: "+re.getMessage(), re);
-            }
-        }
-    }
-    
+               return retval;
+       }
+
+       protected void assertEquals(String msg, HSSFCell expected,
+                       HSSFFormulaEvaluator.CellValue actual) {
+               if (expected != null && actual != null) {
+                       if (expected != null
+                                       && expected.getCellType() == 
HSSFCell.CELL_TYPE_STRING) {
+                               String value = 
expected.getRichStringCellValue().getString();
+                               if (value.startsWith("#")) {
+                                       
expected.setCellType(HSSFCell.CELL_TYPE_ERROR);
+                               }
+                       }
+                       if (!(expected == null || actual == null)) {
+                               switch (expected.getCellType()) {
+                               case HSSFCell.CELL_TYPE_BLANK:
+                                       assertEquals(msg, 
HSSFCell.CELL_TYPE_BLANK, actual
+                                                       .getCellType());
+                                       break;
+                               case HSSFCell.CELL_TYPE_BOOLEAN:
+                                       assertEquals(msg, 
HSSFCell.CELL_TYPE_BOOLEAN, actual
+                                                       .getCellType());
+                                       assertEquals(msg, 
expected.getBooleanCellValue(), actual
+                                                       .getBooleanValue());
+                                       break;
+                               case HSSFCell.CELL_TYPE_ERROR:
+                                       assertEquals(msg, 
HSSFCell.CELL_TYPE_ERROR, actual
+                                                       .getCellType()); // 
TODO: check if exact error
+                                       // matches
+                                       break;
+                               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);
+                               case HSSFCell.CELL_TYPE_NUMERIC:
+                                       assertEquals(msg, 
HSSFCell.CELL_TYPE_NUMERIC, actual
+                                                       .getCellType());
+                                       TestMathX.assertEquals(msg, 
expected.getNumericCellValue(),
+                                                       
actual.getNumberValue(), TestMathX.POS_ZERO,
+                                                       
TestMathX.DIFF_TOLERANCE_FACTOR);
+                                       // double delta =
+                                       // 
Math.abs(expected.getNumericCellValue()-actual.getNumberValue());
+                                       // double pctExpected =
+                                       // 
Math.abs(0.00001*expected.getNumericCellValue());
+                                       // assertTrue(msg, delta <= 
pctExpected);
+                                       break;
+                               case HSSFCell.CELL_TYPE_STRING:
+                                       assertEquals(msg, 
HSSFCell.CELL_TYPE_STRING, actual
+                                                       .getCellType());
+                                       assertEquals(msg, 
expected.getRichStringCellValue()
+                                                       .getString(), 
actual.getRichTextStringValue()
+                                                       .getString());
+                                       break;
+                               }
+                       } else {
+                               throw new AssertionFailedError("expected: " + 
expected
+                                               + " got:" + actual);
+                       }
+               }
+       }
+
+       public GenericFormulaTestCase(String pBeginCell) throws Exception {
+               super("genericTest");
+               if (workbook == null) {
+                       InputStream stream = 
Thread.currentThread().getContextClassLoader()
+                                       .getResourceAsStream(FILENAME);
+                       if(stream  == null){
+                               stream = new FileInputStream(FILENAME);
+                       }
+                       workbook = new HSSFWorkbook(stream);
+                       stream.close();
+               }
+               this.beginCell = new CellReference(pBeginCell);
+       }
+
+       public void setUp() {
+       }
+
+       public void genericTest() throws Exception {
+               HSSFSheet s = workbook.getSheetAt(0);
+               HSSFRow r = s.getRow(getBeginRow());
+               short endcolnum = r.getLastCellNum();
+               HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(s, 
workbook);
+               evaluator.setCurrentRow(r);
+
+               HSSFCell c = null;
+               for (short colnum = getBeginCol(); colnum < endcolnum; 
colnum++) {
+                       try {
+                               c = r.getCell(colnum);
+                               if (c == null || c.getCellType() != 
HSSFCell.CELL_TYPE_FORMULA)
+                                       continue;
+
+                               HSSFFormulaEvaluator.CellValue actualValue = 
evaluator
+                                               .evaluate(c);
+
+                               HSSFCell expectedValueCell = 
getExpectedValueCell(s, r, c);
+                               assertEquals("Formula: " + c.getCellFormula() + 
" @ "
+                                               + getBeginRow() + ":" + colnum, 
expectedValueCell,
+                                               actualValue);
+                       } catch (RuntimeException re) {
+                               throw new RuntimeException("CELL[" + 
getBeginRow() + ","
+                                               + colnum + "]: " + 
re.getMessage(), re);
+                       }
+               }
+       }
+
 }

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
Mailing List:    http://jakarta.apache.org/site/mail2.html#poi
The Apache Jakarta POI Project: http://jakarta.apache.org/poi/

Reply via email to