1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/* Licensed to the Apache Software Foundation (ASF) under one or more
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * contributor license agreements.  See the NOTICE file distributed with
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * this work for additional information regarding copyright ownership.
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * (the "License"); you may not use this file except in compliance with
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * the License.  You may obtain a copy of the License at
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Unless required by applicable law or agreed to in writing, software
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * See the License for the specific language governing permissions and
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * limitations under the License.
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage tests.api.java.nio.charset;
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.ByteBuffer;
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.CharBuffer;
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.CharacterCodingException;
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.Charset;
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.CharsetDecoder;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.CharsetEncoder;
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.CoderResult;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.CodingErrorAction;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.MalformedInputException;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.UnmappableCharacterException;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.charset.UnsupportedCharsetException;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * API unit test for java.nio.charset.CharsetEncoder
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class CharsetEncoderTest extends TestCase {
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	static final int MAX_BYTES = 3;
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	static final float AVER_BYTES = 0.5f;
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// charset for mock class
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	private static final Charset MOCKCS = new MockCharset("CharsetEncoderTest_mock", new String[0]);
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	Charset cs = MOCKCS;
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// default encoder
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	CharsetEncoder encoder;
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// default for Charset abstract class
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	byte[] defaultReplacement = new byte[] { 63 };
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// specific for Charset implementation subclass
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	byte[] specifiedReplacement = new byte[] { 63 };
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	static final String unistr = " buffer";// \u8000\u8001\u00a5\u3000\r\n";
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	byte[] unibytes = new byte[] { 32, 98, 117, 102, 102, 101, 114 };
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	byte[] unibytesWithRep = null;
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	byte[] surrogate = new byte[0];
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	protected void setUp() throws Exception {
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		super.setUp();
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder = cs.newEncoder();
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (null == unibytesWithRep) {
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			byte[] replacement = encoder.replacement();
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			unibytesWithRep = new byte[replacement.length + unibytes.length];
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.arraycopy(replacement, 0, unibytesWithRep, 0,
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					replacement.length);
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.arraycopy(unibytes, 0, unibytesWithRep, replacement.length,
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					unibytes.length);
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @see TestCase#tearDown()
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	protected void tearDown() throws Exception {
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		super.tearDown();
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testSpecificDefaultValue() {
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.averageBytesPerChar() == AVER_BYTES);
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.maxBytesPerChar() == MAX_BYTES);
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testDefaultValue() {
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(CodingErrorAction.REPORT, encoder.malformedInputAction());
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(CodingErrorAction.REPORT, encoder
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.unmappableCharacterAction());
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.onMalformedInput(CodingErrorAction.IGNORE));
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.onUnmappableCharacter(CodingErrorAction.IGNORE));
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (encoder instanceof MockCharsetEncoder) {
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue(Arrays.equals(encoder.replacement(), defaultReplacement));
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} else {
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue(Arrays.equals(encoder.replacement(),
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					specifiedReplacement));
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * Class under test for constructor CharsetEncoder(Charset, float, float)
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testCharsetEncoderCharsetfloatfloat() {
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// default value
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder = new MockCharsetEncoder(cs, (float) AVER_BYTES, MAX_BYTES);
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder.charset(), cs);
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.averageBytesPerChar() == AVER_BYTES);
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.maxBytesPerChar() == MAX_BYTES);
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(CodingErrorAction.REPORT, encoder.malformedInputAction());
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(CodingErrorAction.REPORT, encoder
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.unmappableCharacterAction());
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(new String(encoder.replacement()), new String(
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				defaultReplacement));
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.onMalformedInput(CodingErrorAction.IGNORE));
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.onUnmappableCharacter(CodingErrorAction.IGNORE));
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// normal case
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CharsetEncoder ec = new MockCharsetEncoder(cs, 1, MAX_BYTES);
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(ec.charset(), cs);
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(1.0, ec.averageBytesPerChar(), 0);
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(ec.maxBytesPerChar() == MAX_BYTES);
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		/*
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		 * ------------------------ Exceptional cases -------------------------
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		 */
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// NullPointerException: null charset
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(null, 1, MAX_BYTES);
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (NullPointerException e) {
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ec = new MockCharsetEncoder(new MockCharset("mock", new String[0]), 1,
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				MAX_BYTES);
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // Commented out since the comment is wrong since MAX_BYTES > 1
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// // OK: average length less than max length
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// ec = new MockCharsetEncoder(cs, MAX_BYTES, 1);
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// assertTrue(ec.averageBytesPerChar() == MAX_BYTES);
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// assertTrue(ec.maxBytesPerChar() == 1);
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal Argument: zero length
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, 0, MAX_BYTES);
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, 1, 0);
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal Argument: negative length
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, -1, MAX_BYTES);
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, 1, -1);
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * Class under test for constructor CharsetEncoder(Charset, float, float,
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * byte[])
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testCharsetEncoderCharsetfloatfloatbyteArray() {
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		byte[] ba = getLegalByteArray();
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// normal case
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CharsetEncoder ec = new MockCharsetEncoder(cs, 1, MAX_BYTES, ba);
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(ec.charset(), cs);
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(1.0, ec.averageBytesPerChar(), 0.0);
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(ec.maxBytesPerChar() == MAX_BYTES);
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(ba, ec.replacement());
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		/*
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		 * ------------------------ Exceptional cases -------------------------
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		 */
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// NullPointerException: null charset
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(null, 1, MAX_BYTES, ba);
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (NullPointerException e) {
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal Argument: null byte array
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, 1, MAX_BYTES, null);
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal Argument: empty byte array
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, 1, MAX_BYTES, new byte[0]);
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal Argument: byte array is longer than max length
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, 1, MAX_BYTES, new byte[] { 1, 2,
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					MAX_BYTES, 4 });
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // Commented out since the comment is wrong since MAX_BYTES > 1
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // This test throws IllegalArgumentException on Harmony and RI
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// // OK: average length less than max length
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// ec = new MockCharsetEncoder(cs, MAX_BYTES, ba.length, ba);
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// assertTrue(ec.averageBytesPerChar() == MAX_BYTES);
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// assertTrue(ec.maxBytesPerChar() == ba.length);
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal Argument: zero length
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, 0, MAX_BYTES, ba);
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, 1, 0, ba);
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal Argument: negative length
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, -1, MAX_BYTES, ba);
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			ec = new MockCharsetEncoder(cs, 1, -1, ba);
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalArgumentException");
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * Class under test for boolean canEncode(char)
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testCanEncodechar() throws CharacterCodingException {
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// for non-mapped char
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.canEncode('\uc2c0'));
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// surrogate char for unicode
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// 1st byte: d800-dbff
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// 2nd byte: dc00-dfff
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.canEncode('\ud800'));
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// valid surrogate pair
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.canEncode('\udc00'));
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*-----------------------------------------
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * Class under test for illegal state case
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * methods which can change internal states are two encode, flush, two canEncode, reset
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * -----------------------------------------
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// Normal case: just after reset, and it also means reset can be done
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// anywhere
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testResetIllegalState() throws CharacterCodingException {
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode('\ud901');
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode("\ud901\udc00");
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("aaa"));
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("aaa"), ByteBuffer.allocate(3), false);
279561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("aaa"), ByteBuffer.allocate(3), true);
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testFlushIllegalState() throws CharacterCodingException {
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CharBuffer in = CharBuffer.wrap("aaa");
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteBuffer out = ByteBuffer.allocate(5);
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: after encode with endOfInput is true
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, true);
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CoderResult result = encoder.flush(out);
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal state: flush twice
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.flush(out);
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalStateException");
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalStateException e) {
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		    // Expected
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal state: flush after encode with endOfInput is false
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, false);
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
306561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.flush(out);
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalStateException");
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalStateException e) {
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		    // Expected
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
311561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testFlushAfterConstructing() {
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteBuffer out = ByteBuffer.allocate(5);
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		//Illegal state: flush after instance created
317561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.flush(out);
319561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw IllegalStateException");
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalStateException e) {
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			// Expected
322561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
324561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
325561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// test illegal states for encode facade
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testEncodeFacadeIllegalState() throws CharacterCodingException {
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// encode facade can be execute in anywhere
329561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CharBuffer in = CharBuffer.wrap("aaa");
330561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: just created
331561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in);
332561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
333561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
334561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: just after encode facade
335561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in);
336561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
337561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
338561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: just after canEncode
339561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
340561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode("\ud902\udc00");
341561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in);
342561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
343561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
344561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode('\ud902');
345561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in);
346561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
347561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
348561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: just after encode with that endOfInput is true
349561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
350561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"),
351561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), true);
352561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in);
353561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
354561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
355561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case:just after encode with that endOfInput is false
356561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
357561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"),
358561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), false);
359561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in);
360561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
361561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
362561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: just after flush
363561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
364561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"),
365561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), true);
366561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.flush(ByteBuffer.allocate(10));
367561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in);
368561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
369561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
370561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
371561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// test illegal states for two encode method with endOfInput is true
372561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testEncodeTrueIllegalState() throws CharacterCodingException {
373561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CharBuffer in = CharBuffer.wrap("aaa");
374561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteBuffer out = ByteBuffer.allocate(5);
375561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: just created
376561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, true);
377561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
378561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
379561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
380561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
381561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
382561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
383561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: just after encode with that endOfInput is true
384561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
385561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"),
386561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), true);
387561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, true);
388561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
389561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
390561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
391561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case:just after encode with that endOfInput is false
392561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
393561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"),
394561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), false);
395561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, true);
396561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
397561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
398561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
399561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal state: just after flush
400561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
401561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"),
402561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), true);
403561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.flush(ByteBuffer.allocate(10));
404561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
405561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.encode(in, out, true);
406561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should illegal state");
407561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalStateException e) {
408561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
409561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
410561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: after canEncode
411561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
412561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode("\ud906\udc00");
413561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, true);
414561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
415561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
416561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
417561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode('\ud905');
418561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, true);
419561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
420561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
421561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// test illegal states for two encode method with endOfInput is false
422561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testEncodeFalseIllegalState() throws CharacterCodingException {
423561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CharBuffer in = CharBuffer.wrap("aaa");
424561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteBuffer out = ByteBuffer.allocate(5);
425561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: just created
426561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, false);
427561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
428561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
429561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
430561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal state: just after encode facade
431561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
432561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState1"));
433561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
434561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.encode(in, out, false);
435561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should illegal state");
436561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalStateException e) {
437561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
438561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
439561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal state: just after encode with that endOfInput is true
440561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
441561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"),
442561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), true);
443561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
444561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.encode(in, out, false);
445561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should illegal state");
446561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalStateException e) {
447561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
448561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
449561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case:just after encode with that endOfInput is false
450561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
451561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"),
452561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), false);
453561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, false);
454561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
455561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
456561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
457561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal state: just after flush
458561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
459561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"),
460561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), true);
461561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.flush(ByteBuffer.allocate(10));
462561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
463561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.encode(in, out, false);
464561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should illegal state");
465561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalStateException e) {
466561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
467561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
468561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: after canEncode
469561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
470561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode("\ud906\udc00");
471561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, false);
472561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
473561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
474561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
475561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode('\ud905');
476561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(in, out, false);
477561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
478561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
479561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	// test illegal states for two canEncode methods
480561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testCanEncodeIllegalState() throws CharacterCodingException {
481561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: just created
482561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode("\ud900\udc00");
483561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode('\ud900');
484561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
485561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal state: just after encode with that endOfInput is true
486561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
487561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"),
488561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), true);
489561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
490561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.canEncode("\ud903\udc00");
491561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw illegal state exception");
492561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalStateException e) {
493561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
494561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
495561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Illegal state:just after encode with that endOfInput is false
496561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
497561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"),
498561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), false);
499561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
500561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.canEncode("\ud904\udc00");
501561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw illegal state exception");
502561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalStateException e) {
503561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
504561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
505561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: just after flush
506561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"),
507561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				ByteBuffer.allocate(30), true);
508561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.flush(ByteBuffer.allocate(10));
509561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode("\ud905\udc00");
510561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode('\ud906');
511561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
512561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Normal case: after reset again
513561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
514561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode("\ud906\udc00");
515561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.canEncode('\ud905');
516561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
517561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
518561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
519561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * --------------------------------- illegal state test end
520561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * ---------------------------------
521561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
522561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
523561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
524561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * Class under test for boolean canEncode(CharSequence)
525561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
526561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testCanEncodeCharSequence() {
527561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// for non-mapped char
528561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.canEncode("\uc2c0"));
529561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// surrogate char for unicode
530561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// 1st byte: d800-dbff
531561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// 2nd byte: dc00-dfff
532561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.canEncode("\ud800"));
533561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// valid surrogate pair
534561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.canEncode("\ud800\udc00"));
535561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// invalid surrogate pair
536561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.canEncode("\ud800\udb00"));
537561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
538561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
539561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
540561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * Class under test for Charset charset()
541561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
542561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testCharset() {
543561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
544561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder = new MockCharsetEncoder(Charset.forName("gbk"), 1,
545561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					MAX_BYTES);
546561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			// assertSame(encoder.charset(), Charset.forName("gbk"));
547561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (UnsupportedCharsetException e) {
548561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.err
549561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					.println("Don't support GBK encoding, ignore current test");
550561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
551561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
552561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
553561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
554561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * Class under test for ByteBuffer encode(CharBuffer)
555561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
556561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testEncodeCharBuffer() throws CharacterCodingException {
557561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Null pointer
558561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
559561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.encode(null);
560561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
561561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (NullPointerException e) {
562561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
563561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
564561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// empty input buffer
565561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteBuffer out = encoder.encode(CharBuffer.wrap(""));
566561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.position(), 0);
567561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertByteArray(out, new byte[0]);
568561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// assertByteArray(out, surrogate);
569561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
570561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// normal case
571561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out = encoder.encode(CharBuffer.wrap(unistr));
572561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.position(), 0);
573561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertByteArray(out, addSurrogate(unibytes));
574561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
575561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression test for harmony-3378
576561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        Charset cs = Charset.forName("UTF-8");
577561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharsetEncoder encoder = cs.newEncoder();
578561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoder.onMalformedInput(CodingErrorAction.REPLACE);
579561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        encoder = encoder.replaceWith(new byte[] { (byte) 0xef, (byte) 0xbf,
580561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 0xbd, });
581561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CharBuffer in = CharBuffer.wrap("\ud800");
582561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        out = encoder.encode(in);
583561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotNull(out);
584561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
585561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
586561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	private byte[] addSurrogate(byte[] expected) {
587561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (surrogate.length > 0) {
588561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			byte[] temp = new byte[surrogate.length + expected.length];
589561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.arraycopy(surrogate, 0, temp, 0, surrogate.length);
590561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.arraycopy(expected, 0, temp, surrogate.length,
591561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					expected.length);
592561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			expected = temp;
593561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
594561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		return expected;
595561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
596561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
597561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/**
598561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * @return
599561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
600561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	protected byte[] getEmptyByteArray() {
601561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		return new byte[0];
602561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
603561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
604561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	CharBuffer getMalformedCharBuffer() {
605561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		return CharBuffer.wrap("malform buffer");
606561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
607561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
608561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	CharBuffer getUnmapCharBuffer() {
609561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		return CharBuffer.wrap("unmap buffer");
610561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
611561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
612561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	CharBuffer getExceptionCharBuffer() {
613561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		return CharBuffer.wrap("runtime buffer");
614561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
615561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
616561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testEncodeCharBufferException() throws CharacterCodingException {
617561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteBuffer out;
618561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CharBuffer in;
619561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// MalformedException:
620561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in = getMalformedCharBuffer();
621561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.onMalformedInput(CodingErrorAction.REPORT);
622561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
623561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (in != null) {
624561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			try {
625561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                // regression test for Harmony-1379
626561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				encoder.encode(in);
627561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				fail("should throw MalformedInputException");
628561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			} catch (MalformedInputException e) {
629561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
630561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
631561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
632561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.rewind();
633561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.onMalformedInput(CodingErrorAction.IGNORE);
634561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			out = encoder.encode(in);
635561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertByteArray(out, addSurrogate(unibytes));
636561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
637561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
638561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.rewind();
639561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.onMalformedInput(CodingErrorAction.REPLACE);
640561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			out = encoder.encode(in);
641561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertByteArray(out, addSurrogate(unibytesWithRep));
642561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
643561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
644561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Unmapped Exception:
645561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in = getUnmapCharBuffer();
646561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.onMalformedInput(CodingErrorAction.REPORT);
647561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
648561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (in != null) {
649561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
650561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			try {
651561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				encoder.encode(in);
652561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				fail("should throw UnmappableCharacterException");
653561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			} catch (UnmappableCharacterException e) {
654561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
655561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
656561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
657561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.rewind();
658561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
659561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			out = encoder.encode(in);
660561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertByteArray(out, unibytes);
661561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
662561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
663561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.rewind();
664561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
665561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			out = encoder.encode(in);
666561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertByteArray(out, unibytesWithRep);
667561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
668561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
669561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// RuntimeException
670561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
671561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.encode(getExceptionCharBuffer());
672561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw runtime exception");
673561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (RuntimeException e) {
674561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
675561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
676561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
677561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
678561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * utility method, extract given bytebuffer to a string and compare with
679561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * give string
680561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
681561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	void assertByteArray(ByteBuffer out, byte[] expected) {
682561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out = out.duplicate();
683561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (out.position() != 0) {
684561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			out.flip();
685561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
686561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		byte[] ba = new byte[out.limit() - out.position()];
687561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.get(ba);
688561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// byte[] ba = out.array();
689561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(Arrays.equals(ba, expected));
690561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
691561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
692561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
693561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * Class under test for CoderResult encode(CharBuffer, ByteBuffer, boolean)
694561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
695561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testEncodeCharBufferByteBufferboolean()
696561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			throws CharacterCodingException {
697561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteBuffer out = ByteBuffer.allocate(200);
698561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CharBuffer in = CharBuffer.wrap(unistr);
699561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Null pointer
700561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
701561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.encode(null, out, true);
702561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
703561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (NullPointerException e) {
704561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
705561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
706561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.encode(in, null, true);
707561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
708561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (NullPointerException e) {
709561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
710561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
711561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// normal case, one complete operation
712561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
713561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
714561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
715561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true));
716561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.limit(), 200);
717561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(out.position() > 0);
718561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(out.remaining() > 0);
719561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.capacity(), 200);
720561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertByteArray(out, addSurrogate(unibytes));
721561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
722561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
723561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.flush(out);
724561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
725561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// normal case, one complete operation, but call twice, first time set
726561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// endOfInput to false
727561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
728561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
729561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out = ByteBuffer.allocate(200);
730561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, false));
731561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.limit(), 200);
732561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(out.position() > 0);
733561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(out.remaining() > 0);
734561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.capacity(), 200);
735561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertByteArray(out, addSurrogate(unibytes));
736561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
737561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
738561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, false));
739561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
740561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true));
741561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.limit(), 200);
742561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(out.position() > 0);
743561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(out.remaining() > 0);
744561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.capacity(), 200);
745561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
746561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertByteArray(out, addSurrogate(duplicateByteArray(unibytes, 3)));
747561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
748561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// overflow
749561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out = ByteBuffer.allocate(4);
750561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
751561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
752561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.rewind();
753561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CoderResult.OVERFLOW, encoder.encode(in, out, true));
754561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.limit(), 4);
755561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.position(), 4);
756561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.remaining(), 0);
757561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.capacity(), 4);
758561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteBuffer temp = ByteBuffer.allocate(200);
759561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.flip();
760561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		temp.put(out);
761561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out = temp;
762561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true));
763561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.limit(), 200);
764561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(out.position() > 0);
765561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(out.remaining() > 0);
766561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.capacity(), 200);
767561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertByteArray(out, addSurrogate(unibytes));
768561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
769561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.reset());
770561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in.rewind();
771561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out = ByteBuffer.allocate(4);
772561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CoderResult.OVERFLOW, encoder.encode(in, out, false));
773561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.limit(), 4);
774561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.position(), 4);
775561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.remaining(), 0);
776561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.capacity(), 4);
777561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		temp = ByteBuffer.allocate(200);
778561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out.flip();
779561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		temp.put(out);
780561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		out = temp;
781561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, false));
782561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.limit(), 200);
783561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(out.position() > 0);
784561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(out.remaining() > 0);
785561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(out.capacity(), 200);
786561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertByteArray(out, addSurrogate(unibytes));
787561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
788561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
789561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	void printByteBuffer(ByteBuffer buffer) {
790561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		System.out.println("print buffer");
791561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (buffer.position() != 0) {
792561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			buffer.flip();
793561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
794561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		byte[] ba = buffer.array();
795561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		for (int i = 0; i < ba.length; i++) {
796561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.out.println(Integer.toHexString(ba[i]));
797561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
798561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
799561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
800561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testEncodeCharBufferByteBufferbooleanExceptionFalse()
801561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			throws CharacterCodingException {
802561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		implTestEncodeCharBufferByteBufferbooleanException(false);
803561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
804561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
805561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testEncodeCharBufferByteBufferbooleanExceptionTrue()
806561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			throws CharacterCodingException {
807561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		implTestEncodeCharBufferByteBufferbooleanException(true);
808561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
809561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
810561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	private byte[] duplicateByteArray(byte[] ba, int times) {
811561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		byte[] result = new byte[ba.length * times];
812561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		for (int i = 0; i < times; i++) {
813561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.arraycopy(ba, 0, result, i * ba.length, ba.length);
814561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
815561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		return result;
816561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
817561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
818561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	protected void implTestEncodeCharBufferByteBufferbooleanException(
819561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			boolean endOfInput) throws CharacterCodingException {
820561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteBuffer out = ByteBuffer.allocate(100);
821561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
822561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// MalformedException:
823561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CharBuffer in = getMalformedCharBuffer();
824561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.onMalformedInput(CodingErrorAction.REPORT);
825561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
826561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (in != null) {
827561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
828561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			CoderResult r = encoder.encode(in, out, endOfInput);
829561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue(r.isMalformed());
830561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
831561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
832561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			out.clear();
833561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.rewind();
834561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.onMalformedInput(CodingErrorAction.IGNORE);
835561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out,
836561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					endOfInput));
837561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertCodingErrorAction(endOfInput, out, in, unibytes);
838561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
839561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
840561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			out.clear();
841561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.rewind();
842561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.onMalformedInput(CodingErrorAction.REPLACE);
843561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out,
844561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					endOfInput));
845561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertCodingErrorAction(endOfInput, out, in, unibytesWithRep);
846561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} else {
847561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.out.println("Cannot find malformed char buffer for "
848561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					+ cs.name());
849561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
850561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
851561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Unmapped Exception:
852561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		in = getUnmapCharBuffer();
853561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.onMalformedInput(CodingErrorAction.REPORT);
854561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
855561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (in != null) {
856561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
857561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			out.clear();
858561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertTrue(encoder.encode(in, out, endOfInput).isUnmappable());
859561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
860561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
861561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			out.clear();
862561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.rewind();
863561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
864561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out,
865561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					endOfInput));
866561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertCodingErrorAction(endOfInput, out, in, unibytes);
867561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
868561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.reset();
869561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			out.clear();
870561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.rewind();
871561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
872561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out,
873561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					endOfInput));
874561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertCodingErrorAction(endOfInput, out, in, unibytesWithRep);
875561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} else {
876561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			System.out.println("Cannot find unmapped char buffer for "
877561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					+ cs.name());
878561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
879561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
880561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// RuntimeException
881561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
882561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.encode(getExceptionCharBuffer());
883561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw runtime exception");
884561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (RuntimeException e) {
885561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
886561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
887561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
888561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	private void assertCodingErrorAction(boolean endOfInput, ByteBuffer out,
889561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			CharBuffer in, byte[] expect) {
890561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (endOfInput) {
891561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertByteArray(out, addSurrogate(expect));
892561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} else {
893561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.rewind();
894561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out,
895561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					endOfInput));
896561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.rewind();
897561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true));
898561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertByteArray(out, addSurrogate(duplicateByteArray(expect, 3)));
899561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
900561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
901561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
902561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
903561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * Class under test for CoderResult flush(ByteBuffer)
904561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
905561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testFlush() throws CharacterCodingException {
906561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		ByteBuffer out = ByteBuffer.allocate(6);
907561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		CharBuffer in = CharBuffer.wrap("aaa");
908561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals(in.remaining(), 3);
909561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
910561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// by encode facade, so that internal state will be wrong
911561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.encode(CharBuffer.wrap("testFlush"), ByteBuffer.allocate(20),
912561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				true);
913561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CoderResult.UNDERFLOW, encoder
914561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.flush(ByteBuffer.allocate(50)));
915561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
916561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
917561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
918561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * test isLegalReplacement(byte[])
919561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
920561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testIsLegalReplacement() {
921561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
922561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.isLegalReplacement(null);
923561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
924561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (NullPointerException e) {
925561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
926561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.isLegalReplacement(specifiedReplacement));
927561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
928561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.isLegalReplacement(new byte[200]));
929561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		byte[] ba = getIllegalByteArray();
930561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		if (ba != null) {
931561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertFalse(encoder.isLegalReplacement(ba));
932561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
933561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
934561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
935561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testIsLegalReplacementEmptyArray() {
936561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// ISO, ASC, GB, UTF8 encoder will throw exception in RI
937561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// others will pass
938561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// try {
939561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertTrue(encoder.isLegalReplacement(new byte[0]));
940561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// fail("should throw ArrayIndexOutOfBoundsException");
941561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// } catch (ArrayIndexOutOfBoundsException e) {
942561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// }
943561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
944561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
945561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testOnMalformedInput() {
946561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CodingErrorAction.REPORT, encoder.malformedInputAction());
947561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
948561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.onMalformedInput(null);
949561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
950561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
951561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
952561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.onMalformedInput(CodingErrorAction.IGNORE);
953561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CodingErrorAction.IGNORE, encoder.malformedInputAction());
954561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
955561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
956561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testOnUnmappableCharacter() {
957561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CodingErrorAction.REPORT, encoder
958561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.unmappableCharacterAction());
959561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
960561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.onUnmappableCharacter(null);
961561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
962561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
963561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
964561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
965561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(CodingErrorAction.IGNORE, encoder
966561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				.unmappableCharacterAction());
967561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
968561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
969561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public void testReplacement() {
970561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
971561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.replaceWith(null);
972561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
973561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
974561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
975561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
976561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.replaceWith(new byte[0]);
977561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
978561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
979561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
980561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
981561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.replaceWith(new byte[100]);
982561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
983561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
984561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
985561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
986561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		byte[] nr = getLegalByteArray();
987561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(encoder, encoder.replaceWith(nr));
988561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertSame(nr, encoder.replacement());
989561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
990561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		nr = getIllegalByteArray();
991561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		try {
992561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			encoder.replaceWith(new byte[100]);
993561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			fail("should throw null pointer exception");
994561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		} catch (IllegalArgumentException e) {
995561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
996561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
997561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
998561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	protected byte[] getLegalByteArray() {
999561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		return new byte[] { 'a' };
1000561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
1001561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1002561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	protected byte[] getIllegalByteArray() {
1003561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		return new byte[155];
1004561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
1005561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1006561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
1007561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * Mock subclass of CharsetEncoder For protected method test
1008561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
1009561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public static class MockCharsetEncoder extends CharsetEncoder {
1010561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1011561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		boolean flushed = false;
1012561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1013561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public boolean isFlushed() {
1014561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			boolean result = flushed;
1015561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			flushed = false;
1016561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return result;
1017561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1018561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1019561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public boolean isLegalReplacement(byte[] ba) {
1020561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			if (ba.length == 155) {// specified magic number, return false
1021561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				return false;
1022561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
1023561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return super.isLegalReplacement(ba);
1024561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1025561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1026561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public MockCharsetEncoder(Charset cs, float aver, float max) {
1027561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			super(cs, aver, max);
1028561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1029561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1030561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public MockCharsetEncoder(Charset cs, float aver, float max,
1031561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				byte[] replacement) {
1032561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			super(cs, aver, max, replacement);
1033561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1034561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1035561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		protected CoderResult encodeLoop(CharBuffer in, ByteBuffer out) {
1036561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			int inPosition = in.position();
1037561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			char[] input = new char[in.remaining()];
1038561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			in.get(input);
1039561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			String result = new String(input);
1040561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			if (result.startsWith("malform")) {
1041561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// reset the cursor to the error position
1042561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				in.position(inPosition);
1043561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// in.position(0);
1044561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// set the error length
1045561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				return CoderResult.malformedForLength("malform".length());
1046561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			} else if (result.startsWith("unmap")) {
1047561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// reset the cursor to the error position
1048561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				in.position(inPosition);
1049561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// in.position(0);
1050561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// set the error length
1051561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				return CoderResult.unmappableForLength("unmap".length());
1052561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			} else if (result.startsWith("runtime")) {
1053561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// reset the cursor to the error position
1054561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				in.position(0);
1055561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// set the error length
1056561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				throw new RuntimeException("runtime");
1057561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
1058561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			int inLeft = input.length;
1059561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			int outLeft = out.remaining();
1060561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			CoderResult r = CoderResult.UNDERFLOW;
1061561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			int length = inLeft;
1062561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			if (outLeft < inLeft) {
1063561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				r = CoderResult.OVERFLOW;
1064561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				length = outLeft;
1065561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				in.position(inPosition + outLeft);
1066561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
1067561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			for (int i = 0; i < length; i++) {
1068561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				out.put((byte) input[i]);
1069561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
1070561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return r;
1071561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1072561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1073561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		protected CoderResult implFlush(ByteBuffer out) {
1074561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			CoderResult result = super.implFlush(out);
1075561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			int length = 0;
1076561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			if (out.remaining() >= 5) {
1077561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				length = 5;
1078561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				result = CoderResult.UNDERFLOW;
1079561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				flushed = true;
1080561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// for (int i = 0; i < length; i++) {
1081561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// out.put((byte)'f');
1082561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				// }
1083561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			} else {
1084561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				length = out.remaining();
1085561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes				result = CoderResult.OVERFLOW;
1086561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			}
1087561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return result;
1088561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1089561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1090561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		protected void implReplaceWith(byte[] ba) {
1091561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			assertSame(ba, replacement());
1092561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1093561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1094561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
1095561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1096561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	/*
1097561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 * mock charset for test encoder initialization
1098561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	 */
1099561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	public static class MockCharset extends Charset {
1100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		protected MockCharset(String arg0, String[] arg1) {
1101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			super(arg0, arg1);
1102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public boolean contains(Charset arg0) {
1105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return false;
1106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public CharsetDecoder newDecoder() {
1109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return new CharsetDecoderTest.MockCharsetDecoder(this,
1110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes					(float) AVER_BYTES, MAX_BYTES);
1111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		public CharsetEncoder newEncoder() {
1114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes			return new MockCharsetEncoder(this, (float) AVER_BYTES, MAX_BYTES);
1115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		}
1116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes	}
1117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
1119