You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by ch...@apache.org on 2017/08/02 12:46:56 UTC

[5/7] flink git commit: [FLINK-7311][tests] refrain from using fail(Exception#getMessage())

http://git-wip-us.apache.org/repos/asf/flink/blob/e83217bd/flink-core/src/test/java/org/apache/flink/core/memory/MemorySegmentTestBase.java
----------------------------------------------------------------------
diff --git a/flink-core/src/test/java/org/apache/flink/core/memory/MemorySegmentTestBase.java b/flink-core/src/test/java/org/apache/flink/core/memory/MemorySegmentTestBase.java
index 10c3622..8c10902 100644
--- a/flink-core/src/test/java/org/apache/flink/core/memory/MemorySegmentTestBase.java
+++ b/flink-core/src/test/java/org/apache/flink/core/memory/MemorySegmentTestBase.java
@@ -18,7 +18,6 @@
 
 package org.apache.flink.core.memory;
 
-import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runners.Parameterized;
 
@@ -67,1508 +66,1675 @@ public abstract class MemorySegmentTestBase {
 
 	@Test
 	public void testByteAccess() {
-		try {
-			final MemorySegment segment = createSegment(pageSize);
-
-			// test exceptions
-			try {
-				segment.put(-1, (byte) 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		final MemorySegment segment = createSegment(pageSize);
 
-			try {
-				segment.put(pageSize, (byte) 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// test exceptions
+		try {
+			segment.put(-1, (byte) 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.put(Integer.MAX_VALUE, (byte) 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.put(pageSize, (byte) 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.put(Integer.MIN_VALUE, (byte) 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.put(Integer.MAX_VALUE, (byte) 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.get(-1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.put(Integer.MIN_VALUE, (byte) 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.get(pageSize);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.get(-1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.get(Integer.MAX_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.get(pageSize);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.get(Integer.MIN_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.get(Integer.MAX_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			// test expected correct behavior, sequential access
+		try {
+			segment.get(Integer.MIN_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			long seed = random.nextLong();
+		// test expected correct behavior, sequential access
 
-			random.setSeed(seed);
-			for (int i = 0; i < pageSize; i++) {
-				segment.put(i, (byte) random.nextInt());
-			}
+		long seed = random.nextLong();
 
-			random.setSeed(seed);
-			for (int i = 0; i < pageSize; i++) {
-				assertEquals((byte) random.nextInt(), segment.get(i));
-			}
+		random.setSeed(seed);
+		for (int i = 0; i < pageSize; i++) {
+			segment.put(i, (byte) random.nextInt());
+		}
 
-			// test expected correct behavior, random access
+		random.setSeed(seed);
+		for (int i = 0; i < pageSize; i++) {
+			assertEquals((byte) random.nextInt(), segment.get(i));
+		}
 
-			random.setSeed(seed);
-			boolean[] occupied = new boolean[pageSize];
+		// test expected correct behavior, random access
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize);
+		random.setSeed(seed);
+		boolean[] occupied = new boolean[pageSize];
 
-				if (occupied[pos]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-				}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize);
 
-				segment.put(pos, (byte) random.nextInt());
+			if (occupied[pos]) {
+				continue;
+			} else {
+				occupied[pos] = true;
 			}
 
-			random.setSeed(seed);
-			occupied = new boolean[pageSize];
+			segment.put(pos, (byte) random.nextInt());
+		}
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize);
+		random.setSeed(seed);
+		occupied = new boolean[pageSize];
 
-				if (occupied[pos]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-				}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize);
 
-				assertEquals((byte) random.nextInt(), segment.get(pos));
+			if (occupied[pos]) {
+				continue;
+			} else {
+				occupied[pos] = true;
 			}
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+
+			assertEquals((byte) random.nextInt(), segment.get(pos));
 		}
 
 	}
 
 	@Test
 	public void testBooleanAccess() {
-		try {
-			final MemorySegment segment = createSegment(pageSize);
-
-			// test exceptions
-			try {
-				segment.putBoolean(-1, false);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		final MemorySegment segment = createSegment(pageSize);
 
-			try {
-				segment.putBoolean(pageSize, false);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// test exceptions
+		try {
+			segment.putBoolean(-1, false);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putBoolean(Integer.MAX_VALUE, false);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putBoolean(pageSize, false);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putBoolean(Integer.MIN_VALUE, false);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putBoolean(Integer.MAX_VALUE, false);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getBoolean(-1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putBoolean(Integer.MIN_VALUE, false);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getBoolean(pageSize);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getBoolean(-1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getBoolean(Integer.MAX_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getBoolean(pageSize);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getBoolean(Integer.MIN_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getBoolean(Integer.MAX_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			// test expected correct behavior, sequential access
+		try {
+			segment.getBoolean(Integer.MIN_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			long seed = random.nextLong();
+		// test expected correct behavior, sequential access
 
-			random.setSeed(seed);
-			for (int i = 0; i < pageSize; i++) {
-				segment.putBoolean(i, random.nextBoolean());
-			}
+		long seed = random.nextLong();
 
-			random.setSeed(seed);
-			for (int i = 0; i < pageSize; i++) {
-				assertEquals(random.nextBoolean(), segment.getBoolean(i));
-			}
+		random.setSeed(seed);
+		for (int i = 0; i < pageSize; i++) {
+			segment.putBoolean(i, random.nextBoolean());
+		}
 
-			// test expected correct behavior, random access
+		random.setSeed(seed);
+		for (int i = 0; i < pageSize; i++) {
+			assertEquals(random.nextBoolean(), segment.getBoolean(i));
+		}
 
-			random.setSeed(seed);
-			boolean[] occupied = new boolean[pageSize];
+		// test expected correct behavior, random access
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize);
+		random.setSeed(seed);
+		boolean[] occupied = new boolean[pageSize];
 
-				if (occupied[pos]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-				}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize);
 
-				segment.putBoolean(pos, random.nextBoolean());
+			if (occupied[pos]) {
+				continue;
+			} else {
+				occupied[pos] = true;
 			}
 
-			random.setSeed(seed);
-			occupied = new boolean[pageSize];
+			segment.putBoolean(pos, random.nextBoolean());
+		}
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize);
+		random.setSeed(seed);
+		occupied = new boolean[pageSize];
 
-				if (occupied[pos]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-				}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize);
 
-				assertEquals(random.nextBoolean(), segment.getBoolean(pos));
+			if (occupied[pos]) {
+				continue;
+			} else {
+				occupied[pos] = true;
 			}
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+
+			assertEquals(random.nextBoolean(), segment.getBoolean(pos));
 		}
 	}
 
 	@Test
 	public void testCharAccess() {
+		final MemorySegment segment = createSegment(pageSize);
+
+		// test exceptions
+
 		try {
-			final MemorySegment segment = createSegment(pageSize);
+			segment.putChar(-1, 'a');
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			// test exceptions
+		try {
+			segment.putChar(pageSize, 'a');
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putChar(-1, 'a');
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putChar(Integer.MIN_VALUE, 'a');
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putChar(pageSize, 'a');
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putChar(Integer.MAX_VALUE, 'a');
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putChar(Integer.MIN_VALUE, 'a');
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putChar(Integer.MAX_VALUE - 1, 'a');
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putChar(Integer.MAX_VALUE, 'a');
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getChar(-1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putChar(Integer.MAX_VALUE - 1, 'a');
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getChar(pageSize);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getChar(-1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getChar(Integer.MIN_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getChar(pageSize);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getChar(Integer.MAX_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getChar(Integer.MIN_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getChar(Integer.MAX_VALUE - 1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getChar(Integer.MAX_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// test expected correct behavior, sequential access
 
-			try {
-				segment.getChar(Integer.MAX_VALUE - 1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		long seed = random.nextLong();
 
-			// test expected correct behavior, sequential access 
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 2; i += 2) {
+			segment.putChar(i, (char) (random.nextInt(Character.MAX_VALUE)));
+		}
 
-			long seed = random.nextLong();
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 2; i += 2) {
+			assertEquals((char) (random.nextInt(Character.MAX_VALUE)), segment.getChar(i));
+		}
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 2; i += 2) {
-				segment.putChar(i, (char) (random.nextInt(Character.MAX_VALUE)));
-			}
+		// test expected correct behavior, random access
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 2; i += 2) {
-				assertEquals((char) (random.nextInt(Character.MAX_VALUE)), segment.getChar(i));
-			}
+		random.setSeed(seed);
+		boolean[] occupied = new boolean[pageSize];
 
-			// test expected correct behavior, random access 
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 1);
 
-			random.setSeed(seed);
-			boolean[] occupied = new boolean[pageSize];
+			if (occupied[pos] || occupied[pos + 1]) {
+				continue;
+			} else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
+			}
+
+			segment.putChar(pos, (char) (random.nextInt(Character.MAX_VALUE)));
+		}
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 1);
+		random.setSeed(seed);
+		occupied = new boolean[pageSize];
 
-				if (occupied[pos] || occupied[pos + 1]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-				}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 1);
 
-				segment.putChar(pos, (char) (random.nextInt(Character.MAX_VALUE)));
+			if (occupied[pos] || occupied[pos + 1]) {
+				continue;
+			} else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
 			}
 
-			random.setSeed(seed);
-			occupied = new boolean[pageSize];
+			assertEquals((char) (random.nextInt(Character.MAX_VALUE)), segment.getChar(pos));
+		}
+	}
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 1);
+	@Test
+	public void testShortAccess() {
+		final MemorySegment segment = createSegment(pageSize);
 
-				if (occupied[pos] || occupied[pos + 1]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-				}
+		// test exceptions
 
-				assertEquals((char) (random.nextInt(Character.MAX_VALUE)), segment.getChar(pos));
-			}
+		try {
+			segment.putShort(-1, (short) 0);
+			fail("IndexOutOfBoundsException expected");
 		}
 		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+			assertTrue(e instanceof IndexOutOfBoundsException);
 		}
-	}
 
-	@Test
-	public void testShortAccess() {
 		try {
-			final MemorySegment segment = createSegment(pageSize);
+			segment.putShort(pageSize, (short) 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			// test exceptions
+		try {
+			segment.putShort(Integer.MIN_VALUE, (short) 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putShort(-1, (short) 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putShort(Integer.MAX_VALUE, (short) 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putShort(pageSize, (short) 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putShort(Integer.MAX_VALUE - 1, (short) 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putShort(Integer.MIN_VALUE, (short) 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getShort(-1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putShort(Integer.MAX_VALUE, (short) 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getShort(pageSize);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putShort(Integer.MAX_VALUE - 1, (short) 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getShort(Integer.MIN_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getShort(-1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getShort(Integer.MAX_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getShort(pageSize);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getShort(Integer.MAX_VALUE - 1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getShort(Integer.MIN_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// test expected correct behavior, sequential access
 
-			try {
-				segment.getShort(Integer.MAX_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		long seed = random.nextLong();
 
-			try {
-				segment.getShort(Integer.MAX_VALUE - 1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 2; i += 2) {
+			segment.putShort(i, (short) random.nextInt());
+		}
 
-			// test expected correct behavior, sequential access
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 2; i += 2) {
+			assertEquals((short) random.nextInt(), segment.getShort(i));
+		}
 
-			long seed = random.nextLong();
+		// test expected correct behavior, random access
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 2; i += 2) {
-				segment.putShort(i, (short) random.nextInt());
-			}
+		random.setSeed(seed);
+		boolean[] occupied = new boolean[pageSize];
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 2; i += 2) {
-				assertEquals((short) random.nextInt(), segment.getShort(i));
-			}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 1);
 
-			// test expected correct behavior, random access
+			if (occupied[pos] || occupied[pos + 1]) {
+				continue;
+			} else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
+			}
 
-			random.setSeed(seed);
-			boolean[] occupied = new boolean[pageSize];
+			segment.putShort(pos, (short) random.nextInt());
+		}
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 1);
+		random.setSeed(seed);
+		occupied = new boolean[pageSize];
 
-				if (occupied[pos] || occupied[pos + 1]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-				}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 1);
 
-				segment.putShort(pos, (short) random.nextInt());
+			if (occupied[pos] || occupied[pos + 1]) {
+				continue;
+			} else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
 			}
 
-			random.setSeed(seed);
-			occupied = new boolean[pageSize];
+			assertEquals((short) random.nextInt(), segment.getShort(pos));
+		}
+	}
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 1);
+	@Test
+	public void testIntAccess() {
+		final MemorySegment segment = createSegment(pageSize);
 
-				if (occupied[pos] || occupied[pos + 1]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-				}
+		// test exceptions
 
-				assertEquals((short) random.nextInt(), segment.getShort(pos));
-			}
+		try {
+			segment.putInt(-1, 0);
+			fail("IndexOutOfBoundsException expected");
 		}
 		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+			assertTrue(e instanceof IndexOutOfBoundsException);
 		}
-	}
 
-	@Test
-	public void testIntAccess() {
 		try {
-			final MemorySegment segment = createSegment(pageSize);
+			segment.putInt(pageSize, 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			// test exceptions
+		try {
+			segment.putInt(pageSize - 3, 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putInt(-1, 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putInt(Integer.MIN_VALUE, 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putInt(pageSize, 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putInt(Integer.MAX_VALUE, 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putInt(pageSize - 3, 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putInt(Integer.MAX_VALUE - 3, 0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putInt(Integer.MIN_VALUE, 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getInt(-1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putInt(Integer.MAX_VALUE, 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getInt(pageSize);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putInt(Integer.MAX_VALUE - 3, 0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getInt(pageSize - 3);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getInt(-1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getInt(Integer.MIN_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getInt(pageSize);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getInt(Integer.MAX_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getInt(pageSize - 3);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getInt(Integer.MAX_VALUE - 3);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getInt(Integer.MIN_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// test expected correct behavior, sequential access
 
-			try {
-				segment.getInt(Integer.MAX_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		long seed = random.nextLong();
 
-			try {
-				segment.getInt(Integer.MAX_VALUE - 3);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 4; i += 4) {
+			segment.putInt(i, random.nextInt());
+		}
 
-			// test expected correct behavior, sequential access
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 4; i += 4) {
+			assertEquals(random.nextInt(), segment.getInt(i));
+		}
 
-			long seed = random.nextLong();
+		// test expected correct behavior, random access
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 4; i += 4) {
-				segment.putInt(i, random.nextInt());
-			}
+		random.setSeed(seed);
+		boolean[] occupied = new boolean[pageSize];
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 4; i += 4) {
-				assertEquals(random.nextInt(), segment.getInt(i));
-			}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 3);
 
-			// test expected correct behavior, random access
+			if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3]) {
+				continue;
+			} else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
+				occupied[pos+2] = true;
+				occupied[pos+3] = true;
+			}
 
-			random.setSeed(seed);
-			boolean[] occupied = new boolean[pageSize];
-
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 3);
-
-				if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-					occupied[pos+2] = true;
-					occupied[pos+3] = true;
-				}
+			segment.putInt(pos, random.nextInt());
+		}
 
-				segment.putInt(pos, random.nextInt());
-			}
+		random.setSeed(seed);
+		occupied = new boolean[pageSize];
 
-			random.setSeed(seed);
-			occupied = new boolean[pageSize];
-
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 3);
-
-				if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-					occupied[pos+2] = true;
-					occupied[pos+3] = true;
-				}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 3);
 
-				assertEquals(random.nextInt(), segment.getInt(pos));
+			if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3]) {
+				continue;
+			} else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
+				occupied[pos+2] = true;
+				occupied[pos+3] = true;
 			}
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+
+			assertEquals(random.nextInt(), segment.getInt(pos));
 		}
 	}
 
 	@Test
 	public void testLongAccess() {
-		try {
-			final MemorySegment segment = createSegment(pageSize);
+		final MemorySegment segment = createSegment(pageSize);
 
-			// test exceptions
-
-			try {
-				segment.putLong(-1, 0L);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// test exceptions
 
-			try {
-				segment.putLong(pageSize, 0L);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putLong(-1, 0L);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putLong(pageSize - 7, 0L);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putLong(pageSize, 0L);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putLong(Integer.MIN_VALUE, 0L);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putLong(pageSize - 7, 0L);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putLong(Integer.MAX_VALUE, 0L);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putLong(Integer.MIN_VALUE, 0L);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putLong(Integer.MAX_VALUE - 7, 0L);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putLong(Integer.MAX_VALUE, 0L);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getLong(-1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putLong(Integer.MAX_VALUE - 7, 0L);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getLong(pageSize);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getLong(-1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getLong(pageSize - 7);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getLong(pageSize);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getLong(Integer.MIN_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getLong(pageSize - 7);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getLong(Integer.MAX_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getLong(Integer.MIN_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getLong(Integer.MAX_VALUE - 7);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getLong(Integer.MAX_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			// test expected correct behavior, sequential access
+		try {
+			segment.getLong(Integer.MAX_VALUE - 7);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			long seed = random.nextLong();
+		// test expected correct behavior, sequential access
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 8; i += 8) {
-				segment.putLong(i, random.nextLong());
-			}
+		long seed = random.nextLong();
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 8; i += 8) {
-				assertEquals(random.nextLong(), segment.getLong(i));
-			}
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 8; i += 8) {
+			segment.putLong(i, random.nextLong());
+		}
 
-			// test expected correct behavior, random access
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 8; i += 8) {
+			assertEquals(random.nextLong(), segment.getLong(i));
+		}
 
-			random.setSeed(seed);
-			boolean[] occupied = new boolean[pageSize];
+		// test expected correct behavior, random access
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 7);
+		random.setSeed(seed);
+		boolean[] occupied = new boolean[pageSize];
 
-				if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3] ||
-						occupied[pos + 4] || occupied[pos + 5] || occupied[pos + 6] || occupied[pos + 7])
-				{
-					continue;
-				}
-				else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-					occupied[pos+2] = true;
-					occupied[pos+3] = true;
-					occupied[pos+4] = true;
-					occupied[pos+5] = true;
-					occupied[pos+6] = true;
-					occupied[pos+7] = true;
-				}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 7);
 
-				segment.putLong(pos, random.nextLong());
+			if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3] ||
+					occupied[pos + 4] || occupied[pos + 5] || occupied[pos + 6] || occupied[pos + 7])
+			{
+				continue;
+			}
+			else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
+				occupied[pos+2] = true;
+				occupied[pos+3] = true;
+				occupied[pos+4] = true;
+				occupied[pos+5] = true;
+				occupied[pos+6] = true;
+				occupied[pos+7] = true;
 			}
 
-			random.setSeed(seed);
-			occupied = new boolean[pageSize];
+			segment.putLong(pos, random.nextLong());
+		}
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 7);
+		random.setSeed(seed);
+		occupied = new boolean[pageSize];
 
-				if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3] ||
-						occupied[pos + 4] || occupied[pos + 5] || occupied[pos + 6] || occupied[pos + 7])
-				{
-					continue;
-				}
-				else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-					occupied[pos+2] = true;
-					occupied[pos+3] = true;
-					occupied[pos+4] = true;
-					occupied[pos+5] = true;
-					occupied[pos+6] = true;
-					occupied[pos+7] = true;
-				}
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 7);
 
-				assertEquals(random.nextLong(), segment.getLong(pos));
+			if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3] ||
+					occupied[pos + 4] || occupied[pos + 5] || occupied[pos + 6] || occupied[pos + 7])
+			{
+				continue;
 			}
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+			else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
+				occupied[pos+2] = true;
+				occupied[pos+3] = true;
+				occupied[pos+4] = true;
+				occupied[pos+5] = true;
+				occupied[pos+6] = true;
+				occupied[pos+7] = true;
+			}
+
+			assertEquals(random.nextLong(), segment.getLong(pos));
 		}
 	}
 
 	@Test
 	public void testFloatAccess() {
-		try {
-			final MemorySegment segment = createSegment(pageSize);
+		final MemorySegment segment = createSegment(pageSize);
 
-			// test exceptions
+		// test exceptions
 
-			try {
-				segment.putFloat(-1, 0.0f);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putFloat(-1, 0.0f);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putFloat(pageSize, 0.0f);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putFloat(pageSize, 0.0f);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putFloat(pageSize - 3, 0.0f);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putFloat(pageSize - 3, 0.0f);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putFloat(Integer.MIN_VALUE, 0.0f);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putFloat(Integer.MIN_VALUE, 0.0f);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putFloat(Integer.MAX_VALUE, 0.0f);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putFloat(Integer.MAX_VALUE, 0.0f);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putFloat(Integer.MAX_VALUE - 3, 0.0f);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putFloat(Integer.MAX_VALUE - 3, 0.0f);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getFloat(-1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getFloat(-1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getFloat(pageSize);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getFloat(pageSize);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getFloat(pageSize - 3);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getFloat(pageSize - 3);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getFloat(Integer.MIN_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getFloat(Integer.MIN_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getFloat(Integer.MAX_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getFloat(Integer.MAX_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getFloat(Integer.MAX_VALUE - 3);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getFloat(Integer.MAX_VALUE - 3);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			// test expected correct behavior, sequential access
+		// test expected correct behavior, sequential access
 
-			long seed = random.nextLong();
+		long seed = random.nextLong();
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 4; i += 4) {
-				segment.putFloat(i, random.nextFloat());
-			}
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 4; i += 4) {
+			segment.putFloat(i, random.nextFloat());
+		}
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 4; i += 4) {
-				assertEquals(random.nextFloat(), segment.getFloat(i), 0.0);
-			}
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 4; i += 4) {
+			assertEquals(random.nextFloat(), segment.getFloat(i), 0.0);
+		}
 
-			// test expected correct behavior, random access
+		// test expected correct behavior, random access
 
-			random.setSeed(seed);
-			boolean[] occupied = new boolean[pageSize];
-
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 3);
-
-				if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-					occupied[pos+2] = true;
-					occupied[pos+3] = true;
-				}
+		random.setSeed(seed);
+		boolean[] occupied = new boolean[pageSize];
 
-				segment.putFloat(pos, random.nextFloat());
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 3);
+
+			if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3]) {
+				continue;
+			} else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
+				occupied[pos+2] = true;
+				occupied[pos+3] = true;
 			}
 
-			random.setSeed(seed);
-			occupied = new boolean[pageSize];
-
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 3);
-
-				if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3]) {
-					continue;
-				} else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-					occupied[pos+2] = true;
-					occupied[pos+3] = true;
-				}
+			segment.putFloat(pos, random.nextFloat());
+		}
+
+		random.setSeed(seed);
+		occupied = new boolean[pageSize];
+
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 3);
 
-				assertEquals(random.nextFloat(), segment.getFloat(pos), 0.0);
+			if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3]) {
+				continue;
+			} else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
+				occupied[pos+2] = true;
+				occupied[pos+3] = true;
 			}
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+
+			assertEquals(random.nextFloat(), segment.getFloat(pos), 0.0);
 		}
 	}
 
 	@Test
 	public void testDoubleAccess() {
+		final MemorySegment segment = createSegment(pageSize);
+
+		// test exceptions
 		try {
-			final MemorySegment segment = createSegment(pageSize);
+			segment.putDouble(-1, 0.0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			// test exceptions
-			try {
-				segment.putDouble(-1, 0.0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putDouble(pageSize, 0.0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putDouble(pageSize, 0.0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putDouble(pageSize - 7, 0.0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putDouble(pageSize - 7, 0.0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putDouble(Integer.MIN_VALUE, 0.0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putDouble(Integer.MIN_VALUE, 0.0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putDouble(Integer.MAX_VALUE, 0.0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putDouble(Integer.MAX_VALUE, 0.0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.putDouble(Integer.MAX_VALUE - 7, 0.0);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.putDouble(Integer.MAX_VALUE - 7, 0.0);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getDouble(-1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getDouble(-1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getDouble(pageSize);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getDouble(pageSize);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getDouble(pageSize - 7);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getDouble(pageSize - 7);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getDouble(Integer.MIN_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getDouble(Integer.MIN_VALUE);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.getDouble(Integer.MAX_VALUE);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.getDouble(Integer.MAX_VALUE);
-				fail("IndexOutOfBoundsException expected");
+		try {
+			segment.getDouble(Integer.MAX_VALUE - 7);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		// test expected correct behavior, sequential access
+
+		long seed = random.nextLong();
+
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 8; i += 8) {
+			segment.putDouble(i, random.nextDouble());
+		}
+
+		random.setSeed(seed);
+		for (int i = 0; i <= pageSize - 8; i += 8) {
+			assertEquals(random.nextDouble(), segment.getDouble(i), 0.0);
+		}
+
+		// test expected correct behavior, random access
+
+		random.setSeed(seed);
+		boolean[] occupied = new boolean[pageSize];
+
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 7);
+
+			if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3] ||
+					occupied[pos + 4] || occupied[pos + 5] || occupied[pos + 6] || occupied[pos + 7])
+			{
+				continue;
 			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
+			else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
+				occupied[pos+2] = true;
+				occupied[pos+3] = true;
+				occupied[pos+4] = true;
+				occupied[pos+5] = true;
+				occupied[pos+6] = true;
+				occupied[pos+7] = true;
 			}
 
-			try {
-				segment.getDouble(Integer.MAX_VALUE - 7);
-				fail("IndexOutOfBoundsException expected");
+			segment.putDouble(pos, random.nextDouble());
+		}
+
+		random.setSeed(seed);
+		occupied = new boolean[pageSize];
+
+		for (int i = 0; i < 1000; i++) {
+			int pos = random.nextInt(pageSize - 7);
+
+			if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3] ||
+					occupied[pos + 4] || occupied[pos + 5] || occupied[pos + 6] || occupied[pos + 7])
+			{
+				continue;
 			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
+			else {
+				occupied[pos] = true;
+				occupied[pos+1] = true;
+				occupied[pos+2] = true;
+				occupied[pos+3] = true;
+				occupied[pos+4] = true;
+				occupied[pos+5] = true;
+				occupied[pos+6] = true;
+				occupied[pos+7] = true;
 			}
 
-			// test expected correct behavior, sequential access
+			assertEquals(random.nextDouble(), segment.getDouble(pos), 0.0);
+		}
+	}
 
-			long seed = random.nextLong();
+	// ------------------------------------------------------------------------
+	//  Bulk Byte Movements
+	// ------------------------------------------------------------------------
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 8; i += 8) {
-				segment.putDouble(i, random.nextDouble());
-			}
+	@Test
+	public void testBulkBytePutExceptions() {
+		final MemorySegment segment = createSegment(pageSize);
 
-			random.setSeed(seed);
-			for (int i = 0; i <= pageSize - 8; i += 8) {
-				assertEquals(random.nextDouble(), segment.getDouble(i), 0.0);
-			}
+		byte[] bytes = new byte[pageSize / 4 + (pageSize%4)];
+		random.nextBytes(bytes);
 
-			// test expected correct behavior, random access
+		// wrong positions into memory segment
 
-			random.setSeed(seed);
-			boolean[] occupied = new boolean[pageSize];
+		try {
+			segment.put(-1, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 7);
+		try {
+			segment.put(-1, bytes, 4, 5);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-				if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3] ||
-						occupied[pos + 4] || occupied[pos + 5] || occupied[pos + 6] || occupied[pos + 7])
-				{
-					continue;
-				}
-				else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-					occupied[pos+2] = true;
-					occupied[pos+3] = true;
-					occupied[pos+4] = true;
-					occupied[pos+5] = true;
-					occupied[pos+6] = true;
-					occupied[pos+7] = true;
-				}
+		try {
+			segment.put(Integer.MIN_VALUE, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-				segment.putDouble(pos, random.nextDouble());
-			}
+		try {
+			segment.put(Integer.MIN_VALUE, bytes, 4, 5);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			random.setSeed(seed);
-			occupied = new boolean[pageSize];
+		try {
+			segment.put(pageSize, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			for (int i = 0; i < 1000; i++) {
-				int pos = random.nextInt(pageSize - 7);
+		try {
+			segment.put(pageSize, bytes, 6, 44);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-				if (occupied[pos] || occupied[pos + 1] || occupied[pos + 2] || occupied[pos + 3] ||
-						occupied[pos + 4] || occupied[pos + 5] || occupied[pos + 6] || occupied[pos + 7])
-				{
-					continue;
-				}
-				else {
-					occupied[pos] = true;
-					occupied[pos+1] = true;
-					occupied[pos+2] = true;
-					occupied[pos+3] = true;
-					occupied[pos+4] = true;
-					occupied[pos+5] = true;
-					occupied[pos+6] = true;
-					occupied[pos+7] = true;
-				}
+		try {
+			segment.put(pageSize - bytes.length + 1, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-				assertEquals(random.nextDouble(), segment.getDouble(pos), 0.0);
-			}
+		try {
+			segment.put(pageSize - 5, bytes, 3, 6);
+			fail("IndexOutOfBoundsException expected");
 		}
 		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+			assertTrue(e instanceof IndexOutOfBoundsException);
 		}
-	}
 
-	// ------------------------------------------------------------------------
-	//  Bulk Byte Movements
-	// ------------------------------------------------------------------------
+		try {
+			segment.put(Integer.MAX_VALUE, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.put(Integer.MAX_VALUE, bytes, 10, 20);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.put(Integer.MAX_VALUE - bytes.length + 1, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.put(Integer.MAX_VALUE - 11, bytes, 11, 11);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.put(3 * (pageSize / 4) + 1, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.put(3 * (pageSize / 4) + 2, bytes, 0, bytes.length - 1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.put(7 * (pageSize / 8) + 1, bytes, 0, bytes.length / 2);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		// wrong source array positions / lengths
+
+		try {
+			segment.put(0, bytes, -1, 1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.put(0, bytes, -1, bytes.length + 1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.put(0, bytes, Integer.MIN_VALUE, bytes.length);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.put(0, bytes, Integer.MAX_VALUE, bytes.length);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.put(0, bytes, Integer.MAX_VALUE - bytes.length + 1, bytes.length);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		// case where negative offset and negative index compensate each other
+		try {
+			segment.put(-2, bytes, -1, bytes.length / 2);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+	}
 
 	@Test
-	public void testBulkBytePutExceptions() {
+	public void testBulkByteGetExceptions() {
+		final MemorySegment segment = createSegment(pageSize);
+
+		byte[] bytes = new byte[pageSize / 4];
+
+		// wrong positions into memory segment
+
 		try {
-			final MemorySegment segment = createSegment(pageSize);
+			segment.get(-1, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			byte[] bytes = new byte[pageSize / 4 + (pageSize%4)];
-			random.nextBytes(bytes);
+		try {
+			segment.get(-1, bytes, 4, 5);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			// wrong positions into memory segment
+		try {
+			segment.get(Integer.MIN_VALUE, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.put(-1, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.get(Integer.MIN_VALUE, bytes, 4, 5);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.put(-1, bytes, 4, 5);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.get(pageSize, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.put(Integer.MIN_VALUE, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.get(pageSize, bytes, 6, 44);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.put(Integer.MIN_VALUE, bytes, 4, 5);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.get(pageSize - bytes.length + 1, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.put(pageSize, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.get(pageSize - 5, bytes, 3, 6);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.put(pageSize, bytes, 6, 44);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.get(Integer.MAX_VALUE, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
 
-			try {
-				segment.put(pageSize - bytes.length + 1, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		try {
+			segment.get(Integer.MAX_VALUE, bytes, 10, 20);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.get(Integer.MAX_VALUE - bytes.length + 1, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.get(Integer.MAX_VALUE - 11, bytes, 11, 11);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.get(3 * (pageSize / 4) + 1, bytes);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.get(3 * (pageSize / 4) + 2, bytes, 0, bytes.length - 1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.get(7 * (pageSize / 8) + 1, bytes, 0, bytes.length / 2);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		// wrong source array positions / lengths
+
+		try {
+			segment.get(0, bytes, -1, 1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.get(0, bytes, -1, bytes.length + 1);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.get(0, bytes, Integer.MIN_VALUE, bytes.length);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.get(0, bytes, Integer.MAX_VALUE, bytes.length);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		try {
+			segment.get(0, bytes, Integer.MAX_VALUE - bytes.length + 1, bytes.length);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+
+		// case where negative offset and negative index compensate each other
+		try {
+			segment.get(-2, bytes, -1, bytes.length / 2);
+			fail("IndexOutOfBoundsException expected");
+		}
+		catch (Exception e) {
+			assertTrue(e instanceof IndexOutOfBoundsException);
+		}
+	}
+
+	@Test
+	public void testBulkByteAccess() {
+		// test expected correct behavior with default offset / length
+		{
+			final MemorySegment segment = createSegment(pageSize);
+			long seed = random.nextLong();
 
-			try {
-				segment.put(pageSize - 5, bytes, 3, 6);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
+			random.setSeed(seed);
+			byte[] src = new byte[pageSize / 8];
+			for (int i = 0; i < 8; i++) {
+				random.nextBytes(src);
+				segment.put(i * (pageSize / 8), src);
 			}
 
-			try {
-				segment.put(Integer.MAX_VALUE, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+			random.setSeed(seed);
+			byte[] expected = new byte[pageSize / 8];
+			byte[] actual = new byte[pageSize / 8];
+			for (int i = 0; i < 8; i++) {
+				random.nextBytes(expected);
+				segment.get(i * (pageSize / 8), actual);
 
-			try {
-				segment.put(Integer.MAX_VALUE, bytes, 10, 20);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
+				assertArrayEquals(expected, actual);
 			}
+		}
 
-			try {
-				segment.put(Integer.MAX_VALUE - bytes.length + 1, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// test expected correct behavior with specific offset / length
+		{
+			final MemorySegment segment = createSegment(pageSize);
+			byte[] expected = new byte[pageSize];
+			random.nextBytes(expected);
 
-			try {
-				segment.put(Integer.MAX_VALUE - 11, bytes, 11, 11);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
+			for (int i = 0; i < 16; i++) {
+				segment.put(i * (pageSize / 16), expected, i * (pageSize / 16),
+						pageSize / 16);
 			}
 
-			try {
-				segment.put(3 * (pageSize / 4) + 1, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
+			byte[] actual = new byte[pageSize];
+			for (int i = 0; i < 16; i++) {
+				segment.get(i * (pageSize / 16), actual, i * (pageSize / 16),
+						pageSize / 16);
 			}
 
-			try {
-				segment.put(3 * (pageSize / 4) + 2, bytes, 0, bytes.length - 1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+			assertArrayEquals(expected, actual);
+		}
 
-			try {
-				segment.put(7 * (pageSize / 8) + 1, bytes, 0, bytes.length / 2);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// put segments of various lengths to various positions
+		{
+			final MemorySegment segment = createSegment(pageSize);
+			byte[] expected = new byte[pageSize];
 
-			// wrong source array positions / lengths
+			for (int i = 0; i < 200; i++) {
+				int numBytes = random.nextInt(pageSize - 10) + 1;
+				int pos = random.nextInt(pageSize - numBytes + 1);
 
-			try {
-				segment.put(0, bytes, -1, 1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+				byte[] data = new byte[(random.nextInt(3) + 1) * numBytes];
+				int dataStartPos = random.nextInt(data.length - numBytes + 1);
 
-			try {
-				segment.put(0, bytes, -1, bytes.length + 1);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+				random.nextBytes(data);
 
-			try {
-				segment.put(0, bytes, Integer.MIN_VALUE, bytes.length);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+				// copy to the expected
+				System.arraycopy(data, dataStartPos, expected, pos, numBytes);
 
-			try {
-				segment.put(0, bytes, Integer.MAX_VALUE, bytes.length);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
+				// put to the memory segment
+				segment.put(pos, data, dataStartPos, numBytes);
 			}
 
-			try {
-				segment.put(0, bytes, Integer.MAX_VALUE - bytes.length + 1, bytes.length);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+			byte[] validation = new byte[pageSize];
+			segment.get(0, validation);
 
-			// case where negative offset and negative index compensate each other
-			try {
-				segment.put(-2, bytes, -1, bytes.length / 2);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+			assertArrayEquals(expected, validation);
 		}
-	}
 
-	@Test
-	public void testBulkByteGetExceptions() {
-		try {
+		// get segments with various contents
+		{
 			final MemorySegment segment = createSegment(pageSize);
+			byte[] contents = new byte[pageSize];
+			random.nextBytes(contents);
+			segment.put(0, contents);
 
-			byte[] bytes = new byte[pageSize / 4];
+			for (int i = 0; i < 200; i++) {
+				int numBytes = random.nextInt(pageSize / 8) + 1;
+				int pos = random.nextInt(pageSize - numBytes + 1);
 
-			// wrong positions into memory segment
+				byte[] data = new byte[(random.nextInt(3) + 1) * numBytes];
+				int dataStartPos = random.nextInt(data.length - numBytes + 1);
 
-			try {
-				segment.get(-1, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+				segment.get(pos, data, dataStartPos, numBytes);
 
-			try {
-				segment.get(-1, bytes, 4, 5);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
+				byte[] expected = Arrays.copyOfRange(contents, pos, pos + numBytes);
+				byte[] validation = Arrays.copyOfRange(data, dataStartPos, dataStartPos + numBytes);
+				assertArrayEquals(expected, validation);
 			}
+		}
+	}
 
-			try {
-				segment.get(Integer.MIN_VALUE, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+	// ------------------------------------------------------------------------
+	//  Writing / Reading to/from DataInput / DataOutput
+	// ------------------------------------------------------------------------
 
-			try {
-				segment.get(Integer.MIN_VALUE, bytes, 4, 5);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+	@Test
+	public void testDataInputOutput() throws IOException {
+		MemorySegment seg = createSegment(pageSize);
+		byte[] contents = new byte[pageSize];
+		random.nextBytes(contents);
+		seg.put(0, contents);
 
-			try {
-				segment.get(pageSize, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		ByteArrayOutputStream buffer = new ByteArrayOutputStream(pageSize);
+		DataOutputStream out = new DataOutputStream(buffer);
 
-			try {
-				segment.get(pageSize, bytes, 6, 44);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// write the segment in chunks into the stream
+		int pos = 0;
+		while (pos < pageSize) {
+			int len = random.nextInt(200);
+			len = Math.min(len, pageSize - pos);
+			seg.get(out, pos, len);
+			pos += len;
+		}
 
-			try {
-				segment.get(pageSize - bytes.length + 1, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// verify that we wrote the same bytes
+		byte[] result = buffer.toByteArray();
+		assertArrayEquals(contents, result);
 
-			try {
-				segment.get(pageSize - 5, bytes, 3, 6);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// re-read the bytes into a new memory segment
+		MemorySegment reader = createSegment(pageSize);
+		DataInputStream in = new DataInputStream(new ByteArrayInputStream(result));
 
-			try {
-				segment.get(Integer.MAX_VALUE, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		pos = 0;
+		while (pos < pageSize) {
+			int len = random.nextInt(200);
+			len = Math.min(len, pageSize - pos);
+			reader.put(in, pos, len);
+			pos += len;
+		}
 
-			try {
-				segment.get(Integer.MAX_VALUE, bytes, 10, 20);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		byte[] targetBuffer = new byte[pageSize];
+		reader.get(0, targetBuffer);
 
-			try {
-				segment.get(Integer.MAX_VALUE - bytes.length + 1, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		assertArrayEquals(contents, targetBuffer);
+	}
 
-			try {
-				segment.get(Integer.MAX_VALUE - 11, bytes, 11, 11);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+	@Test
+	public void testDataInputOutputOutOfBounds() {
+		final int segmentSize = 52;
 
-			try {
-				segment.get(3 * (pageSize / 4) + 1, bytes);
-				fail("IndexOutOfBoundsException expected");
-			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
+		// segment with random contents
+		MemorySegment seg = createSegment(segmentSize);
+		byte[] bytes = new byte[segmentSize];
+		random.nextBytes(bytes);
+		seg.put(0, bytes);
+
+		// out of bounds when writing
+		{
+			DataOutputStream out = new DataOutputStream(new ByteArrayOutputStream());
 
 			try {
-				segment.get(3 * (pageSize / 4) + 2, bytes, 0, bytes.length - 1);
+				seg.get(out, -1, segmentSize / 2);
 				fail("IndexOutOfBoundsException expected");
 			}
 			catch (Exception e) {
@@ -1576,17 +1742,15 @@ public abstract class MemorySegmentTestBase {
 			}
 
 			try {
-				segment.get(7 * (pageSize / 8) + 1, bytes, 0, bytes.length / 2);
+				seg.get(out, segmentSize, segmentSize / 2);
 				fail("IndexOutOfBoundsException expected");
 			}
 			catch (Exception e) {
 				assertTrue(e instanceof IndexOutOfBoundsException);
 			}
 
-			// wrong source array positions / lengths
-
 			try {
-				segment.get(0, bytes, -1, 1);
+				seg.get(out, -segmentSize, segmentSize / 2);
 				fail("IndexOutOfBoundsException expected");
 			}
 			catch (Exception e) {
@@ -1594,7 +1758,7 @@ public abstract class MemorySegmentTestBase {
 			}
 
 			try {
-				segment.get(0, bytes, -1, bytes.length + 1);
+				seg.get(out, Integer.MIN_VALUE, segmentSize / 2);
 				fail("IndexOutOfBoundsException expected");
 			}
 			catch (Exception e) {
@@ -1602,15 +1766,20 @@ public abstract class MemorySegmentTestBase {
 			}
 
 			try {
-				segment.get(0, bytes, Integer.MIN_VALUE, bytes.length);
+				seg.get(out, Integer.MAX_VALUE, segmentSize / 2);
 				fail("IndexOutOfBoundsException expected");
 			}
 			catch (Exception e) {
 				assertTrue(e instanceof IndexOutOfBoundsException);
 			}
+		}
+
+		// out of bounds when reading
+		{
+			DataInputStream in = new DataInputStream(new ByteArrayInputStream(new byte[segmentSize]));
 
 			try {
-				segment.get(0, bytes, Integer.MAX_VALUE, bytes.length);
+				seg.put(in, -1, segmentSize / 2);
 				fail("IndexOutOfBoundsException expected");
 			}
 			catch (Exception e) {
@@ -1618,345 +1787,91 @@ public abstract class MemorySegmentTestBase {
 			}
 
 			try {
-				segment.get(0, bytes, Integer.MAX_VALUE - bytes.length + 1, bytes.length);
+				seg.put(in, segmentSize, segmentSize / 2);
 				fail("IndexOutOfBoundsException expected");
 			}
 			catch (Exception e) {
 				assertTrue(e instanceof IndexOutOfBoundsException);
 			}
 
-			// case where negative offset and negative index compensate each other
 			try {
-				segment.get(-2, bytes, -1, bytes.length / 2);
+				seg.put(in, -segmentSize, segmentSize / 2);
 				fail("IndexOutOfBoundsException expected");
 			}
-			catch (Exception e) {
-				assertTrue(e instanceof IndexOutOfBoundsException);
-			}
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		}
-	}
-
-	@Test
-	public void testBulkByteAccess() {
-		try {
-			// test expected correct behavior with default offset / length
-			{
-				final MemorySegment segment = createSegment(pageSize);
-				long seed = random.nextLong();
-
-				random.setSeed(seed);
-				byte[] src = new byte[pageSize / 8];
-				for (int i = 0; i < 8; i++) {
-					random.nextBytes(src);
-					segment.put(i * (pageSize / 8), src);
-				}
-
-				random.setSeed(seed);
-				byte[] expected = new byte[pageSize / 8];
-				byte[] actual = new byte[pageSize / 8];
-				for (int i = 0; i < 8; i++) {
-					random.nextBytes(expected);
-					segment.get(i * (pageSize / 8), actual);
-
-					assertArrayEquals(expected, actual);
-				}
-			}
-
-			// test expected correct behavior with specific offset / length
-			{
-				final MemorySegment segment = createSegment(pageSize);
-				byte[] expected = new byte[pageSize];
-				random.nextBytes(expected);
-
-				for (int i = 0; i < 16; i++) {
-					segment.put(i * (pageSize / 16), expected, i * (pageSize / 16),
-							pageSize / 16);
-				}
-
-				byte[] actual = new byte[pageSize];
-				for (int i = 0; i < 16; i++) {
-					segment.get(i * (pageSize / 16), actual, i * (pageSize / 16),
-							pageSize / 16);
-				}
-
-				assertArrayEquals(expected, actual);
-			}
-			
-			// put segments of various lengths to various positions
-			{
-				final MemorySegment segment = createSegment(pageSize);
-				byte[] expected = new byte[pageSize];
-				
-				for (int i = 0; i < 200; i++) {
-					int numBytes = random.nextInt(pageSize - 10) + 1;
-					int pos = random.nextInt(pageSize - numBytes + 1);
-					
-					byte[] data = new byte[(random.nextInt(3) + 1) * numBytes];
-					int dataStartPos = random.nextInt(data.length - numBytes + 1);
-					
-					random.nextBytes(data);
-					
-					// copy to the expected
-					System.arraycopy(data, dataStartPos, expected, pos, numBytes);
-					
-					// put to the memory segment
-					segment.put(pos, data, dataStartPos, numBytes);
-				}
-				
-				byte[] validation = new byte[pageSize];
-				segment.get(0, validation);
-				
-				assertArrayEquals(expected, validation);
-			}
-			
-			// get segments with various contents
-			{
-				final MemorySegment segment = createSegment(pageSize);
-				byte[] contents = new byte[pageSize];
-				random.nextBytes(contents);
-				segment.put(0, contents);
-
-				for (int i = 0; i < 200; i++) {
-					int numBytes = random.nextInt(pageSize / 8) + 1;
-					int pos = random.nextInt(pageSize - numBytes + 1);
-
-					byte[] data = new byte[(random.nextInt(3) + 1) * numBytes];
-					int dataStartPos = random.nextInt(data.length - numBytes + 1);
-
-					segment.get(pos, data, dataStartPos, numBytes);
-					
-					byte[] expected = Arrays.copyOfRange(contents, pos, pos + numBytes);
-					byte[] validation = Arrays.copyOfRange(data, dataStartPos, dataStartPos + numBytes);
-					assertArrayEquals(expected, validation);
-				}
-			}
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
-		}
-	}
-
-	// ------------------------------------------------------------------------
-	//  Writing / Reading to/from DataInput / DataOutput
-	// ------------------------------------------------------------------------
-
-	@Test
-	public void testDataInputOutput() {
-		try {
-			MemorySegment seg = createSegment(pageSize);
-			byte[] contents = new byte[pageSize];
-			random.nextBytes(contents);
-			seg.put(0, contents);
-
-			ByteArrayOutputStream buffer = new ByteArrayOutputStream(pageSize);
-			DataOutputStream out = new DataOutputStream(buffer);
-
-			// write the segment in chunks into the stream
-			int pos = 0;
-			while (pos < pageSize) {
-				int len = random.nextInt(200);
-				len = Math.min(len, pageSize - pos);
-				seg.get(out, pos, len);
-				pos += len;
-			}
-
-			// verify that we wrote the same bytes
-			byte[] result = buffer.toByteArray();
-			assertArrayEquals(contents, result);
-
-			// re-read the bytes into a new memory segment
-			MemorySegment reader = createSegment(pageSize);
-			DataInputStream in = new DataInputStream(new ByteArrayInputStream(result));
+			catch (Exception e) {
+				assertTrue(e instanceof IndexOutOfBoundsException);
+			}
 
-			pos = 0;
-			while (pos < pageSize) {
-				int len = random.nextInt(200);
-				len = Math.min(len, pageSize - pos);
-				reader.put(in, pos, len);
-				pos += len;
+			try {
+				seg.put(in, Integer.MIN_VALUE, segmentSize / 2);
+				fail("IndexOutOfBoundsException expected");
+			}
+			catch (Exception e) {
+				assertTrue(e instanceof IndexOutOfBoundsException);
 			}
 
-			byte[] targetBuffer = new byte[pageSize];
-			reader.get(0, targetBuffer);
-			
-			assertArrayEquals(contents, targetBuffer);
-		}
-		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+			try {
+				seg.put(in, Integer.MAX_VALUE, segmentSize / 2);
+				fail("IndexOutOfBoundsException expected");
+			}
+			catch (Exception e) {
+				assertTrue(e instanceof IndexOutOfBoundsException);
+			}
 		}
 	}
 
 	@Test
-	public void testDataInputOutputOutOfBounds() {
-		try {
-			final int segmentSize = 52;
-			
-			// segment with random contents
-			MemorySegment seg = createSegment(segmentSize);
-			byte[] bytes = new byte[segmentSize];
-			random.nextBytes(bytes);
-			seg.put(0, bytes);
-			
-			// out of bounds when writing
-			{
-				DataOutputStream out = new DataOutputStream(new ByteArrayOutputStream());
-					
-				try {
-					seg.get(out, -1, segmentSize / 2);
-					fail("IndexOutOfBoundsException expected");
-				}
-				catch (Exception e) {
-					assertTrue(e instanceof IndexOutOfBoundsException);
-				}
-	
-				try {
-					seg.get(out, segmentSize, segmentSize / 2);
-					fail("IndexOutOfBoundsException expected");
-				}
-				catch (Exception e) {
-					assertTrue(e instanceof IndexOutOfBoundsException);
-				}
-	
-				try {
-					seg.get(out, -segmentSize, segmentSize / 2);
-					fail("IndexOutOfBoundsException expected");
-				}
-				catch (Exception e) {
-					assertTrue(e instanceof IndexOutOfBoundsException);
-				}
-	
-				try {
-					seg.get(out, Integer.MIN_VALUE, segmentSize / 2);
-					fail("IndexOutOfBoundsException expected");
-				}
-				catch (Exception e) {
-					assertTrue(e instanceof IndexOutOfBoundsException);
-				}
-	
-				try {
-					seg.get(out, Integer.MAX_VALUE, segmentSize / 2);
-					fail("IndexOutOfBoundsException expected");
-				}
-				catch (Exception e) {
-					assertTrue(e instanceof IndexOutOfBoundsException);
-				}
-			}
-
-			// out of bounds when reading
-			{
-				DataInputStream in = new DataInputStream(new ByteArrayInputStream(new byte[segmentSize]));
-
-				try {
-					seg.put(in, -1, segmentSize / 2);
-					fail("IndexOutOfBoundsException expected");
-				}
-				catch (Exception e) {
-					assertTrue(e instanceof IndexOutOfBoundsException);
-				}
+	public void testDataInputOutputStreamUnderflowOverflow() throws IOException {
+		final int segmentSize = 1337;
 
-				try {
-					seg.put(in, segmentSize, segmentSize / 2);
-					fail("IndexOutOfBoundsException expected");
-				}
-				catch (Exception e) {
-					assertTrue(e instanceof IndexOutOfBoundsException);
-				}
+		// segment with random contents
+		MemorySegment seg = createSegment(segmentSize);
+		byte[] bytes = new byte[segmentSize];
+		random.nextBytes(bytes);
+		seg.put(0, bytes);
 
-				try {
-					seg.put(in, -segmentSize, segmentSize / 2);
-					fail("IndexOutOfBoundsException expected");
-				}
-				catch (Exception e) {
-					assertTrue(e instanceof IndexOutOfBoundsException);
-				}
+		// a stream that we cannot fully write to
+		DataOutputStream out = new DataOutputStream(new OutputStream() {
 
-				try {
-					seg.put(in, Integer.MIN_VALUE, segmentSize / 2);
-					fail("IndexOutOfBoundsException expected");
-				}
-				catch (Exception e) {
-					assertTrue(e instanceof IndexOutOfBoundsException);
+			int bytesSoFar = 0;
+			@Override
+			public void write(int b) throws IOException {
+				bytesSoFar++;
+				if (bytesSoFar > segmentSize / 2) {
+					throw new IOException("overflow");
 				}
+			}
+		});
 
-				try {
-					seg.put(in, Integer.MAX_VALUE, segmentSize / 2);
-					fail("IndexOutOfBoundsException expected");
-				}
-				catch (Exception e) {
-					assertTrue(e instanceof IndexOutOfBoundsException);
-				}
+		// write the segment in chunks into the stream
+		try {
+			int pos = 0;
+			while (pos < pageSize) {
+				int len = random.nextInt(segmentSize / 10);
+				len = Math.min(len, pageSize - pos);
+				seg.get(out, pos, len);
+				pos += len;
 			}
+			fail("Should fail with an IOException");
 		}
-		catch (Exception e) {
-			e.printStackTrace();
-			fail(e.getMessage());
+		catch (IOException e) {
+			// expected
 		}
-	}
-
-	@Test
-	public void testDataInputOutputStreamUnderflowOverflow() {
-		try {
-			final int segmentSize = 1337;
-
-			// segment with random contents
-			MemorySegment seg = createSegment(segmentSize);
-			byte[] bytes = new byte[segmentSize];
-			random.nextBytes(bytes);
-			seg.put(0, bytes);
-			
-			// a stream that we cannot fully write to
-			DataOutputStream out = new DataOutputStream(new OutputStream() {
-	

<TRUNCATED>