# *************************************************************
#  
#  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.
#  
# *************************************************************

# This is a collection of BASIC macros that can cause Syntax errors, Exceptions, 
# Runtime Errors. They are loaded in the test framework/optional/f_basic_issues.bas

# ---------------------------------------------------------------------------- #

[Default_Macro]
REM BASIC

sub main

end sub

# ---------------------------------------------------------------------------- #

[MessageBoxes]
'# MessageBoxes - Macro that opens all flavors of messageboxes
function TestMessageBoxes()

    msgbox( "0x" , 0 )
    msgbox( "1x" , 1 )
    msgbox( "2x" , 2 )
    msgbox( "3x" , 3 )
    msgbox( "4x" , 4 )
    msgbox( "5x" , 5 )
    
    msgbox( "16" , 2 + 16 )
    msgbox( "32" , 2 + 32 )
    msgbox( "48" , 2 + 48 )
    msgbox( "64" , 2 + 64 )
    msgbox( "128" , 2 + 128 )
    msgbox( "256" , 2 + 256 )
    msgbox( "512" , 2 + 512 )
    
end function

# ---------------------------------------------------------------------------- #

[TTMacro1]
'# TTMacro1: This is a short testscript for automated testing!
sub main

    print( "TTMacro1" )

end sub

# ---------------------------------------------------------------------------- #

[TTMacro2]
'# TTMacro2: Macro that only contains a comment on the first line

# ---------------------------------------------------------------------------- #

[TTMacro3]
'# TTMacro3: Bring up a messagebox
sub main

    msgbox( "TTMacro3" )
    
end sub

# ---------------------------------------------------------------------------- #

[tBasicExport]
' This is a macro to test the BASIC library export
sub main

    msgbox( "tBasicExport" )
    
end sub

# ---------------------------------------------------------------------------- #

[i41695]
' No runtime exception 
sub main

    dim F as string
    dim S as string
    msgbox( "i41695-1" )
    F = "file://" & curdir & "/test.txt" 
    Open F for random as #17

    get #17, 1, S
    msgbox( "i41695-2" )

end sub

# ---------------------------------------------------------------------------- #

[i77436]
'# This is a macro required for verification of issue 77436
Sub Main
'test service
o= createUnoService("TestNamesComp")
msgbox o.dbg_supportedInterfaces

'test singleton
ctx = getDefaultContext
factory = ctx.getValueByName("org.openoffice.test.Names")
msgbox o.dbg_supportedInterfaces

End Sub

# ---------------------------------------------------------------------------- #

[i82830]
'should display
'12D687
'4553207
Sub Main
	dim l as long
	l = 1234567
	msgbox hex( l )
	msgbox oct( l )
end sub

# ---------------------------------------------------------------------------- #

[i81674]
Sub Main
	MsgBox Format(1250, "Currency")
	MsgBox Format(1250, "Yes/No")
	MsgBox Format(1250, "True/False")
	MsgBox Format(1250, "On/Off")
End Sub

# ---------------------------------------------------------------------------- #

[i80532]
' Should display three messageboxes: -10,1,-10
Sub Main
    aTestFunction (-10) ' will compile
    aTestFunction 1,-10 ' will compile
    aTestFunction -10 ' should now compile and run, too
End Sub

function aTestFunction( param1 as variant )
    msgbox "param1 = " & param1
end function

# ---------------------------------------------------------------------------- #

[i83978]
' This should trigger an exception

Sub Main
	BasicLibraries.LoadLibrary( "ThisLibDoesNotExist" )
End Sub

# ---------------------------------------------------------------------------- #

[i84040]
' Two messageboxes that should display "false"

Sub Main
    Dim oError1 as new com.sun.star.sdbc.SQLException
    print isnull( oError1 )
    Dim oError2 as Object
    oError2 = CreateUnoStruct( "com.sun.star.sdbc.SQLException" )
    print isnull( oError2 )
End Sub

# ---------------------------------------------------------------------------- #

[i86265]
' There should be no "Parantheses do not match" warning
OPTION EXPLICIT
Public Const cMAX = 256

Sub Main

    Dim mRangeArray(0, 0) as String
    Dim n as Integer
    
    n = 10
    MsgBox "i86265-1"   
    ReDim mRangeArray(CInt(cMAX), n) as String
    MsgBox "i86265-2"

End Sub

# ---------------------------------------------------------------------------- #

[i92329]
Option VBASupport 1
Sub Main()

    Dim mTmp() As String  
    mTmp() = Test(False) '<-- generates an 'unexpected ')' compiler error
    MsgBox mTmp(0) & " " & mTmp(1)
    
End Sub

Function Test(ByVal bFlag As Boolean) As Variant

    Dim mRanges(100) As String

    If (bFlag = True) Then
        Test = "return a String"
    Else
        mRanges(0) = "Return an"
        mRanges(1) = "Array"
        Test = mRanges()
    End If

End Function

# ---------------------------------------------------------------------------- #

[i97038]
' Date should contain the year 1900 and the value should be 2

Sub Main
    Dim v
    v = DateSerial(0,1,1)
    Msgbox ("Date :  " & v)
    MsgBox ("Value : " & CDbl(v))
End Sub

# ---------------------------------------------------------------------------- #

[i103691]
option vbasupport 1

Sub Main
    dim a, b

    if (not a = b) then 
        msgbox( "not equal" )
    else
        msgbox( "Equal" )    
    end if
End Sub
# ---------------------------------------------------------------------------- #

[i103697]
Private Declare Function FooFunction Lib "foo" ( nVal )
Public  Declare Function FooFunction2 Lib "foo" ( nVal )

sub main
	msgbox( "i103697" )
end sub

# ---------------------------------------------------------------------------- #

[i103990]
type MyType
	a( 3 ) as integer
	b as double
end type

Sub Main
	dim mt as MyType
	mt.a(0) = 42
	mt.a(1) = 43
	mt.b = 3.14
	msgbox( mt.a(0) )
	msgbox( mt.a(1) )
	if ( mt.b = 3.14 ) then
    	msgbox( "Pi" )
    else
        msgbox( "Error" )
    endif
end sub

# ---------------------------------------------------------------------------- #

[i107070]
Sub Main
    oSingleton = com.sun.star.logging.LoggerPool

    oInstance1 = oSingleton.get()
    msgbox oInstance1.dbg_properties

    oCtx = GetDefaultContext()
    oInstance2 = oSingleton.get( oCtx )
    msgbox oInstance2.dbg_properties

    ' Uncommenting this should result in an error "Invalid procedure call"
    oInstanceErr1 = oSingleton.get( 42 )
End Sub

# ---------------------------------------------------------------------------- #

[i106744-1]
sub main
    msgbox test1()
end sub

Function test1() As String

    Dim foo As String : foo = "astring"
    
    On Error Resume Next
    test1 = "GOT ERROR"
    If IsEmpty(foo) Then
        test1 = "EMPTY"
    Else
        test1 = "NOT EMPTY"
    End If

End Function

# ---------------------------------------------------------------------------- #

[i106744-2]
option VBASupport 1

sub main
    msgbox test1()
end sub

Function test1() As String

    Dim foo As String : foo = "astring"
    
    On Error Resume Next
    test1 = "GOT ERROR"
    If IsEmpty(foo) Then
        test1 = "EMPTY"
    Else
        test1 = "NOT EMPTY"
    End If

End Function

