--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/sun/nio/cs/TestX11CNS.java Tue May 19 16:03:02 2009 -0700
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6831794
+ * @summary Test X11CNS charset
+ */
+
+import java.nio.charset.*;
+import java.nio.*;
+import java.util.*;
+
+public class TestX11CNS {
+ static char[] decode(byte[] bb, Charset cs)
+ throws Exception {
+ CharsetDecoder dec = cs.newDecoder();
+ ByteBuffer bbf = ByteBuffer.wrap(bb);
+ CharBuffer cbf = CharBuffer.allocate(bb.length);
+ CoderResult cr = dec.decode(bbf, cbf, true);
+ if (cr != CoderResult.UNDERFLOW) {
+ System.out.println("DEC-----------------");
+ int pos = bbf.position();
+ System.out.printf(" cr=%s, bbf.pos=%d, bb[pos]=%x,%x,%x,%x%n",
+ cr.toString(), pos,
+ bb[pos++]&0xff, bb[pos++]&0xff,bb[pos++]&0xff, bb[pos++]&0xff);
+ throw new RuntimeException("Decoding err: " + cs.name());
+ }
+ char[] cc = new char[cbf.position()];
+ cbf.flip(); cbf.get(cc);
+ return cc;
+
+ }
+
+ static byte[] encode(char[] cc, Charset cs)
+ throws Exception {
+ ByteBuffer bbf = ByteBuffer.allocate(cc.length * 4);
+ CharBuffer cbf = CharBuffer.wrap(cc);
+ CharsetEncoder enc = cs.newEncoder();
+
+ CoderResult cr = enc.encode(cbf, bbf, true);
+ if (cr != CoderResult.UNDERFLOW) {
+ System.out.println("ENC-----------------");
+ int pos = cbf.position();
+ System.out.printf(" cr=%s, cbf.pos=%d, cc[pos]=%x%n",
+ cr.toString(), pos, cc[pos]&0xffff);
+ throw new RuntimeException("Encoding err: " + cs.name());
+ }
+ byte[] bb = new byte[bbf.position()];
+ bbf.flip(); bbf.get(bb);
+ return bb;
+ }
+
+ static char[] getChars(Charset newCS, Charset oldCS) {
+ CharsetEncoder enc = oldCS.newEncoder();
+ CharsetEncoder encNew = newCS.newEncoder();
+ char[] cc = new char[0x10000];
+ int pos = 0;
+ int i = 0;
+ while (i < 0x10000) {
+ if (i == 0x4ea0 || i == 0x51ab || i == 0x52f9) {
+ i++;continue;
+ }
+ if (enc.canEncode((char)i) != encNew.canEncode((char)i)) {
+ System.out.printf(" Err i=%x%n", i);
+ //throw new RuntimeException("canEncode() err!");
+ }
+ if (enc.canEncode((char)i)) {
+ cc[pos++] = (char)i;
+ }
+ i++;
+ }
+ return Arrays.copyOf(cc, pos);
+ }
+
+ static void compare(Charset newCS, Charset oldCS) throws Exception {
+ char[] cc = getChars(newCS, oldCS);
+ System.out.printf(" Diff <%s> <%s>...%n", newCS.name(), oldCS.name());
+
+ byte[] bb1 = encode(cc, newCS);
+ byte[] bb2 = encode(cc, oldCS);
+
+ if (!Arrays.equals(bb1, bb2)) {
+ System.out.printf(" encoding failed!%n");
+ }
+ char[] cc1 = decode(bb1, newCS);
+ char[] cc2 = decode(bb1, oldCS);
+ if (!Arrays.equals(cc1, cc2)) {
+ for (int i = 0; i < cc1.length; i++) {
+ if (cc1[i] != cc2[i]) {
+ System.out.printf("i=%d, cc1=%x cc2=%x, bb=<%x%x>%n",
+ i,
+ cc1[i]&0xffff, cc2[i]&0xffff,
+ bb1[i*2]&0xff, bb1[i*2+1]&0xff);
+ }
+
+ }
+
+ System.out.printf(" decoding failed%n");
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+ compare(new sun.awt.motif.X11CNS11643P1(),
+ new X11CNS11643P1());
+
+ compare(new sun.awt.motif.X11CNS11643P2(),
+ new X11CNS11643P2());
+
+ compare(new sun.awt.motif.X11CNS11643P3(),
+ new X11CNS11643P3());
+
+ }
+}