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