<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="sheet_XSheetCondition" script:language="StarBasic">


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





' Be sure that all variables are dimensioned:
option explicit



Sub RunTest()

'*************************************************************************
' INTERFACE: 
' com.sun.star.sheet.XSheetCondition
'*************************************************************************
On Error Goto ErrHndl
    Dim bOK As Boolean
    Dim oldOperator As Variant
    Dim oldFormula As String
    Dim oPos As com.sun.star.table.CellAddress
    Dim newPos As New com.sun.star.table.CellAddress

    Test.StartMethod("setOperator()")
    Test.StartMethod("getOperator()")
    bOK = true
    oldOperator = oObj.getOperator()
    oObj.setOperator(com.sun.star.sheet.ConditionOperator.LESS)
    bOK = bOK AND oObj.getOperator() &lt;&gt; oldOperator
    oObj.setOperator(oldOperator)
    Test.MethodTested("getOperator()", bOK)
    Test.MethodTested("setOperator()", bOK)

    Test.StartMethod("getFormula1()")
    Test.StartMethod("setFormula1()")
    bOK = true
    oldFormula = oObj.getFormula1()
    oObj.setFormula1("1")
    bOK = bOK AND oObj.getFormula1() = "1"
    oObj.setFormula1(oldFormula)
    Test.MethodTested("getFormula1()", bOK)
    Test.MethodTested("setFormula1()", bOK)

    Test.StartMethod("getFormula2()")
    Test.StartMethod("setFormula2()")
    bOK = true
    oldFormula = oObj.getFormula2()
    oObj.setFormula2("2")
    bOK = bOK AND oObj.getFormula2() = "2"
    oObj.setFormula2(oldFormula)
    Test.MethodTested("getFormula2()", bOK)
    Test.MethodTested("setFormula2()", bOK)

    Test.StartMethod("getSourcePosition()")
    Test.StartMethod("setSourcePosition()")
    bOK = true
    oPos = oObj.getSourcePosition()
    bOK = bOK AND oPos.Column &gt;= 0
    newPos.Sheet = oPos.Sheet
    newPos.Column = oPos.Column + 1
    newPos.Row = oPos.Row + 1
    oObj.setSourcePosition(newPos)
    bOK = bOK AND oObj.getSourcePosition().Column = oPos.Column + 1
    Test.MethodTested("getSourcePosition()", bOK)
    Test.MethodTested("setSourcePosition()", bOK)

Exit Sub
ErrHndl:
    Test.Exception()
    bOK = false
    resume next
End Sub
</script:module>
