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