diff options
author | Dominik Stadler <centic@apache.org> | 2019-12-31 16:52:55 +0000 |
---|---|---|
committer | Dominik Stadler <centic@apache.org> | 2019-12-31 16:52:55 +0000 |
commit | 9f35db4f516a9309f3db2104d41cdcf9f6dc86b5 (patch) | |
tree | 1c5dd9be0453bd2cacd25c4b34632932572e52a6 /src/testcases/org/apache/poi/ss | |
parent | 821e1640416c7c57fbcd702061fd48afb610cce7 (diff) | |
download | poi-9f35db4f516a9309f3db2104d41cdcf9f6dc86b5.tar.gz poi-9f35db4f516a9309f3db2104d41cdcf9f6dc86b5.zip |
Bug 63940: Avoid endless loop/out of memory on string-replace with empty search string
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1872145 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/testcases/org/apache/poi/ss')
-rw-r--r-- | src/testcases/org/apache/poi/ss/formula/functions/TestSubstitute.java | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestSubstitute.java b/src/testcases/org/apache/poi/ss/formula/functions/TestSubstitute.java new file mode 100644 index 0000000000..68c868865b --- /dev/null +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestSubstitute.java @@ -0,0 +1,89 @@ +/* ==================================================================== + 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 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.StringValueEval; +import org.apache.poi.ss.usermodel.FormulaError; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class TestSubstitute { + @Test + public void testSubstitute() { + Substitute fun = new Substitute(); + assertEquals("ADEFC", ((StringValueEval)fun.evaluate(0, 1, + new StringEval("ABC"), new StringEval("B"), new StringEval("DEF"))).getStringValue()); + + assertEquals("ACDEC", ((StringValueEval)fun.evaluate(0, 1, + new StringEval("ABC"), new StringEval("B"), new StringEval("CDE"))).getStringValue()); + + assertEquals("ACDECCDEA", ((StringValueEval)fun.evaluate(0, 1, + new StringEval("ABCBA"), new StringEval("B"), new StringEval("CDE"))).getStringValue()); + } + + @Test + public void testSubstituteInvalidArg() { + Substitute fun = new Substitute(); + assertEquals(ErrorEval.valueOf(FormulaError.VALUE.getLongCode()), + fun.evaluate(0, 1, + ErrorEval.valueOf(FormulaError.VALUE.getLongCode()), new StringEval("B"), new StringEval("DEF"))); + + assertEquals(ErrorEval.valueOf(FormulaError.VALUE.getLongCode()), + fun.evaluate(0, 1, + ErrorEval.valueOf(FormulaError.VALUE.getLongCode()), new StringEval("B"), new StringEval("DEF"), + new NumberEval(1))); + + // fails on occurrence below 1 + assertEquals(ErrorEval.valueOf(FormulaError.VALUE.getLongCode()), + fun.evaluate(0, 1, + new StringEval("ABC"), new StringEval("B"), new StringEval("CDE"), new NumberEval(0))); + } + + @Test + public void testSubstituteOne() { + Substitute fun = new Substitute(); + assertEquals("ADEFC", ((StringValueEval)fun.evaluate(0, 1, + new StringEval("ABC"), new StringEval("B"), new StringEval("DEF"), new NumberEval(1))).getStringValue()); + + assertEquals("ACDEC", ((StringValueEval)fun.evaluate(0, 1, + new StringEval("ABC"), new StringEval("B"), new StringEval("CDE"), new NumberEval(1))).getStringValue()); + } + + @Test + public void testSubstituteNotFound() { + Substitute fun = new Substitute(); + assertEquals("ABC", ((StringValueEval)fun.evaluate(0, 1, + new StringEval("ABC"), new StringEval("B"), new StringEval("DEF"), new NumberEval(12))).getStringValue()); + + assertEquals("ABC", ((StringValueEval)fun.evaluate(0, 1, + new StringEval("ABC"), new StringEval("B"), new StringEval("CDE"), new NumberEval(2))).getStringValue()); + } + + @Test + public void testSearchEmpty() { + Substitute fun = new Substitute(); + assertEquals("ABC", ((StringValueEval)fun.evaluate(0, 1, + new StringEval("ABC"), new StringEval(""), new StringEval("CDE"))).getStringValue()); + assertEquals("ABC", ((StringValueEval)fun.evaluate(0, 1, + new StringEval("ABC"), new StringEval(""), new StringEval("CDE"), new NumberEval(1))).getStringValue()); + } +}
\ No newline at end of file |