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 
39 import java.io.*;
40 public class SurrogateTestEUCTW {
41 
42     private static final String testRootDir
43         = System.getProperty("test.src", ".");
44 
main(String[] args)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