100 lines
2.6 KiB
Go
100 lines
2.6 KiB
Go
package compression_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/inkyblackness/hacked/ss1/content/movie/internal/compression"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/suite"
|
|
)
|
|
|
|
type BitstreamWriterSuite struct {
|
|
suite.Suite
|
|
|
|
writer compression.BitstreamWriter
|
|
}
|
|
|
|
func TestBitstreamWriter(t *testing.T) {
|
|
suite.Run(t, new(BitstreamWriterSuite))
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) SetupTest() {
|
|
suite.writer = compression.BitstreamWriter{}
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) TestWriteMoreThan32BitsPanics() {
|
|
assert.Panics(suite.T(), func() { suite.whenWriting(33, 0) })
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) TestWriteZeroBitsIsIgnored() {
|
|
suite.whenWriting(0, 1)
|
|
suite.thenBufferShouldBe([]byte{})
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) TestWriteOneBit() {
|
|
suite.whenWriting(1, 1)
|
|
suite.thenBufferShouldBe([]byte{0x80})
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) TestWriteEightBits() {
|
|
suite.whenWriting(8, 0xEF)
|
|
suite.thenBufferShouldBe([]byte{0xEF})
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) TestWriteTwelveBits() {
|
|
suite.whenWriting(12, 0xFEF)
|
|
suite.thenBufferShouldBe([]byte{0xFE, 0xF0})
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) TestWriteOneBitTwice() {
|
|
suite.givenWritten(1, 1)
|
|
suite.whenWriting(1, 1)
|
|
suite.thenBufferShouldBe([]byte{0xC0})
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) TestWriteArbitrary1() {
|
|
suite.givenWritten(1, 1)
|
|
suite.givenWritten(10, 0x2AA)
|
|
suite.whenWriting(16, 0xFFFF)
|
|
suite.thenBufferShouldBe([]byte{0xD5, 0x5F, 0xFF, 0xE0}) // [1 10 10101] [010 11111] [11111111] [111 00000]
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) TestWriteArbitrary2() {
|
|
suite.givenWritten(1, 1)
|
|
suite.givenWritten(10, 0x2AA)
|
|
suite.whenWriting(24, 0xFFFFFF)
|
|
suite.thenBufferShouldBe([]byte{0xD5, 0x5F, 0xFF, 0xFF, 0xE0}) // extension of Arbitrary1
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) TestWriteLessBitsThanGiven() {
|
|
suite.givenWritten(4, 0x0)
|
|
suite.whenWriting(8, 0xFFF)
|
|
suite.thenBufferShouldBe([]byte{0x0F, 0xF0})
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) TestWriteArbitrary3() {
|
|
suite.givenWritten(1, 1)
|
|
suite.givenWritten(10, 0x2AA)
|
|
suite.whenWriting(32, 0xFFFFFFFF)
|
|
suite.thenBufferShouldBe([]byte{0xD5, 0x5F, 0xFF, 0xFF, 0xFF, 0xE0}) // extension of Arbitrary1+2
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) givenWritten(bits uint, value uint32) {
|
|
suite.writer.Write(bits, value)
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) whenWriting(bits uint, value uint32) {
|
|
suite.writer.Write(bits, value)
|
|
}
|
|
|
|
func (suite *BitstreamWriterSuite) thenBufferShouldBe(expected []byte) {
|
|
suite.T().Helper()
|
|
buf := suite.writer.Buffer()
|
|
if len(expected) == 0 {
|
|
assert.Equal(suite.T(), 0, len(buf))
|
|
} else {
|
|
assert.Equal(suite.T(), expected, buf)
|
|
}
|
|
}
|