1/*
2 * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/* @test
25   @bug 4847097
26   @summary Check surrogate coverage of EUC_TW
27 */
28
29/*
30 * Tests the full surrogate mapping roundtrip fidelity of the
31 * EUC-TW charset coder updated to support the additional
32 * planes 4,5,6,7,15
33 *
34 * byte->char mappings are contained in external files
35 * using plane{x}.surrogate as the convention for the input filenames
36 *
37 */
38
39import java.io.*;
40public class SurrogateTestEUCTW {
41
42    private static final String testRootDir
43        = System.getProperty("test.src", ".");
44
45    public static void main(String[] args) throws Exception {
46        char[] surrogatePair = new char[2];
47        int[] expectBytes = new int[4];
48
49        // Iterate test over each supported CNS-11643 plane
50        // containing supplementary character mappings
51
52        String[] testPlane = { "3", "4", "5", "6" ,"7", "15" };
53
54        for (int i = 0 ; i < testPlane.length; i++) {
55            FileReader f = new FileReader(testRootDir +
56                                          System.getProperty("file.separator")
57                                          + "SurrogateTestEUCTW.plane"
58                                          + testPlane[i]
59                                          + ".surrogates");
60            BufferedReader r = new BufferedReader(f);
61            String line;
62
63            while ((line = r.readLine()) != null) {
64                int charValue = Integer.parseInt(line.substring(9,14), 16);
65                surrogatePair[0] = (char) ((charValue - 0x10000) / 0x400
66                                    + 0xd800);
67                surrogatePair[1] = (char) ((charValue - 0x10000) % 0x400
68                                    + 0xdc00);
69                // Synthesize 4 byte expected byte values from CNS input values
70                expectBytes[0] = 0x8E;
71                expectBytes[1] = 0xA0 + Integer.parseInt(testPlane[i]);
72                expectBytes[2] = 0x80 | Integer.parseInt(line.substring(2,4), 16);
73                expectBytes[3] = 0x80 | Integer.parseInt(line.substring(4,6), 16);
74
75                String testStr = new String(surrogatePair);
76                byte[] encodedBytes = testStr.getBytes("EUC-TW");
77
78                for (int x = 0 ; x < 4 ; x++) {
79                    if (encodedBytes[x] != (byte)(expectBytes[x] & 0xff)) {
80                        throw new Exception("EUC_TW Surrogate Encoder error");
81                    }
82                }
83
84                // Next: test round-trip fidelity
85                String decoded = new String(encodedBytes, "EUC-TW");
86
87                if (!decoded.equals(testStr)) {
88                    throw new Exception("EUCTW Decoder error");
89                }
90            }
91            r.close();
92            f.close();
93        }
94    }
95}
96