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
75ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes *
856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
95ec6bf8d033754e06a463adb091d2c0afd0755acElliott 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.nio.ByteBuffer;
1956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.CharBuffer;
2056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.CharacterCodingException;
2156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.Charset;
2256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.CharsetDecoder;
2356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.nio.charset.CharsetEncoder;
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 Hughesimport java.nio.charset.UnsupportedCharsetException;
2956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport java.util.Arrays;
3056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
3156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughesimport junit.framework.TestCase;
3256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
3356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes/**
3456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes * API unit test for java.nio.charset.CharsetEncoder
3556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes */
3656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughespublic class CharsetEncoderTest extends TestCase {
3756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
3856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	static final int MAX_BYTES = 3;
3956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
4056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	static final float AVER_BYTES = 0.5f;
4156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
4256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	// charset for mock class
4356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	private static final Charset MOCKCS = new MockCharset("CharsetEncoderTest_mock", new String[0]);
4456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
4556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	Charset cs = MOCKCS;
4656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
4756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	// default encoder
4856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	CharsetEncoder encoder;
4956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
5056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	// default for Charset abstract class
5156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	byte[] defaultReplacement = new byte[] { 63 };
5256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
5356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	// specific for Charset implementation subclass
5456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	byte[] specifiedReplacement = new byte[] { 63 };
5556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
5656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	static final String unistr = " buffer";// \u8000\u8001\u00a5\u3000\r\n";
5756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
5856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	byte[] unibytes = new byte[] { 32, 98, 117, 102, 102, 101, 114 };
5956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
6056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	byte[] unibytesWithRep = null;
6156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
6256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	byte[] surrogate = new byte[0];
6356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
6456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	protected void setUp() throws Exception {
6556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		super.setUp();
6656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder = cs.newEncoder();
6756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (null == unibytesWithRep) {
6856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			byte[] replacement = encoder.replacement();
6956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			unibytesWithRep = new byte[replacement.length + unibytes.length];
7056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			System.arraycopy(replacement, 0, unibytesWithRep, 0,
7156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					replacement.length);
7256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			System.arraycopy(unibytes, 0, unibytesWithRep, replacement.length,
7356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					unibytes.length);
7456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
7556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
7656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
7756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
7856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * @see TestCase#tearDown()
7956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
8056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	protected void tearDown() throws Exception {
8156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		super.tearDown();
8256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
8356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
8456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testSpecificDefaultValue() {
8556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.averageBytesPerChar() == AVER_BYTES);
8656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.maxBytesPerChar() == MAX_BYTES);
8756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
8856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
8956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testDefaultValue() {
9056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(CodingErrorAction.REPORT, encoder.malformedInputAction());
915ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes		assertEquals(CodingErrorAction.REPORT, encoder.unmappableCharacterAction());
9256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.onMalformedInput(CodingErrorAction.IGNORE));
935ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes		assertSame(encoder, encoder.onUnmappableCharacter(CodingErrorAction.IGNORE));
9456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (encoder instanceof MockCharsetEncoder) {
9556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertTrue(Arrays.equals(encoder.replacement(), defaultReplacement));
9656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} else {
975ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes			assertTrue(Arrays.equals(encoder.replacement(), specifiedReplacement));
9856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
9956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
10056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
10156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
10256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
10356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * Class under test for constructor CharsetEncoder(Charset, float, float)
10456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
10556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testCharsetEncoderCharsetfloatfloat() {
10656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// default value
10756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder = new MockCharsetEncoder(cs, (float) AVER_BYTES, MAX_BYTES);
10856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder.charset(), cs);
10956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.averageBytesPerChar() == AVER_BYTES);
11056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.maxBytesPerChar() == MAX_BYTES);
11156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(CodingErrorAction.REPORT, encoder.malformedInputAction());
11256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(CodingErrorAction.REPORT, encoder
11356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				.unmappableCharacterAction());
11456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(new String(encoder.replacement()), new String(
11556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				defaultReplacement));
11656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.onMalformedInput(CodingErrorAction.IGNORE));
11756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder
11856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				.onUnmappableCharacter(CodingErrorAction.IGNORE));
11956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
12056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// normal case
12156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		CharsetEncoder ec = new MockCharsetEncoder(cs, 1, MAX_BYTES);
12256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(ec.charset(), cs);
12356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(1.0, ec.averageBytesPerChar(), 0);
12456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(ec.maxBytesPerChar() == MAX_BYTES);
12556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
12656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		/*
12756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		 * ------------------------ Exceptional cases -------------------------
12856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		 */
12956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// NullPointerException: null charset
13056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
13156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(null, 1, MAX_BYTES);
13256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
13356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (NullPointerException e) {
13456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
13556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
13656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		ec = new MockCharsetEncoder(new MockCharset("mock", new String[0]), 1,
13756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				MAX_BYTES);
13856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
13956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // Commented out since the comment is wrong since MAX_BYTES > 1
14056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// // OK: average length less than max length
14156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// ec = new MockCharsetEncoder(cs, MAX_BYTES, 1);
14256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// assertTrue(ec.averageBytesPerChar() == MAX_BYTES);
14356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// assertTrue(ec.maxBytesPerChar() == 1);
14456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
14556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal Argument: zero length
14656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
14756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, 0, MAX_BYTES);
14856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
14956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
15056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
15156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
15256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, 1, 0);
15356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
15456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
15556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
15656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
15756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal Argument: negative length
15856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
15956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, -1, MAX_BYTES);
16056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
16156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
16256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
16356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
16456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, 1, -1);
16556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
16656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
16756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
16856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
16956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
17056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
17156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * Class under test for constructor CharsetEncoder(Charset, float, float,
17256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * byte[])
17356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
17456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testCharsetEncoderCharsetfloatfloatbyteArray() {
17556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		byte[] ba = getLegalByteArray();
17656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// normal case
17756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		CharsetEncoder ec = new MockCharsetEncoder(cs, 1, MAX_BYTES, ba);
17856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(ec.charset(), cs);
17956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(1.0, ec.averageBytesPerChar(), 0.0);
18056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(ec.maxBytesPerChar() == MAX_BYTES);
181861d34f160de8a5f94b2b8b453daca5246052450Shubham Ajmera		assertTrue(Arrays.equals(ba, ec.replacement()));
18256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
18356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		/*
18456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		 * ------------------------ Exceptional cases -------------------------
18556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		 */
18656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// NullPointerException: null charset
18756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
18856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(null, 1, MAX_BYTES, ba);
18956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
19056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (NullPointerException e) {
19156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
19256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
19356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal Argument: null byte array
19456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
19556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, 1, MAX_BYTES, null);
19656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
19756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
19856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
19956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal Argument: empty byte array
20056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
20156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, 1, MAX_BYTES, new byte[0]);
20256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
20356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
20456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
20556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal Argument: byte array is longer than max length
20656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
20756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, 1, MAX_BYTES, new byte[] { 1, 2,
20856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					MAX_BYTES, 4 });
20956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
21056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
21156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
21256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
21356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // Commented out since the comment is wrong since MAX_BYTES > 1
21456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // This test throws IllegalArgumentException on Harmony and RI
21556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// // OK: average length less than max length
21656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// ec = new MockCharsetEncoder(cs, MAX_BYTES, ba.length, ba);
21756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// assertTrue(ec.averageBytesPerChar() == MAX_BYTES);
21856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// assertTrue(ec.maxBytesPerChar() == ba.length);
21956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
22056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal Argument: zero length
22156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
22256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, 0, MAX_BYTES, ba);
22356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
22456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
22556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
22656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
22756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, 1, 0, ba);
22856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
22956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
23056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
23156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
23256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal Argument: negative length
23356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
23456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, -1, MAX_BYTES, ba);
23556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
23656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
23756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
23856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
23956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			ec = new MockCharsetEncoder(cs, 1, -1, ba);
24056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalArgumentException");
24156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
24256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
24356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
24456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
24556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
24656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * Class under test for boolean canEncode(char)
24756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
24856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testCanEncodechar() throws CharacterCodingException {
24956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// for non-mapped char
25056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.canEncode('\uc2c0'));
25156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// surrogate char for unicode
25256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// 1st byte: d800-dbff
25356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// 2nd byte: dc00-dfff
25456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.canEncode('\ud800'));
25556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// valid surrogate pair
25656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.canEncode('\udc00'));
25756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
25856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
25956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*-----------------------------------------
26056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * Class under test for illegal state case
26156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * methods which can change internal states are two encode, flush, two canEncode, reset
26256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * -----------------------------------------
26356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
26456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
26556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	// Normal case: just after reset, and it also means reset can be done
26656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	// anywhere
26756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testResetIllegalState() throws CharacterCodingException {
26856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
26956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode('\ud901');
27056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
27156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode("\ud901\udc00");
27256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
27356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("aaa"));
27456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
27556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("aaa"), ByteBuffer.allocate(3), false);
27656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
27756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("aaa"), ByteBuffer.allocate(3), true);
27856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
27956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
28056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
2816ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes  public void testFlushIllegalState() throws CharacterCodingException {
2826ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    CharBuffer in = CharBuffer.wrap("aaa");
2836ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    ByteBuffer out = ByteBuffer.allocate(5);
2846ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes
2856ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    // Illegal state: after reset.
2866ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    encoder.reset();
2876ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    try {
2886ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes      encoder.flush(out);
2896ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes      fail();
2906ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    } catch (IllegalStateException expected) {
2916ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    }
2926ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes
2936ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    // Normal case: after encode with endOfInput is true
2946ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    assertSame(encoder, encoder.reset());
2956ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    encoder.encode(in, out, true);
2966ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    out.rewind();
2976ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    CoderResult result = encoder.flush(out);
2986ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes
2996ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    // Good state: flush twice
3006ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    encoder.flush(out);
3016ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes
3026ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    // Illegal state: flush after encode with endOfInput is false
3036ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    assertSame(encoder, encoder.reset());
3046ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    encoder.encode(in, out, false);
3056ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    try {
3066ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes      encoder.flush(out);
3076ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes      fail();
3086ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    } catch (IllegalStateException expected) {
3096ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes    }
3106ad37f500b023ef09fd177ad8cd8e2ba0b842caeElliott Hughes  }
3115ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes
31256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testFlushAfterConstructing() {
31356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		ByteBuffer out = ByteBuffer.allocate(5);
3145ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes
31556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		//Illegal state: flush after instance created
31656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
3175ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes			encoder.flush(out);
31856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw IllegalStateException");
31956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalStateException e) {
32056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			// Expected
32156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
32256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
32356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
32456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
32556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	// test illegal states for encode facade
32656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testEncodeFacadeIllegalState() throws CharacterCodingException {
32756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// encode facade can be execute in anywhere
32856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		CharBuffer in = CharBuffer.wrap("aaa");
32956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: just created
33056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in);
33156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
33256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
33356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: just after encode facade
33456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in);
33556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
33656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
33756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: just after canEncode
33856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
33956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode("\ud902\udc00");
34056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in);
34156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
34256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
34356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode('\ud902');
34456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in);
34556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
34656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
34756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: just after encode with that endOfInput is true
34856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
34956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"),
35056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), true);
35156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in);
35256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
35356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
35456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case:just after encode with that endOfInput is false
35556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
35656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"),
35756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), false);
35856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in);
35956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
36056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
36156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: just after flush
36256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
36356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"),
36456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), true);
36556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.flush(ByteBuffer.allocate(10));
36656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in);
36756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
36856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
36956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
37056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	// test illegal states for two encode method with endOfInput is true
37156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testEncodeTrueIllegalState() throws CharacterCodingException {
37256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		CharBuffer in = CharBuffer.wrap("aaa");
37356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		ByteBuffer out = ByteBuffer.allocate(5);
37456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: just created
37556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in, out, true);
37656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
37756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.rewind();
37856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
37956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
38056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.rewind();
38156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
38256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: just after encode with that endOfInput is true
38356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
38456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"),
38556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), true);
38656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in, out, true);
38756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
38856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.rewind();
38956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
39056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case:just after encode with that endOfInput is false
39156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
39256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"),
39356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), false);
39456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in, out, true);
39556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
39656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.rewind();
39756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
39856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal state: just after flush
39956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
40056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"),
40156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), true);
40256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.flush(ByteBuffer.allocate(10));
40356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
40456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.encode(in, out, true);
40556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should illegal state");
40656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalStateException e) {
40756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
40856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
40956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: after canEncode
41056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
41156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode("\ud906\udc00");
41256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in, out, true);
41356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
41456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.rewind();
41556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
41656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode('\ud905');
41756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in, out, true);
41856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
41956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
42056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	// test illegal states for two encode method with endOfInput is false
42156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testEncodeFalseIllegalState() throws CharacterCodingException {
42256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		CharBuffer in = CharBuffer.wrap("aaa");
42356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		ByteBuffer out = ByteBuffer.allocate(5);
42456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: just created
42556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in, out, false);
42656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
42756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.rewind();
42856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
42956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal state: just after encode facade
43056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
43156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState1"));
43256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
43356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.encode(in, out, false);
43456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should illegal state");
43556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalStateException e) {
43656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
43756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
43856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal state: just after encode with that endOfInput is true
43956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
44056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"),
44156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), true);
44256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
44356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.encode(in, out, false);
44456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should illegal state");
44556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalStateException e) {
44656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
44756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
44856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case:just after encode with that endOfInput is false
44956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
45056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"),
45156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), false);
45256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in, out, false);
45356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
45456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.rewind();
45556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
45656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal state: just after flush
45756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
45856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"),
45956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), true);
46056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.flush(ByteBuffer.allocate(10));
46156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
46256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.encode(in, out, false);
46356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should illegal state");
46456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalStateException e) {
46556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
46656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
46756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: after canEncode
46856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
46956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode("\ud906\udc00");
47056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in, out, false);
47156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
47256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.rewind();
47356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
47456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode('\ud905');
47556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(in, out, false);
47656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
47756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
47856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	// test illegal states for two canEncode methods
47956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testCanEncodeIllegalState() throws CharacterCodingException {
48056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: just created
48156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode("\ud900\udc00");
48256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode('\ud900');
48356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
48456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal state: just after encode with that endOfInput is true
48556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
48656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"),
48756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), true);
48856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
48956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.canEncode("\ud903\udc00");
49056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw illegal state exception");
49156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalStateException e) {
49256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
49356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
49456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Illegal state:just after encode with that endOfInput is false
49556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
49656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"),
49756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), false);
49856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
49956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.canEncode("\ud904\udc00");
50056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw illegal state exception");
50156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalStateException e) {
50256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
50356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
50456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: just after flush
50556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"),
50656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				ByteBuffer.allocate(30), true);
50756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.flush(ByteBuffer.allocate(10));
50856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode("\ud905\udc00");
50956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode('\ud906');
51056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
51156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Normal case: after reset again
51256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
51356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode("\ud906\udc00");
51456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.canEncode('\ud905');
51556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
51656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
51756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
51856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * --------------------------------- illegal state test end
51956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * ---------------------------------
52056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
52156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
52256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
52356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * Class under test for boolean canEncode(CharSequence)
52456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
52556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testCanEncodeCharSequence() {
52656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// for non-mapped char
52756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.canEncode("\uc2c0"));
52856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// surrogate char for unicode
52956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// 1st byte: d800-dbff
53056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// 2nd byte: dc00-dfff
53156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// valid surrogate pair
53256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.canEncode("\ud800\udc00"));
53356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// invalid surrogate pair
53456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.canEncode("\ud800\udb00"));
53556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
53656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
5375ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes    public void test_canEncode_empty() throws Exception {
5385ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes        assertTrue(encoder.canEncode(""));
5395ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes    }
5405ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes
5415ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes    public void test_canEncode_null() throws Exception {
5425ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes        try {
5435ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes            encoder.canEncode(null);
5445ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes            fail();
5455ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes        } catch (NullPointerException e) {
5465ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes        }
5475ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes    }
5485ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes
54956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
55056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * Class under test for Charset charset()
55156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
55256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testCharset() {
55356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
55456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder = new MockCharsetEncoder(Charset.forName("gbk"), 1,
55556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					MAX_BYTES);
55656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			// assertSame(encoder.charset(), Charset.forName("gbk"));
55756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (UnsupportedCharsetException e) {
55856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			System.err
55956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					.println("Don't support GBK encoding, ignore current test");
56056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
56156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
56256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
56356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
56456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * Class under test for ByteBuffer encode(CharBuffer)
56556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
56656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testEncodeCharBuffer() throws CharacterCodingException {
56756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Null pointer
56856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
56956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.encode(null);
57056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
57156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (NullPointerException e) {
57256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
57356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
57456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// empty input buffer
57556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		ByteBuffer out = encoder.encode(CharBuffer.wrap(""));
57656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.position(), 0);
57756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertByteArray(out, new byte[0]);
57856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// assertByteArray(out, surrogate);
57956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
58056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// normal case
58156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out = encoder.encode(CharBuffer.wrap(unistr));
58256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.position(), 0);
58356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertByteArray(out, addSurrogate(unibytes));
5845ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes
58556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        // Regression test for harmony-3378
58656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        Charset cs = Charset.forName("UTF-8");
58756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharsetEncoder encoder = cs.newEncoder();
58856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        encoder.onMalformedInput(CodingErrorAction.REPLACE);
58956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        encoder = encoder.replaceWith(new byte[] { (byte) 0xef, (byte) 0xbf,
59056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                (byte) 0xbd, });
59156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        CharBuffer in = CharBuffer.wrap("\ud800");
59256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes        out = encoder.encode(in);
5935ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes        assertNotNull(out);
59456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
59556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
59656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	private byte[] addSurrogate(byte[] expected) {
59756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (surrogate.length > 0) {
59856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			byte[] temp = new byte[surrogate.length + expected.length];
59956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			System.arraycopy(surrogate, 0, temp, 0, surrogate.length);
60056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			System.arraycopy(expected, 0, temp, surrogate.length,
60156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					expected.length);
60256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			expected = temp;
60356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
60456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		return expected;
60556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
60656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
60756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/**
60856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * @return
60956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
61056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	protected byte[] getEmptyByteArray() {
61156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		return new byte[0];
61256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
61356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
61456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	CharBuffer getMalformedCharBuffer() {
61556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		return CharBuffer.wrap("malform buffer");
61656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
61756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
61856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	CharBuffer getUnmapCharBuffer() {
61956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		return CharBuffer.wrap("unmap buffer");
62056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
62156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
62256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	CharBuffer getExceptionCharBuffer() {
62356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		return CharBuffer.wrap("runtime buffer");
62456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
62556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
62656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testEncodeCharBufferException() throws CharacterCodingException {
62756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		ByteBuffer out;
62856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		CharBuffer in;
62956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// MalformedException:
63056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in = getMalformedCharBuffer();
63156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.onMalformedInput(CodingErrorAction.REPORT);
63256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
63356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (in != null) {
63456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			try {
63556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes                // regression test for Harmony-1379
63656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				encoder.encode(in);
63756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				fail("should throw MalformedInputException");
63856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			} catch (MalformedInputException e) {
63956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			}
64056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
64156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
64256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.rewind();
64356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.onMalformedInput(CodingErrorAction.IGNORE);
64456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			out = encoder.encode(in);
64556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertByteArray(out, addSurrogate(unibytes));
64656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
64756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
64856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.rewind();
64956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.onMalformedInput(CodingErrorAction.REPLACE);
65056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			out = encoder.encode(in);
65156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertByteArray(out, addSurrogate(unibytesWithRep));
65256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
65356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
65456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Unmapped Exception:
65556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in = getUnmapCharBuffer();
65656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.onMalformedInput(CodingErrorAction.REPORT);
65756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
65856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (in != null) {
65956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
66056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			try {
66156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				encoder.encode(in);
66256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				fail("should throw UnmappableCharacterException");
66356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			} catch (UnmappableCharacterException e) {
66456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			}
66556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
66656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
66756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.rewind();
66856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
66956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			out = encoder.encode(in);
67056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertByteArray(out, unibytes);
67156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
67256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
67356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.rewind();
67456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
67556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			out = encoder.encode(in);
67656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertByteArray(out, unibytesWithRep);
67756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
67856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
67956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// RuntimeException
68056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
68156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.encode(getExceptionCharBuffer());
68256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw runtime exception");
68356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (RuntimeException e) {
68456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
68556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
68656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
68756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
68856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * utility method, extract given bytebuffer to a string and compare with
68956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * give string
69056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
69156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	void assertByteArray(ByteBuffer out, byte[] expected) {
69256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out = out.duplicate();
69356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (out.position() != 0) {
69456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			out.flip();
69556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
69656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		byte[] ba = new byte[out.limit() - out.position()];
69756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.get(ba);
69856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// byte[] ba = out.array();
69956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(Arrays.equals(ba, expected));
70056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
70156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
70256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
70356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * Class under test for CoderResult encode(CharBuffer, ByteBuffer, boolean)
70456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
70556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testEncodeCharBufferByteBufferboolean()
70656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			throws CharacterCodingException {
70756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		ByteBuffer out = ByteBuffer.allocate(200);
70856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		CharBuffer in = CharBuffer.wrap(unistr);
70956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Null pointer
71056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
71156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.encode(null, out, true);
71256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
71356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (NullPointerException e) {
71456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
71556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
71656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.encode(in, null, true);
71756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
71856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (NullPointerException e) {
71956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
72056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
72156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// normal case, one complete operation
72256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
72356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
72456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.rewind();
72556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true));
72656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.limit(), 200);
72756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(out.position() > 0);
72856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(out.remaining() > 0);
72956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.capacity(), 200);
73056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertByteArray(out, addSurrogate(unibytes));
73156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
73256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
73356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.flush(out);
73456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
73556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// normal case, one complete operation, but call twice, first time set
73656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// endOfInput to false
73756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
73856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
73956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out = ByteBuffer.allocate(200);
74056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, false));
74156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.limit(), 200);
74256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(out.position() > 0);
74356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(out.remaining() > 0);
74456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.capacity(), 200);
74556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertByteArray(out, addSurrogate(unibytes));
74656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
74756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
74856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, false));
74956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
75056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true));
75156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.limit(), 200);
75256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(out.position() > 0);
75356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(out.remaining() > 0);
75456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.capacity(), 200);
75556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
75656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertByteArray(out, addSurrogate(duplicateByteArray(unibytes, 3)));
75756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
75856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// overflow
75956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out = ByteBuffer.allocate(4);
76056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
76156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
76256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.rewind();
76356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CoderResult.OVERFLOW, encoder.encode(in, out, true));
76456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.limit(), 4);
76556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.position(), 4);
76656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.remaining(), 0);
76756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.capacity(), 4);
76856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		ByteBuffer temp = ByteBuffer.allocate(200);
76956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.flip();
77056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		temp.put(out);
77156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out = temp;
77256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true));
77356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.limit(), 200);
77456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(out.position() > 0);
77556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(out.remaining() > 0);
77656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.capacity(), 200);
77756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertByteArray(out, addSurrogate(unibytes));
77856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
77956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.reset());
78056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in.rewind();
78156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out = ByteBuffer.allocate(4);
78256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CoderResult.OVERFLOW, encoder.encode(in, out, false));
78356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.limit(), 4);
78456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.position(), 4);
78556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.remaining(), 0);
78656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.capacity(), 4);
78756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		temp = ByteBuffer.allocate(200);
78856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out.flip();
78956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		temp.put(out);
79056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		out = temp;
79156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, false));
79256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.limit(), 200);
79356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(out.position() > 0);
79456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(out.remaining() > 0);
79556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(out.capacity(), 200);
79656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertByteArray(out, addSurrogate(unibytes));
79756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
79856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
79956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	void printByteBuffer(ByteBuffer buffer) {
80056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		System.out.println("print buffer");
80156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (buffer.position() != 0) {
80256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			buffer.flip();
80356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
80456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		byte[] ba = buffer.array();
80556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		for (int i = 0; i < ba.length; i++) {
80656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			System.out.println(Integer.toHexString(ba[i]));
80756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
80856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
80956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
81056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testEncodeCharBufferByteBufferbooleanExceptionFalse()
81156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			throws CharacterCodingException {
81256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		implTestEncodeCharBufferByteBufferbooleanException(false);
81356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
81456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
81556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testEncodeCharBufferByteBufferbooleanExceptionTrue()
81656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			throws CharacterCodingException {
81756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		implTestEncodeCharBufferByteBufferbooleanException(true);
81856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
81956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
82056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	private byte[] duplicateByteArray(byte[] ba, int times) {
82156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		byte[] result = new byte[ba.length * times];
82256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		for (int i = 0; i < times; i++) {
82356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			System.arraycopy(ba, 0, result, i * ba.length, ba.length);
82456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
82556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		return result;
82656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
82756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
82856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	protected void implTestEncodeCharBufferByteBufferbooleanException(
82956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			boolean endOfInput) throws CharacterCodingException {
83056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		ByteBuffer out = ByteBuffer.allocate(100);
83156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
83256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// MalformedException:
83356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		CharBuffer in = getMalformedCharBuffer();
83456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.onMalformedInput(CodingErrorAction.REPORT);
83556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
83656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (in != null) {
83756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
83856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			CoderResult r = encoder.encode(in, out, endOfInput);
83956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertTrue(r.isMalformed());
84056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
84156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
84256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			out.clear();
84356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.rewind();
84456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.onMalformedInput(CodingErrorAction.IGNORE);
84556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out,
84656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					endOfInput));
84756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertCodingErrorAction(endOfInput, out, in, unibytes);
84856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
84956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
85056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			out.clear();
85156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.rewind();
85256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.onMalformedInput(CodingErrorAction.REPLACE);
85356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out,
85456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					endOfInput));
85556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertCodingErrorAction(endOfInput, out, in, unibytesWithRep);
85656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} else {
85756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			System.out.println("Cannot find malformed char buffer for "
85856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					+ cs.name());
85956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
86056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
86156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// Unmapped Exception:
86256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		in = getUnmapCharBuffer();
86356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.onMalformedInput(CodingErrorAction.REPORT);
86456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
86556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (in != null) {
86656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
86756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			out.clear();
86856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertTrue(encoder.encode(in, out, endOfInput).isUnmappable());
86956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
87056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
87156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			out.clear();
87256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.rewind();
87356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
87456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out,
87556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					endOfInput));
87656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertCodingErrorAction(endOfInput, out, in, unibytes);
87756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
87856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.reset();
87956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			out.clear();
88056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.rewind();
88156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
88256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out,
88356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					endOfInput));
88456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertCodingErrorAction(endOfInput, out, in, unibytesWithRep);
88556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} else {
88656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			System.out.println("Cannot find unmapped char buffer for "
88756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					+ cs.name());
88856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
88956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
89056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// RuntimeException
89156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
89256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.encode(getExceptionCharBuffer());
89356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw runtime exception");
89456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (RuntimeException e) {
89556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
89656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
89756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
89856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	private void assertCodingErrorAction(boolean endOfInput, ByteBuffer out,
89956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			CharBuffer in, byte[] expect) {
90056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (endOfInput) {
90156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertByteArray(out, addSurrogate(expect));
90256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} else {
90356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.rewind();
90456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out,
90556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					endOfInput));
90656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.rewind();
90756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true));
90856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertByteArray(out, addSurrogate(duplicateByteArray(expect, 3)));
90956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
91056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
91156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
91256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
91356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * Class under test for CoderResult flush(ByteBuffer)
91456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
91556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testFlush() throws CharacterCodingException {
91656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		ByteBuffer out = ByteBuffer.allocate(6);
91756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		CharBuffer in = CharBuffer.wrap("aaa");
91856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertEquals(in.remaining(), 3);
91956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
92056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// by encode facade, so that internal state will be wrong
92156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.encode(CharBuffer.wrap("testFlush"), ByteBuffer.allocate(20),
92256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				true);
92356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder
92456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				.flush(ByteBuffer.allocate(50)));
92556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
92656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
92756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
92856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * test isLegalReplacement(byte[])
92956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
9305ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes	public void test_isLegalReplacement_null() {
93156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
93256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.isLegalReplacement(null);
93356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
93456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (NullPointerException e) {
93556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
9365ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes	}
9375ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes
9385ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes	public void test_isLegalReplacement_good() {
93956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.isLegalReplacement(specifiedReplacement));
9405ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes	}
94156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
9425ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes	public void test_isLegalReplacement_bad() {
94356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.isLegalReplacement(new byte[200]));
94456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		byte[] ba = getIllegalByteArray();
94556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		if (ba != null) {
94656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			assertFalse(encoder.isLegalReplacement(ba));
94756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
94856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
94956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
9505ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes	public void test_isLegalReplacement_empty_array() {
95156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// ISO, ASC, GB, UTF8 encoder will throw exception in RI
95256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		// others will pass
95356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertTrue(encoder.isLegalReplacement(new byte[0]));
95456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
95556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
95656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testOnMalformedInput() {
95756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CodingErrorAction.REPORT, encoder.malformedInputAction());
95856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
95956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.onMalformedInput(null);
96056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
96156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
96256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
96356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.onMalformedInput(CodingErrorAction.IGNORE);
96456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CodingErrorAction.IGNORE, encoder.malformedInputAction());
96556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
96656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
96756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testOnUnmappableCharacter() {
96856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CodingErrorAction.REPORT, encoder
96956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				.unmappableCharacterAction());
97056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
97156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.onUnmappableCharacter(null);
97256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
97356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
97456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
97556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
97656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(CodingErrorAction.IGNORE, encoder
97756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				.unmappableCharacterAction());
97856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
97956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
98056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public void testReplacement() {
98156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
98256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.replaceWith(null);
98356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
98456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
98556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
98656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
98756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.replaceWith(new byte[0]);
98856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
98956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
99056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
99156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
99256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.replaceWith(new byte[100]);
99356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			fail("should throw null pointer exception");
99456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
99556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
99656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
99756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		byte[] nr = getLegalByteArray();
99856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		assertSame(encoder, encoder.replaceWith(nr));
999861d34f160de8a5f94b2b8b453daca5246052450Shubham Ajmera		assertTrue(Arrays.equals(nr, encoder.replacement()));
100056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
100156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		nr = getIllegalByteArray();
100256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		try {
100356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			encoder.replaceWith(new byte[100]);
10045ec6bf8d033754e06a463adb091d2c0afd0755acElliott Hughes			fail();
100556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		} catch (IllegalArgumentException e) {
100656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
100756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
100856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
100956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	protected byte[] getLegalByteArray() {
101056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		return new byte[] { 'a' };
101156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
101256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
101356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	protected byte[] getIllegalByteArray() {
101456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		return new byte[155];
101556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
101656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
101756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
101856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * Mock subclass of CharsetEncoder For protected method test
101956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
102056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public static class MockCharsetEncoder extends CharsetEncoder {
102156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
102256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		boolean flushed = false;
102356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
102456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		public boolean isFlushed() {
102556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			boolean result = flushed;
102656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			flushed = false;
102756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			return result;
102856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
102956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
103056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		public boolean isLegalReplacement(byte[] ba) {
103156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			if (ba.length == 155) {// specified magic number, return false
103256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				return false;
103356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			}
103456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			return super.isLegalReplacement(ba);
103556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
103656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
103756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		public MockCharsetEncoder(Charset cs, float aver, float max) {
103856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			super(cs, aver, max);
103956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
104056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
104156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		public MockCharsetEncoder(Charset cs, float aver, float max,
104256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				byte[] replacement) {
104356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			super(cs, aver, max, replacement);
104456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
104556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
104656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) {
104756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			int inPosition = in.position();
104856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			char[] input = new char[in.remaining()];
104956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			in.get(input);
105056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			String result = new String(input);
105156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			if (result.startsWith("malform")) {
105256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// reset the cursor to the error position
105356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				in.position(inPosition);
105456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// in.position(0);
105556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// set the error length
105656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				return CoderResult.malformedForLength("malform".length());
105756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			} else if (result.startsWith("unmap")) {
105856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// reset the cursor to the error position
105956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				in.position(inPosition);
106056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// in.position(0);
106156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// set the error length
106256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				return CoderResult.unmappableForLength("unmap".length());
106356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			} else if (result.startsWith("runtime")) {
106456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// reset the cursor to the error position
106556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				in.position(0);
106656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// set the error length
106756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				throw new RuntimeException("runtime");
106856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			}
106956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			int inLeft = input.length;
107056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			int outLeft = out.remaining();
107156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			CoderResult r = CoderResult.UNDERFLOW;
107256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			int length = inLeft;
107356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			if (outLeft < inLeft) {
107456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				r = CoderResult.OVERFLOW;
107556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				length = outLeft;
107656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				in.position(inPosition + outLeft);
107756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			}
107856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			for (int i = 0; i < length; i++) {
107956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				out.put((byte) input[i]);
108056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			}
108156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			return r;
108256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
108356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
108456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		protected CoderResult implFlush(ByteBuffer out) {
108556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			CoderResult result = super.implFlush(out);
108656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			int length = 0;
108756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			if (out.remaining() >= 5) {
108856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				length = 5;
108956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				result = CoderResult.UNDERFLOW;
109056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				flushed = true;
109156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// for (int i = 0; i < length; i++) {
109256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// out.put((byte)'f');
109356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				// }
109456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			} else {
109556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				length = out.remaining();
109656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes				result = CoderResult.OVERFLOW;
109756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			}
109856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			return result;
109956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
110056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
110156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		protected void implReplaceWith(byte[] ba) {
1102861d34f160de8a5f94b2b8b453daca5246052450Shubham Ajmera			assertTrue(Arrays.equals(ba, replacement()));
110356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
110456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
110556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
110656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
110756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	/*
110856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 * mock charset for test encoder initialization
110956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	 */
111056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	public static class MockCharset extends Charset {
111156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		protected MockCharset(String arg0, String[] arg1) {
111256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			super(arg0, arg1);
111356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
111456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
111556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		public boolean contains(Charset arg0) {
111656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			return false;
111756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
111856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
111956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		public CharsetDecoder newDecoder() {
112056ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			return new CharsetDecoderTest.MockCharsetDecoder(this,
112156ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes					(float) AVER_BYTES, MAX_BYTES);
112256ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
112356ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
112456ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		public CharsetEncoder newEncoder() {
112556ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes			return new MockCharsetEncoder(this, (float) AVER_BYTES, MAX_BYTES);
112656ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes		}
112756ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes	}
112856ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes
112956ddb0af9c75dca21f10cd26e73b9f301c58771eElliott Hughes}
1130