/********************************************************************
 * COPYRIGHT: 
 * Copyright (c) 1997-1999, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/
/********************************************************************************
*
* File CALLCOLL.C
*
* Modification History:
*        Name                     Description            
*     Madhu Katragadda              Ported for C API
*********************************************************************************
*/

/*
 * Important: This file is included into intltest/allcoll.cpp so that the
 * test data is shared. This makes it easier to maintain the test data,
 * especially since the Unicode data must be portable and quoted character
 * literals will not work.
 * If it is included, then there will be a #define INCLUDE_CALLCOLL_C
 * that must prevent the actual code in here from being part of the
 * allcoll.cpp compilation.
 */

/**
 * CollationDummyTest is a third level test class.  This tests creation of 
 * a customized collator object.  For example, number 1 to be sorted 
 * equlivalent to word 'one'.
 */
#ifndef INCLUDE_CALLCOLL_C

#include <string.h>
#include <stdlib.h>
#include "unicode/utypes.h"
#include "unicode/ucol.h"
#include "unicode/uloc.h"
#include "cstring.h"
#include "cintltst.h"
#include "ccolltst.h"
#include "callcoll.h"
#include "unicode/ustring.h"

static UCollator *myCollation;

#endif

static const UChar DEFAULTRULEARRAY[] =
{
          0x3d, 0x27, (UChar)0x200B, 0x27, 0x3d, (UChar)0x200C, 0x3d, (UChar)0x200D, 0x3d, (UChar)0x200E, 0x3d, (UChar)0x200F
        , 0x3d, (UChar)0x0001, 0x3d, (UChar)0x0002, 0x3d, (UChar)0x0003, 0x3d, (UChar)0x0004
        , 0x3d, (UChar)0x0005, 0x3d, (UChar)0x0006, 0x3d, (UChar)0x0007, 0x3d, (UChar)0x0008, 0x3d, 0x27, (UChar)0x0009, 0x27
        , 0x3d, 0x27, (UChar)0x000b, 0x27,  0x3d, (UChar)0x000e       /* vt,, so */
        , 0x3d, (UChar)0x000f, 0x3d, 0x27, (UChar)0x0010, 0x27,  0x3d, (UChar)0x0011, 0x3d, (UChar)0x0012, 0x3d, (UChar)0x0013 /* si, dle, dc1, dc2, dc3 */
        , 0x3d, (UChar)0x0014, 0x3d, (UChar)0x0015, 0x3d, (UChar)0x0016, 0x3d, (UChar)0x0017, 0x3d, (UChar)0x0018 /* dc4, nak, syn, etb, can */
        , 0x3d, (UChar)0x0019, 0x3d, (UChar)0x001a, 0x3d, (UChar)0x001b, 0x3d, (UChar)0x001c, 0x3d, (UChar)0x001d /* em, sub, esc, fs, gs */
        , 0x3d, (UChar)0x001e, 0x3d, (UChar)0x001f, 0x3d, (UChar)0x007f                   /* rs, us, del */
        /* ....then the C1 Latin 1 reserved control codes */
        , 0x3d, (UChar)0x0080, 0x3d, (UChar)0x0081, 0x3d, (UChar)0x0082, 0x3d, (UChar)0x0083, 0x3d, (UChar)0x0084, 0x3d, (UChar)0x0085
        , 0x3d, (UChar)0x0086, 0x3d, (UChar)0x0087, 0x3d, (UChar)0x0088, 0x3d, (UChar)0x0089, 0x3d, (UChar)0x008a, 0x3d, (UChar)0x008b
        , 0x3d, (UChar)0x008c, 0x3d, (UChar)0x008d, 0x3d, (UChar)0x008e, 0x3d, (UChar)0x008f, 0x3d, (UChar)0x0090, 0x3d, (UChar)0x0091
        , 0x3d, (UChar)0x0092, 0x3d, (UChar)0x0093, 0x3d, (UChar)0x0094, 0x3d, (UChar)0x0095, 0x3d, (UChar)0x0096, 0x3d, (UChar)0x0097
        , 0x3d, (UChar)0x0098, 0x3d, (UChar)0x0099, 0x3d, (UChar)0x009a, 0x3d, (UChar)0x009b, 0x3d, (UChar)0x009c, 0x3d, (UChar)0x009d
        , 0x3d, (UChar)0x009e, 0x3d, (UChar)0x009f
        /*  IGNORE except for secondary, tertiary difference */
        /*  Spaces */
        , 0x3b, 0x27, (UChar)0x0020, 0x27, 0x3b, 0x27, (UChar)0x00A0, 0x27                   /*  spaces */
        , 0x3b, 0x27, (UChar)0x2000, 0x27, 0x3b, 0x27, (UChar)0x2001, 0x27, 0x3b, 0x27, (UChar)0x2002, 0x27, 0x3b, 0x27, (UChar)0x2003, 0x27, 0x3b, 0x27, (UChar)0x2004, 0x27   /*  spaces */
        , 0x3b, 0x27, (UChar)0x2005, 0x27, 0x3b, 0x27, (UChar)0x2006, 0x27, 0x3b, 0x27, (UChar)0x2007, 0x27, 0x3b, 0x27, (UChar)0x2008, 0x27, 0x3b, 0x27, (UChar)0x2009, 0x27   /*  spaces */
        , 0x3b, 0x27, (UChar)0x200A, 0x27, 0x3b, 0x27, (UChar)0x3000, 0x27, 0x3b, 0x27, (UChar)0xFEFF, 0x27                 /*  spaces */
        , 0x3b, 0x27, 0xd, 0x27,  0x3b, 0x27, 9, 0x27,  0x3b, 0x27, 0xa, 0x27, 0x3b, 0x27, 0xc, 0x27, 0x3b, 0x27, (UChar)0x000b, 0x27   /*  whitespace */

        /*  Non-spacing accents */

        , 0x3b, (UChar)0x0301          /*  non-spacing acute accent */
        , 0x3b, (UChar)0x0300          /*  non-spacing grave accent */
        , 0x3b, (UChar)0x0306          /*  non-spacing breve accent */
        , 0x3b, (UChar)0x0302          /*  non-spacing circumflex accent */
        , 0x3b, (UChar)0x030c          /*  non-spacing caron/hacek accent */
        , 0x3b, (UChar)0x030a          /*  non-spacing ring above accent */
        , 0x3b, (UChar)0x030d          /*  non-spacing vertical line above */
        , 0x3b, (UChar)0x0308          /*  non-spacing diaeresis accent */
        , 0x3b, (UChar)0x030b          /*  non-spacing double acute accent */
        , 0x3b, (UChar)0x0303          /*  non-spacing tilde accent */
        , 0x3b, (UChar)0x0307          /*  non-spacing dot above/overdot accent */
        , 0x3b, (UChar)0x0304          /*  non-spacing macron accent */
        , 0x3b, (UChar)0x0337          /*  non-spacing short slash overlay (overstruck diacritic) */
        , 0x3b, (UChar)0x0327          /*  non-spacing cedilla accent */
        , 0x3b, (UChar)0x0328          /*  non-spacing ogonek accent */
        , 0x3b, (UChar)0x0323          /*  non-spacing dot-below/underdot accent */
        , 0x3b, (UChar)0x0332          /*  non-spacing underscore/underline accent */
        /*  with the rest of the general diacritical marks in binary order */
        , 0x3b, (UChar)0x0305          /*  non-spacing overscore/overline */
        , 0x3b, (UChar)0x0309          /*  non-spacing hook above */
        , 0x3b, (UChar)0x030e          /*  non-spacing double vertical line above */
        , 0x3b, (UChar)0x030f          /*  non-spacing double grave */
        , 0x3b, (UChar)0x0310          /*  non-spacing chandrabindu */
        , 0x3b, (UChar)0x0311          /*  non-spacing inverted breve */
        , 0x3b, (UChar)0x0312          /*  non-spacing turned comma above/cedilla above */
        , 0x3b, (UChar)0x0313          /*  non-spacing comma above */
        , 0x3b, (UChar)0x0314          /*  non-spacing reversed comma above */
        , 0x3b, (UChar)0x0315          /*  non-spacing comma above right */
        , 0x3b, (UChar)0x0316          /*  non-spacing grave below */
        , 0x3b, (UChar)0x0317          /*  non-spacing acute below */
        , 0x3b, (UChar)0x0318          /*  non-spacing left tack below */
        , 0x3b, (UChar)0x0319          /*  non-spacing tack below */
        , 0x3b, (UChar)0x031a          /*  non-spacing left angle above */
        , 0x3b, (UChar)0x031b          /*  non-spacing horn */
        , 0x3b, (UChar)0x031c          /*  non-spacing left half ring below */
        , 0x3b, (UChar)0x031d          /*  non-spacing up tack below */
        , 0x3b, (UChar)0x031e          /*  non-spacing down tack below */
        , 0x3b, (UChar)0x031f          /*  non-spacing plus sign below */
        , 0x3b, (UChar)0x0320          /*  non-spacing minus sign below */
        , 0x3b, (UChar)0x0321          /*  non-spacing palatalized hook below */
        , 0x3b, (UChar)0x0322          /*  non-spacing retroflex hook below */
        , 0x3b, (UChar)0x0324          /*  non-spacing double dot below */
        , 0x3b, (UChar)0x0325          /*  non-spacing ring below */
        , 0x3b, (UChar)0x0326          /*  non-spacing comma below */
        , 0x3b, (UChar)0x0329          /*  non-spacing vertical line below */
        , 0x3b, (UChar)0x032a          /*  non-spacing bridge below */
        , 0x3b, (UChar)0x032b          /*  non-spacing inverted double arch below */
        , 0x3b, (UChar)0x032c          /*  non-spacing hacek below */
        , 0x3b, (UChar)0x032d          /*  non-spacing circumflex below */
        , 0x3b, (UChar)0x032e          /*  non-spacing breve below */
        , 0x3b, (UChar)0x032f          /*  non-spacing inverted breve below */
        , 0x3b, (UChar)0x0330          /*  non-spacing tilde below */
        , 0x3b, (UChar)0x0331          /*  non-spacing macron below */
        , 0x3b, (UChar)0x0333          /*  non-spacing double underscore */
        , 0x3b, (UChar)0x0334          /*  non-spacing tilde overlay */
        , 0x3b, (UChar)0x0335          /*  non-spacing short bar overlay */
        , 0x3b, (UChar)0x0336          /*  non-spacing long bar overlay */
        , 0x3b, (UChar)0x0338          /*  non-spacing long slash overlay */
        , 0x3b, (UChar)0x0339          /*  non-spacing right half ring below */
        , 0x3b, (UChar)0x033a          /*  non-spacing inverted bridge below */
        , 0x3b, (UChar)0x033b          /*  non-spacing square below */
        , 0x3b, (UChar)0x033c          /*  non-spacing seagull below */
        , 0x3b, (UChar)0x033d          /*  non-spacing x above */
        , 0x3b, (UChar)0x033e          /*  non-spacing vertical tilde */
        , 0x3b, (UChar)0x033f          /*  non-spacing double overscore */
        , 0x3b, (UChar)0x0340          /*  non-spacing grave tone mark */
        , 0x3b, (UChar)0x0341          /*  non-spacing acute tone mark */
        , 0x3b, (UChar)0x0342, 0x3b, (UChar)0x0343, 0x3b, (UChar)0x0344, 0x3b, (UChar)0x0345, 0x3b, (UChar)0x0360, 0x3b, (UChar)0x0361    /*  newer */
        , 0x3b, (UChar)0x0483, 0x3b, (UChar)0x0484, 0x3b, (UChar)0x0485, 0x3b, (UChar)0x0486    /*  Cyrillic accents */

        , 0x3b, (UChar)0x20D0, 0x3b, (UChar)0x20D1, 0x3b, (UChar)0x20D2           /*  symbol accents */
        , 0x3b, (UChar)0x20D3, 0x3b, (UChar)0x20D4, 0x3b, (UChar)0x20D5           /*  symbol accents */
        , 0x3b, (UChar)0x20D6, 0x3b, (UChar)0x20D7, 0x3b, (UChar)0x20D8           /*  symbol accents */
        , 0x3b, (UChar)0x20D9, 0x3b, (UChar)0x20DA, 0x3b, (UChar)0x20DB           /*  symbol accents */
        , 0x3b, (UChar)0x20DC, 0x3b, (UChar)0x20DD, 0x3b, (UChar)0x20DE           /*  symbol accents */
        , 0x3b, (UChar)0x20DF, 0x3b, (UChar)0x20E0, 0x3b, (UChar)0x20E1           /*  symbol accents */

        , 0x2c, 0x27, (UChar)0x002D, 0x27, 0x3b, (UChar)0x00AD                     /*  dashes */
        , 0x3b, (UChar)0x2010, 0x3b, (UChar)0x2011, 0x3b, (UChar)0x2012           /*  dashes */
        , 0x3b, (UChar)0x2013, 0x3b, (UChar)0x2014, 0x3b, (UChar)0x2015           /*  dashes */
        , 0x3b, (UChar)0x2212                                                       /*  dashes */

        /*  other punctuation */

        , 0x3c, 0x27, (UChar)0x005f, 0x27 /*  underline/underscore (spacing) */
        , 0x3c, (UChar)0x00af          /*  overline or macron (spacing) */
/*         , 0x3c, (UChar)0x00ad    */      /* syllable hyphen (SHY) or soft hyphen */
        , 0x3c, 0x27, (UChar)0x002c, 0x27           /*  comma (spacing) */
        , 0x3c, 0x27, (UChar)0x003b, 0x27           /*  semicolon */
        , 0x3c, 0x27, (UChar)0x003a, 0x27           /*  colon */
        , 0x3c, 0x27, (UChar)0x0021, 0x27           /*  exclamation point */
        , 0x3c, (UChar)0x00a1                       /*  inverted exclamation point */
        , 0x3c, 0x27, (UChar)0x003f, 0x27           /*  question mark */
        , 0x3c, (UChar)0x00bf                       /*  inverted question mark */
        , 0x3c, 0x27, (UChar)0x002f, 0x27           /*  slash */
        , 0x3c, 0x27, (UChar)0x002e, 0x27           /*  period/full stop */
        , 0x3c, (UChar)0x00b4                       /*  acute accent (spacing) */
        , 0x3c, 0x27, (UChar)0x0060, 0x27           /*  grave accent (spacing) */
        , 0x3c, 0x27, (UChar)0x005e, 0x27           /*  circumflex accent (spacing) */
        , 0x3c, (UChar)0x00a8                       /*  diaresis/umlaut accent (spacing) */
        , 0x3c, 0x27, (UChar)0x007e, 0x27           /*  tilde accent (spacing) */
        , 0x3c, (UChar)0x00b7                       /*  middle dot (spacing) */
        , 0x3c, (UChar)0x00b8                       /*  cedilla accent (spacing) */
        , 0x3c, 0x27, (UChar)0x0027, 0x27           /*  apostrophe */
        , 0x3c, 0x27, 0x22, 0x27                       /*  quotation marks */
        , 0x3c, (UChar)0x00ab                       /*  left angle quotes */
        , 0x3c, (UChar)0x00bb                       /*  right angle quotes */
        , 0x3c, 0x27, (UChar)0x0028, 0x27           /*  left parenthesis */
        , 0x3c, 0x27, (UChar)0x0029, 0x27           /*  right parenthesis */
        , 0x3c, 0x27, (UChar)0x005b, 0x27           /*  left bracket */
        , 0x3c, 0x27, (UChar)0x005d, 0x27           /*  right bracket */
        , 0x3c, 0x27, (UChar)0x007b, 0x27           /*  left brace */
        , 0x3c, 0x27, (UChar)0x007d, 0x27           /*  right brace */
        , 0x3c, (UChar)0x00a7                       /*  section symbol */
        , 0x3c, (UChar)0x00b6                       /*  paragraph symbol */
        , 0x3c, (UChar)0x00a9                       /*  copyright symbol */
        , 0x3c, (UChar)0x00ae                       /*  registered trademark symbol */
        , 0x3c, 0x27, (UChar)0x0040, 0x27           /*  at sign */
        , 0x3c, (UChar)0x00a4                       /*  international currency symbol */
        , 0x3c, (UChar)0x00a2                       /*  cent sign */
        , 0x3c, 0x27, (UChar)0x0024, 0x27           /*  dollar sign */
        , 0x3c, (UChar)0x00a3                       /*  pound-sterling sign */
        , 0x3c, (UChar)0x00a5                       /*  yen sign */
        , 0x3c, 0x27, (UChar)0x002a, 0x27           /*  asterisk */
        , 0x3c, 0x27, (UChar)0x005c, 0x27           /*  backslash */
        , 0x3c, 0x27, (UChar)0x0026, 0x27           /*  ampersand */
        , 0x3c, 0x27, (UChar)0x0023, 0x27           /*  number sign */
        , 0x3c, 0x27, (UChar)0x0025, 0x27           /*  percent sign */
        , 0x3c, 0x27, (UChar)0x002b, 0x27           /*  plus sign */
/*         , 0x3c, (UChar)0x002d                    */ /* hyphen or minus sign */
        , 0x3c, (UChar)0x00b1                       /*  plus-or-minus sign */
        , 0x3c, (UChar)0x00f7                       /*  divide sign */
        , 0x3c, (UChar)0x00d7                       /*  multiply sign */
        , 0x3c, 0x27, (UChar)0x003c, 0x27           /*  less-than sign */
        , 0x3c, 0x27, (UChar)0x003d, 0x27           /*  equal sign */
        , 0x3c, 0x27, (UChar)0x003e, 0x27           /*  greater-than sign */
        , 0x3c, (UChar)0x00ac                       /*  end of line symbol/logical NOT symbol */
        , 0x3c, 0x27, (UChar)0x007c, 0x27           /*  vertical line/logical OR symbol */
        , 0x3c, (UChar)0x00a6                       /*  broken vertical line */
        , 0x3c, (UChar)0x00b0                       /*  degree symbol */
        , 0x3c, (UChar)0x00b5                       /*  micro symbol */

        /*  NUMERICS */

        , 0x3c, 0x30, 0x3c, 0x31, 0x3c, 0x32, 0x3c, 0x33, 0x3c, 0x34, 0x3c, 0x35, 0x3c, 0x36, 0x3c, 0x37, 0x3c, 0x38, 0x3c, 0x39 
        , 0x3c, (UChar)0x00bc, 0x3c, (UChar)0x00bd, 0x3c, (UChar)0x00be    /*  1/4,1/2,3/4 fractions */

        /*  NON-IGNORABLES */
        , 0x3c, 0x61, 0x2c, 0x41
        , 0x3c, 0x62, 0x2c, 0x42
        , 0x3c, 0x63, 0x2c, 0x43
        , 0x3c, 0x64, 0x2c, 0x44
        , 0x3c, (UChar)0x00F0, 0x2c, (UChar)0x00D0              /*  eth */
        , 0x3c, 0x65, 0x2c, 0x45
        , 0x3c, 0x66, 0x2c, 0x46
        , 0x3c, 0x67, 0x2c, 0x47
        , 0x3c, 0x68, 0x2c, 0x48
        , 0x3c, 0x69, 0x2c, 0x49
        , 0x3c, 0x6a, 0x2c, 0x4a
        , 0x3c, 0x6b, 0x2c, 0x4b
        , 0x3c, 0x6c, 0x2c, 0x4c
        , 0x3c, 0x6d, 0x2c, 0x4d
        , 0x3c, 0x6e, 0x2c, 0x4e
        , 0x3c, 0x6f, 0x2c, 0x4f
        , 0x3c, 0x70, 0x2c, 0x50
        , 0x3c, 0x71, 0x2c, 0x51
        , 0x3c, 0x72, 0x2c, 0x52
        , 0x3c, 0x73, 0x2c, 0x53, 0x26, 0x53, 0x53, 0x2c, (UChar)0x00DF /*  s-zet */
        , 0x3c, 0x74, 0x2c, 0x54
        , 0x26, 0x54, 0x48, 0x2c, 0x00FE, 0x26, 0x54, 0x48, 0x2c, (UChar)0x00DE  /*  thorn */
        , 0x3c, 0x75, 0x2c, 0x55
        , 0x3c, 0x76, 0x2c, 0x56
        , 0x3c, 0x77, 0x2c, 0x57
        , 0x3c, 0x78, 0x2c, 0x58
        , 0x3c, 0x79, 0x2c, 0x59
        , 0x3c, 0x7a, 0x2c, 0x5a
        , 0x26, 0x41, 0x45, 0x2c, (UChar)0x00C6                    /*  ae & AE ligature */
        , 0x26, 0x41, 0x45, 0x2c, (UChar)0x00E6
        , 0x26, 0x4f, 0x45, 0x2c, (UChar)0x0152                    /*  oe & OE ligature */
        , 0x26, 0x4f, 0x45, 0x2c, (UChar)0x0153
        , (UChar)0x0000
};

const UChar testSourceCases[][16] = {
    {0x61, 0x62, 0x27, 0x63, 0},
    {0x63, 0x6f, 0x2d, 0x6f, 0x70, 0},
    {0x61, 0x62, 0},
    {0x61, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x61, 0x64, 0},
    {0x61, 0x6c, 0x6c, 0},
    {0x66, 0x6f, 0x75, 0x72, 0},
    {0x66, 0x69, 0x76, 0x65, 0},
    {0x31, 0},
    {0x31, 0},
    {0x31, 0},                                            /*  10 */
    {0x32, 0},
    {0x32, 0},
    {0x48, 0x65, 0x6c, 0x6c, 0x6f, 0},
    {0x61, 0x3c, 0x62, 0},
    {0x61, 0x3c, 0x62, 0},
    {0x61, 0x63, 0x63, 0},
    {0x61, 0x63, 0x48, 0x63, 0},  /*  simple test */
    {0x70, 0x00EA, 0x63, 0x68, 0x65, 0},
    {0x61, 0x62, 0x63, 0},
    {0x61, 0x62, 0x63, 0},                                  /*  20 */
    {0x61, 0x62, 0x63, 0},
    {0x61, 0x62, 0x63, 0},
    {0x61, 0x62, 0x63, 0},
    {0x61, 0x00E6, 0x63, 0},
    {0x61, 0x63, 0x48, 0x63, 0},  /*  primary test */
    {0x62, 0x6c, 0x61, 0x63, 0x6b, 0},
    {0x66, 0x6f, 0x75, 0x72, 0},
    {0x66, 0x69, 0x76, 0x65, 0},
    {0x31, 0},
    {0x61, 0x62, 0x63, 0},                                        /*  30 */
    {0x61, 0x62, 0x63, 0},                                  
    {0x61, 0x62, 0x63, 0x48, 0},
    {0x61, 0x62, 0x63, 0},
    {0x61, 0x63, 0x48, 0x63, 0},                              /*  34 */
    {0x61, 0x63, 0x65, 0x30},
    {0x31, 0x30},
    {0x70, 0x00EA,0x30}                                    /* 37     */
};

const UChar testTargetCases[][16] = {
    {0x61, 0x62, 0x63, 0x27, 0},
    {0x43, 0x4f, 0x4f, 0x50, 0},
    {0x61, 0x62, 0x63, 0},
    {0x26, 0},
    {0x26, 0},
    {0x34, 0},
    {0x35, 0},
    {0x6f, 0x6e, 0x65, 0},
    {0x6e, 0x6e, 0x65, 0},
    {0x70, 0x6e, 0x65, 0},                                  /*  10 */
    {0x74, 0x77, 0x6f, 0},
    {0x75, 0x77, 0x6f, 0},
    {0x68, 0x65, 0x6c, 0x6c, 0x4f, 0},
    {0x61, 0x3c, 0x3d, 0x62, 0},
    {0x61, 0x62, 0x63, 0},
    {0x61, 0x43, 0x48, 0x63, 0},
    {0x61, 0x43, 0x48, 0x63, 0},  /*  simple test */
    {0x70, (UChar)0x00E9, 0x63, 0x68, 0x00E9, 0},
    {0x61, 0x62, 0x63, 0},
    {0x61, 0x42, 0x43, 0},                                  /*  20 */
    {0x61, 0x62, 0x63, 0x68, 0},
    {0x61, 0x62, 0x64, 0},
    {(UChar)0x00E4, 0x62, 0x63, 0},
    {0x61, (UChar)0x00C6, 0x63, 0},
    {0x61, 0x43, 0x48, 0x63, 0},  /*  primary test */
    {0x62, 0x6c, 0x61, 0x63, 0x6b, 0x2d, 0x62, 0x69, 0x72, 0x64, 0},
    {0x34, 0},
    {0x35, 0},
    {0x6f, 0x6e, 0x65, 0},
    {0x61, 0x62, 0x63, 0},
    {0x61, 0x42, 0x63, 0},                                  /*  30 */
    {0x61, 0x62, 0x63, 0x68, 0},
    {0x61, 0x62, 0x64, 0},
    {0x61, 0x43, 0x48, 0x63, 0},                                /*  34 */
    {0x61, 0x63, 0x65, 0x30},
    {0x31, 0x30},
    {0x70, (UChar)0x00EB,0x30}                                    /* 37 */
};

#ifndef INCLUDE_CALLCOLL_C

const UCollationResult results[] = {
    UCOL_LESS,
    UCOL_LESS, /*UCOL_GREATER,*/
    UCOL_LESS,
    UCOL_LESS,
    UCOL_LESS,
    UCOL_LESS,
    UCOL_LESS,
    UCOL_GREATER,
    UCOL_GREATER,
    UCOL_LESS,                                     /*  10 */
    UCOL_GREATER,
    UCOL_LESS,
    UCOL_GREATER,
    UCOL_GREATER,
    UCOL_LESS,
    UCOL_LESS,
    UCOL_LESS,
    /*  test primary > 17 */
    UCOL_EQUAL,
    UCOL_EQUAL,
    UCOL_EQUAL,                                    /*  20 */
    UCOL_LESS,
    UCOL_LESS,
    UCOL_EQUAL,
    UCOL_EQUAL,
    UCOL_EQUAL,
    UCOL_LESS,
    /*  test secondary > 26 */
    UCOL_EQUAL,
    UCOL_EQUAL,
    UCOL_EQUAL,
    UCOL_EQUAL,
    UCOL_EQUAL,                                    /*  30 */
    UCOL_EQUAL,
    UCOL_LESS,
    UCOL_EQUAL,                                     /*  34 */
    UCOL_EQUAL,
    UCOL_EQUAL,
    UCOL_LESS                                        /* 37 */
};

#endif

const UChar testCases[][4] =
{
    {0x61, 0},
    {0x41, 0},
    {0x00e4, 0},
    {0x00c4, 0},
    {0x61, 0x65, 0},
    {0x61, 0x45, 0},
    {0x41, 0x65, 0},
    {0x41, 0x45, 0},
    {(UChar)0x00e6, 0},
    {(UChar)0x00c6, 0},
    {0x62, 0},
    {0x63, 0},
    {0x7a, 0}
};

#define COUNT_TEST_CASES 13

#ifndef INCLUDE_CALLCOLL_C

void addAllCollTest(TestNode** root)
{
    
    
    addTest(root, &TestPrimary, "tscoll/callcoll/TestPrimary");
    addTest(root, &TestSecondary, "tscoll/callcoll/TestSecondary");
    addTest(root, &TestTertiary, "tscoll/callcoll/TestTertiary");
    addTest(root, &TestIdentical, "tscoll/callcoll/TestIdentical");
    addTest(root, &TestExtra, "tscoll/callcoll/TestExtra");
    addTest(root, &TestJB581, "tscoll/callcoll/TestJB581");      
}

void doTest(UCollator* myCollation, const UChar source[], const UChar target[], UCollationResult result)
{
    int32_t sortklen1, sortklen2, sortklenmax, sortklenmin;
    int temp=0, gSortklen1=0,gSortklen2=0;
    UCollationResult compareResult, keyResult, incResult;
    uint8_t *sortKey1, *sortKey2;
    
    compareResult = ucol_strcoll(myCollation, source, u_strlen(source), target, u_strlen(target));
    incResult = ctst_strcollTestIncremental(myCollation, source, u_strlen(source), target, u_strlen(target));
    sortklen1=ucol_getSortKey(myCollation, source, u_strlen(source),  NULL, 0);
    sortklen2=ucol_getSortKey(myCollation, target, u_strlen(target),  NULL, 0);

    sortklenmax = (sortklen1>sortklen2?sortklen1:sortklen2);
    sortklenmin = (sortklen1<sortklen2?sortklen1:sortklen2);

    sortKey1=(uint8_t*)malloc(sizeof(uint8_t) * (sortklenmax+1));
    ucol_getSortKey(myCollation, source, u_strlen(source), sortKey1, sortklen1+1);
    
    sortKey2=(uint8_t*)malloc(sizeof(uint8_t) * (sortklenmax+1));
    ucol_getSortKey(myCollation, target, u_strlen(target), sortKey2, sortklen2+1);
    
    /*memcmp(sortKey1, sortKey2,sortklenmax);*/
    temp= uprv_strcmp((const char *)sortKey1, (const char *)sortKey2);
    gSortklen1 = uprv_strlen((const char *)sortKey1)+1;
    gSortklen2 = uprv_strlen((const char *)sortKey2)+1;
    if(sortklen1 != gSortklen1){
        log_err("SortKey length does not match Expected: %i Got: %i\n",sortklen1, gSortklen1);
    }
    if(sortklen2!= gSortklen2){
        log_err("SortKey length does not match Expected: %i Got: %i\n", sortklen2, gSortklen2);
    }

    if(temp < 0) {
        keyResult=UCOL_LESS;
    }
    else if(temp > 0) {
        keyResult= UCOL_GREATER;
    }
    else {
        keyResult = UCOL_EQUAL;
    }
    reportCResult( source, target, sortKey1, sortKey2, compareResult, keyResult, incResult, result );
    free(sortKey1);
    free(sortKey2);
}

static void TestTertiary()
{
    int32_t len,i;
    UChar *rules, *newRules;
    UErrorCode status=U_ZERO_ERROR;
    const char* str="& C < ch, cH, Ch, CH & Five, 5 & Four, 4 & one, 1 & Ampersand; '&' & Two, 2 ";
    newRules=(UChar*)malloc(sizeof(UChar*) * (strlen(str)+1));
    u_uastrcpy(newRules, str);
    len=u_strlen(DEFAULTRULEARRAY) + u_strlen(newRules);
    rules=(UChar*)malloc(sizeof(UChar) * (len+1));
/*
    u_strcpy(rules, DEFAULTRULEARRAY);
    u_strcat(rules, newRules);
*/
    u_strcpy(rules, newRules);
    myCollation=ucol_openRules(rules, u_strlen(rules), UCOL_NO_NORMALIZATION, UCOL_DEFAULT_STRENGTH, &status);
    if(U_FAILURE(status)){
        log_err("ERROR: in creation of rule based collator :%s\n", myErrorName(status));
    }
   
   /* ucol_setNormalization(myCollation, UCOL_DEFAULT_NORMALIZATION); */
    ucol_setStrength(myCollation, UCOL_TERTIARY);
    for (i = 0; i < 17 ; i++)
    {
        doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
    }
    free(newRules);
    free(rules);
    ucol_close(myCollation);
    myCollation = 0;
}

static void TestPrimary( )
{
    int32_t len,i;
    UChar *rules, *newRules;
    UErrorCode status=U_ZERO_ERROR;
    const char* str="& C < ch, cH, Ch, CH & Five, 5 & Four, 4 & one, 1 & Ampersand; '&' & Two, 2 ";
    
    newRules=(UChar*)malloc(sizeof(UChar*) * strlen(str));
    u_uastrcpy(newRules, str);
    
    len=u_strlen(DEFAULTRULEARRAY) + u_strlen(newRules);
    rules=(UChar*)malloc(sizeof(UChar) * (len+1));
/*
    u_strcpy(rules, DEFAULTRULEARRAY);
    u_strcat(rules, newRules);
*/
    u_strcpy(rules, newRules);
    myCollation=ucol_openRules(rules, u_strlen(rules), UCOL_NO_NORMALIZATION, UCOL_DEFAULT_STRENGTH, &status);
    if(U_FAILURE(status)){
        log_err("ERROR: in creation of rule based collator :%s\n", myErrorName(status));
    }
    /* problem in strcollinc for unfinshed contractions */
    ucol_setAttribute(myCollation, UCOL_NORMALIZATION_MODE, UCOL_ON, &status);
    ucol_setStrength(myCollation, UCOL_PRIMARY);
    
    for (i = 17; i < 26 ; i++)
    {
        
        doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
    }
    free(newRules);
    free(rules);
    ucol_close(myCollation);
    myCollation = 0;
}

static void TestSecondary()
{
    int32_t i;
    int32_t len;
    UChar *rules, *newRules;
    UErrorCode status=U_ZERO_ERROR;
    const char* str="& C < ch, cH, Ch, CH & Five, 5 & Four, 4 & one, 1 & Ampersand; '&' & Two, 2 ";
    
    newRules=(UChar*)malloc(sizeof(UChar*) * strlen(str));
    u_uastrcpy(newRules, str);
    
    len=u_strlen(DEFAULTRULEARRAY) + u_strlen(newRules);
    rules=(UChar*)malloc(sizeof(UChar) * (len+1));
/*
    u_strcpy(rules, DEFAULTRULEARRAY);
    u_strcat(rules, newRules);
*/
    u_strcpy(rules, newRules);
    myCollation=ucol_openRules(rules, u_strlen(rules), UCOL_NO_NORMALIZATION, UCOL_DEFAULT_STRENGTH, &status);
    if(U_FAILURE(status)){
        log_err("ERROR: in creation of rule based collator :%s\n", myErrorName(status));
    }
    ucol_setStrength(myCollation, UCOL_SECONDARY);
    for (i = 26; i < 34 ; i++)
    {
        doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
    }
    free(newRules);
    free(rules);
    ucol_close(myCollation);
    myCollation = 0;
}

static void TestIdentical()
{
    int32_t i;
    int32_t len;
    UChar *rules = 0, *newRules = 0;
    UErrorCode status=U_ZERO_ERROR;
    const char* str="& C < ch, cH, Ch, CH & Five, 5 & Four, 4 & one, 1 & Ampersand; '&' & Two, 2 ";

    newRules=(UChar*)malloc(sizeof(UChar*) * strlen(str));
    u_uastrcpy(newRules, str);
   
    len=u_strlen(DEFAULTRULEARRAY) + u_strlen(newRules);
    rules=(UChar*)malloc(sizeof(UChar) * (len+1));
/*
    u_strcpy(rules, DEFAULTRULEARRAY);
    u_strcat(rules, newRules);
*/
    u_strcpy(rules, newRules);
    myCollation=ucol_openRules(rules, u_strlen(rules), UCOL_NO_NORMALIZATION, UCOL_IDENTICAL, &status);
    if(U_FAILURE(status)){
        log_err("ERROR: in creation of rule based collator :%s\n", myErrorName(status));
    }
    for(i= 34; i<37; i++)
    {
        doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
    }
    free(newRules);
    free(rules);
    ucol_close(myCollation);
    myCollation = 0;
}

static void TestExtra()
{
    int32_t i, j;
    int32_t len;
    UChar *rules, *newRules;
    UErrorCode status = U_ZERO_ERROR;
    const char* str="& C < ch, cH, Ch, CH & Five, 5 & Four, 4 & one, 1 & Ampersand; '&' & Two, 2 ";
    newRules=(UChar*)malloc(sizeof(UChar*) * strlen(str));
    u_uastrcpy(newRules, str);
    log_verbose("Testing extra\n");
    len=u_strlen(DEFAULTRULEARRAY) + u_strlen(newRules);
    rules=(UChar*)malloc(sizeof(UChar) * (len+1));
/*
    u_strcpy(rules, DEFAULTRULEARRAY);
    u_strcat(rules, newRules);
*/
    u_strcpy(rules, newRules);
    myCollation=ucol_openRules(rules, u_strlen(rules), UCOL_NO_NORMALIZATION, UCOL_DEFAULT_STRENGTH, &status);
    if(U_FAILURE(status)){
        log_err("ERROR: in creation of rule based collator :%s\n", myErrorName(status));
    }
    ucol_setNormalization(myCollation, UCOL_DEFAULT_NORMALIZATION); 
    ucol_setStrength(myCollation, UCOL_TERTIARY);
    for (i = 0; i < COUNT_TEST_CASES-1 ; i++)
    {
        for (j = i + 1; j < COUNT_TEST_CASES; j += 1)
        {
        
            doTest(myCollation, testCases[i], testCases[j], UCOL_LESS);
        }
    }
    free(newRules);
    free(rules);
    ucol_close(myCollation);
    myCollation = 0;
}

static void TestJB581(void)
{
    UChar       dispName    [100]; 
    int32_t     bufferLen   = 0;
    UChar       source      [100];
    UChar       target      [100];
    UCollationResult result     = UCOL_EQUAL;
    uint8_t     sourceKeyArray  [100];
    uint8_t     targetKeyArray  [100]; 
    int32_t     sourceKeyOut    = 0, 
                targetKeyOut    = 0;
    UCollator   *myCollator = 0;
    UErrorCode status = U_ZERO_ERROR;

    /*u_uastrcpy(source, "This is a test.");*/
    /*u_uastrcpy(target, "THISISATEST.");*/
    u_uastrcpy(source, "THISISATEST.");
    u_uastrcpy(target, "Thisisatest.");

    myCollator = ucol_open("en_US", &status);
    if (U_FAILURE(status)){
        bufferLen = uloc_getDisplayName("en_US", 0, dispName, 100, &status);
        /*Report the error with display name... */
        log_err("ERROR: Failed to create the collator for : \"%s\"\n", dispName);
        return;
    }
    result = ucol_strcoll(myCollator, source, -1, target, -1);
    /* result is 1, secondary differences only for ignorable space characters*/
    if (result != 1)
    {
        log_err("Comparing two strings with only secondary differences in C failed.\n");
    }
    /* To compare them with just primary differences */
    ucol_setStrength(myCollator, UCOL_PRIMARY);
    result = ucol_strcoll(myCollator, source, -1, target, -1);
    /* result is 0 */
    if (result != 0)
    {
        log_err("Comparing two strings with no differences in C failed.\n");
    }
    /* Now, do the same comparison with keys */
    sourceKeyOut = ucol_getSortKey(myCollator, source, -1, sourceKeyArray, 100);
    targetKeyOut = ucol_getSortKey(myCollator, target, -1, targetKeyArray, 100);
    result = 0;
    bufferLen = ((targetKeyOut > 100) ? 100 : targetKeyOut);
    result = memcmp(sourceKeyArray, targetKeyArray, bufferLen);
    if (result != 0)
    {
        log_err("Comparing two strings with sort keys in C failed.\n");
    }
    ucol_close(myCollator);
}
#endif
