summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/mattermost/rsc/qr/coding/qr_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/mattermost/rsc/qr/coding/qr_test.go')
-rw-r--r--vendor/github.com/mattermost/rsc/qr/coding/qr_test.go133
1 files changed, 133 insertions, 0 deletions
diff --git a/vendor/github.com/mattermost/rsc/qr/coding/qr_test.go b/vendor/github.com/mattermost/rsc/qr/coding/qr_test.go
new file mode 100644
index 000000000..b8199bb51
--- /dev/null
+++ b/vendor/github.com/mattermost/rsc/qr/coding/qr_test.go
@@ -0,0 +1,133 @@
+// Copyright 2011 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 coding
+
+import (
+ "bytes"
+ "testing"
+
+ "github.com/mattermost/rsc/gf256"
+ "github.com/mattermost/rsc/qr/libqrencode"
+)
+
+func test(t *testing.T, v Version, l Level, text ...Encoding) bool {
+ s := ""
+ ty := libqrencode.EightBit
+ switch x := text[0].(type) {
+ case String:
+ s = string(x)
+ case Alpha:
+ s = string(x)
+ ty = libqrencode.Alphanumeric
+ case Num:
+ s = string(x)
+ ty = libqrencode.Numeric
+ }
+ key, err := libqrencode.Encode(libqrencode.Version(v), libqrencode.Level(l), ty, s)
+ if err != nil {
+ t.Errorf("libqrencode.Encode(%v, %v, %d, %#q): %v", v, l, ty, s, err)
+ return false
+ }
+ mask := (^key.Pixel[8][2]&1)<<2 | (key.Pixel[8][3]&1)<<1 | (^key.Pixel[8][4] & 1)
+ p, err := NewPlan(v, l, Mask(mask))
+ if err != nil {
+ t.Errorf("NewPlan(%v, L, %d): %v", v, err, mask)
+ return false
+ }
+ if len(p.Pixel) != len(key.Pixel) {
+ t.Errorf("%v: NewPlan uses %dx%d, libqrencode uses %dx%d", v, len(p.Pixel), len(p.Pixel), len(key.Pixel), len(key.Pixel))
+ return false
+ }
+ c, err := p.Encode(text...)
+ if err != nil {
+ t.Errorf("Encode: %v", err)
+ return false
+ }
+ badpix := 0
+Pixel:
+ for y, prow := range p.Pixel {
+ for x, pix := range prow {
+ pix &^= Black
+ if c.Black(x, y) {
+ pix |= Black
+ }
+
+ keypix := key.Pixel[y][x]
+ want := Pixel(0)
+ switch {
+ case keypix&libqrencode.Finder != 0:
+ want = Position.Pixel()
+ case keypix&libqrencode.Alignment != 0:
+ want = Alignment.Pixel()
+ case keypix&libqrencode.Timing != 0:
+ want = Timing.Pixel()
+ case keypix&libqrencode.Format != 0:
+ want = Format.Pixel()
+ want |= OffsetPixel(pix.Offset()) // sic
+ want |= pix & Invert
+ case keypix&libqrencode.PVersion != 0:
+ want = PVersion.Pixel()
+ case keypix&libqrencode.DataECC != 0:
+ if pix.Role() == Check || pix.Role() == Extra {
+ want = pix.Role().Pixel()
+ } else {
+ want = Data.Pixel()
+ }
+ want |= OffsetPixel(pix.Offset())
+ want |= pix & Invert
+ default:
+ want = Unused.Pixel()
+ }
+ if keypix&libqrencode.Black != 0 {
+ want |= Black
+ }
+ if pix != want {
+ t.Errorf("%v/%v: Pixel[%d][%d] = %v, want %v %#x", v, mask, y, x, pix, want, keypix)
+ if badpix++; badpix >= 100 {
+ t.Errorf("stopping after %d bad pixels", badpix)
+ break Pixel
+ }
+ }
+ }
+ }
+ return badpix == 0
+}
+
+var input = []Encoding{
+ String("hello"),
+ Num("1"),
+ Num("12"),
+ Num("123"),
+ Alpha("AB"),
+ Alpha("ABC"),
+}
+
+func TestVersion(t *testing.T) {
+ badvers := 0
+Version:
+ for v := Version(1); v <= 40; v++ {
+ for l := L; l <= H; l++ {
+ for _, in := range input {
+ if !test(t, v, l, in) {
+ if badvers++; badvers >= 10 {
+ t.Errorf("stopping after %d bad versions", badvers)
+ break Version
+ }
+ }
+ }
+ }
+ }
+}
+
+func TestEncode(t *testing.T) {
+ data := []byte{0x10, 0x20, 0x0c, 0x56, 0x61, 0x80, 0xec, 0x11, 0xec, 0x11, 0xec, 0x11, 0xec, 0x11, 0xec, 0x11}
+ check := []byte{0xa5, 0x24, 0xd4, 0xc1, 0xed, 0x36, 0xc7, 0x87, 0x2c, 0x55}
+ rs := gf256.NewRSEncoder(Field, len(check))
+ out := make([]byte, len(check))
+ rs.ECC(data, out)
+ if !bytes.Equal(out, check) {
+ t.Errorf("have %x want %x", out, check)
+ }
+}