FindCanEncodeBugs.java revision 1571
2N/A/*
2N/A * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
2N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2N/A *
2N/A * This code is free software; you can redistribute it and/or modify it
2N/A * under the terms of the GNU General Public License version 2 only, as
2N/A * published by the Free Software Foundation.
2N/A *
2N/A * This code is distributed in the hope that it will be useful, but WITHOUT
2N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
2N/A * version 2 for more details (a copy is included in the LICENSE file that
2N/A * accompanied this code).
2N/A *
2N/A * You should have received a copy of the GNU General Public License version
2N/A * 2 along with this work; if not, write to the Free Software Foundation,
2N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2N/A *
2N/A * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
2N/A * CA 95054 USA or visit www.sun.com if you need additional information or
2N/A * have any questions.
2N/A */
2N/A
2N/A/* @test
2N/A @bug 5066863 5066867 5066874 5066879 5066884 5066887 5065777 6730652
2N/A @summary canEncode() false iff encode() throws CharacterCodingException
2N/A @run main/timeout=1200 FindCanEncodeBugs
2N/A @author Martin Buchholz
2N/A */
2N/A
2N/Aimport java.util.*;
2N/Aimport java.nio.charset.*;
2N/Aimport java.nio.*;
2N/A
2N/Apublic class FindCanEncodeBugs {
2N/A static boolean encodable1(CharsetEncoder enc, char c) {
2N/A enc.reset();
2N/A return enc.canEncode(c);
2N/A }
2N/A
2N/A static boolean encodable2(CharsetEncoder enc, char c) {
2N/A enc.reset();
2N/A try { enc.encode(CharBuffer.wrap(new char[]{c})); return true; }
2N/A catch (CharacterCodingException e) { return false; }
2N/A }
2N/A
2N/A public static void main(String[] args) throws Exception {
2N/A int failures = 0;
2N/A
for (Map.Entry<String,Charset> e
: Charset.availableCharsets().entrySet()) {
String csn = e.getKey();
Charset cs = e.getValue();
if (! cs.canEncode() || csn.matches("x-COMPOUND_TEXT"))
continue;
//System.out.println(csn);
CharsetEncoder enc = cs.newEncoder();
for (int i = Character.MIN_VALUE; i <= Character.MAX_VALUE; i++) {
boolean encodable1 = encodable1(enc, (char)i);
boolean encodable2 = encodable2(enc, (char)i);
if (encodable1 != encodable2) {
int start = i;
int end = i;
for (int j = i;
j <= '\uffff' &&
encodable1(enc, (char)j) == encodable1 &&
encodable2(enc, (char)j) == encodable2;
j++)
end = j;
System.out.printf("charset=%-18s canEncode=%-5b ",
csn, encodable1);
if (start == end)
System.out.printf("\'\\u%04x\'%n", start);
else
System.out.printf("\'\\u%04x\' - \'\\u%04x\'%n",
start, end);
i = end;
failures++;
}
}
}
if (failures > 0)
throw new Exception(failures + " failures");
}
}