/**************************************************************
 *
 * 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.
 *
 *************************************************************/
#ifndef _RTL_TRES_H_
#define _RTL_TRES_H_

#include <osl/diagnose.h>
#include <rtl/string.h>

#ifdef __cplusplus
extern "C" {
#endif

 /* commandline flags */
#define rtl_tres_Flag_BOOM      0x00000001
#define rtl_tres_Flag_VERBOSE   0x00000002
#define rtl_tres_Flag_SKIP      0x00000004
#define rtl_tres_Flag_LOG       0x00000010
#define rtl_tres_Flag_HIS       0x00000100
#define rtl_tres_Flag_TIME      0x00000200
#define rtl_tres_Flag_MSG       0x00000400
#define rtl_tres_Flag_QUIET     0x00000800

 /* state flags */
#define rtl_tres_Flag_SUB       0x01000000
#define rtl_tres_Flag_PASSED    0x10000000
#define rtl_tres_Flag_OK        0x20000000



 /* forward declaration and type definition */
struct _rtl_TestResult;
typedef struct _rtl_TestResult rtl_TestResult;


typedef void* rtl_funcstate;
typedef void* rtl_cmpstate;

 /* type definitions of function pointers which can be overloaded */
typedef sal_Bool (SAL_CALL *rtl_tres_state_ptr)(
                                                rtl_TestResult*,
                                                sal_Bool,
                                                const sal_Char*,
                                                const sal_Char*,
                                                sal_Bool
                                                );

typedef void (SAL_CALL *rtl_tres_end_ptr)( rtl_TestResult*, const sal_Char* );
typedef sal_Bool (SAL_CALL *rtl_tres_ispassed_ptr)( rtl_TestResult* );
typedef sal_Bool (SAL_CALL *rtl_tres_isok_ptr)( rtl_TestResult* );
typedef rtl_funcstate (SAL_CALL *rtl_tres_funcstate_ptr)( rtl_TestResult* );
typedef sal_Bool (SAL_CALL *rtl_tres_isbit_ptr)( rtl_TestResult*,
                                                                sal_uInt32 );

typedef rtl_funcstate (SAL_CALL *rtl_tres_getnextfuncstate_ptr)
                                                            ( rtl_funcstate );
typedef rtl_funcstate (SAL_CALL *rtl_tres_getprevfuncstate_ptr)
                                                            ( rtl_funcstate );
typedef sal_uInt32 (SAL_CALL *rtl_tres_getflags_ptr)( rtl_funcstate );
typedef rtl_String* (SAL_CALL *rtl_tres_getname_ptr)( rtl_funcstate );
typedef sal_uInt32 (SAL_CALL *rtl_tres_getstart_ptr)( rtl_funcstate );
typedef sal_uInt32 (SAL_CALL *rtl_tres_getstop_ptr)( rtl_funcstate );
typedef rtl_cmpstate (SAL_CALL *rtl_tres_getcmpstate_ptr)( rtl_funcstate );

typedef sal_Bool (SAL_CALL *rtl_tres_getstat_ptr)( rtl_cmpstate );
typedef rtl_String* (SAL_CALL *rtl_tres_getmsg_ptr)( rtl_cmpstate );
typedef rtl_cmpstate (SAL_CALL *rtl_tres_getnextcmpstate_ptr)( rtl_cmpstate );

 /* type definition of vtable structure for testresult */
typedef struct _rtl_TestResult_vtable
{
    sal_uInt32                      vtablesize;
    rtl_tres_state_ptr              state_;
    rtl_tres_end_ptr                end_;
    rtl_tres_ispassed_ptr           ispassed;
    rtl_tres_isok_ptr               isok;
    rtl_tres_funcstate_ptr          funcstate;
    rtl_tres_isbit_ptr              isbit;
    rtl_tres_getnextfuncstate_ptr   nextfuncstate;
    rtl_tres_getprevfuncstate_ptr   prevfuncstate;
    rtl_tres_getflags_ptr           flags;
    rtl_tres_getname_ptr            name;
    rtl_tres_getstart_ptr           start;
    rtl_tres_getstop_ptr            stop;
    rtl_tres_getcmpstate_ptr        cmpstate;
    rtl_tres_getstat_ptr            stat;
    rtl_tres_getmsg_ptr             msg;
    rtl_tres_getnextcmpstate_ptr    nextcmpstate;

} rtl_TestResult_vtable;

 /* type definition of testresult structure */
struct _rtl_TestResult
{
    rtl_TestResult_vtable * pFuncs;
    void *                  pExternalData;

};


 /* exports */
rtl_TestResult* SAL_CALL rtl_tres_create( const sal_Char* meth, sal_uInt32 flags );
void SAL_CALL rtl_tres_destroy( rtl_TestResult* res );

#ifdef __cplusplus
}
#endif

#endif  /* _RTL_TRES_H_ */
