StrictBitVector implements BitVector { public static StrictBitVector concat(StrictBitVector... bitVectors) { int combinedBitLength = 0; for (StrictBitVector bitVector : bitVectors) { combinedBitLength += bitVector.getSize(); } byte[] combined = new byte[combinedBitLength / 8]; int offset = 0; for (StrictBitVector bitVector : bitVectors) { byte[] rawBytes = bitVector.toByteArray(); System.arraycopy(rawBytes, 0, combined, offset, rawBytes.length); offset += rawBytes.length; } return new StrictBitVector(combined); } StrictBitVector(byte[] bits);  StrictBitVector(int size);  StrictBitVector(int size, Drbg rand); boolean getBit(int index, boolean isBigEndian); @Override boolean getBit(int bit); void setBit(int index, boolean value, boolean isBigEndian); @Override void setBit(int index, boolean value); @Override int getSize(); @Override byte[] toByteArray(); String asBinaryString(); @Override void xor(BitVector other); @Override String toString(); @Override int hashCode(); @Override boolean equals(Object obj); static StrictBitVector concat(StrictBitVector... bitVectors);  }
@Test public void testConcatSameSizeBitVectors() { byte[] bitsOne = { (byte) 0xFF, (byte) 0x01, (byte) 0x00 }; StrictBitVector bvOne = new StrictBitVector(bitsOne); byte[] bitsTwo = { (byte) 0x01, (byte) 0x02, (byte) 0x03 }; StrictBitVector bvTwo = new StrictBitVector(bitsTwo); StrictBitVector actual = StrictBitVector.concat(bvOne, bvTwo); byte[] expectedBits = { (byte) 0xFF, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03 }; StrictBitVector expected = new StrictBitVector(expectedBits); assertEquals(expected, actual); }
@Test public void testConcatDifferentSizeBitVectors() { byte[] bitsOne = { (byte) 0xFF, (byte) 0x01, (byte) 0x00 }; StrictBitVector bvOne = new StrictBitVector(bitsOne); byte[] bitsTwo = { (byte) 0x01, (byte) 0x02 }; StrictBitVector bvTwo = new StrictBitVector(bitsTwo); StrictBitVector actual = StrictBitVector.concat(bvOne, bvTwo); byte[] expectedBits = { (byte) 0xFF, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x02 }; StrictBitVector expected = new StrictBitVector(expectedBits); assertEquals(expected, actual); }
@Test public void testConcatMultipleBitVectors() { byte[] bitsOne = { (byte) 0xFF, (byte) 0x01, (byte) 0x00 }; StrictBitVector bvOne = new StrictBitVector(bitsOne); byte[] bitsTwo = { (byte) 0x01, (byte) 0x02 }; StrictBitVector bvTwo = new StrictBitVector(bitsTwo); byte[] bitsThree = { (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06 }; StrictBitVector bvThree = new StrictBitVector(bitsThree); StrictBitVector actual = StrictBitVector.concat(bvOne, bvTwo, bvThree); byte[] expectedBits = { (byte) 0xFF, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06 }; StrictBitVector expected = new StrictBitVector(expectedBits); assertEquals(expected, actual); }
@Test public void testConcatSingleBitVector() { byte[] bitsOne = { (byte) 0xFF, (byte) 0x01, (byte) 0x00 }; StrictBitVector bvOne = new StrictBitVector(bitsOne); StrictBitVector actual = StrictBitVector.concat(bvOne); assertEquals(bvOne, actual); }
@Test public void testConcatEmptyBitVector() { byte[] bitsOne = {}; StrictBitVector bvOne = new StrictBitVector(bitsOne); byte[] bitsTwo = { (byte) 0x01, (byte) 0x02 }; StrictBitVector bvTwo = new StrictBitVector(bitsTwo); StrictBitVector actual = StrictBitVector.concat(bvOne, bvTwo); byte[] expectedBits = { (byte) 0x01, (byte) 0x02 }; StrictBitVector expected = new StrictBitVector(expectedBits); assertEquals(expected, actual); }