| /* Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package tests.api.java.nio.charset; |
| |
| import dalvik.annotation.TestTargetClass; |
| import dalvik.annotation.TestTargets; |
| import dalvik.annotation.TestTargetNew; |
| import dalvik.annotation.TestLevel; |
| |
| import java.nio.ByteBuffer; |
| import java.nio.CharBuffer; |
| import java.nio.charset.CharacterCodingException; |
| import java.nio.charset.Charset; |
| import java.nio.charset.CharsetDecoder; |
| import java.nio.charset.CharsetEncoder; |
| import java.nio.charset.CoderResult; |
| import java.nio.charset.CodingErrorAction; |
| import java.nio.charset.MalformedInputException; |
| import java.nio.charset.UnmappableCharacterException; |
| import java.nio.charset.UnsupportedCharsetException; |
| import java.util.Arrays; |
| |
| import junit.framework.TestCase; |
| |
| @TestTargetClass(CharsetEncoder.class) |
| |
| /** |
| * Super class for concrete charset test suites. |
| */ |
| public class AbstractCharsetEncoderTestCase extends TestCase { |
| |
| Charset cs; |
| |
| // Target encoder (tobj): |
| CharsetEncoder encoder; |
| |
| static final String unistr = " buffer";// \u8000\u8001\u00a5\u3000\r\n"; |
| |
| byte[] unibytes = new byte[] { 32, 98, 117, 102, 102, 101, 114 }; |
| |
| |
| // default for Charset abstract class |
| byte[] defaultReplacement = new byte[] { 63 }; |
| |
| // specific for Charset implementation subclass |
| byte[] specifiedReplacement = new byte[] { 26 }; |
| |
| byte[] unibytesWithRep = null; |
| |
| byte[] surrogate = new byte[0]; |
| |
| |
| protected void setUp() throws Exception { |
| super.setUp(); |
| encoder = cs.newEncoder(); |
| if (null == unibytesWithRep) { |
| byte[] replacement = encoder.replacement(); |
| unibytesWithRep = new byte[replacement.length + unibytes.length]; |
| System.arraycopy(replacement, 0, unibytesWithRep, 0, |
| replacement.length); |
| System.arraycopy(unibytes, 0, unibytesWithRep, replacement.length, |
| unibytes.length); |
| } |
| } |
| |
| protected void tearDown() throws Exception { |
| super.tearDown(); |
| } |
| |
| |
| /* |
| * Class under test for boolean canEncode(char) |
| */ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {char.class} |
| ) |
| public void testCanEncodechar() throws CharacterCodingException { |
| // for non-mapped char |
| assertTrue(encoder.canEncode('\uc2c0')); |
| // surrogate char for unicode |
| // 1st byte: d800-dbff |
| // 2nd byte: dc00-dfff |
| assertTrue(encoder.canEncode('\ud800')); |
| // valid surrogate pair |
| assertTrue(encoder.canEncode('\udc00')); |
| } |
| |
| /*----------------------------------------- |
| * Class under test for illegal state case |
| * methods which can change internal states are two encode, flush, two canEncode, reset |
| * ----------------------------------------- |
| */ |
| |
| // Normal case: just after reset, and it also means reset can be done |
| // anywhere |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {char.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {java.lang.CharSequence.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class, java.nio.ByteBuffer.class, boolean.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "reset", |
| args = {} |
| ) |
| }) |
| public void testResetIllegalState() throws CharacterCodingException { |
| assertSame(encoder, encoder.reset()); |
| encoder.canEncode('\ud901'); |
| assertSame(encoder, encoder.reset()); |
| encoder.canEncode("\ud901\udc00"); |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("aaa")); |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("aaa"), ByteBuffer.allocate(3), false); |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("aaa"), ByteBuffer.allocate(3), true); |
| assertSame(encoder, encoder.reset()); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "reset", |
| args = {} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "flush", |
| args = {java.nio.ByteBuffer.class} |
| ) |
| }) |
| public void testFlushIllegalState() throws CharacterCodingException { |
| CharBuffer in = CharBuffer.wrap("aaa"); |
| ByteBuffer out = ByteBuffer.allocate(5); |
| |
| // Normal case: after encode with endOfInput is true |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(in, out, true); |
| out.rewind(); |
| CoderResult result = encoder.flush(out); |
| |
| // Illegal state: flush twice |
| try { |
| encoder.flush(out); |
| fail("should throw IllegalStateException"); |
| } catch (IllegalStateException e) { |
| } |
| |
| // Illegal state: flush after encode with endOfInput is false |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(in, out, false); |
| try { |
| encoder.flush(out); |
| fail("should throw IllegalStateException"); |
| } catch (IllegalStateException e) { |
| } |
| } |
| |
| // test illegal states for encode facade |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {char.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {java.lang.CharSequence.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class, java.nio.ByteBuffer.class, boolean.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "flush", |
| args = {java.nio.ByteBuffer.class} |
| ) |
| }) |
| public void testEncodeFacadeIllegalState() throws CharacterCodingException { |
| // encode facade can be execute in anywhere |
| CharBuffer in = CharBuffer.wrap("aaa"); |
| // Normal case: just created |
| encoder.encode(in); |
| in.rewind(); |
| |
| // Normal case: just after encode facade |
| encoder.encode(in); |
| in.rewind(); |
| |
| // Normal case: just after canEncode |
| assertSame(encoder, encoder.reset()); |
| encoder.canEncode("\ud902\udc00"); |
| encoder.encode(in); |
| in.rewind(); |
| assertSame(encoder, encoder.reset()); |
| encoder.canEncode('\ud902'); |
| encoder.encode(in); |
| in.rewind(); |
| |
| // Normal case: just after encode with that endOfInput is true |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"), |
| ByteBuffer.allocate(30), true); |
| encoder.encode(in); |
| in.rewind(); |
| |
| // Normal case:just after encode with that endOfInput is false |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"), |
| ByteBuffer.allocate(30), false); |
| encoder.encode(in); |
| in.rewind(); |
| |
| // Normal case: just after flush |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"), |
| ByteBuffer.allocate(30), true); |
| encoder.flush(ByteBuffer.allocate(10)); |
| encoder.encode(in); |
| in.rewind(); |
| } |
| |
| // test illegal states for two encode method with endOfInput is true |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class, java.nio.ByteBuffer.class, boolean.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {char.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {java.lang.CharSequence.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "reset", |
| args = {} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "flush", |
| args = {java.nio.ByteBuffer.class} |
| ) |
| }) |
| public void testEncodeTrueIllegalState() throws CharacterCodingException { |
| CharBuffer in = CharBuffer.wrap("aaa"); |
| ByteBuffer out = ByteBuffer.allocate(5); |
| // Normal case: just created |
| encoder.encode(in, out, true); |
| in.rewind(); |
| out.rewind(); |
| |
| in.rewind(); |
| out.rewind(); |
| |
| // Normal case: just after encode with that endOfInput is true |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"), |
| ByteBuffer.allocate(30), true); |
| encoder.encode(in, out, true); |
| in.rewind(); |
| out.rewind(); |
| |
| // Normal case:just after encode with that endOfInput is false |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"), |
| ByteBuffer.allocate(30), false); |
| encoder.encode(in, out, true); |
| in.rewind(); |
| out.rewind(); |
| |
| // Illegal state: just after flush |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"), |
| ByteBuffer.allocate(30), true); |
| encoder.flush(ByteBuffer.allocate(10)); |
| try { |
| encoder.encode(in, out, true); |
| fail("should illegal state"); |
| } catch (IllegalStateException e) { |
| } |
| |
| // Normal case: after canEncode |
| assertSame(encoder, encoder.reset()); |
| encoder.canEncode("\ud906\udc00"); |
| encoder.encode(in, out, true); |
| in.rewind(); |
| out.rewind(); |
| assertSame(encoder, encoder.reset()); |
| encoder.canEncode('\ud905'); |
| encoder.encode(in, out, true); |
| } |
| |
| // test illegal states for two encode method with endOfInput is false |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class, java.nio.ByteBuffer.class, boolean.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {char.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {java.lang.CharSequence.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "reset", |
| args = {} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "flush", |
| args = {java.nio.ByteBuffer.class} |
| ) |
| }) |
| public void testEncodeFalseIllegalState() throws CharacterCodingException { |
| CharBuffer in = CharBuffer.wrap("aaa"); |
| ByteBuffer out = ByteBuffer.allocate(5); |
| // Normal case: just created |
| encoder.encode(in, out, false); |
| in.rewind(); |
| out.rewind(); |
| |
| // Illegal state: just after encode facade |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState1")); |
| try { |
| encoder.encode(in, out, false); |
| fail("should illegal state"); |
| } catch (IllegalStateException e) { |
| } |
| |
| // Illegal state: just after encode with that endOfInput is true |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"), |
| ByteBuffer.allocate(30), true); |
| try { |
| encoder.encode(in, out, false); |
| fail("should illegal state"); |
| } catch (IllegalStateException e) { |
| } |
| |
| // Normal case:just after encode with that endOfInput is false |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"), |
| ByteBuffer.allocate(30), false); |
| encoder.encode(in, out, false); |
| in.rewind(); |
| out.rewind(); |
| |
| // Illegal state: just after flush |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"), |
| ByteBuffer.allocate(30), true); |
| encoder.flush(ByteBuffer.allocate(10)); |
| try { |
| encoder.encode(in, out, false); |
| fail("should illegal state"); |
| } catch (IllegalStateException e) { |
| } |
| |
| // Normal case: after canEncode |
| assertSame(encoder, encoder.reset()); |
| encoder.canEncode("\ud906\udc00"); |
| encoder.encode(in, out, false); |
| in.rewind(); |
| out.rewind(); |
| assertSame(encoder, encoder.reset()); |
| encoder.canEncode('\ud905'); |
| encoder.encode(in, out, false); |
| } |
| |
| // test illegal states for two canEncode methods |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {char.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {java.lang.CharSequence.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "reset", |
| args = {} |
| ), |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "flush", |
| args = {java.nio.ByteBuffer.class} |
| ) |
| }) |
| public void testCanEncodeIllegalState() throws CharacterCodingException { |
| // Normal case: just created |
| encoder.canEncode("\ud900\udc00"); |
| encoder.canEncode('\ud900'); |
| |
| // Illegal state: just after encode with that endOfInput is true |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState2"), |
| ByteBuffer.allocate(30), true); |
| try { |
| encoder.canEncode("\ud903\udc00"); |
| fail("should throw illegal state exception"); |
| } catch (IllegalStateException e) { |
| } |
| |
| // Illegal state:just after encode with that endOfInput is false |
| assertSame(encoder, encoder.reset()); |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState3"), |
| ByteBuffer.allocate(30), false); |
| try { |
| encoder.canEncode("\ud904\udc00"); |
| fail("should throw illegal state exception"); |
| } catch (IllegalStateException e) { |
| } |
| |
| // Normal case: just after flush |
| encoder.encode(CharBuffer.wrap("testCanEncodeIllegalState4"), |
| ByteBuffer.allocate(30), true); |
| encoder.flush(ByteBuffer.allocate(10)); |
| encoder.canEncode("\ud905\udc00"); |
| encoder.canEncode('\ud906'); |
| |
| // Normal case: after reset again |
| assertSame(encoder, encoder.reset()); |
| encoder.canEncode("\ud906\udc00"); |
| encoder.canEncode('\ud905'); |
| } |
| |
| /* |
| * --------------------------------- illegal state test end |
| * --------------------------------- |
| */ |
| |
| /* |
| * Class under test for boolean canEncode(CharSequence) |
| */ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "canEncode", |
| args = {java.lang.CharSequence.class} |
| ) |
| public void testCanEncodeCharSequence() { |
| // for non-mapped char |
| assertTrue(encoder.canEncode("\uc2c0")); |
| // surrogate char for unicode |
| // 1st byte: d800-dbff |
| // 2nd byte: dc00-dfff |
| assertTrue(encoder.canEncode("\ud800")); |
| // valid surrogate pair |
| assertTrue(encoder.canEncode("\ud800\udc00")); |
| // invalid surrogate pair |
| assertTrue(encoder.canEncode("\ud800\udb00")); |
| } |
| |
| |
| |
| /* |
| * Class under test for ByteBuffer encode(CharBuffer) |
| */ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class} |
| ) |
| public void testEncodeCharBuffer() throws CharacterCodingException { |
| // Null pointer |
| try { |
| encoder.encode(null); |
| fail("should throw null pointer exception"); |
| } catch (NullPointerException e) { |
| } |
| |
| // empty input buffer |
| ByteBuffer out = encoder.encode(CharBuffer.wrap("")); |
| assertEquals(out.position(), 0); |
| assertByteArray(out, new byte[0]); |
| // assertByteArray(out, surrogate); |
| |
| // normal case |
| out = encoder.encode(CharBuffer.wrap(unistr)); |
| assertEquals(out.position(), 0); |
| assertByteArray(out, addSurrogate(unibytes)); |
| |
| // Regression test for harmony-3378 |
| Charset cs = Charset.forName("UTF-8"); |
| CharsetEncoder encoder = cs.newEncoder(); |
| encoder.onMalformedInput(CodingErrorAction.REPLACE); |
| encoder = encoder.replaceWith(new byte[] { (byte) 0xef, (byte) 0xbf, |
| (byte) 0xbd, }); |
| CharBuffer in = CharBuffer.wrap("\ud800"); |
| out = encoder.encode(in); |
| assertNotNull(out); |
| } |
| |
| private byte[] addSurrogate(byte[] expected) { |
| if (surrogate.length > 0) { |
| byte[] temp = new byte[surrogate.length + expected.length]; |
| System.arraycopy(surrogate, 0, temp, 0, surrogate.length); |
| System.arraycopy(expected, 0, temp, surrogate.length, |
| expected.length); |
| expected = temp; |
| } |
| return expected; |
| } |
| |
| /** |
| * @return |
| */ |
| protected byte[] getEmptyByteArray() { |
| return new byte[0]; |
| } |
| |
| CharBuffer getMalformedCharBuffer() { |
| return CharBuffer.wrap("malform buffer"); |
| } |
| |
| CharBuffer getUnmapCharBuffer() { |
| return CharBuffer.wrap("unmap buffer"); |
| } |
| |
| CharBuffer getExceptionCharBuffer() { |
| return CharBuffer.wrap("runtime buffer"); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class} |
| ) |
| public void testEncodeCharBufferException() throws CharacterCodingException { |
| ByteBuffer out; |
| CharBuffer in; |
| // MalformedException: |
| in = getMalformedCharBuffer(); |
| encoder.onMalformedInput(CodingErrorAction.REPORT); |
| encoder.onUnmappableCharacter(CodingErrorAction.REPORT); |
| if (in != null) { |
| try { |
| // regression test for Harmony-1379 |
| encoder.encode(in); |
| fail("should throw MalformedInputException"); |
| } catch (MalformedInputException e) { |
| } |
| |
| encoder.reset(); |
| in.rewind(); |
| encoder.onMalformedInput(CodingErrorAction.IGNORE); |
| out = encoder.encode(in); |
| assertByteArray(out, addSurrogate(unibytes)); |
| |
| encoder.reset(); |
| in.rewind(); |
| encoder.onMalformedInput(CodingErrorAction.REPLACE); |
| out = encoder.encode(in); |
| assertByteArray(out, addSurrogate(unibytesWithRep)); |
| } |
| |
| // Unmapped Exception: |
| in = getUnmapCharBuffer(); |
| encoder.onMalformedInput(CodingErrorAction.REPORT); |
| encoder.onUnmappableCharacter(CodingErrorAction.REPORT); |
| if (in != null) { |
| encoder.reset(); |
| try { |
| encoder.encode(in); |
| fail("should throw UnmappableCharacterException"); |
| } catch (UnmappableCharacterException e) { |
| } |
| |
| encoder.reset(); |
| in.rewind(); |
| encoder.onUnmappableCharacter(CodingErrorAction.IGNORE); |
| out = encoder.encode(in); |
| assertByteArray(out, unibytes); |
| |
| encoder.reset(); |
| in.rewind(); |
| encoder.onUnmappableCharacter(CodingErrorAction.REPLACE); |
| out = encoder.encode(in); |
| assertByteArray(out, unibytesWithRep); |
| } |
| |
| // RuntimeException |
| try { |
| encoder.encode(getExceptionCharBuffer()); |
| fail("should throw runtime exception"); |
| } catch (RuntimeException e) { |
| } |
| } |
| |
| /* |
| * utility method, extract given bytebuffer to a string and compare with |
| * give string |
| */ |
| void assertByteArray(ByteBuffer out, byte[] expected) { |
| out = out.duplicate(); |
| if (out.position() != 0) { |
| out.flip(); |
| } |
| byte[] ba = new byte[out.limit() - out.position()]; |
| out.get(ba); |
| // byte[] ba = out.array(); |
| assertTrue(Arrays.equals(ba, expected)); |
| } |
| |
| /* |
| * Class under test for CoderResult encode(CharBuffer, ByteBuffer, boolean) |
| */ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class, java.nio.ByteBuffer.class, boolean.class} |
| ) |
| public void testEncodeCharBufferByteBufferboolean() |
| throws CharacterCodingException { |
| ByteBuffer out = ByteBuffer.allocate(200); |
| CharBuffer in = CharBuffer.wrap(unistr); |
| // Null pointer |
| try { |
| encoder.encode(null, out, true); |
| fail("should throw null pointer exception"); |
| } catch (NullPointerException e) { |
| } |
| try { |
| encoder.encode(in, null, true); |
| fail("should throw null pointer exception"); |
| } catch (NullPointerException e) { |
| } |
| |
| // normal case, one complete operation |
| assertSame(encoder, encoder.reset()); |
| in.rewind(); |
| out.rewind(); |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true)); |
| assertEquals(out.limit(), 200); |
| assertTrue(out.position() > 0); |
| assertTrue(out.remaining() > 0); |
| assertEquals(out.capacity(), 200); |
| assertByteArray(out, addSurrogate(unibytes)); |
| in.rewind(); |
| |
| encoder.flush(out); |
| |
| // normal case, one complete operation, but call twice, first time set |
| // endOfInput to false |
| assertSame(encoder, encoder.reset()); |
| in.rewind(); |
| out = ByteBuffer.allocate(200); |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, false)); |
| assertEquals(out.limit(), 200); |
| assertTrue(out.position() > 0); |
| assertTrue(out.remaining() > 0); |
| assertEquals(out.capacity(), 200); |
| assertByteArray(out, addSurrogate(unibytes)); |
| |
| in.rewind(); |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, false)); |
| in.rewind(); |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true)); |
| assertEquals(out.limit(), 200); |
| assertTrue(out.position() > 0); |
| assertTrue(out.remaining() > 0); |
| assertEquals(out.capacity(), 200); |
| |
| assertByteArray(out, addSurrogate(duplicateByteArray(unibytes, 3))); |
| |
| // overflow |
| out = ByteBuffer.allocate(4); |
| assertSame(encoder, encoder.reset()); |
| in.rewind(); |
| out.rewind(); |
| assertSame(CoderResult.OVERFLOW, encoder.encode(in, out, true)); |
| assertEquals(out.limit(), 4); |
| assertEquals(out.position(), 4); |
| assertEquals(out.remaining(), 0); |
| assertEquals(out.capacity(), 4); |
| ByteBuffer temp = ByteBuffer.allocate(200); |
| out.flip(); |
| temp.put(out); |
| out = temp; |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true)); |
| assertEquals(out.limit(), 200); |
| assertTrue(out.position() > 0); |
| assertTrue(out.remaining() > 0); |
| assertEquals(out.capacity(), 200); |
| assertByteArray(out, addSurrogate(unibytes)); |
| |
| assertSame(encoder, encoder.reset()); |
| in.rewind(); |
| out = ByteBuffer.allocate(4); |
| assertSame(CoderResult.OVERFLOW, encoder.encode(in, out, false)); |
| assertEquals(out.limit(), 4); |
| assertEquals(out.position(), 4); |
| assertEquals(out.remaining(), 0); |
| assertEquals(out.capacity(), 4); |
| temp = ByteBuffer.allocate(200); |
| out.flip(); |
| temp.put(out); |
| out = temp; |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, false)); |
| assertEquals(out.limit(), 200); |
| assertTrue(out.position() > 0); |
| assertTrue(out.remaining() > 0); |
| assertEquals(out.capacity(), 200); |
| assertByteArray(out, addSurrogate(unibytes)); |
| } |
| |
| void printByteBuffer(ByteBuffer buffer) { |
| System.out.println("print buffer"); |
| if (buffer.position() != 0) { |
| buffer.flip(); |
| } |
| byte[] ba = buffer.array(); |
| for (int i = 0; i < ba.length; i++) { |
| System.out.println(Integer.toHexString(ba[i])); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class, java.nio.ByteBuffer.class, boolean.class} |
| ) |
| public void testEncodeCharBufferByteBufferbooleanExceptionFalse() |
| throws CharacterCodingException { |
| implTestEncodeCharBufferByteBufferbooleanException(false); |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class, java.nio.ByteBuffer.class, boolean.class} |
| ) |
| public void testEncodeCharBufferByteBufferbooleanExceptionTrue() |
| throws CharacterCodingException { |
| implTestEncodeCharBufferByteBufferbooleanException(true); |
| } |
| |
| private byte[] duplicateByteArray(byte[] ba, int times) { |
| byte[] result = new byte[ba.length * times]; |
| for (int i = 0; i < times; i++) { |
| System.arraycopy(ba, 0, result, i * ba.length, ba.length); |
| } |
| return result; |
| } |
| |
| protected void implTestEncodeCharBufferByteBufferbooleanException( |
| boolean endOfInput) throws CharacterCodingException { |
| ByteBuffer out = ByteBuffer.allocate(100); |
| |
| // MalformedException: |
| CharBuffer in = getMalformedCharBuffer(); |
| encoder.onMalformedInput(CodingErrorAction.REPORT); |
| encoder.onUnmappableCharacter(CodingErrorAction.REPORT); |
| if (in != null) { |
| encoder.reset(); |
| CoderResult r = encoder.encode(in, out, endOfInput); |
| assertTrue(r.isMalformed()); |
| |
| encoder.reset(); |
| out.clear(); |
| in.rewind(); |
| encoder.onMalformedInput(CodingErrorAction.IGNORE); |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, |
| endOfInput)); |
| assertCodingErrorAction(endOfInput, out, in, unibytes); |
| |
| encoder.reset(); |
| out.clear(); |
| in.rewind(); |
| encoder.onMalformedInput(CodingErrorAction.REPLACE); |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, |
| endOfInput)); |
| assertCodingErrorAction(endOfInput, out, in, unibytesWithRep); |
| } else { |
| // System.out.println("Cannot find malformed char buffer for " |
| // + cs.name()); |
| } |
| |
| // Unmapped Exception: |
| in = getUnmapCharBuffer(); |
| encoder.onMalformedInput(CodingErrorAction.REPORT); |
| encoder.onUnmappableCharacter(CodingErrorAction.REPORT); |
| if (in != null) { |
| encoder.reset(); |
| out.clear(); |
| assertTrue(encoder.encode(in, out, endOfInput).isUnmappable()); |
| |
| encoder.reset(); |
| out.clear(); |
| in.rewind(); |
| encoder.onUnmappableCharacter(CodingErrorAction.IGNORE); |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, |
| endOfInput)); |
| assertCodingErrorAction(endOfInput, out, in, unibytes); |
| |
| encoder.reset(); |
| out.clear(); |
| in.rewind(); |
| encoder.onUnmappableCharacter(CodingErrorAction.REPLACE); |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, |
| endOfInput)); |
| assertCodingErrorAction(endOfInput, out, in, unibytesWithRep); |
| } else { |
| // System.out.println("Cannot find unmapped char buffer for " |
| // + cs.name()); |
| } |
| |
| // RuntimeException |
| try { |
| encoder.encode(getExceptionCharBuffer()); |
| fail("should throw runtime exception"); |
| } catch (RuntimeException e) { |
| } |
| } |
| |
| private void assertCodingErrorAction(boolean endOfInput, ByteBuffer out, |
| CharBuffer in, byte[] expect) { |
| if (endOfInput) { |
| assertByteArray(out, addSurrogate(expect)); |
| } else { |
| in.rewind(); |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, |
| endOfInput)); |
| in.rewind(); |
| assertSame(CoderResult.UNDERFLOW, encoder.encode(in, out, true)); |
| assertByteArray(out, addSurrogate(duplicateByteArray(expect, 3))); |
| } |
| } |
| |
| /* |
| * Class under test for CoderResult flush(ByteBuffer) |
| */ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "encode", |
| args = {java.nio.CharBuffer.class, java.nio.ByteBuffer.class, boolean.class} |
| ) |
| public void testFlush() throws CharacterCodingException { |
| ByteBuffer out = ByteBuffer.allocate(6); |
| CharBuffer in = CharBuffer.wrap("aaa"); |
| assertEquals(in.remaining(), 3); |
| |
| // by encode facade, so that internal state will be wrong |
| encoder.encode(CharBuffer.wrap("testFlush"), ByteBuffer.allocate(20), |
| true); |
| assertSame(CoderResult.UNDERFLOW, encoder |
| .flush(ByteBuffer.allocate(50))); |
| } |
| |
| /* |
| * test isLegalReplacement(byte[]) |
| */ |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "isLegalReplacement", |
| args = {byte[].class} |
| ) |
| public void testIsLegalReplacement() { |
| try { |
| encoder.isLegalReplacement(null); |
| fail("should throw null pointer exception"); |
| } catch (NullPointerException e) { |
| } |
| assertTrue(encoder.isLegalReplacement(specifiedReplacement)); |
| |
| assertTrue(encoder.isLegalReplacement(new byte[200])); |
| byte[] ba = getIllegalByteArray(); |
| if (ba != null) { |
| assertFalse(encoder.isLegalReplacement(ba)); |
| } |
| } |
| |
| @TestTargetNew( |
| level = TestLevel.PARTIAL_COMPLETE, |
| method = "isLegalReplacement", |
| args = {byte[].class} |
| ) |
| public void testIsLegalReplacementEmptyArray() { |
| // ISO, ASC, GB, UTF8 encoder will throw exception in RI |
| // others will pass |
| // try { |
| assertTrue(encoder.isLegalReplacement(new byte[0])); |
| // fail("should throw ArrayIndexOutOfBoundsException"); |
| // } catch (ArrayIndexOutOfBoundsException e) { |
| // } |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "onMalformedInput", |
| args = {java.nio.charset.CodingErrorAction.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "malformedInputAction", |
| args = {} |
| ) |
| }) |
| public void testOnMalformedInput() { |
| assertSame(CodingErrorAction.REPORT, encoder.malformedInputAction()); |
| try { |
| encoder.onMalformedInput(null); |
| fail("should throw null pointer exception"); |
| } catch (IllegalArgumentException e) { |
| } |
| encoder.onMalformedInput(CodingErrorAction.IGNORE); |
| assertSame(CodingErrorAction.IGNORE, encoder.malformedInputAction()); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "onUnmappableCharacter", |
| args = {java.nio.charset.CodingErrorAction.class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "unmappableCharacterAction", |
| args = {} |
| ) |
| }) |
| public void testOnUnmappableCharacter() { |
| assertSame(CodingErrorAction.REPORT, encoder |
| .unmappableCharacterAction()); |
| try { |
| encoder.onUnmappableCharacter(null); |
| fail("should throw null pointer exception"); |
| } catch (IllegalArgumentException e) { |
| } |
| encoder.onUnmappableCharacter(CodingErrorAction.IGNORE); |
| assertSame(CodingErrorAction.IGNORE, encoder |
| .unmappableCharacterAction()); |
| } |
| |
| @TestTargets({ |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "replaceWith", |
| args = {byte[].class} |
| ), |
| @TestTargetNew( |
| level = TestLevel.COMPLETE, |
| method = "replacement", |
| args = {} |
| ) |
| }) |
| public void testReplacement() { |
| try { |
| encoder.replaceWith(null); |
| fail("should throw null pointer exception"); |
| } catch (IllegalArgumentException e) { |
| } |
| try { |
| encoder.replaceWith(new byte[0]); |
| fail("should throw null pointer exception"); |
| } catch (IllegalArgumentException e) { |
| } |
| try { |
| encoder.replaceWith(new byte[100]); |
| fail("should throw null pointer exception"); |
| } catch (IllegalArgumentException e) { |
| } |
| |
| byte[] nr = getLegalByteArray(); |
| assertSame(encoder, encoder.replaceWith(nr)); |
| assertSame(nr, encoder.replacement()); |
| |
| nr = getIllegalByteArray(); |
| try { |
| encoder.replaceWith(new byte[100]); |
| fail("should throw null pointer exception"); |
| } catch (IllegalArgumentException e) { |
| } |
| } |
| |
| protected byte[] getLegalByteArray() { |
| return new byte[] { 'a' }; |
| } |
| |
| protected byte[] getIllegalByteArray() { |
| return new byte[155]; |
| } |
| |
| } |