// Copyright (C) 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/********************************************************************
 * COPYRIGHT:
 * Copyright (c) 1997-2014, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/
/********************************************************************************
*
* File CITERTST.H
*
* Modification History:
*        Name                     Description            
*     Madhu Katragadda            Converted to C
*********************************************************************************/

/**
 * Collation Iterator tests.
 * (Let me reiterate my position...)
 */

#ifndef _CITERCOLLTST
#define _CITERCOLLTST

#include "unicode/utypes.h"

#if !UCONFIG_NO_COLLATION

#include "unicode/ucol.h"
#include "unicode/ucoleitr.h"
#include "cintltst.h"

#define MAX_TOKEN_LEN 16

/**
* Test for CollationElementIterator previous and next for the whole set of
* unicode characters.
*/
static void TestUnicodeChar(void);
/**
* Test for CollationElementIterator previous and next for the whole set of
* unicode characters with normalization on.
*/
static void TestNormalizedUnicodeChar(void);
/**
* Test incremental normalization
*/
static void TestNormalization(void);
 /**
 * Test for CollationElementIterator.previous()
 *
 * @bug 4108758 - Make sure it works with contracting characters
 * 
 */
static void TestPrevious(void);

/**
 * Test for getOffset() and setOffset()
 */
static void TestOffset(void);
/**
 * Test for setText()
 */
static void TestSetText(void);
/** @bug 4108762
 * Test for getMaxExpansion()
 */
static void TestMaxExpansion(void);
/**
* Test Bug 672, where different locales give a different offset after 
* a previous for the same string at the same position
*/
static void TestBug672(void);

/**
 * Repeat TestBug672 with normalizatin enabled - this test revealed a bug
 *   in incremental normalization.
 */
static void TestBug672Normalize(void);
/**
* Test iterators with an relatively small buffer
*/
static void TestSmallBuffer(void);
/**
* Tests the discontiguos contractions
*/
static void TestDiscontiguos(void);
/**
* TestSearchCollatorElements tests iterator behavior (forwards and backwards) with
* normalization on AND jamo tailoring, among other things.
*/
static void TestSearchCollatorElements(void);

/*------------------------------------------------------------------------
 Internal utilities
 */


static void assertEqual(UCollationElements *i1, UCollationElements *i2);


#endif /* #if !UCONFIG_NO_COLLATION */

#endif
