|
|
@@ -0,0 +1,333 @@
|
|
|
+// go-qrcode
|
|
|
+// Copyright 2014 Tom Harwood
|
|
|
+
|
|
|
+package qrcode
|
|
|
+
|
|
|
+import "testing"
|
|
|
+
|
|
|
+func TestSymbolBasic(t *testing.T) {
|
|
|
+ var size int = 10
|
|
|
+ var quietZoneSize int = 4
|
|
|
+
|
|
|
+ var m *symbol = newSymbol(size, quietZoneSize)
|
|
|
+
|
|
|
+ if m.size != size+quietZoneSize*2 {
|
|
|
+ t.Errorf("Symbol size is %d, expected %d", m.size, size+quietZoneSize*2)
|
|
|
+ }
|
|
|
+
|
|
|
+ for i := 0; i < size; i++ {
|
|
|
+ for j := 0; j < size; j++ {
|
|
|
+
|
|
|
+ v := m.get(i, j)
|
|
|
+
|
|
|
+ if v != false {
|
|
|
+ t.Errorf("New symbol not empty")
|
|
|
+ }
|
|
|
+
|
|
|
+ if !m.empty(i, j) {
|
|
|
+ t.Errorf("New symbol is not empty")
|
|
|
+ }
|
|
|
+
|
|
|
+ var value bool = i*j%2 == 0
|
|
|
+ m.set(i, j, value)
|
|
|
+
|
|
|
+ v = m.get(i, j)
|
|
|
+
|
|
|
+ if v != value {
|
|
|
+ t.Errorf("Symbol ignores set bits")
|
|
|
+ }
|
|
|
+
|
|
|
+ if m.empty(i, j) {
|
|
|
+ t.Errorf("Symbol ignores set bits")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func TestSymbolPenalties(t *testing.T) {
|
|
|
+ tests := []struct {
|
|
|
+ pattern [][]bool
|
|
|
+ expectedPenalty1 int
|
|
|
+ expectedPenalty2 int
|
|
|
+ expectedPenalty3 int
|
|
|
+ expectedPenalty4 int
|
|
|
+ }{
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0},
|
|
|
+ {b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0},
|
|
|
+ {b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0},
|
|
|
+ },
|
|
|
+ 0, // No adjacent modules of same color.
|
|
|
+ 0, // No 2x2+ sized blocks.
|
|
|
+ 0, // No 1:1:3:1:1 pattern.
|
|
|
+ -1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0},
|
|
|
+ {b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0},
|
|
|
+ {b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0},
|
|
|
+ },
|
|
|
+ 0, // 5 adjacent modules of same colour, score = 0.
|
|
|
+ 0, // No 2x2+ sized blocks.
|
|
|
+ 0, // No 1:1:3:1:1 pattern.
|
|
|
+ -1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b0, b0, b0},
|
|
|
+ {b1, b0, b1, b0, b1, b0},
|
|
|
+ {b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0},
|
|
|
+ {b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0},
|
|
|
+ },
|
|
|
+ 4, // 6 adjacent modules of same colour, score = 3 + (6-5)
|
|
|
+ 0, // No 2x2+ sized blocks.
|
|
|
+ 0, // No 1:1:3:1:1 pattern.
|
|
|
+ -1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b1, b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b0, b0, b0, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b0, b0, b0, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b0, b0, b0, b0, b0},
|
|
|
+ },
|
|
|
+ 28, // 3+(7-5) + 3+(6-5) + 3+(6-5) + 3+(6-5) + 3+(7-5) + 3+(7-5) = 28
|
|
|
+ 0, // No 2x2+ sized blocks.
|
|
|
+ 0, // No 1:1:3:1:1 pattern.
|
|
|
+ -1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b1, b0, b1},
|
|
|
+ {b0, b0, b1, b0, b1, b0},
|
|
|
+ {b0, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b0, b1, b1, b1, b0},
|
|
|
+ {b0, b1, b1, b1, b0, b1},
|
|
|
+ {b1, b0, b1, b0, b1, b0},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ 6, // 3*(2-1)*(2-1) + 3(2-1)*(2-1)
|
|
|
+ 0, // No 1:1:3:1:1 pattern.
|
|
|
+ -1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b0, b0, b1},
|
|
|
+ {b0, b0, b0, b0, b0, b1},
|
|
|
+ {b0, b0, b0, b0, b0, b1},
|
|
|
+ {b0, b0, b0, b0, b0, b1},
|
|
|
+ {b0, b0, b0, b0, b0, b1},
|
|
|
+ {b0, b0, b0, b0, b0, b1},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ 60, // 3 * (5-1) * (6-1)
|
|
|
+ 0, // No 1:1:3:1:1 pattern.
|
|
|
+ -1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b0, b0, b1},
|
|
|
+ {b0, b0, b0, b0, b0, b1},
|
|
|
+ {b1, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b1, b0, b1, b0, b1},
|
|
|
+ {b1, b1, b0, b1, b0, b1},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ 21, // 3*(5-1)*(2-1) + 3*(2-1)*(4-1) = 3*4 + 3*3
|
|
|
+ 0, // No 1:1:3:1:1 pattern.
|
|
|
+ -1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ {b0, b0, b0, b0, b1, b0, b1, b1, b1, b0, b1, b0},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ 480, // 12* 1:1:3:1:1 patterns, 12 * 40.
|
|
|
+ -1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b1, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b1, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b1, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b1, b1, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b1, b1, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b1, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b1, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b1, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ 80, // 2* 1:1:3:1:1 patterns, 2 * 40.
|
|
|
+ -1,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ 100, // 10 * (10 steps of 5% deviation from 50% black/white).
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ 100, // 10 * (10 steps of 5% deviation from 50% black/white).
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ 0, // Exactly 50%/50% black/white.
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ 20, // 10 * (2 steps of 5% deviation towards white).
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ 30, // 10 * (3 steps of 5% deviation towards white).
|
|
|
+ },
|
|
|
+ {
|
|
|
+ [][]bool{
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b0},
|
|
|
+ {b0, b0, b0, b0, b0, b0, b0, b0, b0, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ {b1, b1, b1, b1, b1, b1, b1, b1, b1, b1},
|
|
|
+ },
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ -1,
|
|
|
+ 30, // 10 * (3 steps of 5% deviation towards white).
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ for i, test := range tests {
|
|
|
+ var s *symbol = newSymbol(len(test.pattern[0]), 4)
|
|
|
+ s.set2dPattern(0, 0, test.pattern)
|
|
|
+
|
|
|
+ penalty1 := s.penalty1()
|
|
|
+ penalty2 := s.penalty2()
|
|
|
+ penalty3 := s.penalty3()
|
|
|
+ penalty4 := s.penalty4()
|
|
|
+
|
|
|
+ var ok bool = true
|
|
|
+ if test.expectedPenalty1 != -1 && test.expectedPenalty1 != penalty1 {
|
|
|
+ ok = false
|
|
|
+ }
|
|
|
+ if test.expectedPenalty2 != -1 && test.expectedPenalty2 != penalty2 {
|
|
|
+ ok = false
|
|
|
+ }
|
|
|
+ if test.expectedPenalty3 != -1 && test.expectedPenalty3 != penalty3 {
|
|
|
+ ok = false
|
|
|
+ }
|
|
|
+ if test.expectedPenalty4 != -1 && test.expectedPenalty4 != penalty4 {
|
|
|
+ ok = false
|
|
|
+ }
|
|
|
+
|
|
|
+ if !ok {
|
|
|
+ t.Fatalf("Penalty test #%d p1=%d, p2=%d, p3=%d, p4=%d (expected p1=%d, p2=%d, p3=%d, p4=%d)", i, penalty1, penalty2, penalty3, penalty4,
|
|
|
+ test.expectedPenalty1, test.expectedPenalty2, test.expectedPenalty3,
|
|
|
+ test.expectedPenalty4)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|