395N/A/*
2362N/A * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
395N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
395N/A *
395N/A * This code is free software; you can redistribute it and/or modify it
395N/A * under the terms of the GNU General Public License version 2 only, as
395N/A * published by the Free Software Foundation.
395N/A *
395N/A * This code is distributed in the hope that it will be useful, but WITHOUT
395N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
395N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
395N/A * version 2 for more details (a copy is included in the LICENSE file that
395N/A * accompanied this code).
395N/A *
395N/A * You should have received a copy of the GNU General Public License version
395N/A * 2 along with this work; if not, write to the Free Software Foundation,
395N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
395N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
395N/A */
395N/A
395N/A/*
395N/A @bug 6346419
395N/A @summary Check correctness of the UTF-32 and its variant charsets
395N/A */
395N/A
395N/Aimport java.io.*;
395N/Aimport java.nio.*;
395N/Aimport java.nio.charset.*;
395N/A
395N/Apublic class TestUTF_32 {
395N/A private static void testDecode(String charset,
395N/A String expected,
395N/A byte[] input)
395N/A throws Exception
395N/A {
395N/A String out = new String(input, charset);
395N/A if (!out.equals(expected)) {
395N/A failureReport (out, expected);
395N/A throw new Exception("UTF_32 Decoding test failed: " + charset);
395N/A }
395N/A }
395N/A
395N/A private static void testEncode(String charset,
395N/A String input,
395N/A byte[] expected)
395N/A throws Exception
395N/A {
395N/A byte[] testBytes = input.getBytes(charset);
395N/A for (int i = 0; i< expected.length; i++)
395N/A if (testBytes[i] != expected[i])
395N/A throw new Exception("UTF_32 Encoding test failed: [" + i + "]"+ charset);
395N/A
395N/A }
395N/A
395N/A private static void warn(String s) {
395N/A System.err.println("FAILED Test UTF-32:" +
395N/A s) ;
395N/A }
395N/A
395N/A private static void failureReport(String testStr,
395N/A String expected) {
395N/A System.err.println ("Expected Characters:");
395N/A for (int i = 0; i < expected.length() ; i++) {
395N/A warn("expected char[" + i + "] : " +
395N/A Integer.toHexString((int)expected.charAt(i)) +
395N/A "obtained char[" + i + "] : " +
395N/A Integer.toHexString((int)testStr.charAt(i)));
395N/A }
395N/A }
395N/A
395N/A private static void writeInt(OutputStream os, int i, boolean isBig)
395N/A throws Exception
395N/A {
395N/A if (isBig) {
395N/A os.write((i>>24) & 0xff);
395N/A os.write((i>>16) & 0xff);
395N/A os.write((i>>8) & 0xff);
395N/A os.write(i & 0xff);
395N/A } else {
395N/A os.write(i & 0xff);
395N/A os.write((i>>8) & 0xff);
395N/A os.write((i>>16) & 0xff);
395N/A os.write((i>>24) & 0xff);
395N/A }
395N/A }
395N/A
395N/A private static byte[] getBytes(boolean doBOM, boolean isBig)
395N/A throws Exception
395N/A {
395N/A ByteArrayOutputStream baos = new ByteArrayOutputStream(1024*1024);
395N/A if (doBOM)
395N/A writeInt(baos, 0xfeff, isBig);
395N/A
395N/A for (int i = 0; i < 0xffff; i++) {
395N/A if (i < Character.MIN_SURROGATE ||
395N/A i > Character.MAX_SURROGATE)
395N/A writeInt(baos, i, isBig);
395N/A }
395N/A for (int i = 0x10000; i < 0x1ffff; i++) {
395N/A writeInt(baos, i, isBig);
395N/A }
395N/A
395N/A for (int i = 0x100000; i < 0x10ffff; i++) {
395N/A writeInt(baos, i, isBig);
395N/A }
395N/A byte[] bb = baos.toByteArray();
395N/A baos.close();
395N/A return bb;
395N/A }
395N/A
395N/A public static void main (String[] args) throws Exception {
395N/A byte[] bb;
395N/A String s;
395N/A
395N/A // Test 1: UTF_32 BigEndian
395N/A bb = getBytes(false, true);
395N/A s = new String(bb, "UTF-32");
395N/A testDecode("UTF_32", s, bb);
395N/A testEncode("UTF_32", s, bb);
395N/A
395N/A // Test 2: UTF_32 LittleEndian Decoding With BOM and
395N/A // BigEndian Encoding
395N/A bb = getBytes(true, false);
395N/A s = new String(bb, "UTF-32");
395N/A bb = getBytes(false, true);
395N/A testDecode("UTF_32", s, bb);
395N/A testEncode("UTF_32", s, bb);
395N/A
395N/A
395N/A // Test 3: UTF_32BE
395N/A bb = getBytes(false, true);
395N/A s = new String(bb, "UTF-32BE");
395N/A testDecode("UTF_32BE", s, bb);
395N/A testEncode("UTF_32BE", s, bb);
395N/A
395N/A
395N/A // Test 4: UTF_32LE
395N/A bb = getBytes(false, false);
395N/A s = new String(bb, "UTF-32LE");
395N/A testDecode("UTF_32LE", s, bb);
395N/A testEncode("UTF_32LE", s, bb);
395N/A
395N/A // Test 5: UTF_32BE_BOM
395N/A bb = getBytes(true, true);
395N/A s = new String(bb, "UTF-32BE-BOM");
395N/A testDecode("UTF_32BE_BOM", s, bb);
395N/A testEncode("UTF_32BE_BOM", s, bb);
395N/A
395N/A
395N/A // Test 6: UTF_32LE_BOM
395N/A bb = getBytes(true, false);
395N/A s = new String(bb, "UTF-32LE-BOM");
395N/A testDecode("UTF_32LE_BOM", s, bb);
395N/A testEncode("UTF_32LE_BOM", s, bb);
395N/A
395N/A s = "\u4e00\ufffd\u4e01";
395N/A // Test 7: BigEndian with reverse BOM in middle
395N/A bb = new byte[] {
395N/A (byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x00,
395N/A (byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00,
395N/A (byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x01
395N/A };
395N/A if (!s.equals(new String(bb, "UTF_32")) ||
395N/A !s.equals(new String(bb, "UTF_32BE")) ||
395N/A !s.equals(new String(bb, "UTF_32BE_BOM")))
395N/A throw new Exception("UTF_32 Decoding test failed: ");
395N/A
395N/A // Test 7: LittleEndian with reverse BOM in middle
395N/A bb = new byte[] {
395N/A (byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00,
395N/A (byte)0x00,(byte)0x4e,(byte)0x00,(byte)0x00,
395N/A (byte)0x00,(byte)0x00,(byte)0xfe,(byte)0xff,
395N/A (byte)0x01,(byte)0x4e,(byte)0x00,(byte)0x00
395N/A };
395N/A if (!s.equals(new String(bb, "UTF_32")) ||
395N/A !s.equals(new String(bb, "UTF_32LE")) ||
395N/A !s.equals(new String(bb, "UTF_32LE_BOM")))
395N/A throw new Exception("UTF_32 Decoding test failed: ");
395N/A
395N/A // Test 8: Overflow
395N/A if (CoderResult.OVERFLOW !=
395N/A Charset.forName("UTF_32")
395N/A .newDecoder()
395N/A .decode((ByteBuffer)(ByteBuffer.allocate(4)
395N/A .put(new byte[]
395N/A {(byte)0,(byte)1, (byte)0,(byte)01})
395N/A .flip()),
395N/A CharBuffer.allocate(1),
395N/A true)) {
395N/A throw new Exception ("Test UTF-32 Overflow test failed");
395N/A }
395N/A System.err.println ("OVERALL PASS OF UTF-32 Test");
395N/A }
395N/A}