--- /dev/null
+package org.apache.lucene.util;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util.UnsafeByteArrayOutputStream;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class UnsafeByteArrayOutputStreamTest extends LuceneTestCase {
+
+ @Test
+ public void testSimpleWrite() throws IOException {
+ int length = 100;
+ byte[] buffer = new byte[length];
+ UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(buffer);
+
+ for (int i = 0; i < 100; i++) {
+ ubaos.write((byte) i);
+ }
+
+ byte[] result = ubaos.toByteArray();
+
+ assertEquals(length, ubaos.length());
+
+ for (int j = 0; j < length; ++j) {
+ assertEquals(result[j], j);
+ }
+ }
+
+ @Test
+ public void testArrayWrite() throws IOException {
+ int length = 100;
+ byte[] buffer = new byte[length];
+ UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(buffer);
+
+ for (int i = 0; i < 100; i++) {
+ ubaos.write((byte) i);
+ }
+
+ int length2 = 10;
+ byte[] buffer2 = new byte[length2];
+ for (int i = 0; i < length2; i++) {
+ buffer2[i] = (byte) (8 + i);
+ }
+
+ ubaos.write(buffer2);
+
+ byte[] result = ubaos.toByteArray();
+
+ assertEquals(length + length2, ubaos.length());
+
+ for (int j = 0; j < length; ++j) {
+ assertEquals(result[j], j);
+ }
+ for (int j = 0; j < length2; ++j) {
+ assertEquals(result[j + length], buffer2[j]);
+ }
+ }
+
+ @Test
+ public void testArrayWriteStartNotZero() throws IOException {
+ int length = 100;
+ byte[] buffer = new byte[length];
+ UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(buffer);
+
+ for (int i = 0; i < 100; i++) {
+ ubaos.write((byte) i);
+ }
+
+ int length2 = 1000;
+ byte[] buffer2 = new byte[length2];
+ for (int i = 0; i < length2; i++) {
+ buffer2[i] = (byte) (8 + i);
+ }
+
+ int length3 = 5;
+ int start = 2;
+ ubaos.write(buffer2, start, length3);
+
+ byte[] result = ubaos.toByteArray();
+
+ assertEquals(length + length3, ubaos.length());
+
+ for (int j = 0; j < length; ++j) {
+ assertEquals(result[j], j);
+ }
+ for (int j = 0; j < length3; ++j) {
+ assertEquals(result[j + length], buffer2[j + start]);
+ }
+ }
+
+ @Test
+ public void testBufferGrow() throws IOException {
+ int length = 100;
+ byte[] buffer = new byte[length / 10];
+ UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(buffer);
+
+ for (int i = 0; i < length; i++) {
+ ubaos.write((byte) i);
+ }
+
+ byte[] result = ubaos.toByteArray();
+
+ assertEquals(length, ubaos.length());
+
+ for (int j = 0; j < length; ++j) {
+ assertEquals(result[j], j);
+ }
+
+ buffer = ubaos.toByteArray();
+
+ int length2 = 10;
+ byte[] buffer2 = new byte[length2];
+ for (int i = 0; i < length2; i++) {
+ buffer2[i] = (byte) (8 + i);
+ }
+
+ ubaos.reInit(buffer2);
+ for (int i = 0; i < length2; i++) {
+ ubaos.write(7 + i);
+ }
+
+ byte[] result2 = ubaos.toByteArray();
+
+ assertEquals(length2, ubaos.length());
+
+ for (int j = 0; j < length2; ++j) {
+ assertEquals(result2[j], j + 7);
+ }
+
+ for (int i = 0; i < length; i++) {
+ assertEquals(buffer[i], i);
+ }
+ }
+
+ @Test
+ public void testStartPos() throws Exception {
+ byte[] buf = new byte[10];
+ for (int i = 0; i < buf.length; i++) {
+ buf[i] = (byte) i;
+ }
+
+ int startPos = 3;
+ UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream(buf, startPos);
+ int numValues = 5;
+ for (int i = 0; i < numValues; i++) {
+ ubaos.write((i + 1) * 2);
+ }
+
+ // the length of the buffer should be whatever was written after startPos
+ // and before that.
+ assertEquals("invalid buffer length", startPos + numValues, ubaos.length());
+
+ assertEquals("invalid startPos", startPos, ubaos.getStartPos());
+
+ byte[] bytes = ubaos.toByteArray();
+ for (int i = 0; i < startPos; i++) {
+ assertEquals(i, bytes[i]);
+ }
+
+ for (int i = startPos, j = 0; j < numValues; i++, j++) {
+ assertEquals((j + 1) * 2, bytes[i]);
+ }
+
+ for (int i = startPos + numValues; i < buf.length; i++) {
+ assertEquals(i, bytes[i]);
+ }
+
+ }
+
+ @Test
+ public void testDefaultCtor() throws Exception {
+ UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream();
+ int numValues = 5;
+ for (int i = 0; i < numValues; i++) {
+ ubaos.write(i);
+ }
+
+ assertEquals("invalid buffer length", numValues, ubaos.length());
+
+ byte[] bytes = ubaos.toByteArray();
+ for (int i = 0; i < numValues; i++) {
+ assertEquals(i, bytes[i]);
+ }
+ }
+
+ @Test(expected=IllegalArgumentException.class)
+ public void testIllegalBufferSize() throws Exception {
+ UnsafeByteArrayOutputStream ubaos = new UnsafeByteArrayOutputStream();
+ ubaos.reInit(new byte[0]);
+ }
+
+}