Files
questshock/modding/hacked/ss1/serial/PositioningEncoder_test.go
T

162 lines
5.2 KiB
Go

package serial_test
import (
"io"
"testing"
"github.com/inkyblackness/hacked/ss1/serial"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
)
type PositioningEncoderSuite struct {
suite.Suite
coder *serial.PositioningEncoder
store *serial.ByteStore
}
func TestPositioningEncoderSuite(t *testing.T) {
suite.Run(t, new(PositioningEncoderSuite))
}
func (suite *PositioningEncoderSuite) SetupTest() {
suite.store = serial.NewByteStore()
suite.coder = serial.NewPositioningEncoder(suite.store)
}
func (suite *PositioningEncoderSuite) TestImplementsPositioningCoderInterface() {
instance := interface{}(suite.coder)
_, ok := instance.(serial.PositioningCoder)
assert.True(suite.T(), ok)
}
func (suite *PositioningEncoderSuite) TestCurPosReturnsCurrentOffset() {
suite.coder.Code(uint32(0))
assert.Equal(suite.T(), uint32(4), suite.coder.CurPos())
}
func (suite *PositioningEncoderSuite) TestSetCurPosRepositionsWritePointer() {
suite.coder.Code(uint32(0))
suite.coder.SetCurPos(0)
suite.coder.Code(uint32(0x13243546))
result := suite.store.Data()
assert.Equal(suite.T(), []byte{0x46, 0x35, 0x24, 0x13}, result)
}
func (suite *PositioningEncoderSuite) TestFirstErrorBySetCurPos() {
var target errorBuffer
suite.coder = serial.NewPositioningEncoder(&target)
suite.coder.Code(uint32(0))
target.errorOnNextCall = true
suite.coder.SetCurPos(0)
assert.EqualError(suite.T(), suite.coder.FirstError(), "errorBuffer on call number 2")
}
func (suite *PositioningEncoderSuite) TestSetCurPosDoesNothingOnPreviousError() {
var target errorBuffer
suite.coder = serial.NewPositioningEncoder(&target)
target.errorOnNextCall = true
suite.coder.Code(uint32(0))
target.errorOnNextCall = true
suite.coder.SetCurPos(0)
assert.Equal(suite.T(), target.callCounter, 1)
assert.EqualError(suite.T(), suite.coder.FirstError(), "errorBuffer on call number 1")
}
func (suite *PositioningEncoderSuite) TestCurPosIsNotChangedOnSetError() {
var target errorBuffer
suite.coder = serial.NewPositioningEncoder(&target)
target.errorOnNextCall = true
suite.coder.SetCurPos(4)
assert.Equal(suite.T(), uint32(0), suite.coder.CurPos())
}
func (suite *PositioningEncoderSuite) TestCurPosIsRelativeToConstructionTime() {
_, _ = suite.store.Write([]byte{0x01, 0x02, 0x03})
assert.Equal(suite.T(), uint32(0), suite.coder.CurPos(), "CurPos should be zero at the start")
suite.coder.Code(uint16(0xAAAA))
suite.coder.SetCurPos(1)
suite.coder.Code(byte(0xCC))
result := suite.store.Data()
assert.Equal(suite.T(), []byte{0x01, 0x02, 0x03, 0xAA, 0xCC}, result, "SetCurPos did not work relative to original start")
}
func (suite *PositioningEncoderSuite) TestImplementsSeekerInterface() {
instance := interface{}(suite.coder)
_, ok := instance.(io.Seeker)
assert.True(suite.T(), ok)
}
func (suite *PositioningEncoderSuite) TestSeekReturnsErrorForWrongWhence() {
pos, err := suite.coder.Seek(1, 1234)
assert.Equal(suite.T(), int64(0), pos, "zero position should be returned")
assert.EqualError(suite.T(), err, "seek: invalid whence")
}
func (suite *PositioningEncoderSuite) TestSeekAbsolute() {
suite.coder.Code(uint32(0))
pos, err := suite.coder.Seek(1, io.SeekStart)
assert.Nil(suite.T(), err, "no error expected")
assert.Equal(suite.T(), int64(1), pos, "invalid position returned")
suite.coder.Code(uint16(0xAABB))
result := suite.store.Data()
assert.Equal(suite.T(), []byte{0x00, 0xBB, 0xAA, 0x00}, result)
assert.Equal(suite.T(), uint32(3), suite.coder.CurPos(), "should update current position")
}
func (suite *PositioningEncoderSuite) TestSeekRelative() {
suite.coder.Code(uint32(0))
pos, err := suite.coder.Seek(-1, io.SeekCurrent)
assert.Equal(suite.T(), int64(3), pos, "should return new position")
assert.Nil(suite.T(), err, "should have no error")
suite.coder.Code(uint16(0xAABB))
result := suite.store.Data()
assert.Equal(suite.T(), []byte{0x00, 0x00, 0x00, 0xBB, 0xAA}, result)
assert.Equal(suite.T(), uint32(5), suite.coder.CurPos(), "should update current position")
}
func (suite *PositioningEncoderSuite) TestSeekDoesNothingOnPreviousError() {
var target errorBuffer
suite.coder = serial.NewPositioningEncoder(&target)
target.errorOnNextCall = true
suite.coder.Code(uint32(0))
_, _ = suite.coder.Seek(0, io.SeekStart)
assert.Equal(suite.T(), target.callCounter, 1)
assert.EqualError(suite.T(), suite.coder.FirstError(), "errorBuffer on call number 1")
}
func (suite *PositioningEncoderSuite) TestSeekRegistersReturnedError() {
var target errorBuffer
suite.coder = serial.NewPositioningEncoder(&target)
suite.coder.Code(uint32(0))
target.errorOnNextCall = true
_, _ = suite.coder.Seek(1, io.SeekStart)
pos, err := suite.coder.Seek(1, io.SeekStart)
assert.Equal(suite.T(), int64(4), pos, "Should return old position value for seek")
assert.EqualError(suite.T(), err, "errorBuffer on call number 2")
assert.EqualError(suite.T(), suite.coder.FirstError(), "errorBuffer on call number 2", "should set first error")
}
func (suite *PositioningEncoderSuite) TestSeekReturnsErrorForSeekBeforeStart() {
pos, err := suite.coder.Seek(-1, io.SeekStart)
assert.Equal(suite.T(), int64(0), pos, "Should return old position value for seek")
assert.EqualError(suite.T(), err, "seek: seeking before start")
}