diff --git a/basic/qa/basic_coverage/test_space_method.bas b/basic/qa/basic_coverage/test_space_method.bas index 6c44482de128..79d91969e9fa 100644 --- a/basic/qa/basic_coverage/test_space_method.bas +++ b/basic/qa/basic_coverage/test_space_method.bas @@ -7,11 +7,24 @@ Option Explicit -Function doUnitTest as String - ' SPACE - If ( Space(3) <> " " ) Then - doUnitTest = "FAIL" - Else - doUnitTest = "OK" - End If +Function doUnitTest As String + TestUtil.Testinit + verify_testSpace + doUnitTest = TestUtil.GetResult() End Function + +Sub verify_testSpace() + On Error Goto errorHandler + + TestUtil.AssertEqual(Space(3), " ", "Space(3)") + TestUtil.AssertEqual(Space(2), " ", "Space(2)") + TestUtil.AssertEqual(Space(0), "", "Space(0)") + + ' Negative values generate an empty string + TestUtil.AssertEqual(Space(-1), "", "Space(-1)") + TestUtil.AssertEqual(Space(-4), "", "Space(-4)") + + Exit Sub +errorHandler: + TestUtil.ReportErrorHandler("verify_testSpace", Err, Error$, Erl) +End Sub diff --git a/basic/qa/vba_tests/space.vb b/basic/qa/vba_tests/space.vb index 70d09c3ea74e..abd3f3ddc47d 100644 --- a/basic/qa/vba_tests/space.vb +++ b/basic/qa/vba_tests/space.vb @@ -18,9 +18,24 @@ End Function Sub verify_testSpace() On Error GoTo errorHandler - TestUtil.AssertEqual(Space(2), " ", "Space(2)") + TestUtil.AssertEqual(Space(3), " ", "Space(3)") + TestUtil.AssertEqual(Space(2), " ", "Space(2)") + TestUtil.AssertEqual(Space(0), "", "Space(0)") + + ' in VBA it must throw when used with negative values + TestUtil.AssertEqual(GetNegativeSpaceError(-1), 5, "GetNegativeSpaceError(-1)") + TestUtil.AssertEqual(GetNegativeSpaceError(-4), 5, "GetNegativeSpaceError(-4)") Exit Sub errorHandler: TestUtil.ReportErrorHandler("verify_testSpace", Err, Error$, Erl) End Sub + +Function GetNegativeSpaceError(negativeValue) As Long +On Error GoTo errorHandler + Space(negativeValue) + GetNegativeSpaceError = 0 + Exit Function +errorHandler: + GetNegativeSpaceError = Err +End Function diff --git a/basic/source/runtime/methods.cxx b/basic/source/runtime/methods.cxx index d83b4bcee60b..2cd7c0074e6c 100644 --- a/basic/source/runtime/methods.cxx +++ b/basic/source/runtime/methods.cxx @@ -1302,7 +1302,18 @@ void SbRtl_Space(StarBASIC *, SbxArray & rPar, bool) return StarBASIC::Error(ERRCODE_BASIC_BAD_ARGUMENT); } - const sal_Int32 nCount = rPar.Get(1)->GetLong(); + sal_Int32 nCount = rPar.Get(1)->GetLong(); + + if (nCount < 0) + { + if (SbiRuntime::isVBAEnabled()) + { + return StarBASIC::Error(ERRCODE_BASIC_BAD_ARGUMENT); + } + + nCount = 0; + } + rPar.Get(0)->PutString(OUString::Concat(RepeatedUChar(' ', nCount))); }