/* * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* @test @bug 4179153 4652234 6529796 @summary Read code mapping table and check code conversion @modules jdk.charsets */ import java.io.*; import java.nio.charset.Charset; import java.util.HashSet; public class TestConv { static int errorNum = 0; private static final int maxBytesPerChar = 10; public static void main(String args[]) throws Exception { File d = new File(System.getProperty("test.src", ".")); if (args.length == 0) { String[] files = d.list(); String encoding; for (int i = 0; i < files.length; i++) { if (files[i].endsWith(".b2c")) { encoding = files[i].substring(0, files[i].length() - 4 ); check(d, encoding); } } } else { for (int i = 0; i < args.length; i++) check(d, args[i]); } } static class Parser2 extends CoderTest.Parser { int warnOff; String regwarnCP; Parser2 (InputStream is) throws IOException { super(is); } protected boolean isDirective(String line) { if ((warnOff = line.indexOf("REGWARN")) != -1) regwarnCP = line.substring(warnOff+7); else regwarnCP = null; return false; } } private static void check(File dir, String encoding) throws Exception { byte[] inByte; byte[] outByte; char[] inChar; String inStr; String outStr; System.out.println("\nChecking " + encoding + "..."); errorNum = 0; if (!Charset.isSupported(encoding)) { System.out.println("Not supported: " + encoding); return; } Parser2 p = null; try { p = new Parser2(new FileInputStream(new File(dir, encoding + ".b2c"))); } catch (Exception e) { throw new Exception("Can't open file " + encoding + ".b2c"); } CoderTest.Entry e = new CoderTest.Entry(); while ((e = (CoderTest.Entry)p.next(e)) != null) { if (e.cp2 != 0) continue; // skip composite (base+cc) for now inByte = e.bb; inChar = Character.toChars(e.cp); inStr = new String(inChar); outStr = new String(inByte, encoding); outByte = inStr.getBytes(encoding); int r = compareInOut(inStr, outStr, inByte, outByte); if (r == 1) { if (p.warnOff == -1) errorNum++; else { System.out.println ("Regression Warning code point " + p.regwarnCP); } System.out.println("Warning " + errorNum + ": " + byteString(inByte) + " -> \\u" + toHex(outStr) + " multi-mapping? \\u" + toHex(inStr)); } else if (r == 2) { if (p.warnOff == -1) errorNum++; } } if (errorNum == 0) { System.out.println("OK."); } else { throw new RuntimeException(errorNum + " Warning(s)."); } } private static int compareInOut(String inStr, String outStr, byte[] inByte, byte[] outByte) { if (inStr.compareTo(outStr) != 0) return 1; if (inByte.length != outByte.length) { return 2; } for (int i = 0; i < inByte.length; i++) { if (inByte[i] != outByte[i]) return 2; } return 0; } private static String toHex(String str) { if (str.length() == 0) return ""; String s = Integer.toHexString(str.charAt(0)).toUpperCase(); if (s.length() == 1 || s.length() == 3) return "0" + s; return s; } private static String byteString(byte[] b) { String s = "0x"; for (int i = 0; i < b.length; i++) s += Integer.toHexString(b[i] & 0xff).toUpperCase(); return s; } }