From 6c7886fb1715795853d953889e63d89c83829479 Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Wed, 05 Mar 2014 13:38:23 +0000
Subject: [PATCH] ByteStringBuilder.java: Added ByteStringBuilder(ByteSequence) and setByte(int, byte).

---
 opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java         |   34 +++++++++++
 opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/ByteStringBuilderTestCase.java |  114 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 148 insertions(+), 0 deletions(-)

diff --git a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java
index c03563c..65de162 100755
--- a/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java
+++ b/opendj-sdk/opendj-core/src/main/java/org/forgerock/opendj/ldap/ByteStringBuilder.java
@@ -285,6 +285,19 @@
     }
 
     /**
+     * Creates a new byte string builder with the content of the provided
+     * ByteSequence. Its capacity is set to the length of the provided
+     * ByteSequence.
+     *
+     * @param bs
+     *            The ByteSequence to copy
+     */
+    public ByteStringBuilder(final ByteSequence bs) {
+        this(bs.length());
+        bs.copyTo(this);
+    }
+
+    /**
      * Appends the provided byte to this byte string builder.
      *
      * @param b
@@ -923,6 +936,27 @@
     }
 
     /**
+     * Sets the byte value at the specified index.
+     * <p>
+     * An index ranges from zero to {@code length() - 1}. The first byte value
+     * of the sequence is at index zero, the next at index one, and so on, as
+     * for array indexing.
+     *
+     * @param index
+     *            The index of the byte to be set.
+     * @param b
+     *            The byte to set on this byte string builder.
+     * @throws IndexOutOfBoundsException
+     *             If the index argument is negative or not less than length().
+     */
+    public void setByte(final int index, final byte b) {
+        if (index >= length || index < 0) {
+            throw new IndexOutOfBoundsException();
+        }
+        buffer[index] = b;
+    }
+
+    /**
      * Sets the length of this byte string builder.
      * <p>
      * If the <code>newLength</code> argument is less than the current length,
diff --git a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/ByteStringBuilderTestCase.java b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/ByteStringBuilderTestCase.java
index 1f472ad..e94ee06 100644
--- a/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/ByteStringBuilderTestCase.java
+++ b/opendj-sdk/opendj-core/src/test/java/org/forgerock/opendj/ldap/ByteStringBuilderTestCase.java
@@ -293,4 +293,118 @@
                     _(0x00), _(0x00), _(0x00), _(0x84), _(0xFF), _(0xFF),
                     _(0xFF), _(0xFF) } }, };
     }
+
+    @Test
+    public void testCopyCtor() {
+        final ByteStringBuilder builder = new ByteStringBuilder(400);
+        builder.append("this is a ByteString");
+        final ByteString orig = builder.toByteString();
+        final ByteString copy = new ByteStringBuilder(orig).toByteString();
+        Assert.assertEquals(copy, orig);
+        Assert.assertEquals(copy.length(), builder.length());
+    }
+
+    @Test
+    public void testSetByte() {
+        final ByteStringBuilder builder = new ByteStringBuilder();
+        builder.append("this is a ByteString");
+        builder.setByte(2, _('a'));
+        builder.setByte(3, _('t'));
+        Assert.assertEquals(builder.toByteString().toString(), "that is a ByteString");
+    }
+
+    @Test(expectedExceptions = { IndexOutOfBoundsException.class })
+    public void testSetByteAtInvalidLowerIndex() {
+        final ByteStringBuilder builder = new ByteStringBuilder();
+        builder.setByte(-1, _(0));
+    }
+
+    @Test(expectedExceptions = { IndexOutOfBoundsException.class })
+    public void testSetByteAtInvalidUpperIndex() {
+        final ByteStringBuilder builder = new ByteStringBuilder();
+        builder.setByte(builder.length(), _(0));
+    }
+
+    @Test
+    public void testSetLength() {
+        final ByteStringBuilder builder = new ByteStringBuilder();
+        builder.append("this is a ByteString");
+        builder.setLength(builder.length() - 16);
+        Assert.assertEquals(builder.toString(), "this");
+        builder.setLength(builder.length() + 1);
+        Assert.assertEquals(builder.toString(), "this\u0000");
+    }
+
+    @Test(expectedExceptions = { IndexOutOfBoundsException.class })
+    public void testSetInvalidLength() {
+        new ByteStringBuilder().setLength(-1);
+    }
+
+    @Test
+    public void testAppendNullCharArray() {
+        final ByteStringBuilder builder = new ByteStringBuilder();
+        builder.append((char[]) null);
+        Assert.assertTrue(builder.isEmpty());
+    }
+
+    @Test
+    public void testAppendNullString() {
+        final ByteStringBuilder builder = new ByteStringBuilder();
+        builder.append((String) null);
+        Assert.assertTrue(builder.isEmpty());
+    }
+
+    @Test
+    public void testAppendNonAsciiCharArray() {
+        final ByteStringBuilder builder = new ByteStringBuilder();
+        builder.append(new char[] { 'œ', 'Œ' });
+        Assert.assertEquals(builder.toString(), "œŒ");
+    }
+
+    @Test
+    public void testAppendNonAsciiString() {
+        final ByteStringBuilder builder = new ByteStringBuilder();
+        builder.append("œŒ");
+        Assert.assertEquals(builder.toString(), "œŒ");
+    }
+
+    @Test
+    public void testByteStringBuilderCompareTo() {
+        final ByteString orig = ByteString.valueOf("this is a ByteString");
+        final ByteStringBuilder builder = new ByteStringBuilder(orig);
+        Assert.assertEquals(builder.compareTo(builder), 0);
+        Assert.assertEquals(builder.compareTo(orig), 0);
+        Assert.assertEquals(orig.compareTo(builder), 0);
+    }
+
+    @Test
+    public void testSubSequenceCompareTo() {
+        final ByteString orig = ByteString.valueOf("this is a ByteString");
+        final ByteStringBuilder builder = new ByteStringBuilder(orig);
+        final ByteSequence subSequence = builder.subSequence(0, 4);
+        Assert.assertEquals(subSequence.compareTo(subSequence), 0);
+        Assert.assertTrue(subSequence.compareTo(orig) < 0);
+        Assert.assertTrue(orig.compareTo(subSequence) > 0);
+    }
+
+    @Test
+    public void testSubSequenceEqualsAndHashCode() {
+        final ByteString orig = ByteString.valueOf("this is a ByteString");
+        final ByteStringBuilder builder = new ByteStringBuilder(orig);
+        final ByteSequence subSequence = builder.subSequence(0, builder.length());
+        final ByteSequence subSequence2 = builder.subSequence(0, builder.length());
+        Assert.assertTrue(subSequence.hashCode() != 0);
+        Assert.assertTrue(subSequence.equals(subSequence));
+        Assert.assertTrue(subSequence.equals(subSequence2));
+        Assert.assertTrue(subSequence.equals(builder));
+        Assert.assertFalse(subSequence.equals(null));
+    }
+
+    @Test
+    public void testSubSequenceIsEmpty() {
+        final ByteStringBuilder builder = new ByteStringBuilder();
+        Assert.assertTrue(builder.subSequence(0, builder.length()).isEmpty());
+        builder.append("This is a ByteString");
+        Assert.assertFalse(builder.subSequence(0, builder.length()).isEmpty());
+    }
 }

--
Gitblit v1.10.0