1 /*
2  * Copyright (c) 1999, 2020, 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 4179153 4652234 6529796
26    @summary Read code mapping table and check code conversion
27    @modules jdk.charsets
28  */
29 
30 import java.io.*;
31 import java.nio.charset.Charset;
32 import java.util.HashSet;
33 
34 public class TestConv {
35     static int errorNum = 0;
36     private static final int maxBytesPerChar = 10;
37 
main(String args[])38     public static void main(String args[])
39         throws Exception
40     {
41         File d = new File(System.getProperty("test.src", "."));
42         if (args.length == 0) {
43             String[] files = d.list();
44             String encoding;
45             for (int i = 0; i < files.length; i++) {
46                 if (files[i].endsWith(".b2c")) {
47                     encoding = files[i].substring(0, files[i].length() - 4 );
48                     check(d, encoding);
49                 }
50             }
51         } else {
52             for (int i = 0; i < args.length; i++)
53                 check(d, args[i]);
54         }
55     }
56 
57     static class Parser2 extends CoderTest.Parser {
58         int warnOff;
59         String regwarnCP;
Parser2(InputStream is)60         Parser2 (InputStream is) throws IOException {
61             super(is);
62         }
isDirective(String line)63         protected boolean isDirective(String line) {
64             if ((warnOff = line.indexOf("REGWARN")) != -1)
65                 regwarnCP = line.substring(warnOff+7);
66             else
67                 regwarnCP = null;
68             return false;
69         }
70     }
71 
check(File dir, String encoding)72     private static void check(File dir, String encoding) throws Exception
73     {
74         byte[] inByte;
75         byte[] outByte;
76         char[] inChar;
77         String inStr;
78         String outStr;
79 
80         System.out.println("\nChecking " + encoding + "...");
81         errorNum = 0;
82 
83         if (!Charset.isSupported(encoding)) {
84             System.out.println("Not supported: " + encoding);
85             return;
86         }
87 
88         Parser2 p = null;
89         try {
90             p = new Parser2(new FileInputStream(new File(dir, encoding + ".b2c")));
91         } catch (Exception e) {
92             throw new Exception("Can't open file " + encoding + ".b2c");
93         }
94         CoderTest.Entry e = new CoderTest.Entry();
95 
96         while ((e = (CoderTest.Entry)p.next(e)) != null) {
97             if (e.cp2 != 0)
98                 continue;  // skip composite (base+cc) for now
99             inByte = e.bb;
100             inChar = Character.toChars(e.cp);
101             inStr = new String(inChar);
102             outStr = new String(inByte, encoding);
103             outByte = inStr.getBytes(encoding);
104             int r = compareInOut(inStr, outStr, inByte, outByte);
105             if (r == 1) {
106                 if (p.warnOff == -1)
107                     errorNum++;
108                 else {
109                    System.out.println ("Regression Warning code point " +
110                                        p.regwarnCP);
111                 }
112                 System.out.println("Warning " + errorNum
113                                    + ": " + byteString(inByte)
114                                    + " -> \\u" + toHex(outStr)
115                                    + "  multi-mapping? \\u" + toHex(inStr));
116             } else if (r == 2) {
117                 if (p.warnOff == -1)
118                     errorNum++;
119             }
120         }
121 
122         if (errorNum == 0) {
123             System.out.println("OK.");
124         } else {
125             throw new RuntimeException(errorNum + " Warning(s).");
126         }
127     }
128 
compareInOut(String inStr, String outStr, byte[] inByte, byte[] outByte)129     private static int compareInOut(String inStr, String outStr,
130                                 byte[] inByte, byte[] outByte)
131     {
132         if (inStr.compareTo(outStr) != 0)
133             return 1;
134 
135         if (inByte.length != outByte.length) {
136             return 2;
137         }
138 
139         for (int i = 0; i < inByte.length; i++) {
140             if (inByte[i] != outByte[i])
141                 return 2;
142         }
143 
144         return 0;
145     }
146 
toHex(String str)147     private static String toHex(String str)
148     {
149         if (str.length() == 0)
150             return "";
151         String s = Integer.toHexString(str.charAt(0)).toUpperCase();
152         if (s.length() == 1 || s.length() == 3)
153             return "0" + s;
154         return s;
155     }
156 
byteString(byte[] b)157     private static String byteString(byte[] b)
158     {
159         String s = "0x";
160         for (int i = 0; i < b.length; i++)
161             s += Integer.toHexString(b[i] & 0xff).toUpperCase();
162         return s;
163     }
164 
165 }
166