1b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes/*
2b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes * Copyright (C) 2009 The Android Open Source Project
3f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
4b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
5b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes * you may not use this file except in compliance with the License.
6b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes * You may obtain a copy of the License at
7f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
8b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
9f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
10b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes * Unless required by applicable law or agreed to in writing, software
11b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes * See the License for the specific language governing permissions and
14b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes * limitations under the License.
15b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes */
16b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes
174557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonpackage libcore.java.nio.charset;
18b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes
19b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughesimport java.nio.ByteBuffer;
20b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughesimport java.nio.CharBuffer;
214557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.nio.charset.CharacterCodingException;
224557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.nio.charset.Charset;
234557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.nio.charset.CharsetDecoder;
244557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.nio.charset.CharsetEncoder;
254557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.nio.charset.CoderResult;
264557728efb66c455a52b7669a8eefef7a9e54854Jesse Wilsonimport java.nio.charset.CodingErrorAction;
27b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes
282981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughespublic class CharsetDecoderTest extends junit.framework.TestCase {
29cf6c3a752da274cc5025191d3bcd62e6222f4a4cElliott Hughes    // None of the harmony or jtreg tests actually check that replaceWith does the right thing!
30cf6c3a752da274cc5025191d3bcd62e6222f4a4cElliott Hughes    public void test_replaceWith() throws Exception {
31cf6c3a752da274cc5025191d3bcd62e6222f4a4cElliott Hughes        CharsetDecoder d = Charset.forName("UTF-16").newDecoder();
32cf6c3a752da274cc5025191d3bcd62e6222f4a4cElliott Hughes        d.replaceWith("x");
33cf6c3a752da274cc5025191d3bcd62e6222f4a4cElliott Hughes        d.onMalformedInput(CodingErrorAction.REPLACE);
34cf6c3a752da274cc5025191d3bcd62e6222f4a4cElliott Hughes        d.onUnmappableCharacter(CodingErrorAction.REPLACE);
35cf6c3a752da274cc5025191d3bcd62e6222f4a4cElliott Hughes        ByteBuffer in = ByteBuffer.wrap(new byte[] { 109, 97, 109 });
36cf6c3a752da274cc5025191d3bcd62e6222f4a4cElliott Hughes        assertEquals("\u6d61x", d.decode(in).toString());
37cf6c3a752da274cc5025191d3bcd62e6222f4a4cElliott Hughes    }
38cf6c3a752da274cc5025191d3bcd62e6222f4a4cElliott Hughes
39b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    // http://code.google.com/p/android/issues/detail?id=4237
40b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    public void test_ByteArray_decode_no_offset() throws Exception {
412981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        CharsetDecoder decoder = Charset.forName("UTF-16").newDecoder();
422981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        byte[] arr = encode("UTF-16", "Android");
43b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        ByteBuffer inBuffer = ByteBuffer.wrap(arr, 0, arr.length).slice();
44b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        CharBuffer outBuffer = CharBuffer.allocate(arr.length);
45b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        decoder.reset();
46b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        CoderResult coderResult = decoder.decode(inBuffer, outBuffer, true);
47b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        assertFalse(coderResult.toString(), coderResult.isError());
48b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        decoder.flush(outBuffer);
49b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        outBuffer.flip();
502981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        assertEquals("Android", outBuffer.toString().trim());
51b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    }
52f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
53b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    // http://code.google.com/p/android/issues/detail?id=4237
54b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    public void test_ByteArray_decode_with_offset() throws Exception {
552981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        CharsetDecoder decoder = Charset.forName("UTF-16").newDecoder();
562981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        byte[] arr = encode("UTF-16", "Android");
57b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        arr = prependByteToByteArray(arr, new Integer(1).byteValue());
58b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        int offset = 1;
59b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        ByteBuffer inBuffer = ByteBuffer.wrap(arr, offset, arr.length - offset).slice();
60b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        CharBuffer outBuffer = CharBuffer.allocate(arr.length - offset);
61b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        decoder.reset();
62b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        CoderResult coderResult = decoder.decode(inBuffer, outBuffer, true);
63b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        assertFalse(coderResult.toString(), coderResult.isError());
64b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        decoder.flush(outBuffer);
65b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        outBuffer.flip();
662981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        assertEquals("Android", outBuffer.toString().trim());
67b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    }
68f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
69b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    // http://code.google.com/p/android/issues/detail?id=4237
70b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    public void test_ByteArray_decode_with_offset_using_facade_method() throws Exception {
712981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        CharsetDecoder decoder = Charset.forName("UTF-16").newDecoder();
722981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        byte[] arr = encode("UTF-16", "Android");
73b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        arr = prependByteToByteArray(arr, new Integer(1).byteValue());
74b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        int offset = 1;
75b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        CharBuffer outBuffer = decoder.decode(ByteBuffer.wrap(arr, offset, arr.length - offset));
762981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        assertEquals("Android", outBuffer.toString().trim());
77b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    }
78f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
79b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    private static byte[] prependByteToByteArray(byte[] arr, byte b) {
80b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        byte[] result = new byte[arr.length + 1];
81b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        result[0] = b;
82b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        System.arraycopy(arr, 0, result, 1, arr.length);
83b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes        return result;
84b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    }
85f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
862981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes    private static byte[] encode(String charsetName, String s) throws Exception {
872981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        CharsetEncoder encoder = Charset.forName(charsetName).newEncoder();
882981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        return encoder.encode(CharBuffer.wrap(s)).array();
89b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    }
90f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
912981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes    public void testUtf8BytesSplitAcrossMultipleWrites() throws Exception {
922981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
932981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        CharBuffer cb = CharBuffer.allocate(128);
942981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        CoderResult cr;
952981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        cr = decoder.decode(ByteBuffer.wrap(new byte[] { (byte) 0xe2 }), cb, false);
962981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        assertEquals(CoderResult.UNDERFLOW, cr);
972981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        cr = decoder.decode(ByteBuffer.wrap(new byte[] { (byte) 0x98 }), cb, false);
982981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        assertEquals(CoderResult.UNDERFLOW, cr);
992981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        cr = decoder.decode(ByteBuffer.wrap(new byte[] { (byte) 0x83 }), cb, false);
1002981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        assertEquals(CoderResult.UNDERFLOW, cr);
1012981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        cr = decoder.decode(ByteBuffer.wrap(new byte[0]), cb, true);
1022981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        assertEquals(CoderResult.UNDERFLOW, cr);
1032981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        cr = decoder.flush(cb);
1042981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        assertEquals(CoderResult.UNDERFLOW, cr);
1052981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        assertEquals(1, cb.position());
1062981b5e8cf7c19dfd85b2088b18b7a6146825317Elliott Hughes        assertEquals('\u2603', cb.get(0));
107b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes    }
108b7bfb47e9720ecc6e10f43878f27e40542a9c800Elliott Hughes}
109