diff --git a/teavm-classlib/pom.xml b/teavm-classlib/pom.xml index be2629a81..667f3b42e 100644 --- a/teavm-classlib/pom.xml +++ b/teavm-classlib/pom.xml @@ -113,6 +113,7 @@ java.io java.math java.net + java.nio java.text java.util java.util.logging diff --git a/teavm-classlib/src/main/java/org/teavm/classlib/java/nio/TBuffer.java b/teavm-classlib/src/main/java/org/teavm/classlib/java/nio/TBuffer.java index e959e9f0f..7b59fc767 100644 --- a/teavm-classlib/src/main/java/org/teavm/classlib/java/nio/TBuffer.java +++ b/teavm-classlib/src/main/java/org/teavm/classlib/java/nio/TBuffer.java @@ -47,6 +47,7 @@ public abstract class TBuffer { if (mark > newLimit) { mark = -1; } + limit = newLimit; if (position > limit) { position = limit; } diff --git a/teavm-classlib/src/main/java/org/teavm/classlib/java/nio/TByteBufferImpl.java b/teavm-classlib/src/main/java/org/teavm/classlib/java/nio/TByteBufferImpl.java index ada0b5c3b..1eec7893b 100644 --- a/teavm-classlib/src/main/java/org/teavm/classlib/java/nio/TByteBufferImpl.java +++ b/teavm-classlib/src/main/java/org/teavm/classlib/java/nio/TByteBufferImpl.java @@ -21,8 +21,7 @@ class TByteBufferImpl extends TByteBuffer { @Override public TByteBuffer slice() { - return new TByteBufferImpl(position, array.length - position, array, 0, array.length - position, - direct, readOnly); + return new TByteBufferImpl(position, limit - position, array, 0, limit - position, direct, readOnly); } @Override diff --git a/teavm-classlib/src/test/java/org/teavm/classlib/java/nio/ByteBufferTest.java b/teavm-classlib/src/test/java/org/teavm/classlib/java/nio/ByteBufferTest.java index 9877f8e12..c0f3fe799 100644 --- a/teavm-classlib/src/test/java/org/teavm/classlib/java/nio/ByteBufferTest.java +++ b/teavm-classlib/src/test/java/org/teavm/classlib/java/nio/ByteBufferTest.java @@ -1,9 +1,9 @@ package org.teavm.classlib.java.nio; import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; -import java.nio.ByteBuffer; -import java.nio.InvalidMarkException; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; +import java.nio.*; import org.junit.Test; /** @@ -159,5 +159,128 @@ public class ByteBufferTest { assertThat(buffer.get(15), is((byte)24)); buffer.put(1, (byte)25); assertThat(duplicate.get(1), is((byte)25)); + assertThat(duplicate.array(), is(sameInstance(buffer.array()))); + } + + @Test + public void getsByte() { + byte[] array = { 2, 3, 5, 7 }; + ByteBuffer buffer = ByteBuffer.wrap(array); + assertThat(buffer.get(), is((byte)2)); + assertThat(buffer.get(), is((byte)3)); + buffer = buffer.slice(); + assertThat(buffer.get(), is((byte)5)); + assertThat(buffer.get(), is((byte)7)); + } + + @Test + public void gettingByteFromEmptyBufferCausesError() { + byte[] array = { 2, 3, 5, 7 }; + ByteBuffer buffer = ByteBuffer.wrap(array); + buffer.limit(2); + buffer.get(); + buffer.get(); + try { + buffer.get(); + fail("Should have thrown error"); + } catch (BufferUnderflowException e) { + // ok + } + } + + @Test + public void putsByte() { + byte[] array = new byte[4]; + ByteBuffer buffer = ByteBuffer.wrap(array); + buffer.put((byte)2).put((byte)3).put((byte)5).put((byte)7); + assertThat(array, is(new byte[] { 2, 3, 5, 7 })); + } + + @Test + public void puttingByteToEmptyBufferCausesError() { + byte[] array = new byte[4]; + ByteBuffer buffer = ByteBuffer.wrap(array); + buffer.limit(2); + buffer.put((byte)2).put((byte)3); + try { + buffer.put((byte)5); + fail("Should have thrown error"); + } catch (BufferOverflowException e) { + System.out.println(e); + assertThat(array[2], is((byte)0)); + } + } + + @Test(expected = ReadOnlyBufferException.class) + public void puttingByteToReadOnlyBufferCausesError() { + byte[] array = new byte[4]; + ByteBuffer buffer = ByteBuffer.wrap(array).asReadOnlyBuffer(); + buffer.put((byte)2); + } + + @Test + public void getsByteFromGivenLocation() { + byte[] array = { 2, 3, 5, 7 }; + ByteBuffer buffer = ByteBuffer.wrap(array); + assertThat(buffer.get(0), is((byte)2)); + assertThat(buffer.get(1), is((byte)3)); + buffer.get(); + buffer = buffer.slice(); + assertThat(buffer.get(1), is((byte)5)); + assertThat(buffer.get(2), is((byte)7)); + } + + @Test + public void gettingByteFromWrongLocationCausesError() { + byte[] array = { 2, 3, 5, 7 }; + ByteBuffer buffer = ByteBuffer.wrap(array); + buffer.limit(3); + try { + buffer.get(-1); + } catch (IndexOutOfBoundsException e) { + // ok + } + try { + buffer.get(3); + } catch (IndexOutOfBoundsException e) { + // ok + } + } + + @Test + public void putsByteToGivenLocation() { + byte[] array = new byte[4]; + ByteBuffer buffer = ByteBuffer.wrap(array); + buffer.put(0, (byte)2); + buffer.put(1, (byte)3); + buffer.get(); + buffer = buffer.slice(); + buffer.put(1, (byte)5); + buffer.put(2, (byte)7); + assertThat(array, is(new byte[] { 2, 3, 5, 7 })); + } + + @Test + public void puttingByteToWrongLocationCausesError() { + byte[] array = new byte[4]; + ByteBuffer buffer = ByteBuffer.wrap(array); + buffer.limit(3); + try { + buffer.put(-1, (byte)2); + } catch (IndexOutOfBoundsException e) { + // ok + } + try { + buffer.put(3, (byte)2); + } catch (IndexOutOfBoundsException e) { + // ok + } + } + + @Test(expected = ReadOnlyBufferException.class) + public void puttingByteToGivenLocationOfReadOnlyBufferCausesError() { + byte[] array = new byte[4]; + ByteBuffer buffer = ByteBuffer.wrap(array).asReadOnlyBuffer(); + buffer.put(0, (byte)2); } }