blob: 83a6d0cae7af3fc379a690bd74f88d8f0b0a0660 [file] [log] [blame]
// Copyright 2015 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package swizzle
import (
"bytes"
"math/rand"
"testing"
)
func TestBGRAShortInput(t *testing.T) {
const s = "012.456.89A.CDE.GHI.KLM.O"
testCases := []string{
0: "012.456.89A.CDE.GHI.KLM.O",
1: "210.456.89A.CDE.GHI.KLM.O",
2: "210.654.89A.CDE.GHI.KLM.O",
3: "210.654.A98.CDE.GHI.KLM.O",
4: "210.654.A98.EDC.GHI.KLM.O",
5: "210.654.A98.EDC.IHG.KLM.O",
6: "210.654.A98.EDC.IHG.MLK.O",
}
for i, want := range testCases {
b := []byte(s)
BGRA(b[:4*i])
got := string(b)
if got != want {
t.Errorf("i=%d: got %q, want %q", i, got, want)
}
changed := got != s
wantChanged := i != 0
if changed != wantChanged {
t.Errorf("i=%d: changed=%t, want %t", i, changed, wantChanged)
}
}
}
func TestBGRARandomInput(t *testing.T) {
r := rand.New(rand.NewSource(1))
fastBuf := make([]byte, 1024)
slowBuf := make([]byte, 1024)
for i := range fastBuf {
fastBuf[i] = uint8(r.Intn(256))
}
copy(slowBuf, fastBuf)
for i := 0; i < 100000; i++ {
o := r.Intn(len(fastBuf))
n := r.Intn(len(fastBuf)-o) &^ 0x03
BGRA(fastBuf[o : o+n])
pureGoBGRA(slowBuf[o : o+n])
if bytes.Equal(fastBuf, slowBuf) {
continue
}
for j := range fastBuf {
x := fastBuf[j]
y := slowBuf[j]
if x != y {
t.Fatalf("iter %d: swizzling [%d:%d+%d]: bytes differ at offset %d (aka %d+%d): %#02x vs %#02x",
i, o, o, n, j, o, j-o, x, y)
}
}
}
}
func pureGoBGRA(p []byte) {
if len(p)%4 != 0 {
return
}
for i := 0; i < len(p); i += 4 {
p[i+0], p[i+2] = p[i+2], p[i+0]
}
}
func benchmarkBGRA(b *testing.B, f func([]byte)) {
const w, h = 1920, 1080 // 1080p RGBA.
buf := make([]byte, 4*w*h)
b.ResetTimer()
for i := 0; i < b.N; i++ {
f(buf)
}
}
func BenchmarkBGRA(b *testing.B) { benchmarkBGRA(b, BGRA) }
func BenchmarkPureGoBGRA(b *testing.B) { benchmarkBGRA(b, pureGoBGRA) }