jdk/test/sun/nio/cs/TestX11CNS.java
changeset 2914 1375969fd02e
child 5506 202f599c92aa
--- /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());
+
+    }
+}