1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/********************************************************************
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * COPYRIGHT:
354dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius * Copyright (c) 1997-2012, 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"
19103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius#include "unicode/utf16.h"
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cintltst.h"
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
2254dcd9b6a06071f647dac967e9e267abb9410720Craig Cornelius#if !UCONFIG_NO_NORMALIZATION
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h>
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <time.h>
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/uchar.h"
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/ustring.h"
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "unicode/unorm.h"
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "cnormtst.h"
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define LENGTHOF(array) (int32_t)(sizeof(array)/sizeof ((array)[0]))
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestAPI(void);
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNormCoverage(void);
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestConcatenate(void);
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNextPrevious(void);
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIsNormalized(void);
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestFCNFKCClosure(void);
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestQuickCheckPerCP(void);
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestComposition(void);
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
5627f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void
5727f654740f2a26ad62a5c155af9199af9e69b889clairehoTestFCD(void);
5827f654740f2a26ad62a5c155af9199af9e69b889claireho
5927f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void
6027f654740f2a26ad62a5c155af9199af9e69b889clairehoTestGetDecomposition(void);
6127f654740f2a26ad62a5c155af9199af9e69b889claireho
62103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void
63103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusTestGetRawDecomposition(void);
64103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
65b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void TestAppendRestoreMiddle(void);
66103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void TestGetEasyToUseInstance(void);
67b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
6827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const canonTests[][3] = {
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Input*/                    /*Decomposed*/                /*Composed*/
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "cat",                    "cat",                        "cat"                    },
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00e0ardvark",            "a\\u0300ardvark",            "\\u00e0ardvark",        },
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u1e0a",                "D\\u0307",                    "\\u1e0a"                }, /* D-dot_above*/
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "D\\u0307",                "D\\u0307",                    "\\u1e0a"                }, /* D dot_above*/
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u1e0c\\u0307",            "D\\u0323\\u0307",            "\\u1e0c\\u0307"        }, /* D-dot_below dot_above*/
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u1e0a\\u0323",            "D\\u0323\\u0307",            "\\u1e0c\\u0307"        }, /* D-dot_above dot_below */
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "D\\u0307\\u0323",        "D\\u0323\\u0307",            "\\u1e0c\\u0307"        }, /* D dot_below dot_above */
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u1e10\\u0307\\u0323",    "D\\u0327\\u0323\\u0307",    "\\u1e10\\u0323\\u0307"    }, /*D dot_below cedilla dot_above*/
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "D\\u0307\\u0328\\u0323",    "D\\u0328\\u0323\\u0307",    "\\u1e0c\\u0328\\u0307"    }, /* D dot_above ogonek dot_below*/
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u1E14",                "E\\u0304\\u0300",            "\\u1E14"                }, /* E-macron-grave*/
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u0112\\u0300",            "E\\u0304\\u0300",            "\\u1E14"                }, /* E-macron + grave*/
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00c8\\u0304",            "E\\u0300\\u0304",            "\\u00c8\\u0304"        }, /* E-grave + macron*/
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u212b",                "A\\u030a",                    "\\u00c5"                }, /* angstrom_sign*/
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00c5",                "A\\u030a",                    "\\u00c5"                }, /* A-ring*/
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00C4ffin",            "A\\u0308ffin",                "\\u00C4ffin"                    },
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00C4\\uFB03n",        "A\\u0308\\uFB03n",            "\\u00C4\\uFB03n"                },
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "Henry IV",                "Henry IV",                    "Henry IV"                },
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "Henry \\u2163",            "Henry \\u2163",            "Henry \\u2163"            },
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u30AC",                "\\u30AB\\u3099",            "\\u30AC"                }, /* ga (Katakana)*/
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u30AB\\u3099",            "\\u30AB\\u3099",            "\\u30AC"                }, /*ka + ten*/
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\uFF76\\uFF9E",            "\\uFF76\\uFF9E",            "\\uFF76\\uFF9E"        }, /* hw_ka + hw_ten*/
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u30AB\\uFF9E",            "\\u30AB\\uFF9E",            "\\u30AB\\uFF9E"        }, /* ka + hw_ten*/
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\uFF76\\u3099",            "\\uFF76\\u3099",            "\\uFF76\\u3099"        },  /* hw_ka + ten*/
10127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "A\\u0300\\u0316",           "A\\u0316\\u0300",           "\\u00C0\\u0316"        },  /* hw_ka + ten*/
10227f654740f2a26ad62a5c155af9199af9e69b889claireho    { "", "", "" }
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const compatTests[][3] = {
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Input*/                        /*Decomposed    */                /*Composed*/
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "cat",                        "cat",                            "cat"                },
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\uFB4f",                    "\\u05D0\\u05DC",                "\\u05D0\\u05DC"    }, /* Alef-Lamed vs. Alef, Lamed*/
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00C4ffin",                "A\\u0308ffin",                    "\\u00C4ffin"             },
112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u00C4\\uFB03n",            "A\\u0308ffin",                    "\\u00C4ffin"                }, /* ffi ligature -> f + f + i*/
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "Henry IV",                    "Henry IV",                        "Henry IV"            },
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "Henry \\u2163",                "Henry IV",                        "Henry IV"            },
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u30AC",                    "\\u30AB\\u3099",                "\\u30AC"            }, /* ga (Katakana)*/
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\u30AB\\u3099",                "\\u30AB\\u3099",                "\\u30AC"            }, /*ka + ten*/
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\uFF76\\u3099",                "\\u30AB\\u3099",                "\\u30AC"            }, /* hw_ka + ten*/
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*These two are broken in Unicode 2.1.2 but fixed in 2.1.5 and later*/
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    { "\\uFF76\\uFF9E",                "\\u30AB\\u3099",                "\\u30AC"            }, /* hw_ka + hw_ten*/
12427f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u30AB\\uFF9E",                "\\u30AB\\u3099",                "\\u30AC"            }, /* ka + hw_ten*/
12527f654740f2a26ad62a5c155af9199af9e69b889claireho    { "", "", "" }
12627f654740f2a26ad62a5c155af9199af9e69b889claireho};
12727f654740f2a26ad62a5c155af9199af9e69b889claireho
12827f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const fcdTests[][3] = {
12927f654740f2a26ad62a5c155af9199af9e69b889claireho    /* Added for testing the below-U+0300 prefix of a NUL-terminated string. */
13027f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u010e\\u0327", "D\\u0327\\u030c", NULL },  /* D-caron + cedilla */
13127f654740f2a26ad62a5c155af9199af9e69b889claireho    { "\\u010e", "\\u010e", NULL }  /* D-caron */
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNormTest(TestNode** root);
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid addNormTest(TestNode** root)
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestAPI, "tsnorm/cnormtst/TestAPI");
13950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestDecomp, "tsnorm/cnormtst/TestDecomp");
14050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestCompatDecomp, "tsnorm/cnormtst/TestCompatDecomp");
14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestCanonDecompCompose, "tsnorm/cnormtst/TestCanonDecompCompose");
14227f654740f2a26ad62a5c155af9199af9e69b889claireho    addTest(root, &TestCompatDecompCompose, "tsnorm/cnormtst/TestCompatDecompCompose");
14327f654740f2a26ad62a5c155af9199af9e69b889claireho    addTest(root, &TestFCD, "tsnorm/cnormtst/TestFCD");
14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestNull, "tsnorm/cnormtst/TestNull");
14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestQuickCheck, "tsnorm/cnormtst/TestQuickCheck");
14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestQuickCheckPerCP, "tsnorm/cnormtst/TestQuickCheckPerCP");
14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestIsNormalized, "tsnorm/cnormtst/TestIsNormalized");
14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestCheckFCD, "tsnorm/cnormtst/TestCheckFCD");
14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestNormCoverage, "tsnorm/cnormtst/TestNormCoverage");
15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestConcatenate, "tsnorm/cnormtst/TestConcatenate");
15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestNextPrevious, "tsnorm/cnormtst/TestNextPrevious");
15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestFCNFKCClosure, "tsnorm/cnormtst/TestFCNFKCClosure");
15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    addTest(root, &TestComposition, "tsnorm/cnormtst/TestComposition");
15427f654740f2a26ad62a5c155af9199af9e69b889claireho    addTest(root, &TestGetDecomposition, "tsnorm/cnormtst/TestGetDecomposition");
155103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    addTest(root, &TestGetRawDecomposition, "tsnorm/cnormtst/TestGetRawDecomposition");
156b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    addTest(root, &TestAppendRestoreMiddle, "tsnorm/cnormtst/TestAppendRestoreMiddle");
157103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    addTest(root, &TestGetEasyToUseInstance, "tsnorm/cnormtst/TestGetEasyToUseInstance");
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic const char* const modeStrings[]={
16127f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_NONE",
16227f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_NFD",
16327f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_NFKD",
16427f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_NFC",
16527f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_NFKC",
16627f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_FCD",
16727f654740f2a26ad62a5c155af9199af9e69b889claireho    "UNORM_MODE_COUNT"
16827f654740f2a26ad62a5c155af9199af9e69b889claireho};
16927f654740f2a26ad62a5c155af9199af9e69b889claireho
17027f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void TestNormCases(UNormalizationMode mode,
17127f654740f2a26ad62a5c155af9199af9e69b889claireho                          const char* const cases[][3], int32_t lengthOfCases) {
17227f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t x, neededLen, length2;
17327f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t expIndex= (mode==UNORM_NFC || mode==UNORM_NFKC) ? 2 : 1;
17427f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar *source=NULL;
17527f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar result[16];
17627f654740f2a26ad62a5c155af9199af9e69b889claireho    log_verbose("Testing unorm_normalize(%s)\n", modeStrings[mode]);
17727f654740f2a26ad62a5c155af9199af9e69b889claireho    for(x=0; x < lengthOfCases; x++)
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
17927f654740f2a26ad62a5c155af9199af9e69b889claireho        UErrorCode status = U_ZERO_ERROR, status2 = U_ZERO_ERROR;
18027f654740f2a26ad62a5c155af9199af9e69b889claireho        source=CharsToUChars(cases[x][0]);
18127f654740f2a26ad62a5c155af9199af9e69b889claireho        neededLen= unorm_normalize(source, u_strlen(source), mode, 0, NULL, 0, &status);
18227f654740f2a26ad62a5c155af9199af9e69b889claireho        length2= unorm_normalize(source, -1, mode, 0, NULL, 0, &status2);
18327f654740f2a26ad62a5c155af9199af9e69b889claireho        if(neededLen!=length2) {
18427f654740f2a26ad62a5c155af9199af9e69b889claireho          log_err("ERROR in unorm_normalize(%s)[%d]: "
18527f654740f2a26ad62a5c155af9199af9e69b889claireho                  "preflight length/NUL %d!=%d preflight length/srcLength\n",
18627f654740f2a26ad62a5c155af9199af9e69b889claireho                  modeStrings[mode], (int)x, (int)neededLen, (int)length2);
18727f654740f2a26ad62a5c155af9199af9e69b889claireho        }
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(status==U_BUFFER_OVERFLOW_ERROR)
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        {
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            status=U_ZERO_ERROR;
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
19227f654740f2a26ad62a5c155af9199af9e69b889claireho        length2=unorm_normalize(source, u_strlen(source), mode, 0, result, LENGTHOF(result), &status);
19327f654740f2a26ad62a5c155af9199af9e69b889claireho        if(U_FAILURE(status) || neededLen!=length2) {
19427f654740f2a26ad62a5c155af9199af9e69b889claireho            log_data_err("ERROR in unorm_normalize(%s/NUL) at %s:  %s - (Are you missing data?)\n",
19527f654740f2a26ad62a5c155af9199af9e69b889claireho                         modeStrings[mode], austrdup(source), myErrorName(status));
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
19727f654740f2a26ad62a5c155af9199af9e69b889claireho            assertEqual(result, cases[x][expIndex], x);
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
19927f654740f2a26ad62a5c155af9199af9e69b889claireho        length2=unorm_normalize(source, -1, mode, 0, result, LENGTHOF(result), &status);
20027f654740f2a26ad62a5c155af9199af9e69b889claireho        if(U_FAILURE(status) || neededLen!=length2) {
20127f654740f2a26ad62a5c155af9199af9e69b889claireho            log_data_err("ERROR in unorm_normalize(%s/srcLength) at %s:  %s - (Are you missing data?)\n",
20227f654740f2a26ad62a5c155af9199af9e69b889claireho                         modeStrings[mode], austrdup(source), myErrorName(status));
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
20427f654740f2a26ad62a5c155af9199af9e69b889claireho            assertEqual(result, cases[x][expIndex], x);
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        free(source);
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21027f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestDecomp() {
21127f654740f2a26ad62a5c155af9199af9e69b889claireho    TestNormCases(UNORM_NFD, canonTests, LENGTHOF(canonTests));
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21427f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCompatDecomp() {
21527f654740f2a26ad62a5c155af9199af9e69b889claireho    TestNormCases(UNORM_NFKD, compatTests, LENGTHOF(compatTests));
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21827f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCanonDecompCompose() {
21927f654740f2a26ad62a5c155af9199af9e69b889claireho    TestNormCases(UNORM_NFC, canonTests, LENGTHOF(canonTests));
22027f654740f2a26ad62a5c155af9199af9e69b889claireho}
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
22227f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestCompatDecompCompose() {
22327f654740f2a26ad62a5c155af9199af9e69b889claireho    TestNormCases(UNORM_NFKC, compatTests, LENGTHOF(compatTests));
22427f654740f2a26ad62a5c155af9199af9e69b889claireho}
22527f654740f2a26ad62a5c155af9199af9e69b889claireho
22627f654740f2a26ad62a5c155af9199af9e69b889clairehovoid TestFCD() {
22727f654740f2a26ad62a5c155af9199af9e69b889claireho    TestNormCases(UNORM_FCD, fcdTests, LENGTHOF(fcdTests));
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void assertEqual(const UChar* result, const char* expected, int32_t index)
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar *expectedUni = CharsToUChars(expected);
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(u_strcmp(result, expectedUni)!=0){
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("ERROR in decomposition at index = %d. EXPECTED: %s , GOT: %s\n", index, expected,
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            austrdup(result) );
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(expectedUni);
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestNull_check(UChar *src, int32_t srcLen,
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UChar *exp, int32_t expLen,
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    UNormalizationMode mode,
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    const char *name)
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode status = U_ZERO_ERROR;
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t len, i;
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar   result[50];
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    status = U_ZERO_ERROR;
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0;i<50;i++)
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      {
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        result[i] = 0xFFFD;
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    len = unorm_normalize(src, srcLen, mode, 0, result, 50, &status);
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(status)) {
26150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("unorm_normalize(%s) with 0x0000 failed: %s - (Are you missing data?)\n", name, u_errorName(status));
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if (len != expLen) {
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("unorm_normalize(%s) with 0x0000 failed: Expected len %d, got %d\n", name, expLen, len);
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      for(i=0;i<len;i++){
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(exp[i] != result[i]) {
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          log_err("unorm_normalize(%s): @%d, expected \\u%04X got \\u%04X\n",
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  name,
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  i,
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  exp[i],
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                  result[i]);
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          return;
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_verbose("     %d: \\u%04X\n", i, result[i]);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("unorm_normalize(%s) with 0x0000: OK\n", name);
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestNull()
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar   source_comp[] = { 0x0061, 0x0000, 0x0044, 0x0307 };
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t source_comp_len = 4;
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar   expect_comp[] = { 0x0061, 0x0000, 0x1e0a };
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t expect_comp_len = 3;
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar   source_dcmp[] = { 0x1e0A, 0x0000, 0x0929 };
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t source_dcmp_len = 3;
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar   expect_dcmp[] = { 0x0044, 0x0307, 0x0000, 0x0928, 0x093C };
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t expect_dcmp_len = 5;
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestNull_check(source_comp,
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   source_comp_len,
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_comp,
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_comp_len,
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UNORM_NFC,
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   "UNORM_NFC");
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestNull_check(source_dcmp,
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   source_dcmp_len,
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_dcmp,
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_dcmp_len,
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UNORM_NFD,
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   "UNORM_NFD");
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    TestNull_check(source_comp,
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   source_comp_len,
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_comp,
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   expect_comp_len,
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   UNORM_NFKC,
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                   "UNORM_NFKC");
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultNO()
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFD[] = {0x00C5, 0x0407, 0x1E00, 0x1F57, 0x220C,
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x30AE, 0xAC00, 0xD7A3, 0xFB36, 0xFB4E};
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFC[] = {0x0340, 0x0F93, 0x1F77, 0x1FBB, 0x1FEB,
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          0x2000, 0x232A, 0xF900, 0xFA1E, 0xFB4E};
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFKD[] = {0x00A0, 0x02E4, 0x1FDB, 0x24EA, 0x32FE,
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           0xAC00, 0xFB4E, 0xFA10, 0xFF3F, 0xFA2D};
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFKC[] = {0x00A0, 0x017F, 0x2000, 0x24EA, 0x32FE,
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           0x33FE, 0xFB4E, 0xFA10, 0xFF3F, 0xFA2D};
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const int SIZE = 10;
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int count = 0;
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode error = U_ZERO_ERROR;
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (; count < SIZE; count ++)
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFD[count]), 1, UNORM_NFD, &error) !=
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                              UNORM_NO)
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFD quick check at U+%04x\n", CPNFD[count]);
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error) !=
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                              UNORM_NO)
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFC quick check at U+%04x\n", CPNFC[count]);
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFKD[count]), 1, UNORM_NFKD, &error) !=
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                              UNORM_NO)
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKD quick check at U+%04x\n", CPNFKD[count]);
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) !=
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                              UNORM_NO)
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]);
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultYES()
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFD[] = {0x00C6, 0x017F, 0x0F74, 0x1000, 0x1E9A,
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x2261, 0x3075, 0x4000, 0x5000, 0xF000};
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFC[] = {0x0400, 0x0540, 0x0901, 0x1000, 0x1500,
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x1E9A, 0x3000, 0x4000, 0x5000, 0xF000};
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFKD[] = {0x00AB, 0x02A0, 0x1000, 0x1027, 0x2FFB,
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          0x3FFF, 0x4FFF, 0xA000, 0xF000, 0xFA27};
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFKC[] = {0x00B0, 0x0100, 0x0200, 0x0A02, 0x1000,
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          0x2010, 0x3030, 0x4000, 0xA000, 0xFA0E};
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const int SIZE = 10;
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int count = 0;
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode error = U_ZERO_ERROR;
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar cp = 0;
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  while (cp < 0xA0)
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&cp, 1, UNORM_NFD, &error) != UNORM_YES)
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
38750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("ERROR in NFD quick check at U+%04x - (Are you missing data?)\n", cp);
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&cp, 1, UNORM_NFC, &error) !=
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UNORM_YES)
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFC quick check at U+%04x\n", cp);
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&cp, 1, UNORM_NFKD, &error) != UNORM_YES)
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKD quick check at U+%04x\n", cp);
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&cp, 1, UNORM_NFKC, &error) !=
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UNORM_YES)
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKC quick check at U+%04x\n", cp);
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    cp ++;
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (; count < SIZE; count ++)
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFD[count]), 1, UNORM_NFD, &error) !=
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UNORM_YES)
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFD quick check at U+%04x\n", CPNFD[count]);
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error)
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                          != UNORM_YES)
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFC quick check at U+%04x\n", CPNFC[count]);
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFKD[count]), 1, UNORM_NFKD, &error) !=
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UNORM_YES)
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKD quick check at U+%04x\n", CPNFKD[count]);
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) !=
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                             UNORM_YES)
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]);
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckResultMAYBE()
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFC[] = {0x0306, 0x0654, 0x0BBE, 0x102E, 0x1161,
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x116A, 0x1173, 0x1175, 0x3099, 0x309A};
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const UChar CPNFKC[] = {0x0300, 0x0654, 0x0655, 0x09D7, 0x0B3E,
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          0x0DCF, 0xDDF, 0x102E, 0x11A8, 0x3099};
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  const int SIZE = 10;
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int count = 0;
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode error = U_ZERO_ERROR;
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* NFD and NFKD does not have any MAYBE codepoints */
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (; count < SIZE; count ++)
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFC[count]), 1, UNORM_NFC, &error) !=
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                           UNORM_MAYBE)
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
45850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("ERROR in NFC quick check at U+%04x - (Are you missing data?)\n", CPNFC[count]);
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(&(CPNFKC[count]), 1, UNORM_NFKC, &error) !=
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                           UNORM_MAYBE)
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKC quick check at U+%04x\n", CPNFKC[count]);
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestQuickCheckStringResult()
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int count;
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar *d = NULL;
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UChar *c = NULL;
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode error = U_ZERO_ERROR;
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (count = 0; count < LENGTHOF(canonTests); count ++)
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d = CharsToUChars(canonTests[count][1]);
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = CharsToUChars(canonTests[count][2]);
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(d, u_strlen(d), UNORM_NFD, &error) !=
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                            UNORM_YES)
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
48450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("ERROR in NFD quick check for string at count %d - (Are you missing data?)\n", count);
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(c, u_strlen(c), UNORM_NFC, &error) ==
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                            UNORM_NO)
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFC quick check for string at count %d\n", count);
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(d);
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(c);
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (count = 0; count < LENGTHOF(compatTests); count ++)
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    d = CharsToUChars(compatTests[count][1]);
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c = CharsToUChars(compatTests[count][2]);
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(d, u_strlen(d), UNORM_NFKD, &error) !=
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                            UNORM_YES)
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKD quick check for string at count %d\n", count);
507b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
508b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
509b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
510b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(c, u_strlen(c), UNORM_NFKC, &error) !=
511b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                            UNORM_YES)
512b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
513b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_err("ERROR in NFKC quick check for string at count %d\n", count);
514b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      return;
515b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
516b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
517b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(d);
518b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    free(c);
519b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
520b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
521b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
522b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestQuickCheck()
523b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
524b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TestQuickCheckResultNO();
525b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TestQuickCheckResultYES();
526b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TestQuickCheckResultMAYBE();
527b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  TestQuickCheckStringResult();
528b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
529b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
530b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
531b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * The intltest/NormalizerConformanceTest tests a lot of strings that _are_
532b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * normalized, and some that are not.
533b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Here we pick some specific cases and test the C API.
534b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
535b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void TestIsNormalized(void) {
536b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar notNFC[][8]={            /* strings that are not in NFC */
537b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x62, 0x61, 0x300, 0x63, 0 },         /* 0061 0300 compose */
538b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0xfb1d, 0 },                          /* excluded from composition */
539b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x0627, 0x0653, 0 },                  /* 0627 0653 compose */
540b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x3071, 0x306f, 0x309a, 0x3073, 0 }   /* 306F 309A compose */
541b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
542b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar notNFKC[][8]={           /* strings that are not in NFKC */
543b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x1100, 0x1161, 0 },                  /* Jamo compose */
544b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x1100, 0x314f, 0 },                  /* compatibility Jamo compose */
545b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x03b1, 0x1f00, 0x0345, 0x03b3, 0 }   /* 1F00 0345 compose */
546b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
547b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
548b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i;
549b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
550b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
551b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* API test */
552b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
553b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* normal case with length>=0 (length -1 used for special cases below) */
554b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
555b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(!unorm_isNormalized(notNFC[0]+2, 1, UNORM_NFC, &errorCode) || U_FAILURE(errorCode)) {
55650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: !isNormalized(<U+0300>, NFC) (%s) - (Are you missing data?)\n", u_errorName(errorCode));
557b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
558b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
559b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* incoming U_FAILURE */
560b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_TRUNCATED_CHAR_FOUND;
561b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (void)unorm_isNormalized(notNFC[0]+2, 1, UNORM_NFC, &errorCode);
562b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_TRUNCATED_CHAR_FOUND) {
563b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: isNormalized(U_TRUNCATED_CHAR_FOUND) changed the error code to %s\n", u_errorName(errorCode));
564b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
565b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
566b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* NULL source */
567b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
568b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (void)unorm_isNormalized(NULL, 1, UNORM_NFC, &errorCode);
569b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
57050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: isNormalized(NULL) did not set U_ILLEGAL_ARGUMENT_ERROR but %s - (Are you missing data?)\n", u_errorName(errorCode));
571b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
572b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
573b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* bad length */
574b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
575b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    (void)unorm_isNormalized(notNFC[0]+2, -2, UNORM_NFC, &errorCode);
576b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
57750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: isNormalized([-2]) did not set U_ILLEGAL_ARGUMENT_ERROR but %s - (Are you missing data?)\n", u_errorName(errorCode));
578b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
579b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
580b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* specific cases */
581b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(notNFC); ++i) {
582b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
583b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(unorm_isNormalized(notNFC[i], -1, UNORM_NFC, &errorCode) || U_FAILURE(errorCode)) {
58450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("error: isNormalized(notNFC[%d], NFC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode));
585b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
586b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
587b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(unorm_isNormalized(notNFC[i], -1, UNORM_NFKC, &errorCode) || U_FAILURE(errorCode)) {
58850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("error: isNormalized(notNFC[%d], NFKC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode));
589b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
590b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
591b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(notNFKC); ++i) {
592b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
593b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(unorm_isNormalized(notNFKC[i], -1, UNORM_NFKC, &errorCode) || U_FAILURE(errorCode)) {
59450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("error: isNormalized(notNFKC[%d], NFKC) is wrong (%s) - (Are you missing data?)\n", i, u_errorName(errorCode));
595b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
596b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
597b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
598b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
599b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid TestCheckFCD()
600b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
601b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  UErrorCode status = U_ZERO_ERROR;
602b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UChar FAST_[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
603b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x0A};
604b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UChar FALSE_[] = {0x0001, 0x0002, 0x02EA, 0x03EB, 0x0300, 0x0301,
605b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                          0x02B9, 0x0314, 0x0315, 0x0316};
606b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UChar TRUE_[] = {0x0030, 0x0040, 0x0440, 0x056D, 0x064F, 0x06E7,
607b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                         0x0050, 0x0730, 0x09EE, 0x1E10};
608b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
609b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UChar datastr[][5] =
610b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  { {0x0061, 0x030A, 0x1E05, 0x0302, 0},
611b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0061, 0x030A, 0x00E2, 0x0323, 0},
612b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0061, 0x0323, 0x00E2, 0x0323, 0},
613b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {0x0061, 0x0323, 0x1E05, 0x0302, 0} };
614b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UBool result[] = {UNORM_YES, UNORM_NO, UNORM_NO, UNORM_YES};
615b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
616b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  static const UChar datachar[] = {0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
617b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x6a,
618b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
619b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0xea,
620b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306,
621b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x0307, 0x0308, 0x0309, 0x030a,
622b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326,
623b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x0327, 0x0328, 0x0329, 0x032a,
624b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x1e00, 0x1e01, 0x1e02, 0x1e03, 0x1e04, 0x1e05, 0x1e06,
625b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                            0x1e07, 0x1e08, 0x1e09, 0x1e0a};
626b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
627b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  int count = 0;
628b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
629b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (unorm_quickCheck(FAST_, 10, UNORM_FCD, &status) != UNORM_YES)
63050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_data_err("unorm_quickCheck(FCD) failed: expected value for fast unorm_quickCheck is UNORM_YES - (Are you missing data?)\n");
631b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (unorm_quickCheck(FALSE_, 10, UNORM_FCD, &status) != UNORM_NO)
632b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_err("unorm_quickCheck(FCD) failed: expected value for error unorm_quickCheck is UNORM_NO\n");
633b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (unorm_quickCheck(TRUE_, 10, UNORM_FCD, &status) != UNORM_YES)
63450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_data_err("unorm_quickCheck(FCD) failed: expected value for correct unorm_quickCheck is UNORM_YES - (Are you missing data?)\n");
635b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
636b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  if (U_FAILURE(status))
63750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho    log_data_err("unorm_quickCheck(FCD) failed: %s - (Are you missing data?)\n", u_errorName(status));
638b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
639b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  while (count < 4)
640b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
641b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool fcdresult = unorm_quickCheck(datastr[count], 4, UNORM_FCD, &status);
642b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
64350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("unorm_quickCheck(FCD) failed: exception occured at data set %d - (Are you missing data?)\n", count);
644b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      break;
645b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
646b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
647b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (result[count] != fcdresult) {
648b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("unorm_quickCheck(FCD) failed: Data set %d expected value %d\n", count,
649b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                 result[count]);
650b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
651b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
652b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    count ++;
653b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
654b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
655b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  /* random checks of long strings */
656b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  status = U_ZERO_ERROR;
657b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  srand((unsigned)time( NULL ));
658b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
659b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  for (count = 0; count < 50; count ++)
660b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  {
661b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int size = 0;
662b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool testresult = UNORM_YES;
663b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar data[20];
664b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar norm[100];
665b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar nfd[100];
666b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int normsize = 0;
667b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int nfdsize = 0;
668b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
669b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (size != 19) {
670b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      data[size] = datachar[(rand() * 50) / RAND_MAX];
671b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("0x%x", data[size]);
672b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      normsize += unorm_normalize(data + size, 1, UNORM_NFD, 0,
673b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  norm + normsize, 100 - normsize, &status);
674b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      if (U_FAILURE(status)) {
67550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("unorm_quickCheck(FCD) failed: exception occured at data generation - (Are you missing data?)\n");
676b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        break;
677b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      }
678b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      size ++;
679b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
680b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    log_verbose("\n");
681b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
682b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfdsize = unorm_normalize(data, size, UNORM_NFD, 0,
683b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              nfd, 100, &status);
684b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (U_FAILURE(status)) {
68550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("unorm_quickCheck(FCD) failed: exception occured at normalized data generation - (Are you missing data?)\n");
686b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
687b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
688b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (nfdsize != normsize || u_memcmp(nfd, norm, nfdsize) != 0) {
689b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      testresult = UNORM_NO;
690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
691b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (testresult == UNORM_YES) {
692b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("result UNORM_YES\n");
693b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
694b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    else {
695b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru      log_verbose("result UNORM_NO\n");
696b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
697b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
698b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (unorm_quickCheck(data, size, UNORM_FCD, &status) != testresult || U_FAILURE(status)) {
69950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho      log_data_err("unorm_quickCheck(FCD) failed: expected %d for random data - (Are you missing data?)\n", testresult);
700b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
701b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  }
702b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
703b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
704b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
705b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestAPI() {
706b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar in[]={ 0x68, 0xe4 };
707b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar out[20]={ 0xffff, 0xffff, 0xffff, 0xffff };
708b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
709b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
710b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
711b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* try preflighting */
712b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
713b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_normalize(in, 2, UNORM_NFD, 0, NULL, 0, &errorCode);
714b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=3) {
71550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("unorm_normalize(pure preflighting NFD)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
716b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
717b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
718b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
719b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
720b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_normalize(in, 2, UNORM_NFD, 0, out, 3, &errorCode);
721b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
722b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("unorm_normalize(NFD)=%ld failed with %s\n", length, u_errorName(errorCode));
723b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
724b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
725b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(length!=3 || out[2]!=0x308 || out[3]!=0xffff) {
726b13da9df870a61b11249bf741347908dbea0edd8Jean-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]);
727b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
728b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
72927f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm_normalize(NULL, 0, UNORM_NFC, 0, NULL, 0, &errorCode);
73027f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode)) {
73127f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("unorm_normalize(src NULL[0], NFC, dest NULL[0])=%ld failed with %s\n", (long)length, u_errorName(errorCode));
73227f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
73327f654740f2a26ad62a5c155af9199af9e69b889claireho    }
73427f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm_normalize(NULL, 0, UNORM_NFC, 0, out, 20, &errorCode);
73527f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode)) {
73627f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err("unorm_normalize(src NULL[0], NFC, dest out[20])=%ld failed with %s\n", (long)length, u_errorName(errorCode));
73727f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
73827f654740f2a26ad62a5c155af9199af9e69b889claireho    }
739b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
740b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
741b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* test cases to improve test code coverage */
742b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
743b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_K_KIYEOK=0x3131,         /* NFKD->Jamo L U+1100 */
744b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_K_WEO=0x315d,            /* NFKD->Jamo V U+116f */
745b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_K_KIYEOK_SIOS=0x3133,    /* NFKD->Jamo T U+11aa */
746b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
747b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_KIYEOK=0x1100,           /* Jamo L U+1100 */
748b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_WEO=0x116f,              /* Jamo V U+116f */
749b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_KIYEOK_SIOS=0x11aa,      /* Jamo T U+11aa */
750b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
751b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_AC00=0xac00,             /* Hangul syllable = Jamo LV U+ac00 */
752b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    HANGUL_SYLLABLE=0xac00+14*28+3, /* Hangul syllable = U+1100 * U+116f * U+11aa */
753b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
754b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MUSICAL_VOID_NOTEHEAD=0x1d157,
755b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MUSICAL_HALF_NOTE=0x1d15e,  /* NFC/NFD->Notehead+Stem */
756b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MUSICAL_STEM=0x1d165,       /* cc=216 */
757b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    MUSICAL_STACCATO=0x1d17c    /* cc=220 */
758b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
759b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
760b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
761b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNormCoverage() {
762b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar input[1000], expect[1000], output[1000];
763b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
764b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, length, inLength, expectLength, hangulPrefixLength, preflightLength;
765b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
766b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* create a long and nasty string with NFKC-unsafe characters */
767b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    inLength=0;
768b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
769b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* 3 Jamos L/V/T, all 8 combinations normal/compatibility */
770b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK;
771b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_WEO;
772b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK_SIOS;
773b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
774b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK;
775b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_WEO;
776b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_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_KIYEOK_SIOS;
781b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
782b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK;
783b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_WEO;
784b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_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_KIYEOK_SIOS;
789b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
790b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK;
791b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_WEO;
792b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_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_KIYEOK_SIOS;
797b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
798b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK;
799b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_WEO;
800b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK_SIOS;
801b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
802b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* Hangul LV with normal/compatibility Jamo T */
803b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_AC00;
804b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_KIYEOK_SIOS;
805b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
806b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_AC00;
807b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK_SIOS;
808b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
809b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* compatibility Jamo L, V */
810b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK;
811b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_WEO;
812b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
813b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    hangulPrefixLength=inLength;
814b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
815103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    input[inLength++]=U16_LEAD(MUSICAL_HALF_NOTE);
816103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    input[inLength++]=U16_TRAIL(MUSICAL_HALF_NOTE);
817b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<200; ++i) {
818103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        input[inLength++]=U16_LEAD(MUSICAL_STACCATO);
819103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        input[inLength++]=U16_TRAIL(MUSICAL_STACCATO);
820103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        input[inLength++]=U16_LEAD(MUSICAL_STEM);
821103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        input[inLength++]=U16_TRAIL(MUSICAL_STEM);
822b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
823b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
824b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* (compatibility) Jamo L, T do not compose */
825b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK;
826b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    input[inLength++]=HANGUL_K_KIYEOK_SIOS;
827b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
828b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* quick checks */
829b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
830b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_NFD, &errorCode) || U_FAILURE(errorCode)) {
83150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_quickCheck(long input, UNORM_NFD)!=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_NFKD, &errorCode) || U_FAILURE(errorCode)) {
83550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_quickCheck(long input, UNORM_NFKD)!=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_NFC, &errorCode) || U_FAILURE(errorCode)) {
83950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_quickCheck(long input, UNORM_NFC)!=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_NFKC, &errorCode) || U_FAILURE(errorCode)) {
84350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_quickCheck(long input, UNORM_NFKC)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode));
844b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
845b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
846b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(UNORM_NO!=unorm_quickCheck(input, inLength, UNORM_FCD, &errorCode) || U_FAILURE(errorCode)) {
84750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_quickCheck(long input, UNORM_FCD)!=NO (%s) - (Are you missing data?)\n", u_errorName(errorCode));
848b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
849b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
850b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* NFKC */
851b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectLength=0;
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_SYLLABLE;
865b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
866b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_SYLLABLE;
867b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
868b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_AC00+3;
869b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
870b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_AC00+3;
871b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
872b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_AC00+14*28;
873b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
874103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expect[expectLength++]=U16_LEAD(MUSICAL_VOID_NOTEHEAD);
875103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expect[expectLength++]=U16_TRAIL(MUSICAL_VOID_NOTEHEAD);
876103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expect[expectLength++]=U16_LEAD(MUSICAL_STEM);
877103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expect[expectLength++]=U16_TRAIL(MUSICAL_STEM);
878b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<200; ++i) {
879103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        expect[expectLength++]=U16_LEAD(MUSICAL_STEM);
880103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        expect[expectLength++]=U16_TRAIL(MUSICAL_STEM);
881b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
882b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<200; ++i) {
883103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        expect[expectLength++]=U16_LEAD(MUSICAL_STACCATO);
884103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        expect[expectLength++]=U16_TRAIL(MUSICAL_STACCATO);
885b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
886b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
887b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_KIYEOK;
888b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_KIYEOK_SIOS;
889b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
890b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* try destination overflow first */
891b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
892b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    preflightLength=unorm_normalize(input, inLength,
893b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           UNORM_NFKC, 0,
894b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           output, 100, /* too short */
895b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &errorCode);
896b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR) {
89750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        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));
898b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
899b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
900b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* real NFKC */
901b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
902b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_normalize(input, inLength,
903b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           UNORM_NFKC, 0,
904b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           output, sizeof(output)/U_SIZEOF_UCHAR,
905b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &errorCode);
906b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
90750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_normalize(long input, UNORM_NFKC) failed with %s - (Are you missing data?)\n", u_errorName(errorCode));
908b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(length!=expectLength || u_memcmp(output, expect, length)!=0) {
909b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_normalize(long input, UNORM_NFKC) produced wrong result\n");
910b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i=0; i<length; ++i) {
911b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(output[i]!=expect[i]) {
912b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("    NFKC[%d]==U+%04lx expected U+%04lx\n", i, output[i], expect[i]);
913b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
914b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
915b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
916b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
917b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(length!=preflightLength) {
918b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_normalize(long input, UNORM_NFKC)==%ld but preflightLength==%ld\n", length, preflightLength);
919b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
920b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
921b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* FCD */
922b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    u_memcpy(expect, input, hangulPrefixLength);
923b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expectLength=hangulPrefixLength;
924b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
925103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expect[expectLength++]=U16_LEAD(MUSICAL_VOID_NOTEHEAD);
926103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expect[expectLength++]=U16_TRAIL(MUSICAL_VOID_NOTEHEAD);
927103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expect[expectLength++]=U16_LEAD(MUSICAL_STEM);
928103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    expect[expectLength++]=U16_TRAIL(MUSICAL_STEM);
929b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<200; ++i) {
930103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        expect[expectLength++]=U16_LEAD(MUSICAL_STEM);
931103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        expect[expectLength++]=U16_TRAIL(MUSICAL_STEM);
932b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
933b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<200; ++i) {
934103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        expect[expectLength++]=U16_LEAD(MUSICAL_STACCATO);
935103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        expect[expectLength++]=U16_TRAIL(MUSICAL_STACCATO);
936b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
937b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
938b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_K_KIYEOK;
939b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[expectLength++]=HANGUL_K_KIYEOK_SIOS;
940b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
941b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
942b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_normalize(input, inLength,
943b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           UNORM_FCD, 0,
944b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           output, sizeof(output)/U_SIZEOF_UCHAR,
945b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                           &errorCode);
946b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode)) {
94750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_normalize(long input, UNORM_FCD) failed with %s - (Are you missing data?)\n", u_errorName(errorCode));
948b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else if(length!=expectLength || u_memcmp(output, expect, length)!=0) {
949b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_normalize(long input, UNORM_FCD) produced wrong result\n");
950b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        for(i=0; i<length; ++i) {
951b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(output[i]!=expect[i]) {
952b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                log_err("    FCD[%d]==U+%04lx expected U+%04lx\n", i, output[i], expect[i]);
953b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                break;
954b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
955b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
956b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
957b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
958b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
959b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* API test for unorm_concatenate() - for real test strings see intltest/tstnorm.cpp */
960b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
961b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestConcatenate(void) {
962b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* "re + 'sume'" */
963b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
964b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    left[]={
965b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x72, 0x65, 0
966b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
967b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    right[]={
968b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x301, 0x73, 0x75, 0x6d, 0xe9, 0
969b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
970b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    expect[]={
971b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x72, 0xe9, 0x73, 0x75, 0x6d, 0xe9, 0
972b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
973b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
974b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[100];
975b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
976b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
977b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
978b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* left with length, right NUL-terminated */
979b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
980b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(left, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode);
981b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=6 || 0!=u_memcmp(buffer, expect, length)) {
98250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: unorm_concatenate()=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
983b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
984b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
985b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* preflighting */
986b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
987b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(left, 2, right, -1, NULL, 0, UNORM_NFC, 0, &errorCode);
988b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=6) {
98950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: unorm_concatenate(preflighting)=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
990b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
991b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
992b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[2]=0x5555;
993b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
994b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(left, 2, right, -1, buffer, 1, UNORM_NFC, 0, &errorCode);
995b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=6 || buffer[2]!=0x5555) {
99650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: unorm_concatenate(preflighting 2)=%ld (expect 6) failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
997b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
998b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
999b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* enter with U_FAILURE */
1000b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[2]=0xaaaa;
1001b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_UNEXPECTED_TOKEN;
1002b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(left, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode);
1003b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_UNEXPECTED_TOKEN || buffer[2]!=0xaaaa) {
1004b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error: unorm_concatenate(failure)=%ld failed with %s\n", length, u_errorName(errorCode));
1005b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1006b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1007b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* illegal arguments */
1008b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[2]=0xaaaa;
1009b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1010b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(NULL, 2, right, -1, buffer, 100, UNORM_NFC, 0, &errorCode);
1011b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR || buffer[2]!=0xaaaa) {
101250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: unorm_concatenate(left=NULL)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
1013b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1014b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1015b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1016b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_concatenate(left, 2, right, -1, NULL, 100, UNORM_NFC, 0, &errorCode);
1017b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
101850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error: unorm_concatenate(buffer=NULL)=%ld failed with %s - (Are you missing data?)\n", length, u_errorName(errorCode));
1019b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1020b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1021b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1022b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruenum {
1023b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _PLUS=0x2b
1024b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1025b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1026b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic const char *const _modeString[UNORM_MODE_COUNT]={
1027b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    "0", "NONE", "NFD", "NFKD", "NFC", "NFKC", "FCD"
1028b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
1029b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1030b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1031b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru_testIter(const UChar *src, int32_t srcLength,
1032b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          UCharIterator *iter, UNormalizationMode mode, UBool forward,
1033b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          const UChar *out, int32_t outLength,
1034b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru          const int32_t *srcIndexes, int32_t srcIndexesLength) {
1035b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[4];
1036b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    const UChar *expect, *outLimit, *in;
1037b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length, i, expectLength, expectIndex, prevIndex, index, inLength;
1038b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1039b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool neededToNormalize, expectNeeded;
1040b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1041b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1042b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    outLimit=out+outLength;
1043b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(forward) {
1044b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect=out;
1045b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        i=index=0;
1046b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
1047b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        expect=outLimit;
1048b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        i=srcIndexesLength-2;
1049b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index=srcLength;
1050b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1051b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1052b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(;;) {
1053b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        prevIndex=index;
1054b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(forward) {
1055b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(!iter->hasNext(iter)) {
1056b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
1057b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1058b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length=unorm_next(iter,
1059b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1060b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              mode, 0,
1061b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              (UBool)(out!=NULL), &neededToNormalize,
1062b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                              &errorCode);
1063b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectIndex=srcIndexes[i+1];
1064b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            in=src+prevIndex;
1065b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            inLength=expectIndex-prevIndex;
1066b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1067b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(out!=NULL) {
1068b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* get output piece from between plus signs */
1069b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectLength=0;
1070b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                while((expect+expectLength)!=outLimit && expect[expectLength]!=_PLUS) {
1071b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ++expectLength;
1072b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1073b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectNeeded=(UBool)(0!=u_memcmp(buffer, in, inLength));
1074b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
1075b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expect=in;
1076b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectLength=inLength;
1077b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectNeeded=FALSE;
1078b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1079b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1080b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(!iter->hasPrevious(iter)) {
1081b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                return;
1082b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1083b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length=unorm_previous(iter,
1084b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1085b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  mode, 0,
1086b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  (UBool)(out!=NULL), &neededToNormalize,
1087b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                  &errorCode);
1088b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expectIndex=srcIndexes[i];
1089b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            in=src+expectIndex;
1090b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            inLength=prevIndex-expectIndex;
1091b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1092b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            if(out!=NULL) {
1093b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                /* get output piece from between plus signs */
1094b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectLength=0;
1095b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                while(expect!=out && expect[-1]!=_PLUS) {
1096b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    ++expectLength;
1097b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    --expect;
1098b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                }
1099b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectNeeded=(UBool)(0!=u_memcmp(buffer, in, inLength));
1100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            } else {
1101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expect=in;
1102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectLength=inLength;
1103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                expectNeeded=FALSE;
1104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            }
1105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        index=iter->getIndex(iter, UITER_CURRENT);
1107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode)) {
110950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("error unorm iteration (next/previous %d %s)[%d]: %s - (Are you missing data?)\n",
1110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    forward, _modeString[mode], i, u_errorName(errorCode));
1111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(expectIndex!=index) {
1114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error unorm iteration (next/previous %d %s): index[%d] wrong, got %d expected %d\n",
1115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    forward, _modeString[mode], i, index, expectIndex);
1116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(expectLength!=length) {
1119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error unorm iteration (next/previous %d %s): length[%d] wrong, got %d expected %d\n",
1120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    forward, _modeString[mode], i, length, expectLength);
1121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(0!=u_memcmp(expect, buffer, length)) {
1124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("error unorm iteration (next/previous %d %s): output string[%d] wrong\n",
1125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    forward, _modeString[mode], i);
1126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
1127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(neededToNormalize!=expectNeeded) {
1129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(forward) {
1132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            expect+=expectLength+1; /* go after the + */
1133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            ++i;
1134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } else {
1135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            --expect; /* go before the + */
1136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            --i;
1137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestNextPrevious() {
1143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const UChar
1144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    src[]={ /* input string */
1145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xa0, 0xe4, 0x63, 0x302, 0x327, 0xac00, 0x3133
1146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfd[]={ /* + separates expected output pieces */
1148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xa0, _PLUS, 0x61, 0x308, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0x1100, 0x1161, _PLUS, 0x3133
1149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfkd[]={
1151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20, _PLUS, 0x61, 0x308, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0x1100, 0x1161, _PLUS, 0x11aa
1152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfc[]={
1154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xa0, _PLUS, 0xe4, _PLUS, 0xe7, 0x302, _PLUS, 0xac00, _PLUS, 0x3133
1155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfkc[]={
1157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0x20, _PLUS, 0xe4, _PLUS, 0xe7, 0x302, _PLUS, 0xac03
1158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fcd[]={
1160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0xa0, _PLUS, 0xe4, _PLUS, 0x63, 0x327, 0x302, _PLUS, 0xac00, _PLUS, 0x3133
1161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* expected iterator indexes in the source string for each iteration piece */
1164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const int32_t
1165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfdIndexes[]={
1166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 2, 5, 6, 7
1167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfkdIndexes[]={
1169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 2, 5, 6, 7
1170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfcIndexes[]={
1172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 2, 5, 6, 7
1173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nfkcIndexes[]={
1175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 2, 5, 7
1176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    },
1177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    fcdIndexes[]={
1178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        0, 1, 2, 5, 6, 7
1179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UCharIterator iter;
1182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[4];
1184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length;
1185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UBool neededToNormalize;
1187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    uiter_setString(&iter, src, sizeof(src)/U_SIZEOF_UCHAR);
1190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test iteration with doNormalize */
1192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, TRUE, nfd, sizeof(nfd)/U_SIZEOF_UCHAR, nfdIndexes, sizeof(nfdIndexes)/4);
1194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, TRUE, nfkd, sizeof(nfkd)/U_SIZEOF_UCHAR, nfkdIndexes, sizeof(nfkdIndexes)/4);
1196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, TRUE, nfc, sizeof(nfc)/U_SIZEOF_UCHAR, nfcIndexes, sizeof(nfcIndexes)/4);
1198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, TRUE, nfkc, sizeof(nfkc)/U_SIZEOF_UCHAR, nfkcIndexes, sizeof(nfkcIndexes)/4);
1200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, TRUE, fcd, sizeof(fcd)/U_SIZEOF_UCHAR, fcdIndexes, sizeof(fcdIndexes)/4);
1202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, FALSE, nfd, sizeof(nfd)/U_SIZEOF_UCHAR, nfdIndexes, sizeof(nfdIndexes)/4);
1205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, FALSE, nfkd, sizeof(nfkd)/U_SIZEOF_UCHAR, nfkdIndexes, sizeof(nfkdIndexes)/4);
1207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, FALSE, nfc, sizeof(nfc)/U_SIZEOF_UCHAR, nfcIndexes, sizeof(nfcIndexes)/4);
1209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, FALSE, nfkc, sizeof(nfkc)/U_SIZEOF_UCHAR, nfkcIndexes, sizeof(nfkcIndexes)/4);
1211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, FALSE, fcd, sizeof(fcd)/U_SIZEOF_UCHAR, fcdIndexes, sizeof(fcdIndexes)/4);
1213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* test iteration without doNormalize */
1215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, TRUE, NULL, 0, nfdIndexes, sizeof(nfdIndexes)/4);
1217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, TRUE, NULL, 0, nfkdIndexes, sizeof(nfkdIndexes)/4);
1219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, TRUE, NULL, 0, nfcIndexes, sizeof(nfcIndexes)/4);
1221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, TRUE, NULL, 0, nfkcIndexes, sizeof(nfkcIndexes)/4);
1223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=0;
1224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, TRUE, NULL, 0, fcdIndexes, sizeof(fcdIndexes)/4);
1225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFD, FALSE, NULL, 0, nfdIndexes, sizeof(nfdIndexes)/4);
1228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKD, FALSE, NULL, 0, nfkdIndexes, sizeof(nfkdIndexes)/4);
1230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFC, FALSE, NULL, 0, nfcIndexes, sizeof(nfcIndexes)/4);
1232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_NFKC, FALSE, NULL, 0, nfkcIndexes, sizeof(nfkcIndexes)/4);
1234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=iter.length;
1235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    _testIter(src, sizeof(src)/U_SIZEOF_UCHAR, &iter, UNORM_FCD, FALSE, NULL, 0, fcdIndexes, sizeof(fcdIndexes)/4);
1236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* try without neededToNormalize */
1238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=5;
1240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UNORM_NFD, 0, TRUE, NULL,
1243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(U_FAILURE(errorCode) || length!=2 || buffer[0]!=nfd[2] || buffer[1]!=nfd[3]) {
124550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        log_data_err("error unorm_next(without needed) %s - (Are you missing data?)\n", u_errorName(errorCode));
1246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* preflight */
1250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    neededToNormalize=9;
1251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(&iter, NULL, 0,
1253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UNORM_NFD, 0, TRUE, &neededToNormalize,
1254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || neededToNormalize!=FALSE || length!=2) {
1256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_next(pure preflighting) %s\n", u_errorName(errorCode));
1257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=buffer[1]=5;
1262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    neededToNormalize=9;
1263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(&iter, buffer, 1,
1265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UNORM_NFD, 0, TRUE, &neededToNormalize,
1266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || neededToNormalize!=FALSE || length!=2 || buffer[1]!=5) {
1268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_next(preflighting) %s\n", u_errorName(errorCode));
1269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* no iterator */
1273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=buffer[1]=5;
1275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    neededToNormalize=9;
1276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(NULL, buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UNORM_NFD, 0, TRUE, &neededToNormalize,
1279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_next(no iterator) %s\n", u_errorName(errorCode));
1282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* illegal mode */
1286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=buffer[1]=5;
1287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    neededToNormalize=9;
1288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      (UNormalizationMode)0, 0, TRUE, &neededToNormalize,
1291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_next(illegal mode) %s\n", u_errorName(errorCode));
1294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* error coming in */
1298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_MISPLACED_QUANTIFIER;
1299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    buffer[0]=5;
1300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    iter.index=1;
1301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=unorm_next(&iter, buffer, sizeof(buffer)/U_SIZEOF_UCHAR,
1302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      UNORM_NFD, 0, TRUE, NULL,
1303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                      &errorCode);
1304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_MISPLACED_QUANTIFIER) {
1305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("error unorm_next(U_MISPLACED_QUANTIFIER) %s\n", u_errorName(errorCode));
1306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return;
1307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestFCNFKCClosure(void) {
1312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar32 c;
1314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        const UChar s[6];
1315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } tests[]={
131650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 0x00C4, { 0 } },
131750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho        { 0x00E4, { 0 } },
1318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x037A, { 0x0020, 0x03B9, 0 } },
1319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x03D2, { 0x03C5, 0 } },
1320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x20A8, { 0x0072, 0x0073, 0 } },
1321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x210B, { 0x0068, 0 } },
1322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x210C, { 0x0068, 0 } },
1323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x2121, { 0x0074, 0x0065, 0x006C, 0 } },
1324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x2122, { 0x0074, 0x006D, 0 } },
1325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x2128, { 0x007A, 0 } },
1326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x1D5DB, { 0x0068, 0 } },
1327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x1D5ED, { 0x007A, 0 } },
1328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { 0x0061, { 0 } }
1329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar buffer[8];
1332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, length;
1334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(tests); ++i) {
1336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=u_getFC_NFKC_Closure(tests[i].c, buffer, LENGTHOF(buffer), &errorCode);
1338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(U_FAILURE(errorCode) || length!=u_strlen(buffer) || 0!=u_strcmp(tests[i].s, buffer)) {
133950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("u_getFC_NFKC_Closure(U+%04lx) is wrong (%s) - (Are you missing data?)\n", tests[i].c, u_errorName(errorCode));
1340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /* error handling */
1344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_getFC_NFKC_Closure(0x5c, NULL, LENGTHOF(buffer), &errorCode);
1346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_getFC_NFKC_Closure(dest=NULL) is wrong (%s)\n", u_errorName(errorCode));
1348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    length=u_getFC_NFKC_Closure(0x5c, buffer, LENGTHOF(buffer), &errorCode);
1351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("u_getFC_NFKC_Closure(U_FAILURE) is wrong (%s)\n", u_errorName(errorCode));
1353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestQuickCheckPerCP() {
1358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar32 c, lead, trail;
1360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar s[U16_MAX_LENGTH], nfd[16];
1361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t length, lccc1, lccc2, tccc1, tccc2;
1362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t qc1, qc2;
1363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if(
1365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_NFD_QUICK_CHECK)!=(int32_t)UNORM_YES ||
1366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_NFKD_QUICK_CHECK)!=(int32_t)UNORM_YES ||
1367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_NFC_QUICK_CHECK)!=(int32_t)UNORM_MAYBE ||
1368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_NFKC_QUICK_CHECK)!=(int32_t)UNORM_MAYBE ||
1369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_LEAD_CANONICAL_COMBINING_CLASS)!=u_getIntPropertyMaxValue(UCHAR_CANONICAL_COMBINING_CLASS) ||
1370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        u_getIntPropertyMaxValue(UCHAR_TRAIL_CANONICAL_COMBINING_CLASS)!=u_getIntPropertyMaxValue(UCHAR_CANONICAL_COMBINING_CLASS)
1371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    ) {
1372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        log_err("wrong result from one of the u_getIntPropertyMaxValue(UCHAR_NF*_QUICK_CHECK) or UCHAR_*_CANONICAL_COMBINING_CLASS\n");
1373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    /*
1376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * compare the quick check property values for some code points
1377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     * to the quick check results for checking same-code point strings
1378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru     */
1379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    errorCode=U_ZERO_ERROR;
1380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    c=0;
1381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while(c<0x110000) {
1382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=0;
1383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U16_APPEND_UNSAFE(s, length, c);
1384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc1=u_getIntPropertyValue(c, UCHAR_NFC_QUICK_CHECK);
1386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc2=unorm_quickCheck(s, length, UNORM_NFC, &errorCode);
1387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(qc1!=qc2) {
138850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("u_getIntPropertyValue(NFC)=%d != %d=unorm_quickCheck(NFC) for U+%04x - (Are you missing data?)\n", qc1, qc2, c);
1389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc1=u_getIntPropertyValue(c, UCHAR_NFD_QUICK_CHECK);
1392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc2=unorm_quickCheck(s, length, UNORM_NFD, &errorCode);
1393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(qc1!=qc2) {
139450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("u_getIntPropertyValue(NFD)=%d != %d=unorm_quickCheck(NFD) for U+%04x - (Are you missing data?)\n", qc1, qc2, c);
1395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc1=u_getIntPropertyValue(c, UCHAR_NFKC_QUICK_CHECK);
1398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc2=unorm_quickCheck(s, length, UNORM_NFKC, &errorCode);
1399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(qc1!=qc2) {
140050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("u_getIntPropertyValue(NFKC)=%d != %d=unorm_quickCheck(NFKC) for U+%04x - (Are you missing data?)\n", qc1, qc2, c);
1401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc1=u_getIntPropertyValue(c, UCHAR_NFKD_QUICK_CHECK);
1404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        qc2=unorm_quickCheck(s, length, UNORM_NFKD, &errorCode);
1405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(qc1!=qc2) {
140650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("u_getIntPropertyValue(NFKD)=%d != %d=unorm_quickCheck(NFKD) for U+%04x - (Are you missing data?)\n", qc1, qc2, c);
1407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=unorm_normalize(s, length, UNORM_NFD, 0, nfd, LENGTHOF(nfd), &errorCode);
1410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* length-length == 0 is used to get around a compiler warning. */
1411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U16_GET(nfd, 0, length-length, length, lead);
1412b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        U16_GET(nfd, 0, length-1, length, trail);
1413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lccc1=u_getIntPropertyValue(c, UCHAR_LEAD_CANONICAL_COMBINING_CLASS);
1415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        lccc2=u_getCombiningClass(lead);
1416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tccc1=u_getIntPropertyValue(c, UCHAR_TRAIL_CANONICAL_COMBINING_CLASS);
1417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        tccc2=u_getCombiningClass(trail);
1418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(lccc1!=lccc2) {
1420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_getIntPropertyValue(lccc)=%d != %d=u_getCombiningClass(lead) for U+%04x\n",
1421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    lccc1, lccc2, c);
1422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if(tccc1!=tccc2) {
1424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            log_err("u_getIntPropertyValue(tccc)=%d != %d=u_getCombiningClass(trail) for U+%04x\n",
1425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    tccc1, tccc2, c);
1426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* skip some code points */
1429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        c=(20*c)/19+1;
1430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querustatic void
1434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruTestComposition(void) {
1435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    static const struct {
1436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UNormalizationMode mode;
1437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        uint32_t options;
1438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar input[12];
1439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        UChar expect[12];
1440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } cases[]={
1441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /*
1442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         * special cases for UAX #15 bug
144350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * see Unicode Corrigendum #5: Normalization Idempotency
144450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * at http://unicode.org/versions/corrigendum5.html
144550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho         * (was Public Review Issue #29)
1446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru         */
1447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UNORM_NFC, 0, { 0x1100, 0x0300, 0x1161, 0x0327 },         { 0x1100, 0x0300, 0x1161, 0x0327 } },
1448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UNORM_NFC, 0, { 0x1100, 0x0300, 0x1161, 0x0327, 0x11a8 }, { 0x1100, 0x0300, 0x1161, 0x0327, 0x11a8 } },
1449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UNORM_NFC, 0, { 0xac00, 0x0300, 0x0327, 0x11a8 },         { 0xac00, 0x0327, 0x0300, 0x11a8 } },
1450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        { UNORM_NFC, 0, { 0x0b47, 0x0300, 0x0b3e },                 { 0x0b47, 0x0300, 0x0b3e } },
1451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        /* TODO: add test cases for UNORM_FCC here (j2151) */
1453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    };
1454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UChar output[16];
1456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    UErrorCode errorCode;
1457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    int32_t i, length;
1458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
1459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for(i=0; i<LENGTHOF(cases); ++i) {
1460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        errorCode=U_ZERO_ERROR;
1461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        length=unorm_normalize(
1462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    cases[i].input, -1,
1463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    cases[i].mode, cases[i].options,
1464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    output, LENGTHOF(output),
1465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                    &errorCode);
1466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if( U_FAILURE(errorCode) ||
1467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            length!=u_strlen(cases[i].expect) ||
1468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            0!=u_memcmp(output, cases[i].expect, length)
1469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        ) {
147050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho            log_data_err("unexpected result for case %d - (Are you missing data?)\n", i);
1471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
1472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
1473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
1474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
147527f654740f2a26ad62a5c155af9199af9e69b889clairehostatic void
147627f654740f2a26ad62a5c155af9199af9e69b889clairehoTestGetDecomposition() {
147727f654740f2a26ad62a5c155af9199af9e69b889claireho    UChar decomp[32];
147827f654740f2a26ad62a5c155af9199af9e69b889claireho    int32_t length;
147927f654740f2a26ad62a5c155af9199af9e69b889claireho
148027f654740f2a26ad62a5c155af9199af9e69b889claireho    UErrorCode errorCode=U_ZERO_ERROR;
148127f654740f2a26ad62a5c155af9199af9e69b889claireho    const UNormalizer2 *n2=unorm2_getInstance(NULL, "nfc", UNORM2_COMPOSE_CONTIGUOUS, &errorCode);
148227f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode)) {
148327f654740f2a26ad62a5c155af9199af9e69b889claireho        log_err_status(errorCode, "unorm2_getInstance(nfc/FCC) failed: %s\n", u_errorName(errorCode));
148427f654740f2a26ad62a5c155af9199af9e69b889claireho        return;
148527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
148627f654740f2a26ad62a5c155af9199af9e69b889claireho
148727f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0x20, decomp, LENGTHOF(decomp), &errorCode);
148827f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode) || length>=0) {
1489103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(fcc, space) failed\n");
149027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
149127f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
149227f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0xe4, decomp, LENGTHOF(decomp), &errorCode);
149327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0x61 || decomp[1]!=0x308 || decomp[2]!=0) {
1494103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(fcc, a-umlaut) failed\n");
149527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
149627f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
149727f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0xac01, decomp, LENGTHOF(decomp), &errorCode);
149827f654740f2a26ad62a5c155af9199af9e69b889claireho    if(U_FAILURE(errorCode) || length!=3 || decomp[0]!=0x1100 || decomp[1]!=0x1161 || decomp[2]!=0x11a8 || decomp[3]!=0) {
1499103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(fcc, Hangul syllable U+AC01) failed\n");
150027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
150127f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
150227f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0xac01, NULL, 0, &errorCode);
150327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=3) {
1504103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(fcc, Hangul syllable U+AC01) overflow failed\n");
150527f654740f2a26ad62a5c155af9199af9e69b889claireho    }
150627f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
150727f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0xac01, decomp, -1, &errorCode);
150827f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1509103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(fcc, capacity<0) failed\n");
151027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
151127f654740f2a26ad62a5c155af9199af9e69b889claireho    errorCode=U_ZERO_ERROR;
151227f654740f2a26ad62a5c155af9199af9e69b889claireho    length=unorm2_getDecomposition(n2, 0xac01, NULL, 4, &errorCode);
151327f654740f2a26ad62a5c155af9199af9e69b889claireho    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1514103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(fcc, decomposition=NULL) failed\n");
1515103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1516103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
1517103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1518103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void
1519103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusTestGetRawDecomposition() {
1520103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar decomp[32];
1521103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t length;
1522103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1523103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode errorCode=U_ZERO_ERROR;
1524103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const UNormalizer2 *n2=unorm2_getNFKCInstance(&errorCode);
1525103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode)) {
1526103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(errorCode, "unorm2_getNFKCInstance() failed: %s\n", u_errorName(errorCode));
1527103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
1528103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1529103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /*
1530103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * Raw decompositions from NFKC data are the Unicode Decomposition_Mapping values,
1531103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     * without recursive decomposition.
1532103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius     */
1533103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1534103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_getRawDecomposition(n2, 0x20, decomp, LENGTHOF(decomp), &errorCode);
1535103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length>=0) {
1536103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(nfkc, space) failed\n");
1537103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1538103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1539103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_getRawDecomposition(n2, 0xe4, decomp, LENGTHOF(decomp), &errorCode);
1540103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0x61 || decomp[1]!=0x308 || decomp[2]!=0) {
1541103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(nfkc, a-umlaut) failed\n");
1542103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1543103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* U+1E08 LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE */
1544103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1545103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_getRawDecomposition(n2, 0x1e08, decomp, LENGTHOF(decomp), &errorCode);
1546103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0xc7 || decomp[1]!=0x301 || decomp[2]!=0) {
1547103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(nfkc, c-cedilla-acute) failed\n");
1548103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1549103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* U+212B ANGSTROM SIGN */
1550103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1551103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_getRawDecomposition(n2, 0x212b, decomp, LENGTHOF(decomp), &errorCode);
1552103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length!=1 || decomp[0]!=0xc5 || decomp[1]!=0) {
1553103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(nfkc, angstrom sign) failed\n");
1554103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1555103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1556103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_getRawDecomposition(n2, 0xac00, decomp, LENGTHOF(decomp), &errorCode);
1557103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0x1100 || decomp[1]!=0x1161 || decomp[2]!=0) {
1558103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(nfkc, Hangul syllable U+AC00) failed\n");
1559103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1560103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    /* A Hangul LVT syllable has a raw decomposition of an LV syllable + T. */
1561103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1562103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_getRawDecomposition(n2, 0xac01, decomp, LENGTHOF(decomp), &errorCode);
1563103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length!=2 || decomp[0]!=0xac00 || decomp[1]!=0x11a8 || decomp[2]!=0) {
1564103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(nfkc, Hangul syllable U+AC01) failed\n");
1565103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1566103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1567103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_getRawDecomposition(n2, 0xac01, NULL, 0, &errorCode);
1568103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=2) {
1569103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(nfkc, Hangul syllable U+AC01) overflow failed\n");
1570103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1571103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1572103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_getRawDecomposition(n2, 0xac01, decomp, -1, &errorCode);
1573103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1574103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(nfkc, capacity<0) failed\n");
1575103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1576103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1577103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_getRawDecomposition(n2, 0xac01, NULL, 4, &errorCode);
1578103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(errorCode!=U_ILLEGAL_ARGUMENT_ERROR) {
1579103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getDecomposition(nfkc, decomposition=NULL) failed\n");
158027f654740f2a26ad62a5c155af9199af9e69b889claireho    }
158127f654740f2a26ad62a5c155af9199af9e69b889claireho}
158227f654740f2a26ad62a5c155af9199af9e69b889claireho
1583b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehostatic void
1584b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoTestAppendRestoreMiddle() {
1585b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UChar a[20]={ 0x61, 0x62, 0x63, 0x41, 0x327, 0 };  /* last chars are 'A' and 'cedilla' NFC */
1586b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const UChar b[]={ 0x30A, 0x64, 0x65, 0x66, 0 };  /* first char is 'ring above' NFC */
1587b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* NFC: C5 is 'A with ring above' */
1588b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    static const UChar expected[]={ 0x61, 0x62, 0x63, 0xC5, 0x327, 0x64, 0x65, 0x66 };
1589b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    int32_t length;
1590b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    UErrorCode errorCode=U_ZERO_ERROR;
1591103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const UNormalizer2 *n2=unorm2_getNFCInstance(&errorCode);
1592b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(U_FAILURE(errorCode)) {
1593103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(errorCode, "unorm2_getNFCInstance() failed: %s\n", u_errorName(errorCode));
1594b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
1595b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1596b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /*
1597b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Use length=-1 to fool the estimate of the ReorderingBuffer capacity.
1598b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * Use a capacity of 6 or 7 so that the middle sequence <41 327 30A>
1599b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * still fits into a[] but the full result still overflows this capacity.
1600b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     * (Let it modify the destination buffer before reallocating internally.)
1601b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho     */
1602b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    length=unorm2_append(n2, a, -1, 6, b, -1, &errorCode);
1603b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(errorCode!=U_BUFFER_OVERFLOW_ERROR || length!=LENGTHOF(expected)) {
1604b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err("unorm2_append(preflight) returned wrong length of %d\n", (int)length);
1605b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
1606b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1607b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    /* Verify that the middle is unchanged or restored. (ICU ticket #7848) */
1608b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(a[0]!=0x61 || a[1]!=0x62 || a[2]!=0x63 || a[3]!=0x41 || a[4]!=0x327 || a[5]!=0) {
1609b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err("unorm2_append(overflow) modified the first string\n");
1610b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
1611b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1612b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    errorCode=U_ZERO_ERROR;
1613b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    length=unorm2_append(n2, a, -1, LENGTHOF(a), b, -1, &errorCode);
1614b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    if(U_FAILURE(errorCode) || length!=LENGTHOF(expected) || 0!=u_memcmp(a, expected, length)) {
1615b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        log_err("unorm2_append(real) failed - %s, length %d\n", u_errorName(errorCode), (int)length);
1616b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho        return;
1617b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho    }
1618b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho}
1619b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho
1620103e9ffba2cba345d0078eb8b8db33249f81840aCraig Corneliusstatic void
1621103e9ffba2cba345d0078eb8b8db33249f81840aCraig CorneliusTestGetEasyToUseInstance() {
1622103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    static const UChar in[]={
1623103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        0xA0,  /* -> <noBreak> 0020 */
1624103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        0xC7, 0x301  /* = 1E08 = 0043 0327 0301 */
1625103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    };
1626103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UChar out[32];
1627103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    int32_t length;
1628103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1629103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    UErrorCode errorCode=U_ZERO_ERROR;
1630103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    const UNormalizer2 *n2=unorm2_getNFCInstance(&errorCode);
1631103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode)) {
1632103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(errorCode, "unorm2_getNFCInstance() failed: %s\n", u_errorName(errorCode));
1633103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
1634103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1635103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_normalize(n2, in, LENGTHOF(in), out, LENGTHOF(out), &errorCode);
1636103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length!=2 || out[0]!=0xa0 || out[1]!=0x1e08) {
1637103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getNFCInstance() did not return an NFC instance (normalized length=%d; %s)\n",
1638103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                (int)length, u_errorName(errorCode));
1639103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1640103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1641103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1642103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    n2=unorm2_getNFDInstance(&errorCode);
1643103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode)) {
1644103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(errorCode, "unorm2_getNFDInstance() failed: %s\n", u_errorName(errorCode));
1645103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
1646103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1647103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_normalize(n2, in, LENGTHOF(in), out, LENGTHOF(out), &errorCode);
1648103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length!=4 || out[0]!=0xa0 || out[1]!=0x43 || out[2]!=0x327 || out[3]!=0x301) {
1649103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getNFDInstance() did not return an NFD instance (normalized length=%d; %s)\n",
1650103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                (int)length, u_errorName(errorCode));
1651103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1652103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1653103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1654103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    n2=unorm2_getNFKCInstance(&errorCode);
1655103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode)) {
1656103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(errorCode, "unorm2_getNFKCInstance() failed: %s\n", u_errorName(errorCode));
1657103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
1658103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1659103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_normalize(n2, in, LENGTHOF(in), out, LENGTHOF(out), &errorCode);
1660103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length!=2 || out[0]!=0x20 || out[1]!=0x1e08) {
1661103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getNFKCInstance() did not return an NFKC instance (normalized length=%d; %s)\n",
1662103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                (int)length, u_errorName(errorCode));
1663103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1664103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1665103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1666103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    n2=unorm2_getNFKDInstance(&errorCode);
1667103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode)) {
1668103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(errorCode, "unorm2_getNFKDInstance() failed: %s\n", u_errorName(errorCode));
1669103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
1670103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1671103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_normalize(n2, in, LENGTHOF(in), out, LENGTHOF(out), &errorCode);
1672103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length!=4 || out[0]!=0x20 || out[1]!=0x43 || out[2]!=0x327 || out[3]!=0x301) {
1673103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getNFKDInstance() did not return an NFKD instance (normalized length=%d; %s)\n",
1674103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                (int)length, u_errorName(errorCode));
1675103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1676103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1677103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    errorCode=U_ZERO_ERROR;
1678103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    n2=unorm2_getNFKCCasefoldInstance(&errorCode);
1679103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode)) {
1680103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err_status(errorCode, "unorm2_getNFKCCasefoldInstance() failed: %s\n", u_errorName(errorCode));
1681103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        return;
1682103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1683103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    length=unorm2_normalize(n2, in, LENGTHOF(in), out, LENGTHOF(out), &errorCode);
1684103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    if(U_FAILURE(errorCode) || length!=2 || out[0]!=0x20 || out[1]!=0x1e09) {
1685103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius        log_err("unorm2_getNFKCCasefoldInstance() did not return an NFKC_Casefold instance (normalized length=%d; %s)\n",
1686103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius                (int)length, u_errorName(errorCode));
1687103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius    }
1688103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius}
1689103e9ffba2cba345d0078eb8b8db33249f81840aCraig Cornelius
1690b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif /* #if !UCONFIG_NO_NORMALIZATION */
1691