1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Copyright (c) 1997-2010, International Business Machines Corporation and
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * others. All Rights Reserved.
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ********************************************************************/
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************************
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* File CNORMTST.C
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru* Modification History:
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*        Name                     Description
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*     Madhu Katragadda            Ported for C API
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*     synwee                      added test for quick check
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*     synwee                      added test for checkFCD
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru*********************************************************************************/
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*tests for u_normalization*/
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/utypes.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unorm.h"
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#if UCONFIG_NO_NORMALIZATION
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNormTest(TestNode** root) {
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* no normalization - nothing to do */
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#else
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <time.h>
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h"
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unorm.h"
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cnormtst.h"
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof ((array)[0]))
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestAPI(void);
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNormCoverage(void);
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestConcatenate(void);
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNextPrevious(void);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIsNormalized(void);
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestFCNFKCClosure(void);
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestQuickCheckPerCP(void);
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestComposition(void);
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
6127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void
6227f654740f2a26ad62a5c155af9199af9e69b889clairehoTestFCD(void);
6327f654740f2a26ad62a5c155af9199af9e69b889claireho
6427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void
6527f654740f2a26ad62a5c155af9199af9e69b889clairehoTestGetDecomposition(void);
6627f654740f2a26ad62a5c155af9199af9e69b889claireho
6727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const canonTests[][3] = {
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Input*/                    /*Decomposed*/                /*Composed*/
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "cat",                    "cat",                        "cat"                    },
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00e0ardvark",            "a\\u0300ardvark",            "\\u00e0ardvark",        },
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u1e0a",                "D\\u0307",                    "\\u1e0a"                }, /* D-dot_above*/
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "D\\u0307",                "D\\u0307",                    "\\u1e0a"                }, /* D dot_above*/
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u1e0c\\u0307",            "D\\u0323\\u0307",            "\\u1e0c\\u0307"        }, /* D-dot_below dot_above*/
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u1e0a\\u0323",            "D\\u0323\\u0307",            "\\u1e0c\\u0307"        }, /* D-dot_above dot_below */
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "D\\u0307\\u0323",        "D\\u0323\\u0307",            "\\u1e0c\\u0307"        }, /* D dot_below dot_above */
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u1e10\\u0307\\u0323",    "D\\u0327\\u0323\\u0307",    "\\u1e10\\u0323\\u0307"    }, /*D dot_below cedilla dot_above*/
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "D\\u0307\\u0328\\u0323",    "D\\u0328\\u0323\\u0307",    "\\u1e0c\\u0328\\u0307"    }, /* D dot_above ogonek dot_below*/
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u1E14",                "E\\u0304\\u0300",            "\\u1E14"                }, /* E-macron-grave*/
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u0112\\u0300",            "E\\u0304\\u0300",            "\\u1E14"                }, /* E-macron + grave*/
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00c8\\u0304",            "E\\u0300\\u0304",            "\\u00c8\\u0304"        }, /* E-grave + macron*/
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u212b",                "A\\u030a",                    "\\u00c5"                }, /* angstrom_sign*/
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00c5",                "A\\u030a",                    "\\u00c5"                }, /* A-ring*/
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00C4ffin",            "A\\u0308ffin",                "\\u00C4ffin"                    },
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00C4\\uFB03n",        "A\\u0308\\uFB03n",            "\\u00C4\\uFB03n"                },
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "Henry IV",                "Henry IV",                    "Henry IV"                },
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "Henry \\u2163",            "Henry \\u2163",            "Henry \\u2163"            },
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u30AC",                "\\u30AB\\u3099",            "\\u30AC"                }, /* ga (Katakana)*/
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u30AB\\u3099",            "\\u30AB\\u3099",            "\\u30AC"                }, /*ka + ten*/
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\uFF76\\uFF9E",            "\\uFF76\\uFF9E",            "\\uFF76\\uFF9E"        }, /* hw_ka + hw_ten*/
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u30AB\\uFF9E",            "\\u30AB\\uFF9E",            "\\u30AB\\uFF9E"        }, /* ka + hw_ten*/
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\uFF76\\u3099",            "\\uFF76\\u3099",            "\\uFF76\\u3099"        },  /* hw_ka + ten*/
10027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "A\\u0300\\u0316",           "A\\u0316\\u0300",           "\\u00C0\\u0316"        },  /* hw_ka + ten*/
10127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "", "", "" }
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10427f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const compatTests[][3] = {
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Input*/                        /*Decomposed    */                /*Composed*/
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "cat",                        "cat",                            "cat"                },
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\uFB4f",                    "\\u05D0\\u05DC",                "\\u05D0\\u05DC"    }, /* Alef-Lamed vs. Alef, Lamed*/
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00C4ffin",                "A\\u0308ffin",                    "\\u00C4ffin"             },
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00C4\\uFB03n",            "A\\u0308ffin",                    "\\u00C4ffin"                }, /* ffi ligature -> f + f + i*/
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "Henry IV",                    "Henry IV",                        "Henry IV"            },
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "Henry \\u2163",                "Henry IV",                        "Henry IV"            },
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u30AC",                    "\\u30AB\\u3099",                "\\u30AC"            }, /* ga (Katakana)*/
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u30AB\\u3099",                "\\u30AB\\u3099",                "\\u30AC"            }, /*ka + ten*/
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\uFF76\\u3099",                "\\u30AB\\u3099",                "\\u30AC"            }, /* hw_ka + ten*/
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*These two are broken in Unicode 2.1.2 but fixed in 2.1.5 and later*/
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\uFF76\\uFF9E",                "\\u30AB\\u3099",                "\\u30AC"            }, /* hw_ka + hw_ten*/
12327f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u30AB\\uFF9E",                "\\u30AB\\u3099",                "\\u30AC"            }, /* ka + hw_ten*/
12427f654740f2a26ad62a5c155af9199af9e69b889claireho    { "", "", "" }
12527f654740f2a26ad62a5c155af9199af9e69b889claireho};
12627f654740f2a26ad62a5c155af9199af9e69b889claireho
12727f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const fcdTests[][3] = {
12827f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Added for testing the below-U+0300 prefix of a NUL-terminated string. */
12927f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u010e\\u0327", "D\\u0327\\u030c", NULL },  /* D-caron + cedilla */
13027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u010e", "\\u010e", NULL }  /* D-caron */
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNormTest(TestNode** root);
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNormTest(TestNode** root)
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestAPI, "tsnorm/cnormtst/TestAPI");
13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestDecomp, "tsnorm/cnormtst/TestDecomp");
13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestCompatDecomp, "tsnorm/cnormtst/TestCompatDecomp");
14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestCanonDecompCompose, "tsnorm/cnormtst/TestCanonDecompCompose");
14127f654740f2a26ad62a5c155af9199af9e69b889claireho    addTest(root, &TestCompatDecompCompose, "tsnorm/cnormtst/TestCompatDecompCompose");
14227f654740f2a26ad62a5c155af9199af9e69b889claireho    addTest(root, &TestFCD, "tsnorm/cnormtst/TestFCD");
14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestNull, "tsnorm/cnormtst/TestNull");
14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestQuickCheck, "tsnorm/cnormtst/TestQuickCheck");
14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestQuickCheckPerCP, "tsnorm/cnormtst/TestQuickCheckPerCP");
14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestIsNormalized, "tsnorm/cnormtst/TestIsNormalized");
14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestCheckFCD, "tsnorm/cnormtst/TestCheckFCD");
14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestNormCoverage, "tsnorm/cnormtst/TestNormCoverage");
14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestConcatenate, "tsnorm/cnormtst/TestConcatenate");
15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestNextPrevious, "tsnorm/cnormtst/TestNextPrevious");
15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestFCNFKCClosure, "tsnorm/cnormtst/TestFCNFKCClosure");
15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestComposition, "tsnorm/cnormtst/TestComposition");
15327f654740f2a26ad62a5c155af9199af9e69b889claireho    addTest(root, &TestGetDecomposition, "tsnorm/cnormtst/TestGetDecomposition");
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const modeStrings[]={
15727f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_NONE",
15827f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_NFD",
15927f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_NFKD",
16027f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_NFC",
16127f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_NFKC",
16227f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_FCD",
16327f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_MODE_COUNT"
16427f654740f2a26ad62a5c155af9199af9e69b889claireho};
16527f654740f2a26ad62a5c155af9199af9e69b889claireho
16627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestNormCases(UNormalizationMode mode,
16727f654740f2a26ad62a5c155af9199af9e69b889claireho                          const char* const cases[][3], int32_t lengthOfCases) {
16827f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t x, neededLen, length2;
16927f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t expIndex= (mode==UNORM_NFC || mode==UNORM_NFKC) ? 2 : 1;
17027f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar *source=NULL;
17127f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar result[16];
17227f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("Testing unorm_normalize(%s)\n", modeStrings[mode]);
17327f654740f2a26ad62a5c155af9199af9e69b889claireho    for(x=0; x < lengthOfCases; x++)
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
17527f654740f2a26ad62a5c155af9199af9e69b889claireho        UErrorCode status = U_ZERO_ERROR, status2 = U_ZERO_ERROR;
17627f654740f2a26ad62a5c155af9199af9e69b889claireho        source=CharsToUChars(cases[x][0]);
17727f654740f2a26ad62a5c155af9199af9e69b889claireho        neededLen= unorm_normalize(source, u_strlen(source), mode, 0, NULL, 0, &status);
17827f654740f2a26ad62a5c155af9199af9e69b889claireho        length2= unorm_normalize(source, -1, mode, 0, NULL, 0, &status2);
17927f654740f2a26ad62a5c155af9199af9e69b889claireho        if(neededLen!=length2) {
18027f654740f2a26ad62a5c155af9199af9e69b889claireho          log_err("ERROR in unorm_normalize(%s)[%d]: "
18127f654740f2a26ad62a5c155af9199af9e69b889claireho                  "preflight length/NUL %d!=%d preflight length/srcLength\n",
18227f654740f2a26ad62a5c155af9199af9e69b889claireho                  modeStrings[mode], (int)x, (int)neededLen, (int)length2);
18327f654740f2a26ad62a5c155af9199af9e69b889claireho        }
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
18827f654740f2a26ad62a5c155af9199af9e69b889claireho        length2=unorm_normalize(source, u_strlen(source), mode, 0, result, LENGTHOF(result), &status);
18927f654740f2a26ad62a5c155af9199af9e69b889claireho        if(U_FAILURE(status) || neededLen!=length2) {
19027f654740f2a26ad62a5c155af9199af9e69b889claireho            log_data_err("ERROR in unorm_normalize(%s/NUL) at %s:  %s - (Are you missing data?)\n",
19127f654740f2a26ad62a5c155af9199af9e69b889claireho                         modeStrings[mode], austrdup(source), myErrorName(status));
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
19327f654740f2a26ad62a5c155af9199af9e69b889claireho            assertEqual(result, cases[x][expIndex], x);
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
19527f654740f2a26ad62a5c155af9199af9e69b889claireho        length2=unorm_normalize(source, -1, mode, 0, result, LENGTHOF(result), &status);
19627f654740f2a26ad62a5c155af9199af9e69b889claireho        if(U_FAILURE(status) || neededLen!=length2) {
19727f654740f2a26ad62a5c155af9199af9e69b889claireho            log_data_err("ERROR in unorm_normalize(%s/srcLength) at %s:  %s - (Are you missing data?)\n",
19827f654740f2a26ad62a5c155af9199af9e69b889claireho                         modeStrings[mode], austrdup(source), myErrorName(status));
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
20027f654740f2a26ad62a5c155af9199af9e69b889claireho            assertEqual(result, cases[x][expIndex], x);
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(source);
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
20627f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestDecomp() {
20727f654740f2a26ad62a5c155af9199af9e69b889claireho    TestNormCases(UNORM_NFD, canonTests, LENGTHOF(canonTests));
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21027f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCompatDecomp() {
21127f654740f2a26ad62a5c155af9199af9e69b889claireho    TestNormCases(UNORM_NFKD, compatTests, LENGTHOF(compatTests));
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21427f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCanonDecompCompose() {
21527f654740f2a26ad62a5c155af9199af9e69b889claireho    TestNormCases(UNORM_NFC, canonTests, LENGTHOF(canonTests));
21627f654740f2a26ad62a5c155af9199af9e69b889claireho}
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21827f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCompatDecompCompose() {
21927f654740f2a26ad62a5c155af9199af9e69b889claireho    TestNormCases(UNORM_NFKC, compatTests, LENGTHOF(compatTests));
22027f654740f2a26ad62a5c155af9199af9e69b889claireho}
22127f654740f2a26ad62a5c155af9199af9e69b889claireho
22227f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestFCD() {
22327f654740f2a26ad62a5c155af9199af9e69b889claireho    TestNormCases(UNORM_FCD, fcdTests, LENGTHOF(fcdTests));
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void assertEqual(const UChar* result, const char* expected, int32_t index)
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *expectedUni = CharsToUChars(expected);
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, expectedUni)!=0){
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR in decomposition at index = %d. EXPECTED: %s , GOT: %s\n", index, expected,
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            austrdup(result) );
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(expectedUni);
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNull_check(UChar *src, int32_t srcLen,
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UChar *exp, int32_t expLen,
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UNormalizationMode mode,
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const char *name)
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len, i;
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar   result[50];
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<50;i++)
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result[i] = 0xFFFD;
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    len = unorm_normalize(src, srcLen, mode, 0, result, 50, &status);
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
25750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("unorm_normalize(%s) with 0x0000 failed: %s - (Are you missing data?)\n", name, u_errorName(status));
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (len != expLen) {
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("unorm_normalize(%s) with 0x0000 failed: Expected len %d, got %d\n", name, expLen, len);
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for(i=0;i<len;i++){
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(exp[i] != result[i]) {
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("unorm_normalize(%s): @%d, expected \\u%04X got \\u%04X\n",
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  name,
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  i,
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  exp[i],
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  result[i]);
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("     %d: \\u%04X\n", i, result[i]);
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("unorm_normalize(%s) with 0x0000: OK\n", name);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestNull()
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar   source_comp[] = { 0x0061, 0x0000, 0x0044, 0x0307 };
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t source_comp_len = 4;
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar   expect_comp[] = { 0x0061, 0x0000, 0x1e0a };
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t expect_comp_len = 3;
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar   source_dcmp[] = { 0x1e0A, 0x0000, 0x0929 };
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t source_dcmp_len = 3;
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar   expect_dcmp[] = { 0x0044, 0x0307, 0x0000, 0x0928, 0x093C };
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t expect_dcmp_len = 5;
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestNull_check(source_comp,
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   source_comp_len,
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_comp,
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_comp_len,
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UNORM_NFC,
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   "UNORM_NFC");
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestNull_check(source_dcmp,
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   source_dcmp_len,
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_dcmp,
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_dcmp_len,
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UNORM_NFD,
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   "UNORM_NFD");
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestNull_check(source_comp,
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   source_comp_len,
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_comp,
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_comp_len,
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UNORM_NFKC,
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   "UNORM_NFKC");
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultNO()
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFD[] = {0x00C5, 0x0407, 0x1E00, 0x1F57, 0x220C,
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x30AE, 0xAC00, 0xD7A3, 0xFB36, 0xFB4E};
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFC[] = {0x0340, 0x0F93, 0x1F77, 0x1FBB, 0x1FEB,
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          0x2000, 0x232A, 0xF900, 0xFA1E, 0xFB4E};
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFKD[] = {0x00A0, 0x02E4, 0x1FDB, 0x24EA, 0x32FE,
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           0xAC00, 0xFB4E, 0xFA10, 0xFF3F, 0xFA2D};
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFKC[] = {0x00A0, 0x017F, 0x2000, 0x24EA, 0x32FE,
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           0x33FE, 0xFB4E, 0xFA10, 0xFF3F, 0xFA2D};
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const int SIZE = 10;
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int count = 0;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode error = U_ZERO_ERROR;
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (; count < SIZE; count ++)
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFD[count]), 1, UNORM_NFD, &error) !=
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                              UNORM_NO)
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFD quick check at U+%04x\n", CPNFD[count]);
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error) !=
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                              UNORM_NO)
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFC quick check at U+%04x\n", CPNFC[count]);
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFKD[count]), 1, UNORM_NFKD, &error) !=
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                              UNORM_NO)
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKD quick check at U+%04x\n", CPNFKD[count]);
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) !=
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                              UNORM_NO)
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]);
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultYES()
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFD[] = {0x00C6, 0x017F, 0x0F74, 0x1000, 0x1E9A,
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x2261, 0x3075, 0x4000, 0x5000, 0xF000};
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFC[] = {0x0400, 0x0540, 0x0901, 0x1000, 0x1500,
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x1E9A, 0x3000, 0x4000, 0x5000, 0xF000};
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFKD[] = {0x00AB, 0x02A0, 0x1000, 0x1027, 0x2FFB,
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          0x3FFF, 0x4FFF, 0xA000, 0xF000, 0xFA27};
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFKC[] = {0x00B0, 0x0100, 0x0200, 0x0A02, 0x1000,
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          0x2010, 0x3030, 0x4000, 0xA000, 0xFA0E};
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const int SIZE = 10;
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int count = 0;
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode error = U_ZERO_ERROR;
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar cp = 0;
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  while (cp < 0xA0)
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&cp, 1, UNORM_NFD, &error) != UNORM_YES)
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
38350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("ERROR in NFD quick check at U+%04x - (Are you missing data?)\n", cp);
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&cp, 1, UNORM_NFC, &error) !=
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UNORM_YES)
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFC quick check at U+%04x\n", cp);
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&cp, 1, UNORM_NFKD, &error) != UNORM_YES)
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKD quick check at U+%04x\n", cp);
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&cp, 1, UNORM_NFKC, &error) !=
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UNORM_YES)
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKC quick check at U+%04x\n", cp);
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cp ++;
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (; count < SIZE; count ++)
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFD[count]), 1, UNORM_NFD, &error) !=
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UNORM_YES)
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFD quick check at U+%04x\n", CPNFD[count]);
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error)
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                          != UNORM_YES)
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFC quick check at U+%04x\n", CPNFC[count]);
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFKD[count]), 1, UNORM_NFKD, &error) !=
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UNORM_YES)
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKD quick check at U+%04x\n", CPNFKD[count]);
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) !=
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UNORM_YES)
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]);
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultMAYBE()
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFC[] = {0x0306, 0x0654, 0x0BBE, 0x102E, 0x1161,
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x116A, 0x1173, 0x1175, 0x3099, 0x309A};
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFKC[] = {0x0300, 0x0654, 0x0655, 0x09D7, 0x0B3E,
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          0x0DCF, 0xDDF, 0x102E, 0x11A8, 0x3099};
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const int SIZE = 10;
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int count = 0;
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode error = U_ZERO_ERROR;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* NFD and NFKD does not have any MAYBE codepoints */
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (; count < SIZE; count ++)
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error) !=
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                           UNORM_MAYBE)
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
45450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("ERROR in NFC quick check at U+%04x - (Are you missing data?)\n", CPNFC[count]);
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) !=
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                           UNORM_MAYBE)
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]);
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckStringResult()
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int count;
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar *d = NULL;
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar *c = NULL;
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode error = U_ZERO_ERROR;
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (count = 0; count < LENGTHOF(canonTests); count ++)
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d = CharsToUChars(canonTests[count][1]);
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = CharsToUChars(canonTests[count][2]);
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(d, u_strlen(d), UNORM_NFD, &error) !=
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                            UNORM_YES)
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
48050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("ERROR in NFD quick check for string at count %d - (Are you missing data?)\n", count);
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(c, u_strlen(c), UNORM_NFC, &error) ==
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                            UNORM_NO)
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFC quick check for string at count %d\n", count);
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(d);
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(c);
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (count = 0; count < LENGTHOF(compatTests); count ++)
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d = CharsToUChars(compatTests[count][1]);
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = CharsToUChars(compatTests[count][2]);
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(d, u_strlen(d), UNORM_NFKD, &error) !=
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                            UNORM_YES)
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKD quick check for string at count %d\n", count);
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(c, u_strlen(c), UNORM_NFKC, &error) !=
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                            UNORM_YES)
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKC quick check for string at count %d\n", count);
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(d);
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(c);
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestQuickCheck()
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TestQuickCheckResultNO();
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TestQuickCheckResultYES();
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TestQuickCheckResultMAYBE();
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TestQuickCheckStringResult();
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The intltest/NormalizerConformanceTest tests a lot of strings that _are_
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * normalized, and some that are not.
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Here we pick some specific cases and test the C API.
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIsNormalized(void) {
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar notNFC[][8]={            /* strings that are not in NFC */
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x62, 0x61, 0x300, 0x63, 0 },         /* 0061 0300 compose */
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0xfb1d, 0 },                          /* excluded from composition */
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x0627, 0x0653, 0 },                  /* 0627 0653 compose */
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x3071, 0x306f, 0x309a, 0x3073, 0 }   /* 306F 309A compose */
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar notNFKC[][8]={           /* strings that are not in NFKC */
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x1100, 0x1161, 0 },                  /* Jamo compose */
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x1100, 0x314f, 0 },                  /* compatibility Jamo compose */
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x03b1, 0x1f00, 0x0345, 0x03b3, 0 }   /* 1F00 0345 compose */
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* API test */
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* normal case with length>=0 (length -1 used for special cases below) */
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!unorm_isNormalized(notNFC[0]+2, 1, UNORM_NFC, &errorCode) || U_FAILURE(errorCode)) {
55250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: !isNormalized(<U+0300>, NFC) (%s) - (Are you missing data?)\n", u_errorName(errorCode));
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* incoming U_FAILURE */
556b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_TRUNCATED_CHAR_FOUND;
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (void)unorm_isNormalized(notNFC[0]+2, 1, UNORM_NFC, &errorCode);
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_TRUNCATED_CHAR_FOUND) {
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: isNormalized(U_TRUNCATED_CHAR_FOUND) changed the error code to %s\n", u_errorName(errorCode));
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* NULL source */
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (void)unorm_isNormalized(NULL, 1, UNORM_NFC, &errorCode);
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
56650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: isNormalized(NULL) did not set U_ILLEGAL_ARGUMENT_ERROR but %s - (Are you missing data?)\n", u_errorName(errorCode));
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* bad length */
570b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (void)unorm_isNormalized(notNFC[0]+2, -2, UNORM_NFC, &errorCode);
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
57350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: isNormalized([-2]) did not set U_ILLEGAL_ARGUMENT_ERROR but %s - (Are you missing data?)\n", u_errorName(errorCode));
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* specific cases */
577b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(notNFC); ++i) {
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(unorm_isNormalized(notNFC[i], -1, UNORM_NFC, &errorCode) || U_FAILURE(errorCode)) {
58050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("error: isNormalized(notNFC[%d], NFC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode));
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(unorm_isNormalized(notNFC[i], -1, UNORM_NFKC, &errorCode) || U_FAILURE(errorCode)) {
58450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("error: isNormalized(notNFC[%d], NFKC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode));
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(notNFKC); ++i) {
588b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(unorm_isNormalized(notNFKC[i], -1, UNORM_NFKC, &errorCode) || U_FAILURE(errorCode)) {
59050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("error: isNormalized(notNFKC[%d], NFKC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode));
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
594b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestCheckFCD()
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UChar FAST_[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x0A};
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UChar FALSE_[] = {0x0001, 0x0002, 0x02EA, 0x03EB, 0x0300, 0x0301,
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          0x02B9, 0x0314, 0x0315, 0x0316};
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UChar TRUE_[] = {0x0030, 0x0040, 0x0440, 0x056D, 0x064F, 0x06E7,
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x0050, 0x0730, 0x09EE, 0x1E10};
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UChar datastr[][5] =
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { {0x0061, 0x030A, 0x1E05, 0x0302, 0},
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0061, 0x030A, 0x00E2, 0x0323, 0},
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0061, 0x0323, 0x00E2, 0x0323, 0},
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0061, 0x0323, 0x1E05, 0x0302, 0} };
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UBool result[] = {UNORM_YES, UNORM_NO, UNORM_NO, UNORM_YES};
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UChar datachar[] = {0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x6a,
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0xea,
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306,
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x0307, 0x0308, 0x0309, 0x030a,
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326,
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x0327, 0x0328, 0x0329, 0x032a,
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x1e00, 0x1e01, 0x1e02, 0x1e03, 0x1e04, 0x1e05, 0x1e06,
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x1e07, 0x1e08, 0x1e09, 0x1e0a};
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int count = 0;
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (unorm_quickCheck(FAST_, 10, UNORM_FCD, &status) != UNORM_YES)
62650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_data_err("unorm_quickCheck(FCD) failed: expected value for fast unorm_quickCheck is UNORM_YES - (Are you missing data?)\n");
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (unorm_quickCheck(FALSE_, 10, UNORM_FCD, &status) != UNORM_NO)
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("unorm_quickCheck(FCD) failed: expected value for error unorm_quickCheck is UNORM_NO\n");
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (unorm_quickCheck(TRUE_, 10, UNORM_FCD, &status) != UNORM_YES)
63050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_data_err("unorm_quickCheck(FCD) failed: expected value for correct unorm_quickCheck is UNORM_YES - (Are you missing data?)\n");
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (U_FAILURE(status))
63350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_data_err("unorm_quickCheck(FCD) failed: %s - (Are you missing data?)\n", u_errorName(status));
634b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  while (count < 4)
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
637b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool fcdresult = unorm_quickCheck(datastr[count], 4, UNORM_FCD, &status);
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
63950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("unorm_quickCheck(FCD) failed: exception occured at data set %d - (Are you missing data?)\n", count);
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
643b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (result[count] != fcdresult) {
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("unorm_quickCheck(FCD) failed: Data set %d expected value %d\n", count,
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 result[count]);
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count ++;
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* random checks of long strings */
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  status = U_ZERO_ERROR;
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  srand((unsigned)time( NULL ));
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (count = 0; count < 50; count ++)
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int size = 0;
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool testresult = UNORM_YES;
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar data[20];
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar norm[100];
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar nfd[100];
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int normsize = 0;
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int nfdsize = 0;
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (size != 19) {
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      data[size] = datachar[(rand() * 50) / RAND_MAX];
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("0x%x", data[size]);
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      normsize += unorm_normalize(data + size, 1, UNORM_NFD, 0,
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  norm + normsize, 100 - normsize, &status);
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (U_FAILURE(status)) {
67150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("unorm_quickCheck(FCD) failed: exception occured at data generation - (Are you missing data?)\n");
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      size ++;
675b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfdsize = unorm_normalize(data, size, UNORM_NFD, 0,
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              nfd, 100, &status);
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
68150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("unorm_quickCheck(FCD) failed: exception occured at normalized data generation - (Are you missing data?)\n");
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (nfdsize != normsize || u_memcmp(nfd, norm, nfdsize) != 0) {
685b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      testresult = UNORM_NO;
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (testresult == UNORM_YES) {
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("result UNORM_YES\n");
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("result UNORM_NO\n");
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(data, size, UNORM_FCD, &status) != testresult || U_FAILURE(status)) {
69550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("unorm_quickCheck(FCD) failed: expected %d for random data - (Are you missing data?)\n", testresult);
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
699b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestAPI() {
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar in[]={ 0x68, 0xe4 };
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar out[20]={ 0xffff, 0xffff, 0xffff, 0xffff };
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* try preflighting */
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_normalize(in, 2, UNORM_NFD, 0, NULL, 0, &errorCode);
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=3) {
71150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("unorm_normalize(pure preflighting NFD)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
715b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_normalize(in, 2, UNORM_NFD, 0, out, 3, &errorCode);
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("unorm_normalize(NFD)=%ld failed with %s\n", length, u_errorName(errorCode));
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(length!=3 || out[2]!=0x308 || out[3]!=0xffff) {
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("unorm_normalize(NFD ma<umlaut>)=%ld failed with out[]=U+%04x U+%04x U+%04x U+%04x\n", length, out[0], out[1], out[2], out[3]);
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
72527f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm_normalize(NULL, 0, UNORM_NFC, 0, NULL, 0, &errorCode);
72627f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode)) {
72727f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("unorm_normalize(src NULL[0], NFC, dest NULL[0])=%ld failed with %s\n", (long)length, u_errorName(errorCode));
72827f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
72927f654740f2a26ad62a5c155af9199af9e69b889claireho    }
73027f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm_normalize(NULL, 0, UNORM_NFC, 0, out, 20, &errorCode);
73127f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode)) {
73227f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("unorm_normalize(src NULL[0], NFC, dest out[20])=%ld failed with %s\n", (long)length, u_errorName(errorCode));
73327f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
73427f654740f2a26ad62a5c155af9199af9e69b889claireho    }
735b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
736b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
737b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test cases to improve test code coverage */
738b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_K_KIYEOK=0x3131,         /* NFKD->Jamo L U+1100 */
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_K_WEO=0x315d,            /* NFKD->Jamo V U+116f */
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_K_KIYEOK_SIOS=0x3133,    /* NFKD->Jamo T U+11aa */
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_KIYEOK=0x1100,           /* Jamo L U+1100 */
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_WEO=0x116f,              /* Jamo V U+116f */
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_KIYEOK_SIOS=0x11aa,      /* Jamo T U+11aa */
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_AC00=0xac00,             /* Hangul syllable = Jamo LV U+ac00 */
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_SYLLABLE=0xac00+14*28+3, /* Hangul syllable = U+1100 * U+116f * U+11aa */
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MUSICAL_VOID_NOTEHEAD=0x1d157,
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MUSICAL_HALF_NOTE=0x1d15e,  /* NFC/NFD->Notehead+Stem */
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MUSICAL_STEM=0x1d165,       /* cc=216 */
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MUSICAL_STACCATO=0x1d17c    /* cc=220 */
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNormCoverage() {
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar input[1000], expect[1000], output[1000];
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, length, inLength, expectLength, hangulPrefixLength, preflightLength;
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* create a long and nasty string with NFKC-unsafe characters */
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inLength=0;
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* 3 Jamos L/V/T, all 8 combinations normal/compatibility */
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK;
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_WEO;
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK_SIOS;
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK;
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_WEO;
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK_SIOS;
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK;
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_WEO;
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK_SIOS;
777b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
778b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK;
779b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_WEO;
780b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK_SIOS;
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK;
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_WEO;
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK_SIOS;
785b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
786b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK;
787b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_WEO;
788b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK_SIOS;
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK;
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_WEO;
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK_SIOS;
793b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
794b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK;
795b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_WEO;
796b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK_SIOS;
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Hangul LV with normal/compatibility Jamo T */
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_AC00;
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK_SIOS;
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_AC00;
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK_SIOS;
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* compatibility Jamo L, V */
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK;
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_WEO;
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    hangulPrefixLength=inLength;
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=UTF16_LEAD(MUSICAL_HALF_NOTE);
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=UTF16_TRAIL(MUSICAL_HALF_NOTE);
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<200; ++i) {
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        input[inLength++]=UTF16_LEAD(MUSICAL_STACCATO);
815b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        input[inLength++]=UTF16_TRAIL(MUSICAL_STACCATO);
816b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        input[inLength++]=UTF16_LEAD(MUSICAL_STEM);
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        input[inLength++]=UTF16_TRAIL(MUSICAL_STEM);
818b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
819b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
820b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* (compatibility) Jamo L, T do not compose */
821b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK;
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK_SIOS;
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* quick checks */
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_NFD, &errorCode) || U_FAILURE(errorCode)) {
82750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_quickCheck(long input, UNORM_NFD)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode));
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_NFKD, &errorCode) || U_FAILURE(errorCode)) {
83150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_quickCheck(long input, UNORM_NFKD)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode));
832b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
833b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
834b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_NFC, &errorCode) || U_FAILURE(errorCode)) {
83550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_quickCheck(long input, UNORM_NFC)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode));
836b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
837b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
838b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_NFKC, &errorCode) || U_FAILURE(errorCode)) {
83950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_quickCheck(long input, UNORM_NFKC)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode));
840b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
841b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
842b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_FCD, &errorCode) || U_FAILURE(errorCode)) {
84350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_quickCheck(long input, UNORM_FCD)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode));
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* NFKC */
847b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectLength=0;
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_SYLLABLE;
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_SYLLABLE;
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
852b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_SYLLABLE;
853b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
854b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_SYLLABLE;
855b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
856b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_SYLLABLE;
857b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
858b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_SYLLABLE;
859b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
860b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_SYLLABLE;
861b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
862b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_SYLLABLE;
863b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
864b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_AC00+3;
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_AC00+3;
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_AC00+14*28;
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=UTF16_LEAD(MUSICAL_VOID_NOTEHEAD);
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=UTF16_TRAIL(MUSICAL_VOID_NOTEHEAD);
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=UTF16_LEAD(MUSICAL_STEM);
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=UTF16_TRAIL(MUSICAL_STEM);
874b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<200; ++i) {
875b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect[expectLength++]=UTF16_LEAD(MUSICAL_STEM);
876b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect[expectLength++]=UTF16_TRAIL(MUSICAL_STEM);
877b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<200; ++i) {
879b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect[expectLength++]=UTF16_LEAD(MUSICAL_STACCATO);
880b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect[expectLength++]=UTF16_TRAIL(MUSICAL_STACCATO);
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
883b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_KIYEOK;
884b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_KIYEOK_SIOS;
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* try destination overflow first */
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    preflightLength=unorm_normalize(input, inLength,
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           UNORM_NFKC, 0,
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           output, 100, /* too short */
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &errorCode);
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR) {
89350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_normalize(long input, output too short, UNORM_NFKC) did not overflow but %s - (Are you missing data?)\n", u_errorName(errorCode));
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* real NFKC */
897b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_normalize(input, inLength,
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           UNORM_NFKC, 0,
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           output, sizeof(output)/U_SIZEOF_UCHAR,
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &errorCode);
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
90350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_normalize(long input, UNORM_NFKC) failed with %s - (Are you missing data?)\n", u_errorName(errorCode));
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(length!=expectLength || u_memcmp(output, expect, length)!=0) {
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_normalize(long input, UNORM_NFKC) produced wrong result\n");
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i=0; i<length; ++i) {
907b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(output[i]!=expect[i]) {
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("    NFKC[%d]==U+%04lx expected U+%04lx\n", i, output[i], expect[i]);
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(length!=preflightLength) {
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_normalize(long input, UNORM_NFKC)==%ld but preflightLength==%ld\n", length, preflightLength);
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* FCD */
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_memcpy(expect, input, hangulPrefixLength);
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectLength=hangulPrefixLength;
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=UTF16_LEAD(MUSICAL_VOID_NOTEHEAD);
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=UTF16_TRAIL(MUSICAL_VOID_NOTEHEAD);
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=UTF16_LEAD(MUSICAL_STEM);
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=UTF16_TRAIL(MUSICAL_STEM);
925b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<200; ++i) {
926b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect[expectLength++]=UTF16_LEAD(MUSICAL_STEM);
927b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect[expectLength++]=UTF16_TRAIL(MUSICAL_STEM);
928b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<200; ++i) {
930b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect[expectLength++]=UTF16_LEAD(MUSICAL_STACCATO);
931b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect[expectLength++]=UTF16_TRAIL(MUSICAL_STACCATO);
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
934b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_K_KIYEOK;
935b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_K_KIYEOK_SIOS;
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_normalize(input, inLength,
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           UNORM_FCD, 0,
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           output, sizeof(output)/U_SIZEOF_UCHAR,
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &errorCode);
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
94350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_normalize(long input, UNORM_FCD) failed with %s - (Are you missing data?)\n", u_errorName(errorCode));
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(length!=expectLength || u_memcmp(output, expect, length)!=0) {
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_normalize(long input, UNORM_FCD) produced wrong result\n");
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i=0; i<length; ++i) {
947b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(output[i]!=expect[i]) {
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("    FCD[%d]==U+%04lx expected U+%04lx\n", i, output[i], expect[i]);
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* API test for unorm_concatenate() - for real test strings see intltest/tstnorm.cpp */
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestConcatenate(void) {
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* "re + 'sume'" */
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    left[]={
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x72, 0x65, 0
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    right[]={
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x301, 0x73, 0x75, 0x6d, 0xe9, 0
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[]={
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x72, 0xe9, 0x73, 0x75, 0x6d, 0xe9, 0
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[100];
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* left with length, right NUL-terminated */
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(left, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode);
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=6 || 0!=u_memcmp(buffer, expect, length)) {
97850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: unorm_concatenate()=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* preflighting */
982b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(left, 2, right, -1, NULL, 0, UNORM_NFC, 0, &errorCode);
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=6) {
98550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: unorm_concatenate(preflighting)=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[2]=0x5555;
989b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(left, 2, right, -1, buffer, 1, UNORM_NFC, 0, &errorCode);
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=6 || buffer[2]!=0x5555) {
99250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: unorm_concatenate(preflighting 2)=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* enter with U_FAILURE */
996b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[2]=0xaaaa;
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_UNEXPECTED_TOKEN;
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(left, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode);
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_UNEXPECTED_TOKEN || buffer[2]!=0xaaaa) {
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: unorm_concatenate(failure)=%ld failed with %s\n", length, u_errorName(errorCode));
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* illegal arguments */
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[2]=0xaaaa;
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(NULL, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode);
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || buffer[2]!=0xaaaa) {
100850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: unorm_concatenate(left=NULL)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1012b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(left, 2, right, -1, NULL, 100, UNORM_NFC, 0, &errorCode);
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
101450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: unorm_concatenate(buffer=NULL)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1018b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _PLUS=0x2b
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *const _modeString[UNORM_MODE_COUNT]={
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "0", "NONE", "NFD", "NFKD", "NFC", "NFKC", "FCD"
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testIter(const UChar *src, int32_t srcLength,
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UCharIterator *iter, UNormalizationMode mode, UBool forward,
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          const UChar *out, int32_t outLength,
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          const int32_t *srcIndexes, int32_t srcIndexesLength) {
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[4];
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *expect, *outLimit, *in;
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length, i, expectLength, expectIndex, prevIndex, index, inLength;
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool neededToNormalize, expectNeeded;
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    outLimit=out+outLength;
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(forward) {
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect=out;
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        i=index=0;
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect=outLimit;
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        i=srcIndexesLength-2;
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index=srcLength;
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(;;) {
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        prevIndex=index;
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(forward) {
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(!iter->hasNext(iter)) {
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length=unorm_next(iter,
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              mode, 0,
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              (UBool)(out!=NULL), &neededToNormalize,
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              &errorCode);
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectIndex=srcIndexes[i+1];
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            in=src+prevIndex;
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            inLength=expectIndex-prevIndex;
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(out!=NULL) {
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* get output piece from between plus signs */
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectLength=0;
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                while((expect+expectLength)!=outLimit && expect[expectLength]!=_PLUS) {
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ++expectLength;
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectNeeded=(UBool)(0!=u_memcmp(buffer, in, inLength));
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expect=in;
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectLength=inLength;
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectNeeded=FALSE;
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(!iter->hasPrevious(iter)) {
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length=unorm_previous(iter,
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  mode, 0,
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  (UBool)(out!=NULL), &neededToNormalize,
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  &errorCode);
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectIndex=srcIndexes[i];
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            in=src+expectIndex;
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            inLength=prevIndex-expectIndex;
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(out!=NULL) {
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* get output piece from between plus signs */
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectLength=0;
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                while(expect!=out && expect[-1]!=_PLUS) {
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ++expectLength;
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    --expect;
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectNeeded=(UBool)(0!=u_memcmp(buffer, in, inLength));
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expect=in;
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectLength=inLength;
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectNeeded=FALSE;
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index=iter->getIndex(iter, UITER_CURRENT);
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
110550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("error unorm iteration (next/previous %d %s)[%d]: %s - (Are you missing data?)\n",
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    forward, _modeString[mode], i, u_errorName(errorCode));
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(expectIndex!=index) {
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error unorm iteration (next/previous %d %s): index[%d] wrong, got %d expected %d\n",
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    forward, _modeString[mode], i, index, expectIndex);
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(expectLength!=length) {
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error unorm iteration (next/previous %d %s): length[%d] wrong, got %d expected %d\n",
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    forward, _modeString[mode], i, length, expectLength);
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(0!=u_memcmp(expect, buffer, length)) {
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error unorm iteration (next/previous %d %s): output string[%d] wrong\n",
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    forward, _modeString[mode], i);
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(neededToNormalize!=expectNeeded) {
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(forward) {
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expect+=expectLength+1; /* go after the + */
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ++i;
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            --expect; /* go before the + */
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            --i;
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNextPrevious() {
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src[]={ /* input string */
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xa0, 0xe4, 0x63, 0x302, 0x327, 0xac00, 0x3133
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfd[]={ /* + separates expected output pieces */
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xa0, _PLUS, 0x61, 0x308, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0x1100, 0x1161, _PLUS, 0x3133
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfkd[]={
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20, _PLUS, 0x61, 0x308, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0x1100, 0x1161, _PLUS, 0x11aa
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfc[]={
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xa0, _PLUS, 0xe4, _PLUS, 0xe7, 0x302, _PLUS, 0xac00, _PLUS, 0x3133
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfkc[]={
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20, _PLUS, 0xe4, _PLUS, 0xe7, 0x302, _PLUS, 0xac03
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fcd[]={
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xa0, _PLUS, 0xe4, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0xac00, _PLUS, 0x3133
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* expected iterator indexes in the source string for each iteration piece */
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const int32_t
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfdIndexes[]={
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 2, 5, 6, 7
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfkdIndexes[]={
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 2, 5, 6, 7
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfcIndexes[]={
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 2, 5, 6, 7
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfkcIndexes[]={
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 2, 5, 7
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fcdIndexes[]={
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 2, 5, 6, 7
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIterator iter;
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[4];
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool neededToNormalize;
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uiter_setString(&iter, src, sizeof(src)/U_SIZEOF_UCHAR);
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test iteration with doNormalize */
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, TRUE, nfd, sizeof(nfd)/U_SIZEOF_UCHAR, nfdIndexes, sizeof(nfdIndexes)/4);
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, TRUE, nfkd, sizeof(nfkd)/U_SIZEOF_UCHAR, nfkdIndexes, sizeof(nfkdIndexes)/4);
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, TRUE, nfc, sizeof(nfc)/U_SIZEOF_UCHAR, nfcIndexes, sizeof(nfcIndexes)/4);
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, TRUE, nfkc, sizeof(nfkc)/U_SIZEOF_UCHAR, nfkcIndexes, sizeof(nfkcIndexes)/4);
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, TRUE, fcd, sizeof(fcd)/U_SIZEOF_UCHAR, fcdIndexes, sizeof(fcdIndexes)/4);
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, FALSE, nfd, sizeof(nfd)/U_SIZEOF_UCHAR, nfdIndexes, sizeof(nfdIndexes)/4);
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, FALSE, nfkd, sizeof(nfkd)/U_SIZEOF_UCHAR, nfkdIndexes, sizeof(nfkdIndexes)/4);
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, FALSE, nfc, sizeof(nfc)/U_SIZEOF_UCHAR, nfcIndexes, sizeof(nfcIndexes)/4);
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, FALSE, nfkc, sizeof(nfkc)/U_SIZEOF_UCHAR, nfkcIndexes, sizeof(nfkcIndexes)/4);
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, FALSE, fcd, sizeof(fcd)/U_SIZEOF_UCHAR, fcdIndexes, sizeof(fcdIndexes)/4);
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test iteration without doNormalize */
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, TRUE, NULL, 0, nfdIndexes, sizeof(nfdIndexes)/4);
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, TRUE, NULL, 0, nfkdIndexes, sizeof(nfkdIndexes)/4);
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, TRUE, NULL, 0, nfcIndexes, sizeof(nfcIndexes)/4);
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, TRUE, NULL, 0, nfkcIndexes, sizeof(nfkcIndexes)/4);
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, TRUE, NULL, 0, fcdIndexes, sizeof(fcdIndexes)/4);
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, FALSE, NULL, 0, nfdIndexes, sizeof(nfdIndexes)/4);
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, FALSE, NULL, 0, nfkdIndexes, sizeof(nfkdIndexes)/4);
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, FALSE, NULL, 0, nfcIndexes, sizeof(nfcIndexes)/4);
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, FALSE, NULL, 0, nfkcIndexes, sizeof(nfkcIndexes)/4);
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, FALSE, NULL, 0, fcdIndexes, sizeof(fcdIndexes)/4);
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* try without neededToNormalize */
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=5;
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UNORM_NFD, 0, TRUE, NULL,
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=2 || buffer[0]!=nfd[2] || buffer[1]!=nfd[3]) {
124150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_next(without needed) %s - (Are you missing data?)\n", u_errorName(errorCode));
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* preflight */
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    neededToNormalize=9;
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(&iter, NULL, 0,
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UNORM_NFD, 0, TRUE, &neededToNormalize,
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || neededToNormalize!=FALSE || length!=2) {
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_next(pure preflighting) %s\n", u_errorName(errorCode));
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=buffer[1]=5;
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    neededToNormalize=9;
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(&iter, buffer, 1,
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UNORM_NFD, 0, TRUE, &neededToNormalize,
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || neededToNormalize!=FALSE || length!=2 || buffer[1]!=5) {
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_next(preflighting) %s\n", u_errorName(errorCode));
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* no iterator */
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=buffer[1]=5;
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    neededToNormalize=9;
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(NULL, buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UNORM_NFD, 0, TRUE, &neededToNormalize,
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_next(no iterator) %s\n", u_errorName(errorCode));
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* illegal mode */
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=buffer[1]=5;
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    neededToNormalize=9;
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      (UNormalizationMode)0, 0, TRUE, &neededToNormalize,
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_next(illegal mode) %s\n", u_errorName(errorCode));
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* error coming in */
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_MISPLACED_QUANTIFIER;
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=5;
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UNORM_NFD, 0, TRUE, NULL,
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_MISPLACED_QUANTIFIER) {
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_next(U_MISPLACED_QUANTIFIER) %s\n", u_errorName(errorCode));
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestFCNFKCClosure(void) {
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar32 c;
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UChar s[6];
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } tests[]={
131250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 0x00C4, { 0 } },
131350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 0x00E4, { 0 } },
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x037A, { 0x0020, 0x03B9, 0 } },
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x03D2, { 0x03C5, 0 } },
1316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x20A8, { 0x0072, 0x0073, 0 } },
1317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x210B, { 0x0068, 0 } },
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x210C, { 0x0068, 0 } },
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x2121, { 0x0074, 0x0065, 0x006C, 0 } },
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x2122, { 0x0074, 0x006D, 0 } },
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x2128, { 0x007A, 0 } },
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x1D5DB, { 0x0068, 0 } },
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x1D5ED, { 0x007A, 0 } },
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x0061, { 0 } }
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[8];
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, length;
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(tests); ++i) {
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=u_getFC_NFKC_Closure(tests[i].c, buffer, LENGTHOF(buffer), &errorCode);
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode) || length!=u_strlen(buffer) || 0!=u_strcmp(tests[i].s, buffer)) {
133550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("u_getFC_NFKC_Closure(U+%04lx) is wrong (%s) - (Are you missing data?)\n", tests[i].c, u_errorName(errorCode));
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* error handling */
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_getFC_NFKC_Closure(0x5c, NULL, LENGTHOF(buffer), &errorCode);
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_getFC_NFKC_Closure(dest=NULL) is wrong (%s)\n", u_errorName(errorCode));
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_getFC_NFKC_Closure(0x5c, buffer, LENGTHOF(buffer), &errorCode);
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_getFC_NFKC_Closure(U_FAILURE) is wrong (%s)\n", u_errorName(errorCode));
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestQuickCheckPerCP() {
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 c, lead, trail;
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar s[U16_MAX_LENGTH], nfd[16];
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length, lccc1, lccc2, tccc1, tccc2;
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t qc1, qc2;
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_NFD_QUICK_CHECK)!=(int32_t)UNORM_YES ||
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_NFKD_QUICK_CHECK)!=(int32_t)UNORM_YES ||
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_NFC_QUICK_CHECK)!=(int32_t)UNORM_MAYBE ||
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_NFKC_QUICK_CHECK)!=(int32_t)UNORM_MAYBE ||
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_LEAD_CANONICAL_COMBINING_CLASS)!=u_getIntPropertyMaxValue(UCHAR_CANONICAL_COMBINING_CLASS) ||
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_TRAIL_CANONICAL_COMBINING_CLASS)!=u_getIntPropertyMaxValue(UCHAR_CANONICAL_COMBINING_CLASS)
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("wrong result from one of the u_getIntPropertyMaxValue(UCHAR_NF*_QUICK_CHECK) or UCHAR_*_CANONICAL_COMBINING_CLASS\n");
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * compare the quick check property values for some code points
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * to the quick check results for checking same-code point strings
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c=0;
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(c<0x110000) {
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=0;
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U16_APPEND_UNSAFE(s, length, c);
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc1=u_getIntPropertyValue(c, UCHAR_NFC_QUICK_CHECK);
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc2=unorm_quickCheck(s, length, UNORM_NFC, &errorCode);
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(qc1!=qc2) {
138450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("u_getIntPropertyValue(NFC)=%d != %d=unorm_quickCheck(NFC) for U+%04x - (Are you missing data?)\n", qc1, qc2, c);
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc1=u_getIntPropertyValue(c, UCHAR_NFD_QUICK_CHECK);
1388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc2=unorm_quickCheck(s, length, UNORM_NFD, &errorCode);
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(qc1!=qc2) {
139050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("u_getIntPropertyValue(NFD)=%d != %d=unorm_quickCheck(NFD) for U+%04x - (Are you missing data?)\n", qc1, qc2, c);
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc1=u_getIntPropertyValue(c, UCHAR_NFKC_QUICK_CHECK);
1394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc2=unorm_quickCheck(s, length, UNORM_NFKC, &errorCode);
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(qc1!=qc2) {
139650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("u_getIntPropertyValue(NFKC)=%d != %d=unorm_quickCheck(NFKC) for U+%04x - (Are you missing data?)\n", qc1, qc2, c);
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc1=u_getIntPropertyValue(c, UCHAR_NFKD_QUICK_CHECK);
1400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc2=unorm_quickCheck(s, length, UNORM_NFKD, &errorCode);
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(qc1!=qc2) {
140250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("u_getIntPropertyValue(NFKD)=%d != %d=unorm_quickCheck(NFKD) for U+%04x - (Are you missing data?)\n", qc1, qc2, c);
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=unorm_normalize(s, length, UNORM_NFD, 0, nfd, LENGTHOF(nfd), &errorCode);
1406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* length-length == 0 is used to get around a compiler warning. */
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U16_GET(nfd, 0, length-length, length, lead);
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U16_GET(nfd, 0, length-1, length, trail);
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lccc1=u_getIntPropertyValue(c, UCHAR_LEAD_CANONICAL_COMBINING_CLASS);
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lccc2=u_getCombiningClass(lead);
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tccc1=u_getIntPropertyValue(c, UCHAR_TRAIL_CANONICAL_COMBINING_CLASS);
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tccc2=u_getCombiningClass(trail);
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(lccc1!=lccc2) {
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_getIntPropertyValue(lccc)=%d != %d=u_getCombiningClass(lead) for U+%04x\n",
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    lccc1, lccc2, c);
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(tccc1!=tccc2) {
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_getIntPropertyValue(tccc)=%d != %d=u_getCombiningClass(trail) for U+%04x\n",
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    tccc1, tccc2, c);
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* skip some code points */
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=(20*c)/19+1;
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestComposition(void) {
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UNormalizationMode mode;
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t options;
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar input[12];
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar expect[12];
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } cases[]={
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * special cases for UAX #15 bug
143950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * see Unicode Corrigendum #5: Normalization Idempotency
144050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * at http://unicode.org/versions/corrigendum5.html
144150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * (was Public Review Issue #29)
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
1443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UNORM_NFC, 0, { 0x1100, 0x0300, 0x1161, 0x0327 },         { 0x1100, 0x0300, 0x1161, 0x0327 } },
1444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UNORM_NFC, 0, { 0x1100, 0x0300, 0x1161, 0x0327, 0x11a8 }, { 0x1100, 0x0300, 0x1161, 0x0327, 0x11a8 } },
1445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UNORM_NFC, 0, { 0xac00, 0x0300, 0x0327, 0x11a8 },         { 0xac00, 0x0327, 0x0300, 0x11a8 } },
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UNORM_NFC, 0, { 0x0b47, 0x0300, 0x0b3e },                 { 0x0b47, 0x0300, 0x0b3e } },
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* TODO: add test cases for UNORM_FCC here (j2151) */
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar output[16];
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, length;
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(cases); ++i) {
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=unorm_normalize(
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    cases[i].input, -1,
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    cases[i].mode, cases[i].options,
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    output, LENGTHOF(output),
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    &errorCode);
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( U_FAILURE(errorCode) ||
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length!=u_strlen(cases[i].expect) ||
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            0!=u_memcmp(output, cases[i].expect, length)
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
146650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("unexpected result for case %d - (Are you missing data?)\n", i);
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147127f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void
147227f654740f2a26ad62a5c155af9199af9e69b889clairehoTestGetDecomposition() {
147327f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar decomp[32];
147427f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t length;
147527f654740f2a26ad62a5c155af9199af9e69b889claireho
147627f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode errorCode=U_ZERO_ERROR;
147727f654740f2a26ad62a5c155af9199af9e69b889claireho    const UNormalizer2 *n2=unorm2_getInstance(NULL, "nfc", UNORM2_COMPOSE_CONTIGUOUS, &errorCode);
147827f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode)) {
147927f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(errorCode, "unorm2_getInstance(nfc/FCC) failed: %s\n", u_errorName(errorCode));
148027f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
148127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
148227f654740f2a26ad62a5c155af9199af9e69b889claireho
148327f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0x20, decomp, LENGTHOF(decomp), &errorCode);
148427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode) || length>=0) {
148527f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("unorm2_getDecomposition(space) failed\n");
148627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
148727f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
148827f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0xe4, decomp, LENGTHOF(decomp), &errorCode);
148927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0x61 || decomp[1]!=0x308 || decomp[2]!=0) {
149027f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("unorm2_getDecomposition(a-umlaut) failed\n");
149127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
149227f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
149327f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0xac01, decomp, LENGTHOF(decomp), &errorCode);
149427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode) || length!=3 || decomp[0]!=0x1100 || decomp[1]!=0x1161 || decomp[2]!=0x11a8 || decomp[3]!=0) {
149527f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("unorm2_getDecomposition(Hangul syllable U+AC01) failed\n");
149627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
149727f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
149827f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0xac01, NULL, 0, &errorCode);
149927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=3) {
150027f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("unorm2_getDecomposition(Hangul syllable U+AC01) overflow failed\n");
150127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
150227f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
150327f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0xac01, decomp, -1, &errorCode);
150427f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
150527f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("unorm2_getDecomposition(capacity<0) failed\n");
150627f654740f2a26ad62a5c155af9199af9e69b889claireho    }
150727f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
150827f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0xac01, NULL, 4, &errorCode);
150927f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
151027f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("unorm2_getDecomposition(decomposition=NULL) failed\n");
151127f654740f2a26ad62a5c155af9199af9e69b889claireho    }
151227f654740f2a26ad62a5c155af9199af9e69b889claireho}
151327f654740f2a26ad62a5c155af9199af9e69b889claireho
1514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_NORMALIZATION */
1515