summaryrefslogtreecommitdiff
path: root/basic
diff options
context:
space:
mode:
authorAndreas Heinisch <andreas.heinisch@yahoo.de>2021-10-05 21:10:22 +0200
committerXisco Fauli <xiscofauli@libreoffice.org>2021-10-11 16:21:45 +0200
commit74aef3f0af59008aa9390bad0b24f8fce0632c87 (patch)
tree2c001fdd969224874ba8c4e3cc4a2409ea3ad956 /basic
parent333b77e92b502d3c3f886f1b38b2e528a2f0937c (diff)
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.heinisch@yahoo.de> Reviewed-by: Andreas Heinisch <andreas.heinisch@yahoo.de> Signed-off-by: Xisco Fauli <xiscofauli@libreoffice.org> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123373 Tested-by: Jenkins
Diffstat (limited to 'basic')
-rw-r--r--basic/qa/basic_coverage/test_split_method.vb63
-rw-r--r--basic/qa/cppunit/test_vba.cxx1
-rw-r--r--basic/qa/vba_tests/split.vb57
-rw-r--r--basic/source/runtime/methods1.cxx6
4 files changed, 118 insertions, 9 deletions
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);
}