basic/qa/basic_coverage/test_split_method.vb | 63 +++++++++++++++++++++++---- basic/qa/cppunit/test_vba.cxx | 1 basic/qa/vba_tests/split.vb | 57 ++++++++++++++++++++++++ basic/source/runtime/methods1.cxx | 6 ++ 4 files changed, 118 insertions(+), 9 deletions(-)
New commits: commit 74aef3f0af59008aa9390bad0b24f8fce0632c87 Author: Andreas Heinisch <andreas.heini...@yahoo.de> AuthorDate: Tue Oct 5 21:10:22 2021 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Mon Oct 11 16:21:45 2021 +0200 tdf#144924 - Change return type of array elements of the split function If VBA is not enabled, allow the assignment of variables with different data types to the individual array elements created by the split function. Change-Id: I7bdd432cdebbfded5f7fb3acc0216474eb6b6821 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123122 Tested-by: Andreas Heinisch <andreas.heini...@yahoo.de> Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de> Signed-off-by: Xisco Fauli <xiscofa...@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123373 Tested-by: Jenkins diff --git a/basic/qa/basic_coverage/test_split_method.vb b/basic/qa/basic_coverage/test_split_method.vb index 8f3701e3d987..5570850c7b97 100644 --- a/basic/qa/basic_coverage/test_split_method.vb +++ b/basic/qa/basic_coverage/test_split_method.vb @@ -5,28 +5,73 @@ ' file, You can obtain one at http://mozilla.org/MPL/2.0/. ' -Function doUnitTest as Integer +Dim passCount As Integer +Dim failCount As Integer +Dim result As String - doUnitTest = 0 +Function doUnitTest() As String + result = verify_testSplit() + If failCount <> 0 Or passCount = 0 Then + doUnitTest = 0 + Else + doUnitTest = 1 + End If +End Function + +Function verify_testSplit() As String + + passCount = 0 + failCount = 0 + + result = "Test Results" & Chr$(10) & "============" & Chr$(10) ' SPLIT - If ( Split( "Hello world" )(1) <> "world" ) Then Exit Function + TestLog_ASSERT Split( "Hello world" )(1), "world", "Split( ""Hello world"" )(1)" ' tdf#123025 - split function sets the datatype of the array to empty, ' preventing any subsequent assignments of values to the array and to the elements itself. Dim arr(1) As String arr = Split("a/b", "/") - If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function + TestLog_ASSERT arr(0), "a", "Split(""a/b"", ""/"")(0)" + TestLog_ASSERT arr(1), "b", "Split(""a/b"", ""/"")(1)" ReDim Preserve arr(1) - If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function + TestLog_ASSERT arr(0), "a", "ReDim Preserve arr(1)(0)" + TestLog_ASSERT arr(1), "b", "ReDim Preserve arr(1)(1)" ReDim arr(1) - If ( arr(0) <> "" Or arr(1) <> "" ) Then Exit Function + TestLog_ASSERT arr(0), "", "ReDim arr(1)(0)" + TestLog_ASSERT arr(1), "", "ReDim arr(1)(1)" + arr(0) = "a" arr(1) = "b" - If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function + TestLog_ASSERT arr(0), "a", "arr(0)" + TestLog_ASSERT arr(1), "b", "arr(1)" ReDim Preserve arr(1) - If ( arr(0) <> "a" Or arr(1) <> "b" ) Then Exit Function + TestLog_ASSERT arr(0), "a", "ReDim Preserve arr(1)(0) after assignment" + TestLog_ASSERT arr(1), "b", "ReDim Preserve arr(1)(1) after assignment" + + ' tdf#144924 - allow the assignment of different data types to the individual elements + Dim splitArr + splitArr = Split("a/b&&c/d", "&&") + Dim i As Integer + For i = 0 To UBound(splitArr) + ' Without the fix in place, this assignment would have failed + splitArr(i) = Split(splitArr(i), "/") + ' Without the fix in place, this test would have failed with: + ' - Expected: 8200 (8192 for Array and 8 for String) + ' - Actual : 8 (8 for String) + TestLog_ASSERT VarType(splitArr(i)), 8200, "VarType(splitArr(i))" + Next - doUnitTest = 1 + result = result & Chr$(10) & "Tests passed: " & passCount & Chr$(10) & "Tests failed: " & failCount & Chr$(10) + verify_testSplit = result End Function + +Sub TestLog_ASSERT(actual As Variant, expected As Variant, testName As String) + If expected = actual Then + passCount = passCount + 1 + Else + result = result & Chr$(10) & "Failed: " & testName & " returned " & actual & ", expected " & expected + failCount = failCount + 1 + End If +End Sub diff --git a/basic/qa/cppunit/test_vba.cxx b/basic/qa/cppunit/test_vba.cxx index 9a3cbe8baab9..c49bd89f3de9 100644 --- a/basic/qa/cppunit/test_vba.cxx +++ b/basic/qa/cppunit/test_vba.cxx @@ -123,6 +123,7 @@ void VBATest::testMiscVBAFunctions() "sgn.vb", "sin.vb", "space.vb", + "split.vb", "sqr.vb", "str.vb", "strcomp.vb", diff --git a/basic/qa/vba_tests/split.vb b/basic/qa/vba_tests/split.vb new file mode 100644 index 000000000000..56d4522180b0 --- /dev/null +++ b/basic/qa/vba_tests/split.vb @@ -0,0 +1,57 @@ +' +' This file is part of the LibreOffice project. +' +' This Source Code Form is subject to the terms of the Mozilla Public +' License, v. 2.0. If a copy of the MPL was not distributed with this +' file, You can obtain one at http://mozilla.org/MPL/2.0/. +' + +Option VBASupport 1 +Option Explicit + +Function doUnitTest() As String + TestUtil.TestInit + verify_testSplit + doUnitTest = TestUtil.GetResult() +End Function + +Sub verify_testSplit + On Error GoTo errorHandler + + ' SPLIT + TestUtil.AssertEqual(Split( "Hello world" )(1), "world", "Split( ""Hello world"" )(1)") + + ' tdf#123025 - split function sets the datatype of the array to empty, + ' preventing any subsequent assignments of values to the array and to the elements itself. + Dim arr(1) As String + arr = Split("a/b", "/") + TestUtil.AssertEqual(arr(0), "a", "Split(""a/b"", ""/"")(0)") + TestUtil.AssertEqual(arr(1), "b", "Split(""a/b"", ""/"")(1)") + ReDim Preserve arr(1) + TestUtil.AssertEqual(arr(0), "a", "ReDim Preserve arr(1)(0)") + TestUtil.AssertEqual(arr(1), "b", "ReDim Preserve arr(1)(1)") + ReDim arr(1) + TestUtil.AssertEqual(arr(0), "", "ReDim arr(1)(0)") + TestUtil.AssertEqual(arr(1), "", "ReDim arr(1)(1)") + + arr(0) = "a" + arr(1) = "b" + TestUtil.AssertEqual(arr(0), "a", "arr(0)") + TestUtil.AssertEqual(arr(1), "b", "arr(1)") + ReDim Preserve arr(1) + TestUtil.AssertEqual(arr(0), "a", "ReDim Preserve arr(1)(0) after assignment") + TestUtil.AssertEqual(arr(1), "b", "ReDim Preserve arr(1)(1) after assignment") + + ' tdf#144924 - using VBASupport 1, the split function returns an array of substrings, hence no + ' assignment of different data types to the individual elements is possible + Dim splitArr + splitArr = Split("a/b&&c/d", "&&") + ' Without the fix in place, this test would have failed with: + ' - Expected: 8 (8 for String) + ' - Actual : 8200 (8192 for Array and 8 for String) + TestUtil.AssertEqual(VarType(splitArr(0)), 8, "VarType(splitArr(0))") + + Exit Sub +errorHandler: + TestUtil.ReportErrorHandler("verify_testSplit", Err, Error$, Erl) +End Sub diff --git a/basic/source/runtime/methods1.cxx b/basic/source/runtime/methods1.cxx index b20b3fce3775..684dc5827583 100644 --- a/basic/source/runtime/methods1.cxx +++ b/basic/source/runtime/methods1.cxx @@ -1628,11 +1628,17 @@ void SbRtl_Split(StarBASIC *, SbxArray & rPar, bool) pArray->unoAddDim(0, nArraySize - 1); // insert parameter(s) into the array + const bool bIsVBAInterOp = SbiRuntime::isVBAEnabled(); for(sal_Int32 i = 0 ; i < nArraySize ; i++ ) { // tdf#123025 - split returns an array of substrings SbxVariableRef xVar = new SbxVariable( SbxSTRING ); xVar->PutString( vRet[i] ); + // tdf#144924 - allow the assignment of different data types to the individual elements + if (!bIsVBAInterOp) + { + xVar->ResetFlag(SbxFlagBits::Fixed); + } pArray->Put(xVar.get(), &i); }