156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes/* Licensed to the Apache Software Foundation (ASF) under one or more
256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * contributor license agreements.  See the NOTICE file distributed with
356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * this work for additional information regarding copyright ownership.
456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * (the "License"); you may not use this file except in compliance with
656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * the License.  You may obtain a copy of the License at
76ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes *
856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
96ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes *
1056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * Unless required by applicable law or agreed to in writing, software
1156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
1256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * See the License for the specific language governing permissions and
1456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * limitations under the License.
1556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes */
16e5fea3d504609d22337a5311d3ce0e72314bceeeNarayan Kamathpackage org.apache.harmony.tests.java.nio.charset;
1756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
1856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.io.UnsupportedEncodingException;
1956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.ByteBuffer;
2056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.CharBuffer;
2156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.CharacterCodingException;
2256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.Charset;
2356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.CharsetDecoder;
2456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.CoderResult;
2556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.CodingErrorAction;
2656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.MalformedInputException;
2756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.UnmappableCharacterException;
2856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
2956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport junit.framework.TestCase;
3056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
3156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes/**
3256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * API unit test for java.nio.CharsetDecoder
3356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes */
3456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughespublic class CharsetDecoderTest extends TestCase {
3556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
3656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    protected static final int MAX_BYTES = 3;
3756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
3856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    protected static final double AVER_BYTES = 0.5;
3956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
4056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // default charset
4156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    private static final Charset MOCKCS = new CharsetEncoderTest.MockCharset(
4256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            "mock", new String[0]);
4356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
4456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    Charset cs = MOCKCS;
4556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
4656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // default decoder
4756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    protected static CharsetDecoder decoder;
4856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
4956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    String bom = "";
5056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
5156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    protected void setUp() throws Exception {
5256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        super.setUp();
5356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder = cs.newDecoder();
5456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
5556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
5656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    protected void tearDown() throws Exception {
5756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        super.tearDown();
5856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
5956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
6056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // FIXME: give up this tests
6156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // /*
6256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // * test default value
6356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // */
6456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // public void testDefaultCharsPerByte() {
6556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // assertTrue(decoder.averageCharsPerByte() == AVER_BYTES);
6656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // assertTrue(decoder.maxCharsPerByte() == MAX_BYTES);
6756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // }
6856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
6956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDefaultValues() {
7056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(cs, decoder.charset());
7156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
7256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.detectedCharset();
7356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should unsupported");
7456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (UnsupportedOperationException e) {
7556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
7656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
7756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            assertTrue(decoder.isCharsetDetected());
7856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should unsupported");
7956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (UnsupportedOperationException e) {
8056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
8156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertFalse(decoder.isAutoDetecting());
8256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CodingErrorAction.REPORT, decoder.malformedInputAction());
8356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CodingErrorAction.REPORT, decoder
8456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                .unmappableCharacterAction());
8556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(decoder.replacement(), "\ufffd");
8656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
8756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
8856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    /*
8956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * test constructor
9056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     */
9156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testCharsetDecoder() {
9256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // default value
9356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder = new MockCharsetDecoder(cs, (float) AVER_BYTES, MAX_BYTES);
9456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
9556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // normal case
9656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharsetDecoder ec = new MockCharsetDecoder(cs, 1, MAX_BYTES);
9756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(ec.charset(), cs);
9856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(1.0, ec.averageCharsPerByte(), 0.0);
9956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertTrue(ec.maxCharsPerByte() == MAX_BYTES);
10056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
10156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        /*
10256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes         * ------------------------ Exceptional cases -------------------------
10356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes         */
10456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case: null charset
10556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ec = new MockCharsetDecoder(null, 1, MAX_BYTES);
10656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertNull(ec.charset());
10756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(1.0, ec.averageCharsPerByte(), 0.0);
10856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertTrue(ec.maxCharsPerByte() == MAX_BYTES);
10956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
11056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ec = new MockCharsetDecoder(new CharsetEncoderTest.MockCharset("mock",
11156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                new String[0]), 1, MAX_BYTES);
11256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
11356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Commented out since the comment is wrong since MAX_BYTES > 1
11456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // // OK: average length less than max length
11556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // ec = new MockCharsetDecoder(cs, MAX_BYTES, 1);
11656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // assertTrue(ec.averageCharsPerByte() == MAX_BYTES);
11756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // assertTrue(ec.maxCharsPerByte() == 1);
11856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
11956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Illegal Argument: zero length
12056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
12156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            ec = new MockCharsetDecoder(cs, 0, MAX_BYTES);
12256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw IllegalArgumentException");
12356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalArgumentException e) {
12456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
12556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
12656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            ec = new MockCharsetDecoder(cs, 1, 0);
12756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw IllegalArgumentException");
12856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalArgumentException e) {
12956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
13056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
13156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Illegal Argument: negative length
13256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
13356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            ec = new MockCharsetDecoder(cs, -1, MAX_BYTES);
13456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw IllegalArgumentException");
13556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalArgumentException e) {
13656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
13756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
13856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            ec = new MockCharsetDecoder(cs, 1, -1);
13956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw IllegalArgumentException");
14056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalArgumentException e) {
14156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
14256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
14356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
14456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    /*
14556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * test onMalformedInput
14656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     */
14756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testOnMalformedInput() {
14856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CodingErrorAction.REPORT, decoder.malformedInputAction());
14956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
15056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.onMalformedInput(null);
15156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw null pointer exception");
15256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalArgumentException e) {
15356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
15456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onMalformedInput(CodingErrorAction.IGNORE);
15556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CodingErrorAction.IGNORE, decoder.malformedInputAction());
15656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
15756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
15856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    /*
15956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * test unmappableCharacter
16056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     */
16156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testOnUnmappableCharacter() {
16256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CodingErrorAction.REPORT, decoder
16356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                .unmappableCharacterAction());
16456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
16556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.onUnmappableCharacter(null);
16656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw null pointer exception");
16756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalArgumentException e) {
16856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
16956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
17056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CodingErrorAction.IGNORE, decoder
17156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                .unmappableCharacterAction());
17256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
17356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
17456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    /*
17556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * test replaceWith
17656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     */
17756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testReplaceWith() {
17856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
17956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.replaceWith(null);
18056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw null pointer exception");
18156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalArgumentException e) {
18256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
18356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
18456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.replaceWith("");
18556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw null pointer exception");
18656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalArgumentException e) {
18756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
18856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
18956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.replaceWith("testReplaceWith");
19056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw illegal argument exception");
19156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalArgumentException e) {
19256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
19356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
19456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.replaceWith("a");
19556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame("a", decoder.replacement());
19656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
19756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
19856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    /*
19956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * Class under test for CharBuffer decode(ByteBuffer)
20056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     */
20156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeByteBuffer() throws CharacterCodingException {
20256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeByteBuffer();
20356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
20456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
20556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    void implTestDecodeByteBuffer() throws CharacterCodingException {
20656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Null pointer
20756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
20856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.decode(null);
20956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw null pointer exception");
21056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (NullPointerException e) {
21156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
21256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
21356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // empty input buffer
21456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer out = decoder.decode(ByteBuffer.allocate(0));
21556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue("", out);
21656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
21756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // normal case
21856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ByteBuffer in = getByteBuffer();
21956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out = decoder.decode(in);
22056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(0, out.position());
22156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(getString().length(), out.limit());
22256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(getString().length(), out.remaining());
22356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(getString(), out);
22456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
22556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // normal read only case
22656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in = getByteBuffer().asReadOnlyBuffer();
22756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out = decoder.decode(in);
22856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.position(), 0);
22956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.limit(), getString().length());
23056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.remaining(), getString().length());
23156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(getString(), out);
23256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
23356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
23456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeByteBufferException()
23556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
23656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer out;
23756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ByteBuffer in;
23856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        String replaceStr = decoder.replacement() + getString();
23956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
24056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // MalformedException:
24156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onMalformedInput(CodingErrorAction.REPORT);
24256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
24356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in = getMalformedByteBuffer();
24456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        if (in != null) {
24556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            try {
24656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                CharBuffer buffer = decoder.decode(in);
24756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                assertTrue(buffer.remaining() > 0);
24856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                fail("should throw MalformedInputException");
24956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            } catch (MalformedInputException e) {
25056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            }
25156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
25256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.reset();
25356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            in.rewind();
25456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.onMalformedInput(CodingErrorAction.IGNORE);
25556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            out = decoder.decode(in);
25656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            assertCharBufferValue(getString(), out);
25756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
25856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.reset();
25956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            in.rewind();
26056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.onMalformedInput(CodingErrorAction.REPLACE);
26156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            out = decoder.decode(in);
26256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            assertCharBufferValue(replaceStr, out);
26356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
26456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
26556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Unmapped Exception:
26656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onMalformedInput(CodingErrorAction.REPORT);
26756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
26856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in = getUnmappedByteBuffer();
26956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        if (in != null) {
27056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            try {
27156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                decoder.decode(in);
27256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                fail("should throw UnmappableCharacterException");
27356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            } catch (UnmappableCharacterException e) {
27456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            }
27556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
27656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.reset();
27756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            in.rewind();
27856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
27956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            out = decoder.decode(in);
28056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            assertCharBufferValue(getString(), out);
28156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
28256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.reset();
28356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            in.rewind();
28456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
28556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            out = decoder.decode(in);
28656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            assertCharBufferValue(replaceStr, out);
28756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
28856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
28956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // RuntimeException
29056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
29156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.decode(getExceptionByteArray());
29256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw runtime exception");
29356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (RuntimeException e) {
29456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
29556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
29656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
29756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    /*
29856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * Class under test for CoderResult decode(ByteBuffer, CharBuffer, boolean)
29956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     */
30056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeByteBufferCharBuffer() {
30156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeByteBufferCharBuffer(getByteBuffer());
30256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
30356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
30456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeByteBufferCharBufferReadOnly() {
30556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeByteBufferCharBuffer(getByteBuffer());
30656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
30756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
30856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    void implTestDecodeByteBufferCharBuffer(ByteBuffer in) {
30956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer out = CharBuffer.allocate(100);
31056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
31156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Null pointer
31256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
31356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
31456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.decode(null, out, true);
31556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("NullPointerException expected");
31656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (NullPointerException e) {
31756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
31856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
31956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.decode(in, null, true);
32056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("NullPointerException expected");
32156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (NullPointerException e) {
32256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
32356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
32456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // normal case, one complete operation
32556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
32656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
32756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
32856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, true));
32956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.limit(), 100);
33056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.position(), getString().length());
33156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.remaining(), 100 - getString().length());
33256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.capacity(), 100);
33356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(getString(), out);
33456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.flush(out);
33556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
33656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // normal case, one complete operation, but call twice, first time set
33756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // endOfInput to false
33856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
33956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
34056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.clear();
34156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, false));
34256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.limit(), 100);
34356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.position(), getString().length());
34456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.remaining(), 100 - getString().length());
34556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.capacity(), 100);
34656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(getString(), out);
34756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
34856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
34956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
35056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.clear();
35156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, false));
35256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in = getHeadlessByteBuffer();
35356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, false));
35456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
35556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, true));
35656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.limit(), 100);
35756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertTrue(out.position() > 0);
35856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.remaining(), out.capacity() - out.position());
35956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(out.capacity(), 100);
36056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(getString() + getString() + getString(), out);
36156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
36256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // overflow
36356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out = CharBuffer.allocate(4);
36456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
36556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in = getByteBuffer();
36656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
36756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.OVERFLOW, decoder.decode(in, out, false));
36856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
36956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(getString().substring(0, 4), out);
37056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out = CharBuffer.allocate(100);
37156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, false));
37256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(getString().substring(4), out);
37356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
37456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out = CharBuffer.allocate(100);
37556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, true));
37656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(bom + getString(), out);
37756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
37856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
37956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteBufferUnmappedException()
38056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
38156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferUnmappedException(
38256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                getUnmappedByteBuffer(), true);
38356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
38456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
38556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteIncompleteBufferUnmappedException()
38656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
38756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferUnmappedException(
38856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                getUnmappedByteBuffer(), false);
38956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
39056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
39156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteReadOnlyBufferUnmappedException()
39256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
39356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferUnmappedException(
39456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                readOnly(getUnmappedByteBuffer()), true);
39556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
39656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
39756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteReadOnlyIncompleteBufferUnmappedException()
39856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
39956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferUnmappedException(
40056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                readOnly(getUnmappedByteBuffer()), false);
40156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
40256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
40356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    void implTestDecodeCharBufferByteBufferUnmappedException(ByteBuffer in,
40456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            boolean endOfInput) throws CharacterCodingException,
40556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            UnsupportedEncodingException {
40656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        if (null == in) {
40756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            return;
40856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
40956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer out = CharBuffer.allocate(50);
41056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
41156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onMalformedInput(CodingErrorAction.REPORT);
41256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
41356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
41456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CoderResult result = decoder.decode(in, out, endOfInput);
41556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertTrue(result.isUnmappable());
41656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
41756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
41856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.clear();
41956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
42056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
42156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, endOfInput));
42256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(getString(), out);
42356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
42456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
42556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.clear();
42656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
42756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
42856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, endOfInput));
42956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(decoder.replacement() + getString(), out);
43056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
43156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
43256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteBufferMalformedException()
43356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
43456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferMalformedException(
43556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                getMalformedByteBuffer(), true);
43656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
43756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
43856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteIncompleteBufferMalformedException()
43956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
44056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
44156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferMalformedException(
44256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                getMalformedByteBuffer(), false);
44356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
44456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
44556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteReadOnlyBufferMalformedException()
44656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
44756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferMalformedException(
44856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                readOnly(getMalformedByteBuffer()), true);
44956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
45056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
45156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteReadOnlyIncompleteBufferMalformedException()
45256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
45356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferMalformedException(
45456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                readOnly(getMalformedByteBuffer()), false);
45556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
45656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
45756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    void implTestDecodeCharBufferByteBufferMalformedException(ByteBuffer in,
45856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            boolean endOfInput) throws CharacterCodingException,
45956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            UnsupportedEncodingException {
46056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        if (null == in) {
46156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            return;
46256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
46356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer out = CharBuffer.allocate(getString().length() * 3);
46456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
46556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
46656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onMalformedInput(CodingErrorAction.REPORT);
46756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CoderResult result = decoder.decode(in, out, endOfInput);
46856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertTrue(result.isMalformed());
46956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
47056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
47156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.clear();
47256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
47356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onMalformedInput(CodingErrorAction.IGNORE);
47456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, endOfInput));
47556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(getString(), out);
47656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
47756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
47856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.clear();
47956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
48056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.onMalformedInput(CodingErrorAction.REPLACE);
48156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, endOfInput));
48256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertCharBufferValue(decoder.replacement() + getString(), out);
48356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
48456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
48556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteBufferException()
48656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
48756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferException(getExceptionByteArray(),
48856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                true);
48956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
49056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
49156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteIncompleteBufferException()
49256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
49356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferException(getExceptionByteArray(),
49456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                false);
49556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
49656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
49756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteReadOnlyBufferException()
49856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
49956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferException(
50056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                readOnly(getExceptionByteArray()), true);
50156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
50256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
50356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeCharBufferByteReadOnlyIncompleteBufferException()
50456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
50556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        implTestDecodeCharBufferByteBufferException(
50656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                readOnly(getExceptionByteArray()), false);
50756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
50856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
50956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    void implTestDecodeCharBufferByteBufferException(ByteBuffer in,
51056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            boolean endOfInput) throws CharacterCodingException,
51156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            UnsupportedEncodingException {
51256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer out = CharBuffer.allocate(50);
51356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
51456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
51556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.decode(in, out, endOfInput);
51656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should throw runtime exception");
51756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (RuntimeException e) {
51856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
51956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
52056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
52156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    private ByteBuffer readOnly(ByteBuffer b) {
52256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        if (null == b) {
52356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            return null;
52456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
52556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        return b.asReadOnlyBuffer();
52656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
52756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
52856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    protected String getString() {
52956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        return " buffer";
53056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
53156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
53256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    protected ByteBuffer getByteBuffer() {
53356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        return ByteBuffer.wrap(new byte[] { 32, 98, 117, 102, 102, 101, 114 });
53456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
53556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
53656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    protected ByteBuffer getHeadlessByteBuffer() {
53756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        return getByteBuffer();
53856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
53956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
54056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    ByteBuffer getExceptionByteArray() throws UnsupportedEncodingException {
54156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // "runtime"
54256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        return ByteBuffer
54356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                .wrap(new byte[] { 114, 117, 110, 116, 105, 109, 101 });
54456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
54556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
54656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    ByteBuffer getUnmappedByteBuffer() throws UnsupportedEncodingException {
54756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // "unmap buffer"
54856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        byte[] ba = new byte[] { 117, 110, 109, 97, 112, 32, 98, 117, 102, 102,
54956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                101, 114 };
55056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        return ByteBuffer.wrap(ba);
55156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
55256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
55356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    ByteBuffer getMalformedByteBuffer() throws UnsupportedEncodingException {
55456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // "malform buffer"
55556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        byte[] ba = new byte[] { 109, 97, 108, 102, 111, 114, 109, 32, 98, 117,
55656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                102, 102, 101, 114 };
55756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        return ByteBuffer.wrap(ba);
55856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
55956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
56056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    private void assertCharBufferValue(String expected, CharBuffer out) {
56156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        if (out.position() != 0) {
56256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            out.flip();
56356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
56456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(expected, new String(out.array(), out.arrayOffset(), out
56556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                .arrayOffset() + out.limit()));
56656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
56756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
56856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    /*
56956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * test flush
57056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     */
57156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testFlush() throws CharacterCodingException {
57256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer out = CharBuffer.allocate(10);
57356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ByteBuffer in = ByteBuffer.wrap(new byte[] { 12, 12 });
57456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, out, true);
57556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.flush(out));
57656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
57756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
57856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode((ByteBuffer) in.rewind(), (CharBuffer) out.rewind(),
57956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                true);
58056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder
58156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                .flush(CharBuffer.allocate(10)));
58256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
58356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
58456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    /*
58556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * ---------------------------------- methods to test illegal state
58656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * -----------------------------------
58756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     */
58856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // Normal case: just after reset, and it also means reset can be done
58956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // anywhere
59056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testResetIllegalState() throws CharacterCodingException {
59156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
59256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(getByteBuffer());
59356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
59456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(getByteBuffer(), CharBuffer.allocate(3), false);
59556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
59656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(getByteBuffer(), CharBuffer.allocate(3), true);
59756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
59856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
59956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
60056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testFlushIllegalState() throws CharacterCodingException {
60156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ByteBuffer in = ByteBuffer.wrap(new byte[] { 98, 98 });
60256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer out = CharBuffer.allocate(5);
6036ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes
6046ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes        // Illegal state: after reset.
6056ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes        decoder.reset();
6066ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes        try {
6076ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes            decoder.flush(out);
6086ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes            fail();
6096ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes        } catch (IllegalStateException expected) {
6106ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes        }
6116ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes
61256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case: after decode with endOfInput is true
61356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
61456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, out, true);
61556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
61656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CoderResult result = decoder.flush(out);
61756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertSame(result, CoderResult.UNDERFLOW);
61856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
6196ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes        // Good state: flush twice
6206ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes        decoder.flush(out);
62156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
62256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Illegal state: flush after decode with endOfInput is false
62356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
62456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, out, false);
62556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
62656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.flush(out);
6276ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes            fail();
6286ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes        } catch (IllegalStateException expected) {
62956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
63056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
6316ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes
63256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // test illegal states for decode facade
63356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeFacadeIllegalState() throws CharacterCodingException {
63456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // decode facade can be execute in anywhere
63556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ByteBuffer in = getByteBuffer();
63656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
63756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case: just created
63856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in);
63956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
64056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
64156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case: just after decode facade
64256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in);
64356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
64456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
64556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case: just after decode with that endOfInput is true
64656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
64756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(getByteBuffer(), CharBuffer.allocate(30), true);
64856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in);
64956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
65056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
65156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case:just after decode with that endOfInput is false
65256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
65356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(getByteBuffer(), CharBuffer.allocate(30), false);
65456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in);
65556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
65656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
65756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case: just after flush
65856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
65956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(getByteBuffer(), CharBuffer.allocate(30), true);
66056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.flush(CharBuffer.allocate(10));
66156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in);
66256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
66356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
66456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
66556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // test illegal states for two decode method with endOfInput is true
66656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeTrueIllegalState() throws CharacterCodingException {
66756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ByteBuffer in = ByteBuffer.wrap(new byte[] { 98, 98 });
66856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer out = CharBuffer.allocate(100);
66956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case: just created
67056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, out, true);
67156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
67256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
67356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
67456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case: just after decode with that endOfInput is true
67556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
67656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, CharBuffer.allocate(30), true);
67756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
67856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, out, true);
67956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
68056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
68156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
68256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case:just after decode with that endOfInput is false
68356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
68456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, CharBuffer.allocate(30), false);
68556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
68656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, out, true);
68756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
68856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
68956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
69056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Illegal state: just after flush
69156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
69256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, CharBuffer.allocate(30), true);
69356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.flush(CharBuffer.allocate(10));
69456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
69556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
69656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.decode(in, out, true);
69756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should illegal state");
69856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalStateException e) {
69956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
70056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
70156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
70256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
70356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
70456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
70556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    // test illegal states for two decode method with endOfInput is false
70656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testDecodeFalseIllegalState() throws CharacterCodingException {
70756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ByteBuffer in = ByteBuffer.wrap(new byte[] { 98, 98 });
70856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer out = CharBuffer.allocate(5);
70956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case: just created
71056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, out, false);
71156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
71256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
71356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
71456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Illegal state: just after decode facade
71556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
71656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in);
71756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
71856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
71956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.decode(in, out, false);
72056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should illegal state");
72156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalStateException e) {
72256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
72356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
72456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
72556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
72656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Illegal state: just after decode with that endOfInput is true
72756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
72856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, CharBuffer.allocate(30), true);
72956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
73056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
73156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.decode(in, out, false);
73256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should illegal state");
73356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalStateException e) {
73456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
73556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
73656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
73756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
73856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Normal case:just after decode with that endOfInput is false
73956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
74056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, CharBuffer.allocate(30), false);
74156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
74256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, out, false);
74356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
74456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out.rewind();
74556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
74656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Illegal state: just after flush
74756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.reset();
74856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.decode(in, CharBuffer.allocate(30), true);
74956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        in.rewind();
75056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder.flush(CharBuffer.allocate(10));
75156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        try {
75256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            decoder.decode(in, out, false);
75356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            fail("should illegal state");
75456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        } catch (IllegalStateException e) {
75556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
75656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
75756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
75856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    /*
75956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * --------------------------------- illegal state test end
76056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * ---------------------------------
76156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     */
76256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
76356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testImplFlush() {
76456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder = new MockCharsetDecoder(cs, 1, 3);
76556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(CoderResult.UNDERFLOW, ((MockCharsetDecoder) decoder)
76656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                .pubImplFlush(null));
76756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
76856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
76956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testImplOnMalformedInput() {
77056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder = new MockCharsetDecoder(cs, 1, 3);
77156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        assertEquals(CoderResult.UNDERFLOW, ((MockCharsetDecoder) decoder)
77256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                .pubImplFlush(null));
77356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
77456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
77556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
77656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testImplOnUnmappableCharacter() {
77756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder = new MockCharsetDecoder(cs, 1, 3);
77856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ((MockCharsetDecoder) decoder).pubImplOnUnmappableCharacter(null);
77956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
78056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
78156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testImplReplaceWith() {
78256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder = new MockCharsetDecoder(cs, 1, 3);
78356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ((MockCharsetDecoder) decoder).pubImplReplaceWith(null);
78456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
78556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
78656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public void testImplReset() {
78756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        decoder = new MockCharsetDecoder(cs, 1, 3);
78856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        ((MockCharsetDecoder) decoder).pubImplReset();
78956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
79056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
79156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    /*
79256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     * mock decoder
79356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes     */
79456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    public static class MockCharsetDecoder extends CharsetDecoder {
79556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        public MockCharsetDecoder(Charset cs, float ave, float max) {
79656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            super(cs, ave, max);
79756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
79856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
79956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) {
80056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            int inPosition = in.position();
80156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            byte[] input = new byte[in.remaining()];
80256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            in.get(input);
80356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            String result;
80456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            try {
80556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                result = new String(input, "UTF-8");
80656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            } catch (UnsupportedEncodingException e) {
80756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                throw new AssertionError(e);
80856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            }
80956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            if (result.startsWith("malform")) {
81056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // reset the cursor to the error position
81156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                in.position(inPosition);
81256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // set the error length
81356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                return CoderResult.malformedForLength("malform".length());
81456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            } else if (result.startsWith("unmap")) {
81556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // reset the cursor to the error position
81656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                in.position(inPosition);
81756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // set the error length
81856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                return CoderResult.unmappableForLength("unmap".length());
81956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            } else if (result.startsWith("runtime")) {
82056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // reset the cursor to the error position
82156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                in.position(0);
82256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // set the error length
82356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                throw new RuntimeException("runtime");
82456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            }
82556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            int inLeft = input.length;
82656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            int outLeft = out.remaining();
82756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            CoderResult r = CoderResult.UNDERFLOW;
82856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            int length = inLeft;
82956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            if (outLeft < inLeft) {
83056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                r = CoderResult.OVERFLOW;
83156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                length = outLeft;
83256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                in.position(inPosition + outLeft);
83356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            }
83456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            for (int i = 0; i < length; i++) {
83556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                out.put((char) input[i]);
83656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            }
83756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            return r;
83856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
83956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
84056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        protected CoderResult implFlush(CharBuffer out) {
84156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            CoderResult result = super.implFlush(out);
84256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            if (out.remaining() >= 5) {
84356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // TODO
84456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // out.put("flush");
84556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                result = CoderResult.UNDERFLOW;
84656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            } else {
84756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // out.put("flush", 0, out.remaining());
84856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                result = CoderResult.OVERFLOW;
84956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            }
85056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            return result;
85156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
85256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
85356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        public CoderResult pubImplFlush(CharBuffer out) {
85456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            return super.implFlush(out);
85556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
85656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
85756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        public void pubImplOnMalformedInput(CodingErrorAction newAction) {
85856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            super.implOnMalformedInput(newAction);
85956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
86056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
86156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        public void pubImplOnUnmappableCharacter(CodingErrorAction newAction) {
86256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            super.implOnUnmappableCharacter(newAction);
86356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
86456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
86556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        public void pubImplReplaceWith(String newReplacement) {
86656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            super.implReplaceWith(newReplacement);
86756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
86856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
86956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        public void pubImplReset() {
87056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes            super.implReset();
87156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        }
87256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
87356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes    }
87456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
87556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes}
876