82 lines
2.1 KiB
Go
82 lines
2.1 KiB
Go
package input
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// testdata/qr: segno 1.6.6 byte-mode symbols, padding fixed to ISO 7.4.10.
|
|
func TestEncodeQRMatchesReference(t *testing.T) {
|
|
files, err := filepath.Glob("testdata/qr/*.txt")
|
|
if err != nil || len(files) < 6 {
|
|
t.Fatalf("reference files: %v %v", files, err)
|
|
}
|
|
levels := map[string]QRLevel{"L": QRLow, "M": QRMedium, "Q": QRQuartile, "H": QRHigh}
|
|
for _, f := range files {
|
|
b, err := os.ReadFile(f)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
lines := strings.Split(strings.TrimSpace(string(b)), "\n")
|
|
head := strings.Fields(lines[0])
|
|
version, _ := strconv.Atoi(head[0])
|
|
mask, _ := strconv.Atoi(head[2])
|
|
data, err := hex.DecodeString(head[3])
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
m, err := EncodeQR(data, levels[head[1]])
|
|
if err != nil {
|
|
t.Fatalf("%s: %v", f, err)
|
|
}
|
|
if m.Version != version || m.Mask != mask {
|
|
t.Errorf("%s: version %d mask %d, want %d %d", f, m.Version, m.Mask, version, mask)
|
|
continue
|
|
}
|
|
for y, row := range lines[1:] {
|
|
for x, ch := range row {
|
|
if m.Modules[y][x] != (ch == '1') {
|
|
t.Fatalf("%s: module (%d,%d) differs", f, x, y)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestQRCodeAlignmentPositions(t *testing.T) {
|
|
for v, want := range map[int]string{1: "[]", 2: "[6 18]", 7: "[6 22 38]", 32: "[6 34 60 86 112 138]", 40: "[6 30 58 86 114 142 170]"} {
|
|
if got := fmtInts(qrCodeAlignment(v)); got != want {
|
|
t.Errorf("version %d: %s, want %s", v, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func fmtInts(v []int) string {
|
|
s := make([]string, len(v))
|
|
for i, n := range v {
|
|
s[i] = strconv.Itoa(n)
|
|
}
|
|
return "[" + strings.Join(s, " ") + "]"
|
|
}
|
|
|
|
func TestEncodeQRLimits(t *testing.T) {
|
|
m, err := EncodeQR(make([]byte, 2953), QRLow)
|
|
if err != nil || m.Version != 40 || m.Size() != 177 {
|
|
t.Fatalf("largest L symbol: %v %v", m.Version, err)
|
|
}
|
|
if _, err := EncodeQR(make([]byte, 2954), QRLow); err == nil {
|
|
t.Fatal("2954 bytes fit at L")
|
|
}
|
|
if _, err := EncodeQR(make([]byte, 1274), QRHigh); err == nil {
|
|
t.Fatal("1274 bytes fit at H")
|
|
}
|
|
m, err = EncodeQR(nil, QRHigh)
|
|
if err != nil || m.Version != 1 {
|
|
t.Fatalf("empty data: %v %v", m.Version, err)
|
|
}
|
|
}
|