Codebase list go-qrcode / 055956d9-a9f4-4497-8632-5018d3f7a00c/main symbol_test.go
055956d9-a9f4-4497-8632-5018d3f7a00c/main

Tree @055956d9-a9f4-4497-8632-5018d3f7a00c/main (Download .tar.gz)

symbol_test.go @055956d9-a9f4-4497-8632-5018d3f7a00c/mainraw · history · blame

// go-qrcode
// Copyright 2014 Tom Harwood

package qrcode

import "testing"

func TestSymbolBasic(t *testing.T) {
	size := 10
	quietZoneSize := 4

	m := 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")
			}

			value := 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 {
		s := newSymbol(len(test.pattern[0]), 4)
		s.set2dPattern(0, 0, test.pattern)

		penalty1 := s.penalty1()
		penalty2 := s.penalty2()
		penalty3 := s.penalty3()
		penalty4 := s.penalty4()

		ok := 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)
		}
	}
}