blob: 082b244c9f62263a705b61bf5de1fa4d6339f2d6 [file] [log] [blame]
/*
* Copyright (c) 2008, 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.
*/
/*
@bug 6346419
@summary Check correctness of the UTF-32 and its variant charsets
*/
import java.io.*;
import java.nio.*;
import java.nio.charset.*;
public class TestUTF_32 {
private static void testDecode(String charset,
String expected,
byte[] input)
throws Exception
{
String out = new String(input, charset);
if (!out.equals(expected)) {
failureReport (out, expected);
throw new Exception("UTF_32 Decoding test failed: " + charset);
}
}
private static void testEncode(String charset,
String input,
byte[] expected)
throws Exception
{
byte[] testBytes = input.getBytes(charset);
for (int i = 0; i< expected.length; i++)
if (testBytes[i] != expected[i])
throw new Exception("UTF_32 Encoding test failed: [" + i + "]"+ charset);
}
private static void warn(String s) {
System.err.println("FAILED Test UTF-32:" +
s) ;
}
private static void failureReport(String testStr,
String expected) {
System.err.println ("Expected Characters:");
for (int i = 0; i < expected.length() ; i++) {
warn("expected char[" + i + "] : " +
Integer.toHexString((int)expected.charAt(i)) +
"obtained char[" + i + "] : " +
Integer.toHexString((int)testStr.charAt(i)));
}
}
private static void writeInt(OutputStream os, int i, boolean isBig)
throws Exception
{
if (isBig) {
os.write((i>>24) & 0xff);
os.write((i>>16) & 0xff);
os.write((i>>8) & 0xff);
os.write(i & 0xff);
} else {
os.write(i & 0xff);
os.write((i>>8) & 0xff);
os.write((i>>16) & 0xff);
os.write((i>>24) & 0xff);
}
}
private static byte[] getBytes(boolean doBOM, boolean isBig)
throws Exception
{
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024*1024);
if (doBOM)
writeInt(baos, 0xfeff, isBig);
for (int i = 0; i < 0xffff; i++) {
if (i < Character.MIN_SURROGATE ||
i > Character.MAX_SURROGATE)
writeInt(baos, i, isBig);
}
for (int i = 0x10000; i < 0x1ffff; i++) {
writeInt(baos, i, isBig);
}
for (int i = 0x100000; i < 0x10ffff; i++) {
writeInt(baos, i, isBig);
}
byte[] bb = baos.toByteArray();
baos.close();
return bb;
}
public static void main (String[] args) throws Exception {
byte[] bb;
String s;
// Test 1: UTF_32 BigEndian
bb = getBytes(false, true);
s = new String(bb, "UTF-32");
testDecode("UTF_32", s, bb);
testEncode("UTF_32", s, bb);
// Test 2: UTF_32 LittleEndian Decoding With BOM and
// BigEndian Encoding
bb = getBytes(true, false);
s = new String(bb, "UTF-32");
bb = getBytes(false, true);
testDecode("UTF_32", s, bb);
testEncode("UTF_32", s, bb);
// Test 3: UTF_32BE
bb = getBytes(false, true);
s = new String(bb, "UTF-32BE");
testDecode("UTF_32BE", s, bb);
testEncode("UTF_32BE", s, bb);
// Test 4: UTF_32LE
bb = getBytes(false, false);
s = new String(bb, "UTF-32LE");
testDecode("UTF_32LE", s, bb);
testEncode("UTF_32LE", s, bb);
// Test 5: UTF_32BE_BOM
bb = getBytes(true, true);
s = new String(bb, "UTF-32BE-BOM");
testDecode("UTF_32BE_BOM", s, bb);
testEncode("UTF_32BE_BOM", s, bb);
// Test 6: UTF_32LE_BOM
bb = getBytes(true, false);
s = new String(bb, "UTF-32LE-BOM");
testDecode("UTF_32LE_BOM", s, bb);
testEncode("UTF_32LE_BOM", s, bb);
s = "\u4e00\ufffd\u4e01";
// Test 7: BigEndian with reverse BOM in middle
bb = new byte[] {
(byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x00,
(byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00,
(byte)0x00,(byte)0x00,(byte)0x4e,(byte)0x01
};
if (!s.equals(new String(bb, "UTF_32")) ||
!s.equals(new String(bb, "UTF_32BE")) ||
!s.equals(new String(bb, "UTF_32BE_BOM")))
throw new Exception("UTF_32 Decoding test failed: ");
// Test 7: LittleEndian with reverse BOM in middle
bb = new byte[] {
(byte)0xff,(byte)0xfe,(byte)0x00,(byte)0x00,
(byte)0x00,(byte)0x4e,(byte)0x00,(byte)0x00,
(byte)0x00,(byte)0x00,(byte)0xfe,(byte)0xff,
(byte)0x01,(byte)0x4e,(byte)0x00,(byte)0x00
};
if (!s.equals(new String(bb, "UTF_32")) ||
!s.equals(new String(bb, "UTF_32LE")) ||
!s.equals(new String(bb, "UTF_32LE_BOM")))
throw new Exception("UTF_32 Decoding test failed: ");
// Test 8: Overflow
if (CoderResult.OVERFLOW !=
Charset.forName("UTF_32")
.newDecoder()
.decode((ByteBuffer)(ByteBuffer.allocate(4)
.put(new byte[]
{(byte)0,(byte)1, (byte)0,(byte)01})
.flip()),
CharBuffer.allocate(1),
true)) {
throw new Exception ("Test UTF-32 Overflow test failed");
}
System.err.println ("OVERALL PASS OF UTF-32 Test");
}
}