mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 16:14:10 -08:00
Add PushbackInputStream and DataInputStream
This commit is contained in:
parent
470bbc6fc1
commit
d5e602b38e
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.lang.TString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev <konsoletyper@gmail.com>
|
||||||
|
*/
|
||||||
|
public interface TDataInput {
|
||||||
|
void readFully(byte[] b) throws TIOException;
|
||||||
|
|
||||||
|
void readFully(byte[] b, int off, int len) throws TIOException;
|
||||||
|
|
||||||
|
int skipBytes(int n) throws TIOException;
|
||||||
|
|
||||||
|
boolean readBoolean() throws TIOException;
|
||||||
|
|
||||||
|
byte readByte() throws TIOException;
|
||||||
|
|
||||||
|
int readUnsignedByte() throws TIOException;
|
||||||
|
|
||||||
|
short readShort() throws TIOException;
|
||||||
|
|
||||||
|
int readUnsignedShort() throws TIOException;
|
||||||
|
|
||||||
|
char readChar() throws TIOException;
|
||||||
|
|
||||||
|
int readInt() throws TIOException;
|
||||||
|
|
||||||
|
long readLong() throws TIOException;
|
||||||
|
|
||||||
|
float readFloat() throws TIOException;
|
||||||
|
|
||||||
|
double readDouble() throws TIOException;
|
||||||
|
|
||||||
|
TString readLine() throws TIOException;
|
||||||
|
|
||||||
|
TString readUTF() throws TIOException;
|
||||||
|
}
|
|
@ -0,0 +1,270 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.lang.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev <konsoletyper@gmail.com>
|
||||||
|
*/
|
||||||
|
public class TDataInputStream extends TFilterInputStream implements TDataInput {
|
||||||
|
byte[] buff;
|
||||||
|
|
||||||
|
public TDataInputStream(TInputStream in) {
|
||||||
|
super(in);
|
||||||
|
buff = new byte[8];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final int read(byte[] buffer) throws TIOException {
|
||||||
|
return in.read(buffer, 0, buffer.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final int read(byte[] buffer, int offset, int length) throws TIOException {
|
||||||
|
return in.read(buffer, offset, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final boolean readBoolean() throws TIOException {
|
||||||
|
int temp = in.read();
|
||||||
|
if (temp < 0) {
|
||||||
|
throw new TEOFException();
|
||||||
|
}
|
||||||
|
return temp != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final byte readByte() throws TIOException {
|
||||||
|
int temp = in.read();
|
||||||
|
if (temp < 0) {
|
||||||
|
throw new TEOFException();
|
||||||
|
}
|
||||||
|
return (byte)temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int readToBuff(int count) throws TIOException {
|
||||||
|
int offset = 0;
|
||||||
|
while(offset < count) {
|
||||||
|
int bytesRead = in.read(buff, offset, count - offset);
|
||||||
|
if(bytesRead == -1) return bytesRead;
|
||||||
|
offset += bytesRead;
|
||||||
|
}
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final char readChar() throws TIOException {
|
||||||
|
if (readToBuff(2) < 0){
|
||||||
|
throw new TEOFException();
|
||||||
|
}
|
||||||
|
return (char) (((buff[0] & 0xff) << 8) | (buff[1] & 0xff));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final double readDouble() throws TIOException {
|
||||||
|
return TDouble.longBitsToDouble(readLong());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final float readFloat() throws TIOException {
|
||||||
|
return TFloat.intBitsToFloat(readInt());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final void readFully(byte[] buffer) throws TIOException {
|
||||||
|
readFully(buffer, 0, buffer.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final void readFully(byte[] buffer, int offset, int length) throws TIOException {
|
||||||
|
if (length < 0) {
|
||||||
|
throw new TIndexOutOfBoundsException();
|
||||||
|
}
|
||||||
|
if (length == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (in == null) {
|
||||||
|
throw new TNullPointerException();
|
||||||
|
}
|
||||||
|
if (buffer == null) {
|
||||||
|
throw new TNullPointerException();
|
||||||
|
}
|
||||||
|
if (offset < 0 || offset > buffer.length - length) {
|
||||||
|
throw new TIndexOutOfBoundsException();
|
||||||
|
}
|
||||||
|
while (length > 0) {
|
||||||
|
int result = in.read(buffer, offset, length);
|
||||||
|
if (result < 0) {
|
||||||
|
throw new TEOFException();
|
||||||
|
}
|
||||||
|
offset += result;
|
||||||
|
length -= result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final int readInt() throws TIOException {
|
||||||
|
if (readToBuff(4) < 0){
|
||||||
|
throw new TEOFException();
|
||||||
|
}
|
||||||
|
return ((buff[0] & 0xff) << 24) | ((buff[1] & 0xff) << 16) | ((buff[2] & 0xff) << 8) | (buff[3] & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public final TString readLine() throws TIOException {
|
||||||
|
TStringBuilder line = new TStringBuilder(80);
|
||||||
|
boolean foundTerminator = false;
|
||||||
|
while (true) {
|
||||||
|
int nextByte = in.read();
|
||||||
|
switch (nextByte) {
|
||||||
|
case -1:
|
||||||
|
if (line.length() == 0 && !foundTerminator) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return TString.wrap(line.toString());
|
||||||
|
case (byte) '\r':
|
||||||
|
if (foundTerminator) {
|
||||||
|
((TPushbackInputStream)in).unread(nextByte);
|
||||||
|
return TString.wrap(line.toString());
|
||||||
|
}
|
||||||
|
foundTerminator = true;
|
||||||
|
/* Have to be able to peek ahead one byte */
|
||||||
|
if (!(in.getClass() == TPushbackInputStream.class)) {
|
||||||
|
in = new TPushbackInputStream(in);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case (byte) '\n':
|
||||||
|
return TString.wrap(line.toString());
|
||||||
|
default:
|
||||||
|
if (foundTerminator) {
|
||||||
|
((TPushbackInputStream)in).unread(nextByte);
|
||||||
|
return TString.wrap(line.toString());
|
||||||
|
}
|
||||||
|
line.append((char) nextByte);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final long readLong() throws TIOException {
|
||||||
|
if (readToBuff(8) < 0){
|
||||||
|
throw new TEOFException();
|
||||||
|
}
|
||||||
|
int i1 = ((buff[0] & 0xff) << 24) | ((buff[1] & 0xff) << 16) |
|
||||||
|
((buff[2] & 0xff) << 8) | (buff[3] & 0xff);
|
||||||
|
int i2 = ((buff[4] & 0xff) << 24) | ((buff[5] & 0xff) << 16) |
|
||||||
|
((buff[6] & 0xff) << 8) | (buff[7] & 0xff);
|
||||||
|
return ((i1 & 0xffffffffL) << 32) | (i2 & 0xffffffffL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final short readShort() throws TIOException {
|
||||||
|
if (readToBuff(2) < 0){
|
||||||
|
throw new TEOFException();
|
||||||
|
}
|
||||||
|
return (short) (((buff[0] & 0xff) << 8) | (buff[1] & 0xff));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final int readUnsignedByte() throws TIOException {
|
||||||
|
int temp = in.read();
|
||||||
|
if (temp < 0) {
|
||||||
|
throw new TEOFException();
|
||||||
|
}
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final int readUnsignedShort() throws TIOException {
|
||||||
|
if (readToBuff(2) < 0){
|
||||||
|
throw new TEOFException();
|
||||||
|
}
|
||||||
|
return (char) (((buff[0] & 0xff) << 8) | (buff[1] & 0xff));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final TString readUTF() throws TIOException {
|
||||||
|
return decodeUTF(readUnsignedShort());
|
||||||
|
}
|
||||||
|
|
||||||
|
TString decodeUTF(int utfSize) throws TIOException {
|
||||||
|
return decodeUTF(utfSize, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static TString decodeUTF(int utfSize, TDataInput in) throws TIOException {
|
||||||
|
byte[] buf = new byte[utfSize];
|
||||||
|
char[] out = new char[utfSize];
|
||||||
|
in.readFully(buf, 0, utfSize);
|
||||||
|
|
||||||
|
return convertUTF8WithBuf(buf, out, 0, utfSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final TString readUTF(TDataInput in) throws TIOException {
|
||||||
|
return decodeUTF(in.readUnsignedShort(), in);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final int skipBytes(int count) throws TIOException {
|
||||||
|
int skipped = 0;
|
||||||
|
long skip;
|
||||||
|
while (skipped < count && (skip = in.skip(count - skipped)) != 0) {
|
||||||
|
skipped += skip;
|
||||||
|
}
|
||||||
|
if (skipped < 0) {
|
||||||
|
throw new TEOFException();
|
||||||
|
}
|
||||||
|
return skipped;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static TString convertUTF8WithBuf(byte[] buf, char[] out, int offset, int utfSize)
|
||||||
|
throws TUTFDataFormatException {
|
||||||
|
int count = 0;
|
||||||
|
int s = 0;
|
||||||
|
int a;
|
||||||
|
while (count < utfSize) {
|
||||||
|
char ch = (char)buf[offset + count++];
|
||||||
|
if (ch < '\u0080') {
|
||||||
|
out[s++] = ch;
|
||||||
|
} else if (((a = out[s]) & 0xe0) == 0xc0) {
|
||||||
|
if (count >= utfSize) {
|
||||||
|
throw new TUTFDataFormatException(TString.wrap("End of stream reached"));
|
||||||
|
}
|
||||||
|
int b = buf[count++];
|
||||||
|
if ((b & 0xC0) != 0x80) {
|
||||||
|
throw new TUTFDataFormatException(TString.wrap("Malformed UTF-8 sequence"));
|
||||||
|
}
|
||||||
|
out[s++] = (char) (((a & 0x1F) << 6) | (b & 0x3F));
|
||||||
|
} else if ((a & 0xf0) == 0xe0) {
|
||||||
|
if (count + 1 >= utfSize) {
|
||||||
|
throw new TUTFDataFormatException(TString.wrap("Malformed UTF-8 sequence"));
|
||||||
|
}
|
||||||
|
int b = buf[count++];
|
||||||
|
int c = buf[count++];
|
||||||
|
if (((b & 0xC0) != 0x80) || ((c & 0xC0) != 0x80)) {
|
||||||
|
throw new TUTFDataFormatException(TString.wrap("Malformed UTF-8 sequence"));
|
||||||
|
}
|
||||||
|
out[s++] = (char)(((a & 0x0F) << 12) | ((b & 0x3F) << 6) | (c & 0x3F));
|
||||||
|
} else {
|
||||||
|
throw new TUTFDataFormatException(TString.wrap("Malformed UTF-8 sequence"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new TString(out, 0, s);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,176 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.lang.TArrayIndexOutOfBoundsException;
|
||||||
|
import org.teavm.classlib.java.lang.TString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev <konsoletyper@gmail.com>
|
||||||
|
*/
|
||||||
|
public class TPushbackInputStream extends TFilterInputStream {
|
||||||
|
protected byte[] buf;
|
||||||
|
protected int pos;
|
||||||
|
|
||||||
|
public TPushbackInputStream(TInputStream in) {
|
||||||
|
super(in);
|
||||||
|
buf = (in == null) ? null : new byte[1];
|
||||||
|
pos = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TPushbackInputStream(TInputStream in, int size) {
|
||||||
|
super(in);
|
||||||
|
if (size <= 0) {
|
||||||
|
throw new IllegalArgumentException("Size must be positive");
|
||||||
|
}
|
||||||
|
buf = in == null ? null : new byte[size];
|
||||||
|
pos = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int available() throws TIOException {
|
||||||
|
if (buf == null) {
|
||||||
|
throw new TIOException();
|
||||||
|
}
|
||||||
|
return buf.length - pos + in.available();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws TIOException {
|
||||||
|
if (in != null) {
|
||||||
|
in.close();
|
||||||
|
in = null;
|
||||||
|
buf = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean markSupported() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() throws TIOException {
|
||||||
|
if (buf == null) {
|
||||||
|
throw new TIOException();
|
||||||
|
}
|
||||||
|
// Is there a pushback byte available?
|
||||||
|
if (pos < buf.length) {
|
||||||
|
return (buf[pos++] & 0xFF);
|
||||||
|
}
|
||||||
|
// Assume read() in the InputStream will return low-order byte or -1
|
||||||
|
// if end of stream.
|
||||||
|
return in.read();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(byte[] buffer, int offset, int length) throws TIOException {
|
||||||
|
if (buf == null) {
|
||||||
|
throw new TIOException(TString.wrap("Stream is closed"));
|
||||||
|
}
|
||||||
|
// Force buffer null check first!
|
||||||
|
if (offset > buffer.length || offset < 0) {
|
||||||
|
throw new TArrayIndexOutOfBoundsException(TString.wrap("Offset out of bounds: " + offset));
|
||||||
|
}
|
||||||
|
if (length < 0 || length > buffer.length - offset) {
|
||||||
|
throw new TArrayIndexOutOfBoundsException(TString.wrap("Length out of bounds: " + length));
|
||||||
|
}
|
||||||
|
|
||||||
|
int copiedBytes = 0, copyLength = 0, newOffset = offset;
|
||||||
|
// Are there pushback bytes available?
|
||||||
|
if (pos < buf.length) {
|
||||||
|
copyLength = (buf.length - pos >= length) ? length : buf.length - pos;
|
||||||
|
System.arraycopy(buf, pos, buffer, newOffset, copyLength);
|
||||||
|
newOffset += copyLength;
|
||||||
|
copiedBytes += copyLength;
|
||||||
|
// Use up the bytes in the local buffer
|
||||||
|
pos += copyLength;
|
||||||
|
}
|
||||||
|
// Have we copied enough?
|
||||||
|
if (copyLength == length) {
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
int inCopied = in.read(buffer, newOffset, length - copiedBytes);
|
||||||
|
if (inCopied > 0) {
|
||||||
|
return inCopied + copiedBytes;
|
||||||
|
}
|
||||||
|
if (copiedBytes == 0) {
|
||||||
|
return inCopied;
|
||||||
|
}
|
||||||
|
return copiedBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long skip(long count) throws TIOException {
|
||||||
|
if (in == null) {
|
||||||
|
throw new TIOException();
|
||||||
|
}
|
||||||
|
if (count <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int numSkipped = 0;
|
||||||
|
if (pos < buf.length) {
|
||||||
|
numSkipped += (count < buf.length - pos) ? count : buf.length - pos;
|
||||||
|
pos += numSkipped;
|
||||||
|
}
|
||||||
|
if (numSkipped < count) {
|
||||||
|
numSkipped += in.skip(count - numSkipped);
|
||||||
|
}
|
||||||
|
return numSkipped;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unread(byte[] buffer) throws TIOException {
|
||||||
|
unread(buffer, 0, buffer.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unread(byte[] buffer, int offset, int length) throws TIOException {
|
||||||
|
if (length > pos) {
|
||||||
|
throw new TIOException(TString.wrap("Pushback buffer full"));
|
||||||
|
}
|
||||||
|
if (offset > buffer.length || offset < 0) {
|
||||||
|
throw new TArrayIndexOutOfBoundsException(TString.wrap("Offset out of bounds: " + offset));
|
||||||
|
}
|
||||||
|
if (length < 0 || length > buffer.length - offset) {
|
||||||
|
throw new TArrayIndexOutOfBoundsException(TString.wrap("Length out of bounds: " + length));
|
||||||
|
}
|
||||||
|
if (buf == null) {
|
||||||
|
throw new TIOException(TString.wrap("Stream is closed"));
|
||||||
|
}
|
||||||
|
System.arraycopy(buffer, offset, buf, pos - length, length);
|
||||||
|
pos = pos - length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unread(int oneByte) throws TIOException {
|
||||||
|
if (buf == null) {
|
||||||
|
throw new TIOException();
|
||||||
|
}
|
||||||
|
if (pos == 0) {
|
||||||
|
throw new TIOException();
|
||||||
|
}
|
||||||
|
buf[--pos] = (byte) oneByte;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mark(int readlimit) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() throws TIOException {
|
||||||
|
throw new TIOException();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* 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 org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.lang.TString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev <konsoletyper@gmail.com>
|
||||||
|
*/
|
||||||
|
public class TUTFDataFormatException extends TIOException {
|
||||||
|
private static final long serialVersionUID = -6383472574962319733L;
|
||||||
|
|
||||||
|
public TUTFDataFormatException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public TUTFDataFormatException(TString message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,199 @@
|
||||||
|
/*
|
||||||
|
* 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 org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PushbackInputStream;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
@SuppressWarnings("resource")
|
||||||
|
public class PushbackInputStreamTest {
|
||||||
|
PushbackInputStream pis;
|
||||||
|
|
||||||
|
public PushbackInputStreamTest() {
|
||||||
|
byte[] array = new byte[1000];
|
||||||
|
for (int i = 0; i < array.length; ++i) {
|
||||||
|
array[i] = (byte)i;
|
||||||
|
}
|
||||||
|
pis = new PushbackInputStream(new ByteArrayInputStream(array), array.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_reset() {
|
||||||
|
PushbackInputStream pb = new PushbackInputStream(new ByteArrayInputStream(new byte[] { 0 }), 2);
|
||||||
|
try {
|
||||||
|
pb.reset();
|
||||||
|
fail("Should throw IOException");
|
||||||
|
} catch (IOException e) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_mark() {
|
||||||
|
PushbackInputStream pb = new PushbackInputStream(new ByteArrayInputStream(new byte[] { 0 }), 2);
|
||||||
|
pb.mark(Integer.MAX_VALUE);
|
||||||
|
pb.mark(0);
|
||||||
|
pb.mark(-1);
|
||||||
|
pb.mark(Integer.MIN_VALUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_ConstructorLjava_io_InputStream() {
|
||||||
|
try {
|
||||||
|
PushbackInputStream str = new PushbackInputStream(null);
|
||||||
|
str.read();
|
||||||
|
fail("Expected IOException");
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
pis = new PushbackInputStream(new ByteArrayInputStream("Hello".getBytes()));
|
||||||
|
pis.unread("He".getBytes());
|
||||||
|
fail("Failed to throw exception on unread when buffer full");
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_ConstructorLjava_io_InputStreamI() {
|
||||||
|
try {
|
||||||
|
pis = new PushbackInputStream(new ByteArrayInputStream("Hello".getBytes()), 5);
|
||||||
|
pis.unread("Hellos".getBytes());
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Correct
|
||||||
|
// Pushback buffer should be full
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
fail("Failed to throw exception on unread when buffer full");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_ConstructorLjava_io_InputStreamL() {
|
||||||
|
try {
|
||||||
|
PushbackInputStream str = new PushbackInputStream(null, 1);
|
||||||
|
str.read();
|
||||||
|
fail("Expected IOException");
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_available() {
|
||||||
|
try {
|
||||||
|
assertEquals("Available returned incorrect number of bytes", 1000, pis.available());
|
||||||
|
} catch (IOException e) {
|
||||||
|
fail("Exception during available test: " + e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_markSupported() {
|
||||||
|
assertTrue("markSupported returned true", !pis.markSupported());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_read() {
|
||||||
|
try {
|
||||||
|
assertEquals("Incorrect byte read", 0, pis.read());
|
||||||
|
} catch (IOException e) {
|
||||||
|
fail("Exception during read test : " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_read$BII() {
|
||||||
|
try {
|
||||||
|
byte[] buf = new byte[100];
|
||||||
|
pis.read(buf, 0, buf.length);
|
||||||
|
assertEquals(0, buf[0]);
|
||||||
|
assertEquals(99, buf[99]);
|
||||||
|
} catch (IOException e) {
|
||||||
|
fail("Exception during read test : " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_skipJ() throws Exception {
|
||||||
|
byte[] buf = new byte[50];
|
||||||
|
pis.skip(50);
|
||||||
|
pis.read(buf, 0, buf.length);
|
||||||
|
assertEquals(50, buf[0]);
|
||||||
|
assertEquals(99, buf[49]);
|
||||||
|
pis.unread(buf);
|
||||||
|
pis.skip(25);
|
||||||
|
byte[] buf2 = new byte[25];
|
||||||
|
pis.read(buf2, 0, buf2.length);
|
||||||
|
assertEquals(75, buf2[0]);
|
||||||
|
assertEquals(99, buf2[24]);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_unread$B() {
|
||||||
|
try {
|
||||||
|
byte[] buf = new byte[100];
|
||||||
|
pis.read(buf, 0, buf.length);
|
||||||
|
assertEquals(0, buf[0]);
|
||||||
|
assertEquals(99, buf[99]);
|
||||||
|
pis.unread(buf);
|
||||||
|
pis.read(buf, 0, 50);
|
||||||
|
assertEquals(0, buf[0]);
|
||||||
|
assertEquals(49, buf[49]);
|
||||||
|
} catch (IOException e) {
|
||||||
|
fail("IOException during unread test : " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_unread$BII() throws IOException {
|
||||||
|
byte[] buf = new byte[100];
|
||||||
|
pis.read(buf, 0, buf.length);
|
||||||
|
assertEquals(0, buf[0]);
|
||||||
|
assertEquals(99, buf[99]);
|
||||||
|
pis.unread(buf, 50, 50);
|
||||||
|
pis.read(buf, 0, 50);
|
||||||
|
assertEquals(50, buf[0]);
|
||||||
|
assertEquals(99, buf[49]);
|
||||||
|
|
||||||
|
// Regression for HARMONY-49
|
||||||
|
try {
|
||||||
|
PushbackInputStream pb = new PushbackInputStream(new ByteArrayInputStream(new byte[] { 0 }), 2);
|
||||||
|
pb.unread(new byte[1], 0, 5);
|
||||||
|
fail("Assert 0: should throw IOE");
|
||||||
|
} catch (IOException e) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_unreadI() {
|
||||||
|
try {
|
||||||
|
int x = pis.read();
|
||||||
|
assertEquals("Incorrect byte read", 0, x);
|
||||||
|
pis.unread(x);
|
||||||
|
assertEquals("Failed to unread", x, pis.read());
|
||||||
|
} catch (IOException e) {
|
||||||
|
fail("IOException during read test : " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user