blob: 666a44e030e6f3eef46c0f3648564e4ae546f93c [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed 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 libcore.java.io;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.UTFDataFormatException;
import java.util.Arrays;
import junit.framework.TestCase;
public final class DataOutputStreamTest extends TestCase {
private ByteArrayOutputStream bytes = new ByteArrayOutputStream();
private DataOutputStream os = new DataOutputStream(bytes);
public void test_writeBoolean() throws Exception {
os.writeBoolean(true);
os.writeBoolean(false);
assertEquals("[01, 00]", toHexString(bytes.toByteArray()));
}
public void test_writeByte() throws Exception {
os.writeByte(-1);
os.writeByte(0);
os.writeByte(1);
os.writeByte(129);
// writeByte takes only the bottom byte from its int parameter.
os.writeByte(0x1234);
assertEquals("[ff, 00, 01, 81, 34]", toHexString(bytes.toByteArray()));
}
public void test_writeBytes() throws Exception {
// writeBytes takes only the bottom byte from each character.
os.writeBytes("0\u12341");
assertEquals("[30, 34, 31]", toHexString(bytes.toByteArray()));
}
public void test_writeChar() throws Exception {
// writeChar writes two-byte big-endian characters.
os.writeChar('0');
os.writeChar(0x1234);
assertEquals("[00, 30, 12, 34]", toHexString(bytes.toByteArray()));
}
public void test_writeChars() throws Exception {
// writeChars writes two-byte big-endian characters.
os.writeChars("0\u12341");
assertEquals("[00, 30, 12, 34, 00, 31]", toHexString(bytes.toByteArray()));
}
public void test_writeDouble() throws Exception {
os.writeDouble(Double.longBitsToDouble(0x0123456789abcdefL));
assertEquals("[01, 23, 45, 67, 89, ab, cd, ef]", toHexString(bytes.toByteArray()));
}
public void test_writeFloat() throws Exception {
os.writeFloat(Float.intBitsToFloat(0x01234567));
assertEquals("[01, 23, 45, 67]", toHexString(bytes.toByteArray()));
}
public void test_writeInt() throws Exception {
os.writeInt(0x01234567);
assertEquals("[01, 23, 45, 67]", toHexString(bytes.toByteArray()));
}
public void test_writeLong() throws Exception {
os.writeLong(0x0123456789abcdefL);
assertEquals("[01, 23, 45, 67, 89, ab, cd, ef]", toHexString(bytes.toByteArray()));
}
public void test_writeShort() throws Exception {
// writeShort only writes the bottommost 16 bits of its int parameter.
os.writeShort(0x01234567);
assertEquals("[45, 67]", toHexString(bytes.toByteArray()));
}
public void test_writeUTF() throws Exception {
// The limit is 65535 *bytes* but we want to test 2- and 3-byte characters too.
char[] chars = new char[65535 - 1 - 2];
Arrays.fill(chars, 0, chars.length, 'a');
chars[0] = '\u0666'; // a two-byte character
chars[1] = '\u2603'; // a three-byte character
String maxLength = new String(chars);
os.writeUTF(maxLength);
byte[] expected = new byte[2 + 65535];
expected[0] = (byte) 0xff;
expected[1] = (byte) 0xff;
// U+0666 = 0xD9 0xA6
expected[2] = (byte) 0xd9;
expected[3] = (byte) 0xa6;
// U+2603 = 0xE2 0x98 0x83
expected[4] = (byte) 0xe2;
expected[5] = (byte) 0x98;
expected[6] = (byte) 0x83;
Arrays.fill(expected, 7, expected.length, (byte) 'a');
assertEquals(Arrays.toString(expected), Arrays.toString(bytes.toByteArray()));
}
public void test_writeUTF_NUL() throws Exception {
// This is a special case, represented with two non-zero bytes.
os.writeUTF("\u0000");
assertEquals("[00, 02, c0, 80]", toHexString(bytes.toByteArray()));
}
public void test_writeUTF_too_long() throws Exception {
String tooLong = new String(new char[65536]);
try {
os.writeUTF(tooLong);
fail("should throw UTFDataFormatException");
} catch (UTFDataFormatException expected) {
}
assertEquals("[]", toHexString(bytes.toByteArray()));
}
/**
* Returns a string representation of a byte array that's more useful for debugging.
* TODO: move this somewhere where it's available to all tests.
*/
public static String toHexString(byte[] array) {
if (array == null) {
return null;
}
if (array.length == 0) {
return "[]";
}
StringBuilder sb = new StringBuilder();
sb.append('[');
// TODO: don't use String.format if we put this in the library. Too expensive!
sb.append(String.format("%02x", array[0] & 0xff));
for (int i = 1; i < array.length; i++) {
sb.append(", ");
sb.append(String.format("%02x", array[i] & 0xff));
}
sb.append(']');
return sb.toString();
}
}