/********************************************************************
 * COPYRIGHT: 
 * Copyright (c) 1997-2001, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/
/*   file name:  cbididat.c
*   encoding:   US-ASCII
*   tab size:   8 (not used)
*   indentation:4
*
*   created on: 1999sep22
*   created by: Markus W. Scherer
*/

#ifndef _BIDITST_H
#define _BIDITST_H

#include "unicode/utypes.h"
#include "unicode/uchar.h"
#include "intltest.h"
#ifdef ICU_UBIDI_USE_DEPRECATES
#include "unicode/bidi.h"

#define MAX_STRING_LENGTH 200

/* length of an array */
#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(array[0]))

/*  Comparing the description of the BiDi algorithm with this implementation
    is easier with the same names for the BiDi types in the code as there.
    See UCharDirection in uchar.h .
*/
enum { 
    L=  U_LEFT_TO_RIGHT,
    R=  U_RIGHT_TO_LEFT,
    EN= U_EUROPEAN_NUMBER,
    ES= U_EUROPEAN_NUMBER_SEPARATOR,
    ET= U_EUROPEAN_NUMBER_TERMINATOR,
    AN= U_ARABIC_NUMBER,
    CS= U_COMMON_NUMBER_SEPARATOR,
    B=  U_BLOCK_SEPARATOR,
    S=  U_SEGMENT_SEPARATOR,
    WS= U_WHITE_SPACE_NEUTRAL,
    ON= U_OTHER_NEUTRAL,
    LRE=U_LEFT_TO_RIGHT_EMBEDDING,
    LRO=U_LEFT_TO_RIGHT_OVERRIDE,
    AL= U_RIGHT_TO_LEFT_ARABIC,
    RLE=U_RIGHT_TO_LEFT_EMBEDDING,
    RLO=U_RIGHT_TO_LEFT_OVERRIDE,
    PDF=U_POP_DIRECTIONAL_FORMAT,
    NSM=U_DIR_NON_SPACING_MARK,
    BN= U_BOUNDARY_NEUTRAL,
    dirPropCount
};

typedef struct {
    const uint8_t *text;
    int32_t length;
    UBiDiLevel paraLevel;
    int32_t lineStart, lineLimit;
    UBiDiDirection direction;
    UBiDiLevel resultLevel;
    const UBiDiLevel *levels;
    const uint8_t *visualMap;
} BiDiTestData;





class BiDiTest: public IntlTest{

private:
    
public:
    void TestBiDi(void);

    void TestBiDi(BiDi& bidi, BiDi& line);

    void TestBiDi(BiDi& bidi, int testNumber, BiDiTestData *test, int32_t lineStart);

    void TestReordering(BiDi& bidi, int testNumber);

    void TestInverseBiDi(void);

    void TestInverseBiDi(BiDi& bidi, UBiDiLevel direction);

    void TestInverseBiDi(BiDi& bidi, const UChar* src,int32_t srcLength, UBiDiLevel direction, UErrorCode& errorCode);

    void TestWriteReverse(void);


    UChar* getStringFromDirProps(const uint8_t *dirProps, int32_t length);

    void printUnicode(const UChar* s,int32_t length, const UBiDiLevel *levels);

    void runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par = NULL */);
};
#endif /* ICU_UBIDI_USE_DEPRECATES */

#endif
