<?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="util_XSearchable" 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.
'
'*************************************************************************





'*************************************************************************
' This Interface/Service test depends on the following GLOBAL variables,
' which must be specified in the object creation:

'     - Global cStringToSearch As String
'	 should appears more than once
'     - Global nSearchedEntriesAmount As Integer

'*************************************************************************





Sub RunTest()

'*************************************************************************
' INTERFACE: 
' com.sun.star.util.XSearchable
'*************************************************************************
On Error Goto ErrHndl
    Dim bOK As Boolean

    Dim oMatch As Object
    Dim oAllMatch As Object
    Dim oSearchDescriptor As Object
    Dim nCount As Long

    Test.StartMethod("createSearchDescriptor()")
    bOK = true
    oSearchDescriptor = oObj.createSearchDescriptor()
    bOK = bOK AND NOT isNULL(oSearchDescriptor)
    bOK = bOK AND hasUnoInterfaces(oSearchDescriptor, "com.sun.star.util.XSearchDescriptor")
    Test.MethodTested("createSearchDescriptor()", bOK)

    Out.Log("Setting values to search descriptor")
    oSearchDescriptor.SearchString = cStringToSearch
    oSearchDescriptor.SearchWords = false
    oSearchDescriptor.SearchCaseSensitive = true

    Test.StartMethod("findAll()")
    bOK = true
    oAllMatch = oObj.findAll(oSearchDescriptor)
    bOK = bOK AND hasUnoInterfaces(oAllMatch, "com.sun.star.container.XIndexAccess")
    for i = 0 to oAllMatch.count - 1
        bOK = bOK AND oAllMatch.getByIndex(i).String = cStringToSearch
    next i
    bOK = bOK AND oAllMatch.count = nSearchedEntriesAmount
    Test.MethodTested("findAll()", bOK)

    Test.StartMethod("findFirst()")
    bOK = true
    oMatch = oObj.findFirst(oSearchDescriptor)
    bOK = bOK AND oMatch.String = cStringToSearch
    Test.MethodTested("findFirst()", bOK)

    Test.StartMethod("findNext()")
    bOK = true
    nCount = 0

    While NOT isNULL(oMatch)
        nCount = nCount + 1
        bOK = bOK AND oMatch.String = cStringToSearch
        oMatch = oObj.findNext(oMatch.end, oSearchDescriptor)
    wend

    bOK = bOK AND nSearchedEntriesAmount = nCount
    Test.MethodTested("findNext()", bOK)

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