summaryrefslogtreecommitdiff
path: root/vendor/github.com/skip2/go-qrcode/encoder_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/skip2/go-qrcode/encoder_test.go')
-rw-r--r--vendor/github.com/skip2/go-qrcode/encoder_test.go328
1 files changed, 328 insertions, 0 deletions
diff --git a/vendor/github.com/skip2/go-qrcode/encoder_test.go b/vendor/github.com/skip2/go-qrcode/encoder_test.go
new file mode 100644
index 0000000..1bf74be
--- /dev/null
+++ b/vendor/github.com/skip2/go-qrcode/encoder_test.go
@@ -0,0 +1,328 @@
+// go-qrcode
+// Copyright 2014 Tom Harwood
+
+package qrcode
+
+import (
+ "fmt"
+ "reflect"
+ "testing"
+
+ bitset "github.com/skip2/go-qrcode/bitset"
+)
+
+func TestClassifyDataMode(t *testing.T) {
+ type Test struct {
+ }
+
+ tests := []struct {
+ data []byte
+ actual []segment
+ }{
+ {
+ []byte{0x30},
+ []segment{
+ {
+ dataModeNumeric,
+ []byte{0x30},
+ },
+ },
+ },
+ {
+ []byte{0x30, 0x41, 0x42, 0x43, 0x20, 0x00, 0xf0, 0xf1, 0xf2, 0x31},
+ []segment{
+ {
+ dataModeNumeric,
+ []byte{0x30},
+ },
+ {
+ dataModeAlphanumeric,
+ []byte{0x41, 0x42, 0x43, 0x20},
+ },
+ {
+ dataModeByte,
+ []byte{0x00, 0xf0, 0xf1, 0xf2},
+ },
+ {
+ dataModeNumeric,
+ []byte{0x31},
+ },
+ },
+ },
+ }
+
+ for _, test := range tests {
+ encoder := newDataEncoder(dataEncoderType1To9)
+ encoder.encode(test.data)
+
+ if !reflect.DeepEqual(test.actual, encoder.actual) {
+ t.Errorf("Got %v, expected %v", encoder.actual, test.actual)
+ }
+ }
+}
+
+func TestByteModeLengthCalculations(t *testing.T) {
+ tests := []struct {
+ dataEncoderType dataEncoderType
+ dataMode dataMode
+ numSymbols int
+ expectedLength int
+ }{}
+
+ for i, test := range tests {
+ encoder := newDataEncoder(test.dataEncoderType)
+ var resultLength int
+
+ resultLength, err := encoder.encodedLength(test.dataMode, test.numSymbols)
+
+ if test.expectedLength == -1 {
+ if err == nil {
+ t.Errorf("Test %d: got length %d, expected error", i, resultLength)
+ }
+ } else if resultLength != test.expectedLength {
+ t.Errorf("Test %d: got length %d, expected length %d", i, resultLength,
+ test.expectedLength)
+ }
+ }
+}
+
+func TestSingleModeEncodings(t *testing.T) {
+ tests := []struct {
+ dataEncoderType dataEncoderType
+ dataMode dataMode
+ data string
+ expected *bitset.Bitset
+ }{
+ {
+ dataEncoderType1To9,
+ dataModeNumeric,
+ "01234567",
+ bitset.NewFromBase2String("0001 0000001000 0000001100 0101011001 1000011"),
+ },
+ {
+ dataEncoderType1To9,
+ dataModeAlphanumeric,
+ "AC-42",
+ bitset.NewFromBase2String("0010 000000101 00111001110 11100111001 000010"),
+ },
+ {
+ dataEncoderType1To9,
+ dataModeByte,
+ "123",
+ bitset.NewFromBase2String("0100 00000011 00110001 00110010 00110011"),
+ },
+ {
+ dataEncoderType10To26,
+ dataModeByte,
+ "123",
+ bitset.NewFromBase2String("0100 00000000 00000011 00110001 00110010 00110011"),
+ },
+ {
+ dataEncoderType27To40,
+ dataModeByte,
+ "123",
+ bitset.NewFromBase2String("0100 00000000 00000011 00110001 00110010 00110011"),
+ },
+ }
+
+ for _, test := range tests {
+ encoder := newDataEncoder(test.dataEncoderType)
+ encoded := bitset.New()
+
+ encoder.encodeDataRaw([]byte(test.data), test.dataMode, encoded)
+
+ if !test.expected.Equals(encoded) {
+ t.Errorf("For %s got %s, expected %s", test.data, encoded.String(),
+ test.expected.String())
+ }
+ }
+}
+
+type testModeSegment struct {
+ dataMode dataMode
+ numChars int
+}
+
+func TestOptimiseEncoding(t *testing.T) {
+ tests := []struct {
+ dataEncoderType dataEncoderType
+ actual []testModeSegment
+ optimised []testModeSegment
+ }{
+ // Coalescing multiple segments.
+ {
+ dataEncoderType1To9,
+ []testModeSegment{
+ {dataModeAlphanumeric, 1}, // length = 4 + 9 + 6 = 19 bits
+ {dataModeNumeric, 1}, // length = 4 + 10 + 4 = 18 bits
+ {dataModeAlphanumeric, 1}, // 19 bits.
+ {dataModeNumeric, 1}, // 18 bits.
+ {dataModeAlphanumeric, 1}, // 19 bits.
+ // total = 93 bits.
+ },
+ []testModeSegment{
+ {dataModeAlphanumeric, 5}, // length = 4 + 9 + 22 + 6 = 41.
+ },
+ },
+ // Coalesing not necessary.
+ {
+ dataEncoderType1To9,
+ []testModeSegment{
+ {dataModeAlphanumeric, 1},
+ {dataModeNumeric, 20},
+ },
+ []testModeSegment{
+ {dataModeAlphanumeric, 1},
+ {dataModeNumeric, 20},
+ },
+ },
+ // Switch to more general dataMode.
+ {
+ dataEncoderType1To9,
+ []testModeSegment{
+ {dataModeAlphanumeric, 1},
+ {dataModeByte, 1},
+ {dataModeNumeric, 1},
+ },
+ []testModeSegment{
+ {dataModeAlphanumeric, 1},
+ {dataModeByte, 2},
+ },
+ },
+ // https://www.google.com/123
+ // BBBBBAAABBBABBBBBBABBBANNN
+ {
+ dataEncoderType1To9,
+ []testModeSegment{
+ {dataModeByte, 5},
+ {dataModeAlphanumeric, 3},
+ {dataModeByte, 3},
+ {dataModeAlphanumeric, 1},
+ {dataModeByte, 6},
+ {dataModeAlphanumeric, 1},
+ {dataModeAlphanumeric, 4},
+ {dataModeNumeric, 3},
+ },
+ []testModeSegment{
+ {dataModeByte, 23},
+ {dataModeNumeric, 3},
+ },
+ },
+ // HTTPS://WWW.GOOGLE.COM/123
+ // AAAAAAAAAAAAAAAAAAAAAAANNN
+ {
+ dataEncoderType1To9,
+ []testModeSegment{
+ {dataModeAlphanumeric, 23},
+ {dataModeNumeric, 3},
+ },
+ []testModeSegment{
+ {dataModeAlphanumeric, 26},
+ },
+ },
+ {
+ dataEncoderType27To40,
+ []testModeSegment{
+ {dataModeByte, 1},
+ {dataModeNumeric, 1},
+ {dataModeByte, 1},
+ {dataModeNumeric, 1},
+ {dataModeByte, 1},
+ {dataModeNumeric, 1},
+ {dataModeByte, 1},
+ {dataModeNumeric, 1},
+ },
+ []testModeSegment{
+ {dataModeByte, 8},
+ },
+ },
+ }
+
+ for _, test := range tests {
+ numTotalChars := 0
+ for _, v := range test.actual {
+ numTotalChars += v.numChars
+ }
+
+ data := make([]byte, numTotalChars)
+
+ i := 0
+ for _, v := range test.actual {
+ for j := 0; j < v.numChars; j++ {
+ switch v.dataMode {
+ case dataModeNumeric:
+ data[i] = '1'
+ case dataModeAlphanumeric:
+ data[i] = 'A'
+ case dataModeByte:
+ data[i] = '#'
+ default:
+ t.Fatal("Unrecognised data mode")
+ }
+
+ i++
+ }
+ }
+
+ encoder := newDataEncoder(test.dataEncoderType)
+
+ _, err := encoder.encode(data)
+
+ if err != nil {
+ t.Errorf("Got %s, expected valid encoding", err.Error())
+ } else {
+ ok := true
+
+ if len(encoder.optimised) != len(test.optimised) {
+ ok = false
+ } else {
+ for i, s := range test.optimised {
+ if encoder.optimised[i].dataMode != s.dataMode ||
+ len(encoder.optimised[i].data) != s.numChars {
+ ok = false
+ break
+ }
+ }
+ }
+
+ if !ok {
+ t.Errorf("got %s, expected %s", segmentsString(encoder.optimised),
+ testModeSegmentsString(test.optimised))
+ }
+ }
+ }
+}
+
+func testModeSegmentsString(segments []testModeSegment) string {
+ result := "["
+
+ for i, segment := range segments {
+ if i > 0 {
+ result += ", "
+ }
+
+ result += fmt.Sprintf("%d*%s", segment.numChars,
+ dataModeString(segment.dataMode))
+ }
+
+ result += "]"
+
+ return result
+}
+
+func segmentsString(segments []segment) string {
+ result := "["
+
+ for i, segment := range segments {
+ if i > 0 {
+ result += ", "
+ }
+
+ result += fmt.Sprintf("%d*%s", len(segment.data),
+ dataModeString(segment.dataMode))
+ }
+
+ result += "]"
+
+ return result
+}