1/*
2 * Copyright (C) 2007 The Guava Authors
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.google.common.io;
18
19import com.google.common.primitives.Bytes;
20
21import junit.framework.TestCase;
22
23import java.io.ByteArrayInputStream;
24import java.io.ByteArrayOutputStream;
25import java.io.DataInput;
26import java.io.DataOutputStream;
27import java.io.EOFException;
28import java.io.IOException;
29
30/**
31 * Test class for {@link LittleEndianDataInputStream}.
32 *
33 * @author Chris Nokleberg
34 */
35public class LittleEndianDataInputStreamTest extends TestCase {
36
37  private byte[] data;
38
39  @Override
40  protected void setUp() throws Exception {
41    super.setUp();
42
43    ByteArrayOutputStream baos = new ByteArrayOutputStream();
44    DataOutputStream out = new DataOutputStream(baos);
45
46    initializeData(out);
47
48    data = baos.toByteArray();
49  }
50
51  private void initializeData(DataOutputStream out) throws IOException {
52    /* Write out various test values NORMALLY */
53    out.write(new byte[] { -100, 100 });
54    out.writeBoolean(true);
55    out.writeBoolean(false);
56    out.writeByte(100);
57    out.writeByte(-100);
58    out.writeByte((byte) 200);
59    out.writeChar('a');
60    out.writeShort((short) -30000);
61    out.writeShort((short) 50000);
62    out.writeInt(0xCAFEBABE);
63    out.writeLong(0xDEADBEEFCAFEBABEL);
64    out.writeUTF("Herby Derby");
65    out.writeFloat(Float.intBitsToFloat(0xCAFEBABE));
66    out.writeDouble(Double.longBitsToDouble(0xDEADBEEFCAFEBABEL));
67  }
68
69  public void testReadFully() throws IOException {
70    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data));
71    byte[] b = new byte[data.length];
72    in.readFully(b);
73    assertEquals(Bytes.asList(data), Bytes.asList(b));
74  }
75
76  public void testReadUnsignedByte_eof() throws IOException {
77    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(new byte[0]));
78    try {
79      in.readUnsignedByte();
80      fail();
81    } catch (EOFException expected) {
82    }
83  }
84
85  public void testReadUnsignedShort_eof() throws IOException {
86    byte[] buf = {23};
87    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(buf));
88    try {
89      in.readUnsignedShort();
90      fail();
91    } catch (EOFException expected) {}
92  }
93
94  public void testReadLine() throws IOException {
95    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data));
96    try {
97      in.readLine();
98      fail();
99    } catch (UnsupportedOperationException expected) {
100      assertEquals("readLine is not supported", expected.getMessage());
101    }
102  }
103
104  public void testReadLittleEndian() throws IOException {
105    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data));
106
107    /* Read in various values in LITTLE ENDIAN FORMAT */
108    byte[] b = new byte[2];
109    in.readFully(b);
110    assertEquals(-100, b[0]);
111    assertEquals(100, b[1]);
112    assertEquals(true, in.readBoolean());
113    assertEquals(false, in.readBoolean());
114    assertEquals(100, in.readByte());
115    assertEquals(-100, in.readByte());
116    assertEquals(200, in.readUnsignedByte());
117    assertEquals('\u6100', in.readChar());
118    assertEquals(-12150, in.readShort());
119    assertEquals(20675, in.readUnsignedShort());
120    assertEquals(0xBEBAFECA, in.readInt());
121    assertEquals(0xBEBAFECAEFBEADDEL, in.readLong());
122    assertEquals("Herby Derby", in.readUTF());
123    assertEquals(0xBEBAFECA, Float.floatToIntBits(in.readFloat()));
124    assertEquals(0xBEBAFECAEFBEADDEL, Double.doubleToLongBits(in.readDouble()));
125  }
126
127  public void testSkipBytes() throws IOException {
128    ByteArrayOutputStream baos = new ByteArrayOutputStream();
129    DataOutputStream out = new DataOutputStream(baos);
130
131    /* Write out various test values NORMALLY */
132    out.write(new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}); // 10 bytes of junk to skip
133    initializeData(out);
134
135    byte[] data = baos.toByteArray();
136
137    DataInput in = new LittleEndianDataInputStream(new ByteArrayInputStream(data));
138    int bytesSkipped = 0;
139    while (bytesSkipped < 10) {
140      bytesSkipped += in.skipBytes(10 - bytesSkipped);
141    }
142
143    /* Read in various values in LITTLE ENDIAN FORMAT */
144    byte[] b = new byte[2];
145    in.readFully(b);
146    assertEquals(-100, b[0]);
147    assertEquals(100, b[1]);
148    assertTrue(in.readBoolean());
149    assertFalse(in.readBoolean());
150  }
151}
152