11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.io;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.primitives.Bytes;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.ByteArrayInputStream;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.ByteArrayOutputStream;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.DataInput;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.DataOutputStream;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.EOFException;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.IOException;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Test class for {@link LittleEndianDataInputStream}.
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Chris Nokleberg
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class LittleEndianDataInputStreamTest extends TestCase {
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private byte[] data;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected void setUp() throws Exception {
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    super.setUp();
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ByteArrayOutputStream baos = new ByteArrayOutputStream();
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    DataOutputStream out = new DataOutputStream(baos);
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    initializeData(out);
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    data = baos.toByteArray();
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void initializeData(DataOutputStream out) throws IOException {
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Write out various test values NORMALLY */
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.write(new byte[] { -100, 100 });
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeBoolean(true);
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeBoolean(false);
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeByte(100);
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeByte(-100);
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeByte((byte) 200);
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeChar('a');
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeShort((short) -30000);
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeShort((short) 50000);
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeInt(0xCAFEBABE);
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeLong(0xDEADBEEFCAFEBABEL);
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeUTF("Herby Derby");
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeFloat(Float.intBitsToFloat(0xCAFEBABE));
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.writeDouble(Double.longBitsToDouble(0xDEADBEEFCAFEBABEL));
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReadFully() throws IOException {
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data));
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    byte[] b = new byte[data.length];
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    in.readFully(b);
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Bytes.asList(data), Bytes.asList(b));
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReadUnsignedByte_eof() throws IOException {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(new byte[0]));
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      in.readUnsignedByte();
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (EOFException expected) {
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReadUnsignedShort_eof() throws IOException {
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    byte[] buf = {23};
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(buf));
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      in.readUnsignedShort();
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (EOFException expected) {}
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReadLine() throws IOException {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data));
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      in.readLine();
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("readLine is not supported", expected.getMessage());
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReadLittleEndian() throws IOException {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data));
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Read in various values in LITTLE ENDIAN FORMAT */
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    byte[] b = new byte[2];
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    in.readFully(b);
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-100, b[0]);
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(100, b[1]);
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(true, in.readBoolean());
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(false, in.readBoolean());
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(100, in.readByte());
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-100, in.readByte());
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(200, in.readUnsignedByte());
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals('\u6100', in.readChar());
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-12150, in.readShort());
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(20675, in.readUnsignedShort());
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0xBEBAFECA, in.readInt());
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0xBEBAFECAEFBEADDEL, in.readLong());
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("Herby Derby", in.readUTF());
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0xBEBAFECA, Float.floatToIntBits(in.readFloat()));
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0xBEBAFECAEFBEADDEL, Double.doubleToLongBits(in.readDouble()));
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkipBytes() throws IOException {
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ByteArrayOutputStream baos = new ByteArrayOutputStream();
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    DataOutputStream out = new DataOutputStream(baos);
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Write out various test values NORMALLY */
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    out.write(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}); // 10 bytes of junk to skip
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    initializeData(out);
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    byte[] data = baos.toByteArray();
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data));
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int bytesSkipped = 0;
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    while (bytesSkipped < 10) {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      bytesSkipped += in.skipBytes(10 - bytesSkipped);
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* Read in various values in LITTLE ENDIAN FORMAT */
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    byte[] b = new byte[2];
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    in.readFully(b);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-100, b[0]);
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(100, b[1]);
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(in.readBoolean());
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(in.readBoolean());
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
152