Skip to content

Commit

Permalink
refactor: allow for invalid dimensions error on NewBoard
Browse files Browse the repository at this point in the history
  • Loading branch information
mroth committed May 18, 2024
1 parent d8221a9 commit f4da498
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 14 deletions.
11 changes: 6 additions & 5 deletions board.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,11 @@ type position struct{ x, y int }
// the center point.
//
// x 0→n, y 0↓n.
func NewBoard(x, y int) *Board {
func NewBoard(x, y int) (*Board, error) {
if x <= 0 || y <= 0 {
return nil, errors.New("invalid dimensions")
}

data := make([]uint8, x*y)

b := Board{
Expand All @@ -30,10 +34,7 @@ func NewBoard(x, y int) *Board {
}

err := b.setStartPos(x/2, y/2)
if err != nil {
panic(err) // should be unreachable in current usage
}
return &b
return &b, err
}

func (b *Board) setStartPos(x, y int) error {
Expand Down
66 changes: 58 additions & 8 deletions board_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,33 @@ import (
"testing"
)

func TestNewBoard(t *testing.T) {
type args struct {
x, y int
}
tests := []struct {
name string
args args
wantErr bool
}{
{args: args{x: 0, y: 0}, wantErr: true},
{args: args{x: 1, y: 0}, wantErr: true},
{args: args{x: 0, y: 1}, wantErr: true},
{args: args{x: 1, y: 1}, wantErr: false},
{args: args{x: -1, y: 1}, wantErr: true},
{args: args{x: 10, y: 10}, wantErr: false},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
_, err := NewBoard(tt.args.x, tt.args.y)
if (err != nil) != tt.wantErr {
t.Errorf("NewBoard(%v, %v) error = %v, wantErr %v", tt.args.x, tt.args.y, err, tt.wantErr)
return
}
})
}
}

func TestBoard_Write(t *testing.T) {
type state struct {
data []uint8
Expand Down Expand Up @@ -50,7 +77,10 @@ func TestBoard_Write(t *testing.T) {
}
for _, tt := range tests {
t.Run(base64.RawStdEncoding.EncodeToString(tt.fingerprint), func(t *testing.T) {
b := NewBoard(tt.dimX, tt.dimY)
b, err := NewBoard(tt.dimX, tt.dimY)
if err != nil {
t.Fatal(err)
}
gotN, err := b.Write(tt.fingerprint)
// check for error (always false currently, just there for io.Writer
if (err != nil) != tt.wantErr {
Expand Down Expand Up @@ -108,8 +138,16 @@ func TestBoard_Render(t *testing.T) {
filename := strings.Join([]string{slug, specifier, "txt"}, ".")
path := filepath.Join("testdata", filename)

board := NewBoard(rc.dimX, rc.dimY)
_, _ = board.Write(dc)
board, err := NewBoard(rc.dimX, rc.dimY)
if err != nil {
t.Fatal(err)
}

_, err = board.Write(dc)
if err != nil {
t.Fatal(err)
}

got := board.Render(rc.tiles)
if rc.armor {
got = Armor(got)
Expand Down Expand Up @@ -165,12 +203,12 @@ func BenchmarkNewBoard(b *testing.B) {
b.ReportAllocs()
b.Run("10x10", func(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = NewBoard(10, 10)
_, _ = NewBoard(10, 10)
}
})
b.Run("17x9", func(b *testing.B) {
for i := 0; i < b.N; i++ {
_ = NewBoard(17, 9)
_, _ = NewBoard(17, 9)
}
})
}
Expand All @@ -180,15 +218,23 @@ func BenchmarkBoard_Write(b *testing.B) {
b.SetBytes(int64(len(data)))
b.ReportAllocs()

board := NewBoard(17, 9)
board, err := NewBoard(17, 9)
if err != nil {
b.Fatal(err)
}

for i := 0; i < b.N; i++ {
board.Write(data)
}
}

func BenchmarkBoard_Render(b *testing.B) {
board, err := NewBoard(17, 9)
if err != nil {
b.Fatal(err)
}

data := []byte{0x9b, 0x4c, 0x7b, 0xce, 0x7a, 0xbd, 0x0a, 0x13, 0x61, 0xfb, 0x17, 0xc2, 0x06, 0x12, 0x0c, 0xed}
board := NewBoard(17, 9)
board.Write(data)

for _, ts := range BundledTileSets {
Expand All @@ -202,8 +248,12 @@ func BenchmarkBoard_Render(b *testing.B) {
}

func BenchmarkArmor(b *testing.B) {
board, err := NewBoard(17, 9)
if err != nil {
b.Fatal(err)
}

data := []byte{0x9b, 0x4c, 0x7b, 0xce, 0x7a, 0xbd, 0x0a, 0x13, 0x61, 0xfb, 0x17, 0xc2, 0x06, 0x12, 0x0c, 0xed}
board := NewBoard(17, 9)
board.Write(data)
raw := board.Render(SSHTiles)

Expand Down
6 changes: 5 additions & 1 deletion example/fcaddr/fcaddr.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,11 @@ func main() {
fmt.Printf("decoded: 0x%x (%v bytes) / checksum: 0x%x (%v bytes)\n", hsh, len(hsh), checksum, len(checksum))

// display!
board := randomart.NewBoard(int(*width), int(*height))
board, err := randomart.NewBoard(int(*width), int(*height))
if err != nil {
log.Fatal(err)
}

board.Write((hsh))
fmt.Printf("%s", board.Render(tileset))
}
Expand Down

0 comments on commit f4da498

Please sign in to comment.