1// © 2016 and later: Unicode, Inc. and others.
2// License & terms of use: http://www.unicode.org/copyright.html
3/*
4************************************************************************
5* Copyright (c) 1997-2003, International Business Machines
6* Corporation and others.  All Rights Reserved.
7************************************************************************
8*/
9
10#ifndef _NORMCONF
11#define _NORMCONF
12
13#include "unicode/utypes.h"
14
15#if !UCONFIG_NO_NORMALIZATION
16
17#include "unicode/normalizer2.h"
18#include "unicode/normlzr.h"
19#include "intltest.h"
20
21typedef struct _FileStream FileStream;
22
23class NormalizerConformanceTest : public IntlTest {
24    Normalizer normalizer;
25    const Normalizer2 *nfc, *nfd, *nfkc, *nfkd;
26
27 public:
28    NormalizerConformanceTest();
29    virtual ~NormalizerConformanceTest();
30
31    void runIndexedTest(int32_t index, UBool exec, const char* &name, char* par=NULL);
32
33    /**
34     * Test the conformance of Normalizer to
35     * http://www.unicode.org/Public/UNIDATA/NormalizationTest.txt
36     */
37    void TestConformance();
38    void TestConformance32();
39    void TestConformance(FileStream *input, int32_t options);
40
41    // Specific tests for debugging.  These are generally failures taken from
42    // the conformance file, but culled out to make debugging easier.
43    void TestCase6(void);
44
45 private:
46    FileStream *openNormalizationTestFile(const char *filename);
47
48    /**
49     * Verify the conformance of the given line of the Unicode
50     * normalization (UTR 15) test suite file.  For each line,
51     * there are five columns, corresponding to field[0]..field[4].
52     *
53     * The following invariants must be true for all conformant implementations
54     *  c2 == NFC(c1) == NFC(c2) == NFC(c3)
55     *  c3 == NFD(c1) == NFD(c2) == NFD(c3)
56     *  c4 == NFKC(c1) == NFKC(c2) == NFKC(c3) == NFKC(c4) == NFKC(c5)
57     *  c5 == NFKD(c1) == NFKD(c2) == NFKD(c3) == NFKD(c4) == NFKD(c5)
58     *
59     * @param field the 5 columns
60     * @param line the source line from the test suite file
61     * @return true if the test passes
62     */
63    UBool checkConformance(const UnicodeString* field,
64                           const char *line,
65                           int32_t options,
66                           UErrorCode &status);
67
68    UBool checkNorm(UNormalizationMode mode, int32_t options,
69                    const Normalizer2 *norm2,
70                    const UnicodeString &s, const UnicodeString &exp,
71                    int32_t field);
72
73    void iterativeNorm(const UnicodeString& str,
74                       UNormalizationMode mode, int32_t options,
75                       UnicodeString& result,
76                       int8_t dir);
77
78    /**
79     * @param op name of normalization form, e.g., "KC"
80     * @param op2 name of test case variant, e.g., "(-1)"
81     * @param s string being normalized
82     * @param got value received
83     * @param exp expected value
84     * @param msg description of this test
85     * @param return true if got == exp
86     */
87    UBool assertEqual(const char *op, const char *op2,
88                      const UnicodeString& s,
89                      const UnicodeString& got,
90                      const UnicodeString& exp,
91                      const char *msg);
92
93    /**
94     * Split a string into pieces based on the given delimiter
95     * character.  Then, parse the resultant fields from hex into
96     * characters.  That is, "0040 0400;0C00;0899" -> new String[] {
97     * "\u0040\u0400", "\u0C00", "\u0899" }.  The output is assumed to
98     * be of the proper length already, and exactly output.length
99     * fields are parsed.  If there are too few an exception is
100     * thrown.  If there are too many the extras are ignored.
101     *
102     * @param buf scratch buffer
103     * @return FALSE upon failure
104     */
105    UBool hexsplit(const char *s, char delimiter,
106                   UnicodeString output[], int32_t outputLength);
107
108    void _testOneLine(const char *line);
109    void compare(const UnicodeString& s1,const UnicodeString& s2);
110};
111
112#endif /* #if !UCONFIG_NO_NORMALIZATION */
113
114#endif
115