Commit 32dcd80b by kimvde Committed by Oliver Woodman

Improve ParsableBitArray unit tests

PiperOrigin-RevId: 277744735
parent 981008f7
...@@ -18,7 +18,7 @@ package com.google.android.exoplayer2.util; ...@@ -18,7 +18,7 @@ package com.google.android.exoplayer2.util;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Before; import com.google.android.exoplayer2.testutil.TestUtil;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
...@@ -26,59 +26,108 @@ import org.junit.runner.RunWith; ...@@ -26,59 +26,108 @@ import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class) @RunWith(AndroidJUnit4.class)
public final class ParsableBitArrayTest { public final class ParsableBitArrayTest {
private static final byte[] TEST_DATA = new byte[] {0x3C, (byte) 0xD2, (byte) 0x5F, (byte) 0x01, @Test
(byte) 0xFF, (byte) 0x14, (byte) 0x60, (byte) 0x99}; public void testReadAllBytes() {
byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F);
ParsableBitArray testArray = new ParsableBitArray(testData);
byte[] bytesRead = new byte[testData.length];
private ParsableBitArray testArray; testArray.readBytes(bytesRead, 0, testData.length);
@Before assertThat(bytesRead).isEqualTo(testData);
public void setUp() { assertThat(testArray.getPosition()).isEqualTo(testData.length * 8);
testArray = new ParsableBitArray(TEST_DATA); assertThat(testArray.getBytePosition()).isEqualTo(testData.length);
} }
@Test @Test
public void testReadAllBytes() { public void testReadBitInSameByte() {
byte[] bytesRead = new byte[TEST_DATA.length]; byte[] testData = TestUtil.createByteArray(0, 0b00110000);
testArray.readBytes(bytesRead, 0, TEST_DATA.length); ParsableBitArray testArray = new ParsableBitArray(testData);
assertThat(bytesRead).isEqualTo(TEST_DATA); testArray.setPosition(10);
assertThat(testArray.getPosition()).isEqualTo(TEST_DATA.length * 8);
assertThat(testArray.getBytePosition()).isEqualTo(TEST_DATA.length); assertThat(testArray.readBit()).isTrue();
assertThat(testArray.readBit()).isTrue();
assertThat(testArray.readBit()).isFalse();
assertThat(testArray.readBit()).isFalse();
}
@Test
public void testReadBitInMultipleBytes() {
byte[] testData = TestUtil.createByteArray(1, 1 << 7);
ParsableBitArray testArray = new ParsableBitArray(testData);
testArray.setPosition(6);
assertThat(testArray.readBit()).isFalse();
assertThat(testArray.readBit()).isTrue();
assertThat(testArray.readBit()).isTrue();
assertThat(testArray.readBit()).isFalse();
}
@Test
public void testReadBits0Bits() {
byte[] testData = TestUtil.createByteArray(0x3C);
ParsableBitArray testArray = new ParsableBitArray(testData);
int result = testArray.readBits(0);
assertThat(result).isEqualTo(0);
}
@Test
public void testReadBitsByteAligned() {
byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F, 0x01);
ParsableBitArray testArray = new ParsableBitArray(testData);
testArray.readBits(8);
int result = testArray.readBits(18);
assertThat(result).isEqualTo(0xD25F << 2);
assertThat(testArray.getPosition()).isEqualTo(26);
} }
@Test @Test
public void testReadBit() { public void testReadBitsNonByteAligned() {
assertReadBitsToEnd(0); byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F);
ParsableBitArray testArray = new ParsableBitArray(testData);
testArray.readBits(3);
int result = testArray.readBits(14);
assertThat(result).isEqualTo((0x3C & 0b11111) << 9 | 0xD2 << 1 | 0x5F >> 7);
assertThat(testArray.getPosition()).isEqualTo(17);
} }
@Test @Test
public void testReadBits() { public void testReadBitsNegativeValue() {
assertThat(testArray.readBits(5)).isEqualTo(getTestDataBits(0, 5)); byte[] testData = TestUtil.createByteArray(0xF0, 0, 0, 0);
assertThat(testArray.readBits(0)).isEqualTo(getTestDataBits(5, 0)); ParsableBitArray testArray = new ParsableBitArray(testData);
assertThat(testArray.readBits(3)).isEqualTo(getTestDataBits(5, 3));
assertThat(testArray.readBits(16)).isEqualTo(getTestDataBits(8, 16)); int result = testArray.readBits(32);
assertThat(testArray.readBits(3)).isEqualTo(getTestDataBits(24, 3));
assertThat(testArray.readBits(18)).isEqualTo(getTestDataBits(27, 18)); assertThat(result).isEqualTo(0xF0000000);
assertThat(testArray.readBits(5)).isEqualTo(getTestDataBits(45, 5));
assertThat(testArray.readBits(14)).isEqualTo(getTestDataBits(50, 14));
} }
@Test @Test
public void testReadBitsToByteArray() { public void testReadBitsToByteArray() {
byte[] result = new byte[TEST_DATA.length]; byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F, 0x01, 0xFF, 0x14, 0x60, 0x99);
ParsableBitArray testArray = new ParsableBitArray(testData);
int numBytes = testData.length;
byte[] result = new byte[numBytes];
// Test read within byte boundaries. // Test read within byte boundaries.
testArray.readBits(result, 0, 6); testArray.readBits(result, 0, 6);
assertThat(result[0]).isEqualTo((byte) (TEST_DATA[0] & 0xFC)); assertThat(result[0]).isEqualTo((byte) (testData[0] & 0xFC));
// Test read across byte boundaries. // Test read across byte boundaries.
testArray.readBits(result, 0, 8); testArray.readBits(result, 0, 8);
assertThat(result[0]).isEqualTo( assertThat(result[0])
(byte) (((TEST_DATA[0] & 0x03) << 6) | ((TEST_DATA[1] & 0xFC) >> 2))); .isEqualTo((byte) (((testData[0] & 0x03) << 6) | ((testData[1] & 0xFC) >> 2)));
// Test reading across multiple bytes. // Test reading across multiple bytes.
testArray.readBits(result, 1, 50); testArray.readBits(result, 1, numBytes * 8 - 14);
for (int i = 1; i < 7; i++) { for (int i = 1; i < numBytes - 1; i++) {
assertThat(result[i]) assertThat(result[i])
.isEqualTo((byte) (((TEST_DATA[i] & 0x03) << 6) | ((TEST_DATA[i + 1] & 0xFC) >> 2))); .isEqualTo((byte) (((testData[i] & 0x03) << 6) | ((testData[i + 1] & 0xFC) >> 2)));
} }
assertThat(result[7]).isEqualTo((byte) ((TEST_DATA[7] & 0x03) << 6)); assertThat(result[numBytes - 1]).isEqualTo((byte) ((testData[numBytes - 1] & 0x03) << 6));
assertThat(testArray.bitsLeft()).isEqualTo(0); assertThat(testArray.bitsLeft()).isEqualTo(0);
// Test read last buffer byte across input data bytes. // Test read last buffer byte across input data bytes.
testArray.setPosition(31); testArray.setPosition(31);
...@@ -98,8 +147,8 @@ public final class ParsableBitArrayTest { ...@@ -98,8 +147,8 @@ public final class ParsableBitArrayTest {
// Test reading a number of bits divisible by 8. // Test reading a number of bits divisible by 8.
testArray.setPosition(0); testArray.setPosition(0);
testArray.readBits(result, 0, 16); testArray.readBits(result, 0, 16);
assertThat(result[0]).isEqualTo(TEST_DATA[0]); assertThat(result[0]).isEqualTo(testData[0]);
assertThat(result[1]).isEqualTo(TEST_DATA[1]); assertThat(result[1]).isEqualTo(testData[1]);
// Test least significant bits are unmodified. // Test least significant bits are unmodified.
result[1] = (byte) 0xFF; result[1] = (byte) 0xFF;
testArray.readBits(result, 0, 9); testArray.readBits(result, 0, 9);
...@@ -108,63 +157,79 @@ public final class ParsableBitArrayTest { ...@@ -108,63 +157,79 @@ public final class ParsableBitArrayTest {
} }
@Test @Test
public void testRead32BitsByteAligned() {
assertThat(testArray.readBits(32)).isEqualTo(getTestDataBits(0, 32));
assertThat(testArray.readBits(32)).isEqualTo(getTestDataBits(32, 32));
}
@Test
public void testRead32BitsNonByteAligned() {
assertThat(testArray.readBits(5)).isEqualTo(getTestDataBits(0, 5));
assertThat(testArray.readBits(32)).isEqualTo(getTestDataBits(5, 32));
}
@Test
public void testSkipBytes() { public void testSkipBytes() {
byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F, 0x01);
ParsableBitArray testArray = new ParsableBitArray(testData);
testArray.skipBytes(2); testArray.skipBytes(2);
assertReadBitsToEnd(16);
assertThat(testArray.readBits(8)).isEqualTo(0x5F);
} }
@Test @Test
public void testSkipBitsByteAligned() { public void testSkipBitsByteAligned() {
byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F, 0x01);
ParsableBitArray testArray = new ParsableBitArray(testData);
testArray.skipBits(16); testArray.skipBits(16);
assertReadBitsToEnd(16);
assertThat(testArray.readBits(8)).isEqualTo(0x5F);
} }
@Test @Test
public void testSkipBitsNonByteAligned() { public void testSkipBitsNonByteAligned() {
byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F, 0x01);
ParsableBitArray testArray = new ParsableBitArray(testData);
testArray.skipBits(5); testArray.skipBits(5);
assertReadBitsToEnd(5);
assertThat(testArray.readBits(11)).isEqualTo((0x3C & 0b111) << 8 | 0xD2);
} }
@Test @Test
public void testSetPositionByteAligned() { public void testSetPositionByteAligned() {
byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F, 0x01);
ParsableBitArray testArray = new ParsableBitArray(testData);
testArray.setPosition(16); testArray.setPosition(16);
assertReadBitsToEnd(16);
assertThat(testArray.readBits(8)).isEqualTo(0x5F);
} }
@Test @Test
public void testSetPositionNonByteAligned() { public void testSetPositionNonByteAligned() {
byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F, 0x01);
ParsableBitArray testArray = new ParsableBitArray(testData);
testArray.setPosition(5); testArray.setPosition(5);
assertReadBitsToEnd(5);
assertThat(testArray.readBits(11)).isEqualTo((0x3C & 0b111) << 8 | 0xD2);
} }
@Test @Test
public void testByteAlignFromNonByteAligned() { public void testByteAlignFromNonByteAligned() {
byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F, 0x01);
ParsableBitArray testArray = new ParsableBitArray(testData);
testArray.setPosition(11); testArray.setPosition(11);
testArray.byteAlign(); testArray.byteAlign();
assertThat(testArray.getBytePosition()).isEqualTo(2); assertThat(testArray.getBytePosition()).isEqualTo(2);
assertThat(testArray.getPosition()).isEqualTo(16); assertThat(testArray.getPosition()).isEqualTo(16);
assertReadBitsToEnd(16); assertThat(testArray.readBits(8)).isEqualTo(0x5F);
} }
@Test @Test
public void testByteAlignFromByteAligned() { public void testByteAlignFromByteAligned() {
byte[] testData = TestUtil.createByteArray(0x3C, 0xD2, 0x5F, 0x01);
ParsableBitArray testArray = new ParsableBitArray(testData);
testArray.setPosition(16); testArray.setPosition(16);
testArray.byteAlign(); // Should be a no-op. testArray.byteAlign(); // Should be a no-op.
assertThat(testArray.getBytePosition()).isEqualTo(2); assertThat(testArray.getBytePosition()).isEqualTo(2);
assertThat(testArray.getPosition()).isEqualTo(16); assertThat(testArray.getPosition()).isEqualTo(16);
assertReadBitsToEnd(16); assertThat(testArray.readBits(8)).isEqualTo(0x5F);
} }
@Test @Test
...@@ -184,8 +249,8 @@ public final class ParsableBitArrayTest { ...@@ -184,8 +249,8 @@ public final class ParsableBitArrayTest {
output.setPosition(12); output.setPosition(12);
output.putInt(0xFF, 8); output.putInt(0xFF, 8);
output.setPosition(8);
output.setPosition(8);
assertThat(output.readBits(16)).isEqualTo(0x0FF0); assertThat(output.readBits(16)).isEqualTo(0x0FF0);
} }
...@@ -224,8 +289,7 @@ public final class ParsableBitArrayTest { ...@@ -224,8 +289,7 @@ public final class ParsableBitArrayTest {
@Test @Test
public void testNoOverwriting() { public void testNoOverwriting() {
ParsableBitArray output = ParsableBitArray output =
new ParsableBitArray( new ParsableBitArray(TestUtil.createByteArray(0xFF, 0xFF, 0xFF, 0xFF, 0xFF));
new byte[] {(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff});
output.setPosition(1); output.setPosition(1);
output.putInt(0, 30); output.putInt(0, 30);
...@@ -234,28 +298,4 @@ public final class ParsableBitArrayTest { ...@@ -234,28 +298,4 @@ public final class ParsableBitArrayTest {
assertThat(output.readBits(32)).isEqualTo(0x80000001); assertThat(output.readBits(32)).isEqualTo(0x80000001);
} }
private void assertReadBitsToEnd(int expectedStartPosition) {
int position = testArray.getPosition();
assertThat(position).isEqualTo(expectedStartPosition);
for (int i = position; i < TEST_DATA.length * 8; i++) {
assertThat(testArray.readBit()).isEqualTo(getTestDataBit(i));
assertThat(testArray.getPosition()).isEqualTo(i + 1);
}
}
private static int getTestDataBits(int bitPosition, int length) {
int result = 0;
for (int i = 0; i < length; i++) {
result = result << 1;
if (getTestDataBit(bitPosition++)) {
result |= 0x1;
}
}
return result;
}
private static boolean getTestDataBit(int bitPosition) {
return (TEST_DATA[bitPosition / 8] & (0x80 >>> (bitPosition % 8))) != 0;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment