<?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_XNamedRange" 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.XNamedRange
'*************************************************************************
On Error Goto ErrHndl
    Dim bOK As Boolean
    Dim oldContent, newContent As String
    Dim position, oldPosition As Object
    Dim newPosition As New com.sun.star.table.CellAddress
    Dim oldType, newType As Long

    Test.StartMethod("getContent()")
    bOK = true
    bOK = bOK AND NOT isNULL(oObj.getContent())
    Test.MethodTested("getContent()", bOK)

    Test.StartMethod("setContent()")
    bOK = true
    oldContent = oObj.getContent
    newContent = cIfcShortName
    oObj.setContent(newContent)
    bOK = bOK AND (oldContent &lt;&gt; oObj.getContent)
    oObj.setContent(oldContent)
    Test.MethodTested("setContent()", bOK)

    Test.StartMethod("getReferencePosition()")
    bOK = true
    bOK = bOK AND NOT isNULL(oObj.getReferencePosition())
    Test.MethodTested("getReferencePosition()", bOK)

    Test.StartMethod("setReferencePosition()")
    bOK = true
    oldPosition = oObj.getReferencePosition()

    newPosition.sheet = oldPosition.sheet
    newPosition.row = oldPosition.row + 1
    newPosition.column = oldPosition.column + 1
    oObj.setReferencePosition(newPosition)
    position = oObj.getReferencePosition()

    bOK = bOK AND NOT isNULL(position)
    bOK = bOK AND position.Row &lt;&gt; oldPosition.row
    bOK = bOK AND position.Column &lt;&gt; oldPosition.Column

    oObj.setReferencePosition(oldPosition)
    Test.MethodTested("setReferencePosition()", bOK)

    Test.StartMethod("getType()")
    bOK = true
    bOK = bOK AND NOT isNULL(oObj.getType)
    Test.MethodTested("getType()", bOK)

    Test.StartMethod("setType()")
    bOK = true
    oldType = oObj.getType()
    newType = oldType XOR com.sun.star.sheet.NamedRangeFlag.PRINT_AREA
    oObj.setType(newType)
    bOK = bOK AND (oldType &lt;&gt; oObj.getType())
    oObj.setType(oldType)
    Test.MethodTested("setType()", bOK)

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