1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/* Licensed to the Apache Software Foundation (ASF) under one or more
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements.  See the NOTICE file distributed with
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership.
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License.  You may obtain a copy of the License at
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License.
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage tests.api.java.nio.charset;
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.io.UnsupportedEncodingException;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.ByteBuffer;
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.CharBuffer;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.CharacterCodingException;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.Charset;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.CharsetDecoder;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.CoderResult;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.CodingErrorAction;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.MalformedInputException;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.UnmappableCharacterException;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * API unit test for java.nio.CharsetDecoder
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class CharsetDecoderTest extends TestCase {
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected static final int MAX_BYTES = 3;
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected static final double AVER_BYTES = 0.5;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // default charset
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static final Charset MOCKCS = new CharsetEncoderTest.MockCharset(
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            "mock", new String[0]);
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    Charset cs = MOCKCS;
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // default decoder
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected static CharsetDecoder decoder;
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    String bom = "";
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void setUp() throws Exception {
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.setUp();
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder = cs.newDecoder();
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void tearDown() throws Exception {
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super.tearDown();
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // FIXME: give up this tests
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // /*
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // * test default value
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // */
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // public void testDefaultCharsPerByte() {
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // assertTrue(decoder.averageCharsPerByte() == AVER_BYTES);
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // assertTrue(decoder.maxCharsPerByte() == MAX_BYTES);
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // }
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDefaultValues() {
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(cs, decoder.charset());
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.detectedCharset();
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should unsupported");
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue(decoder.isCharsetDetected());
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should unsupported");
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse(decoder.isAutoDetecting());
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CodingErrorAction.REPORT, decoder.malformedInputAction());
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CodingErrorAction.REPORT, decoder
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .unmappableCharacterAction());
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(decoder.replacement(), "\ufffd");
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * test constructor
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testCharsetDecoder() {
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // default value
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder = new MockCharsetDecoder(cs, (float) AVER_BYTES, MAX_BYTES);
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // normal case
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharsetDecoder ec = new MockCharsetDecoder(cs, 1, MAX_BYTES);
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(ec.charset(), cs);
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(1.0, ec.averageCharsPerByte(), 0.0);
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(ec.maxCharsPerByte() == MAX_BYTES);
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /*
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         * ------------------------ Exceptional cases -------------------------
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes         */
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case: null charset
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ec = new MockCharsetDecoder(null, 1, MAX_BYTES);
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull(ec.charset());
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(1.0, ec.averageCharsPerByte(), 0.0);
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(ec.maxCharsPerByte() == MAX_BYTES);
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ec = new MockCharsetDecoder(new CharsetEncoderTest.MockCharset("mock",
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                new String[0]), 1, MAX_BYTES);
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Commented out since the comment is wrong since MAX_BYTES > 1
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // // OK: average length less than max length
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // ec = new MockCharsetDecoder(cs, MAX_BYTES, 1);
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // assertTrue(ec.averageCharsPerByte() == MAX_BYTES);
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // assertTrue(ec.maxCharsPerByte() == 1);
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Illegal Argument: zero length
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ec = new MockCharsetDecoder(cs, 0, MAX_BYTES);
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IllegalArgumentException");
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ec = new MockCharsetDecoder(cs, 1, 0);
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IllegalArgumentException");
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Illegal Argument: negative length
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ec = new MockCharsetDecoder(cs, -1, MAX_BYTES);
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IllegalArgumentException");
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ec = new MockCharsetDecoder(cs, 1, -1);
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IllegalArgumentException");
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * test onMalformedInput
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testOnMalformedInput() {
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CodingErrorAction.REPORT, decoder.malformedInputAction());
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.onMalformedInput(null);
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw null pointer exception");
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onMalformedInput(CodingErrorAction.IGNORE);
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CodingErrorAction.IGNORE, decoder.malformedInputAction());
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * test unmappableCharacter
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testOnUnmappableCharacter() {
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CodingErrorAction.REPORT, decoder
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .unmappableCharacterAction());
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.onUnmappableCharacter(null);
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw null pointer exception");
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CodingErrorAction.IGNORE, decoder
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .unmappableCharacterAction());
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * test replaceWith
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testReplaceWith() {
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.replaceWith(null);
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw null pointer exception");
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.replaceWith("");
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw null pointer exception");
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.replaceWith("testReplaceWith");
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw illegal argument exception");
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.replaceWith("a");
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame("a", decoder.replacement());
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Class under test for CharBuffer decode(ByteBuffer)
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeByteBuffer() throws CharacterCodingException {
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeByteBuffer();
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    void implTestDecodeByteBuffer() throws CharacterCodingException {
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Null pointer
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.decode(null);
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw null pointer exception");
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // empty input buffer
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer out = decoder.decode(ByteBuffer.allocate(0));
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue("", out);
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // normal case
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer in = getByteBuffer();
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out = decoder.decode(in);
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(0, out.position());
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(getString().length(), out.limit());
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(getString().length(), out.remaining());
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(getString(), out);
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // normal read only case
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in = getByteBuffer().asReadOnlyBuffer();
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out = decoder.decode(in);
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.position(), 0);
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.limit(), getString().length());
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.remaining(), getString().length());
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(getString(), out);
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeByteBufferException()
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer out;
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer in;
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String replaceStr = decoder.replacement() + getString();
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // MalformedException:
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onMalformedInput(CodingErrorAction.REPORT);
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in = getMalformedByteBuffer();
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (in != null) {
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                CharBuffer buffer = decoder.decode(in);
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                assertTrue(buffer.remaining() > 0);
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("should throw MalformedInputException");
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (MalformedInputException e) {
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.reset();
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            in.rewind();
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.onMalformedInput(CodingErrorAction.IGNORE);
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            out = decoder.decode(in);
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertCharBufferValue(getString(), out);
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.reset();
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            in.rewind();
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.onMalformedInput(CodingErrorAction.REPLACE);
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            out = decoder.decode(in);
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertCharBufferValue(replaceStr, out);
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Unmapped Exception:
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onMalformedInput(CodingErrorAction.REPORT);
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in = getUnmappedByteBuffer();
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (in != null) {
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                decoder.decode(in);
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                fail("should throw UnmappableCharacterException");
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (UnmappableCharacterException e) {
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.reset();
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            in.rewind();
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            out = decoder.decode(in);
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertCharBufferValue(getString(), out);
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.reset();
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            in.rewind();
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            out = decoder.decode(in);
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertCharBufferValue(replaceStr, out);
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // RuntimeException
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.decode(getExceptionByteArray());
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw runtime exception");
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (RuntimeException e) {
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Class under test for CoderResult decode(ByteBuffer, CharBuffer, boolean)
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeByteBufferCharBuffer() {
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeByteBufferCharBuffer(getByteBuffer());
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeByteBufferCharBufferReadOnly() {
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeByteBufferCharBuffer(getByteBuffer());
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    void implTestDecodeByteBufferCharBuffer(ByteBuffer in) {
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer out = CharBuffer.allocate(100);
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Null pointer
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.decode(null, out, true);
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("NullPointerException expected");
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.decode(in, null, true);
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("NullPointerException expected");
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // normal case, one complete operation
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, true));
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.limit(), 100);
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.position(), getString().length());
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.remaining(), 100 - getString().length());
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.capacity(), 100);
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(getString(), out);
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.flush(out);
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // normal case, one complete operation, but call twice, first time set
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // endOfInput to false
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.clear();
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, false));
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.limit(), 100);
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.position(), getString().length());
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.remaining(), 100 - getString().length());
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.capacity(), 100);
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(getString(), out);
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.clear();
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, false));
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in = getHeadlessByteBuffer();
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, false));
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, true));
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.limit(), 100);
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(out.position() > 0);
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.remaining(), out.capacity() - out.position());
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(out.capacity(), 100);
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(getString() + getString() + getString(), out);
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // overflow
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out = CharBuffer.allocate(4);
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in = getByteBuffer();
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.OVERFLOW, decoder.decode(in, out, false));
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(getString().substring(0, 4), out);
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out = CharBuffer.allocate(100);
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, false));
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(getString().substring(4), out);
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out = CharBuffer.allocate(100);
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, true));
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(bom + getString(), out);
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteBufferUnmappedException()
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferUnmappedException(
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                getUnmappedByteBuffer(), true);
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteIncompleteBufferUnmappedException()
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferUnmappedException(
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                getUnmappedByteBuffer(), false);
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteReadOnlyBufferUnmappedException()
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferUnmappedException(
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                readOnly(getUnmappedByteBuffer()), true);
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteReadOnlyIncompleteBufferUnmappedException()
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferUnmappedException(
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                readOnly(getUnmappedByteBuffer()), false);
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    void implTestDecodeCharBufferByteBufferUnmappedException(ByteBuffer in,
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            boolean endOfInput) throws CharacterCodingException,
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            UnsupportedEncodingException {
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (null == in) {
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return;
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer out = CharBuffer.allocate(50);
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onMalformedInput(CodingErrorAction.REPORT);
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CoderResult result = decoder.decode(in, out, endOfInput);
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(result.isUnmappable());
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.clear();
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, endOfInput));
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(getString(), out);
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.clear();
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, endOfInput));
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(decoder.replacement() + getString(), out);
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteBufferMalformedException()
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferMalformedException(
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                getMalformedByteBuffer(), true);
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteIncompleteBufferMalformedException()
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferMalformedException(
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                getMalformedByteBuffer(), false);
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteReadOnlyBufferMalformedException()
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferMalformedException(
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                readOnly(getMalformedByteBuffer()), true);
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteReadOnlyIncompleteBufferMalformedException()
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferMalformedException(
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                readOnly(getMalformedByteBuffer()), false);
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    void implTestDecodeCharBufferByteBufferMalformedException(ByteBuffer in,
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            boolean endOfInput) throws CharacterCodingException,
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            UnsupportedEncodingException {
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (null == in) {
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return;
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer out = CharBuffer.allocate(getString().length() * 3);
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onUnmappableCharacter(CodingErrorAction.REPORT);
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onMalformedInput(CodingErrorAction.REPORT);
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CoderResult result = decoder.decode(in, out, endOfInput);
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue(result.isMalformed());
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.clear();
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onMalformedInput(CodingErrorAction.IGNORE);
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, endOfInput));
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(getString(), out);
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.clear();
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.onMalformedInput(CodingErrorAction.REPLACE);
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.decode(in, out, endOfInput));
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertCharBufferValue(decoder.replacement() + getString(), out);
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteBufferException()
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferException(getExceptionByteArray(),
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                true);
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteIncompleteBufferException()
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferException(getExceptionByteArray(),
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                false);
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteReadOnlyBufferException()
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferException(
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                readOnly(getExceptionByteArray()), true);
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeCharBufferByteReadOnlyIncompleteBufferException()
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws CharacterCodingException, UnsupportedEncodingException {
505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        implTestDecodeCharBufferByteBufferException(
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                readOnly(getExceptionByteArray()), false);
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    void implTestDecodeCharBufferByteBufferException(ByteBuffer in,
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            boolean endOfInput) throws CharacterCodingException,
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            UnsupportedEncodingException {
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer out = CharBuffer.allocate(50);
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.decode(in, out, endOfInput);
516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw runtime exception");
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (RuntimeException e) {
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private ByteBuffer readOnly(ByteBuffer b) {
522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (null == b) {
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return null;
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return b.asReadOnlyBuffer();
526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected String getString() {
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return " buffer";
530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
532561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected ByteBuffer getByteBuffer() {
533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return ByteBuffer.wrap(new byte[] { 32, 98, 117, 102, 102, 101, 114 });
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected ByteBuffer getHeadlessByteBuffer() {
537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return getByteBuffer();
538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    ByteBuffer getExceptionByteArray() throws UnsupportedEncodingException {
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // "runtime"
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return ByteBuffer
543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .wrap(new byte[] { 114, 117, 110, 116, 105, 109, 101 });
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    ByteBuffer getUnmappedByteBuffer() throws UnsupportedEncodingException {
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // "unmap buffer"
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] ba = new byte[] { 117, 110, 109, 97, 112, 32, 98, 117, 102, 102,
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                101, 114 };
550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return ByteBuffer.wrap(ba);
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    ByteBuffer getMalformedByteBuffer() throws UnsupportedEncodingException {
554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // "malform buffer"
555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] ba = new byte[] { 109, 97, 108, 102, 111, 114, 109, 32, 98, 117,
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                102, 102, 101, 114 };
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return ByteBuffer.wrap(ba);
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private void assertCharBufferValue(String expected, CharBuffer out) {
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (out.position() != 0) {
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            out.flip();
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(expected, new String(out.array(), out.arrayOffset(), out
565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .arrayOffset() + out.limit()));
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * test flush
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testFlush() throws CharacterCodingException {
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer out = CharBuffer.allocate(10);
573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer in = ByteBuffer.wrap(new byte[] { 12, 12 });
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, out, true);
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder.flush(out));
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode((ByteBuffer) in.rewind(), (CharBuffer) out.rewind(),
579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                true);
580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(CoderResult.UNDERFLOW, decoder
581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .flush(CharBuffer.allocate(10)));
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * ---------------------------------- methods to test illegal state
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * -----------------------------------
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // Normal case: just after reset, and it also means reset can be done
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // anywhere
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testResetIllegalState() throws CharacterCodingException {
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(getByteBuffer());
593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(getByteBuffer(), CharBuffer.allocate(3), false);
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(getByteBuffer(), CharBuffer.allocate(3), true);
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testFlushIllegalState() throws CharacterCodingException {
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer in = ByteBuffer.wrap(new byte[] { 98, 98 });
602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer out = CharBuffer.allocate(5);
603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case: after decode with endOfInput is true
604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, out, true);
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CoderResult result = decoder.flush(out);
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertSame(result, CoderResult.UNDERFLOW);
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Illegal state: flush twice
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.flush(out);
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IllegalStateException");
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalStateException e) {
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Illegal state: flush after decode with endOfInput is false
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, out, false);
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.flush(out);
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should throw IllegalStateException");
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalStateException e) {
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // test illegal states for decode facade
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeFacadeIllegalState() throws CharacterCodingException {
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // decode facade can be execute in anywhere
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer in = getByteBuffer();
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case: just created
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in);
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case: just after decode facade
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in);
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case: just after decode with that endOfInput is true
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(getByteBuffer(), CharBuffer.allocate(30), true);
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in);
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
646561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case:just after decode with that endOfInput is false
647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(getByteBuffer(), CharBuffer.allocate(30), false);
649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in);
650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case: just after flush
653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(getByteBuffer(), CharBuffer.allocate(30), true);
655561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.flush(CharBuffer.allocate(10));
656561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in);
657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
659561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
660561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // test illegal states for two decode method with endOfInput is true
661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeTrueIllegalState() throws CharacterCodingException {
662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer in = ByteBuffer.wrap(new byte[] { 98, 98 });
663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer out = CharBuffer.allocate(100);
664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case: just created
665561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, out, true);
666561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
667561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
668561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
669561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case: just after decode with that endOfInput is true
670561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
671561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, CharBuffer.allocate(30), true);
672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
673561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, out, true);
674561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
675561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
676561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
677561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case:just after decode with that endOfInput is false
678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, CharBuffer.allocate(30), false);
680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, out, true);
682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
683561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
684561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
685561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Illegal state: just after flush
686561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
687561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, CharBuffer.allocate(30), true);
688561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.flush(CharBuffer.allocate(10));
689561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
690561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
691561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.decode(in, out, true);
692561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should illegal state");
693561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalStateException e) {
694561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
695561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
696561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
697561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
698561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
699561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
700561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    // test illegal states for two decode method with endOfInput is false
701561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDecodeFalseIllegalState() throws CharacterCodingException {
702561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer in = ByteBuffer.wrap(new byte[] { 98, 98 });
703561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer out = CharBuffer.allocate(5);
704561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case: just created
705561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, out, false);
706561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
707561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
708561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
709561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Illegal state: just after decode facade
710561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
711561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in);
712561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
713561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
714561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.decode(in, out, false);
715561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should illegal state");
716561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalStateException e) {
717561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
718561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
719561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
720561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
721561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Illegal state: just after decode with that endOfInput is true
722561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
723561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, CharBuffer.allocate(30), true);
724561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
725561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
726561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.decode(in, out, false);
727561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should illegal state");
728561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalStateException e) {
729561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
730561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
731561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
732561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
733561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Normal case:just after decode with that endOfInput is false
734561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
735561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, CharBuffer.allocate(30), false);
736561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
737561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, out, false);
738561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
739561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out.rewind();
740561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
741561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Illegal state: just after flush
742561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.reset();
743561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.decode(in, CharBuffer.allocate(30), true);
744561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        in.rewind();
745561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder.flush(CharBuffer.allocate(10));
746561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
747561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            decoder.decode(in, out, false);
748561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("should illegal state");
749561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalStateException e) {
750561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
751561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
752561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
753561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
754561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * --------------------------------- illegal state test end
755561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * ---------------------------------
756561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
757561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
758561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testImplFlush() {
759561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder = new MockCharsetDecoder(cs, 1, 3);
760561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(CoderResult.UNDERFLOW, ((MockCharsetDecoder) decoder)
761561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .pubImplFlush(null));
762561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
763561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
764561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testImplOnMalformedInput() {
765561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder = new MockCharsetDecoder(cs, 1, 3);
766561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(CoderResult.UNDERFLOW, ((MockCharsetDecoder) decoder)
767561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                .pubImplFlush(null));
768561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
769561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
770561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
771561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testImplOnUnmappableCharacter() {
772561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder = new MockCharsetDecoder(cs, 1, 3);
773561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ((MockCharsetDecoder) decoder).pubImplOnUnmappableCharacter(null);
774561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
775561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
776561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testImplReplaceWith() {
777561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder = new MockCharsetDecoder(cs, 1, 3);
778561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ((MockCharsetDecoder) decoder).pubImplReplaceWith(null);
779561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
780561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
781561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testImplReset() {
782561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        decoder = new MockCharsetDecoder(cs, 1, 3);
783561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ((MockCharsetDecoder) decoder).pubImplReset();
784561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
785561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
786561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /*
787561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * mock decoder
788561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
789561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static class MockCharsetDecoder extends CharsetDecoder {
790561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public MockCharsetDecoder(Charset cs, float ave, float max) {
791561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super(cs, ave, max);
792561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
793561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
794561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) {
795561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int inPosition = in.position();
796561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] input = new byte[in.remaining()];
797561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            in.get(input);
798561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            String result;
799561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            try {
800561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                result = new String(input, "UTF-8");
801561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } catch (UnsupportedEncodingException e) {
802561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new AssertionError(e);
803561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
804561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (result.startsWith("malform")) {
805561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // reset the cursor to the error position
806561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                in.position(inPosition);
807561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // set the error length
808561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return CoderResult.malformedForLength("malform".length());
809561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else if (result.startsWith("unmap")) {
810561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // reset the cursor to the error position
811561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                in.position(inPosition);
812561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // set the error length
813561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                return CoderResult.unmappableForLength("unmap".length());
814561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else if (result.startsWith("runtime")) {
815561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // reset the cursor to the error position
816561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                in.position(0);
817561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // set the error length
818561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                throw new RuntimeException("runtime");
819561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
820561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int inLeft = input.length;
821561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int outLeft = out.remaining();
822561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            CoderResult r = CoderResult.UNDERFLOW;
823561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            int length = inLeft;
824561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (outLeft < inLeft) {
825561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                r = CoderResult.OVERFLOW;
826561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                length = outLeft;
827561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                in.position(inPosition + outLeft);
828561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
829561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int i = 0; i < length; i++) {
830561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                out.put((char) input[i]);
831561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
832561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return r;
833561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
834561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
835561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        protected CoderResult implFlush(CharBuffer out) {
836561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            CoderResult result = super.implFlush(out);
837561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            if (out.remaining() >= 5) {
838561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // TODO
839561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // out.put("flush");
840561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                result = CoderResult.UNDERFLOW;
841561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            } else {
842561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // out.put("flush", 0, out.remaining());
843561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                result = CoderResult.OVERFLOW;
844561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
845561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return result;
846561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
847561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
848561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public CoderResult pubImplFlush(CharBuffer out) {
849561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return super.implFlush(out);
850561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
851561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
852561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void pubImplOnMalformedInput(CodingErrorAction newAction) {
853561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super.implOnMalformedInput(newAction);
854561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
855561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
856561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void pubImplOnUnmappableCharacter(CodingErrorAction newAction) {
857561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super.implOnUnmappableCharacter(newAction);
858561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
859561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
860561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void pubImplReplaceWith(String newReplacement) {
861561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super.implReplaceWith(newReplacement);
862561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
863561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
864561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        public void pubImplReset() {
865561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            super.implReset();
866561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
867561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
868561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
869561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
870561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
871