qr_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright 2011 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package coding
  5. import (
  6. "bytes"
  7. "testing"
  8. "github.com/SKatiyar/qr/gf256"
  9. "github.com/SKatiyar/qr/libqrencode"
  10. )
  11. func test(t *testing.T, v Version, l Level, text ...Encoding) bool {
  12. s := ""
  13. ty := libqrencode.EightBit
  14. switch x := text[0].(type) {
  15. case String:
  16. s = string(x)
  17. case Alpha:
  18. s = string(x)
  19. ty = libqrencode.Alphanumeric
  20. case Num:
  21. s = string(x)
  22. ty = libqrencode.Numeric
  23. }
  24. key, err := libqrencode.Encode(libqrencode.Version(v), libqrencode.Level(l), ty, s)
  25. if err != nil {
  26. t.Errorf("libqrencode.Encode(%v, %v, %d, %#q): %v", v, l, ty, s, err)
  27. return false
  28. }
  29. mask := (^key.Pixel[8][2]&1)<<2 | (key.Pixel[8][3]&1)<<1 | (^key.Pixel[8][4] & 1)
  30. p, err := NewPlan(v, l, Mask(mask))
  31. if err != nil {
  32. t.Errorf("NewPlan(%v, L, %d): %v", v, err, mask)
  33. return false
  34. }
  35. if len(p.Pixel) != len(key.Pixel) {
  36. t.Errorf("%v: NewPlan uses %dx%d, libqrencode uses %dx%d", v, len(p.Pixel), len(p.Pixel), len(key.Pixel), len(key.Pixel))
  37. return false
  38. }
  39. c, err := p.Encode(text...)
  40. if err != nil {
  41. t.Errorf("Encode: %v", err)
  42. return false
  43. }
  44. badpix := 0
  45. Pixel:
  46. for y, prow := range p.Pixel {
  47. for x, pix := range prow {
  48. pix &^= Black
  49. if c.Black(x, y) {
  50. pix |= Black
  51. }
  52. keypix := key.Pixel[y][x]
  53. want := Pixel(0)
  54. switch {
  55. case keypix&libqrencode.Finder != 0:
  56. want = Position.Pixel()
  57. case keypix&libqrencode.Alignment != 0:
  58. want = Alignment.Pixel()
  59. case keypix&libqrencode.Timing != 0:
  60. want = Timing.Pixel()
  61. case keypix&libqrencode.Format != 0:
  62. want = Format.Pixel()
  63. want |= OffsetPixel(pix.Offset()) // sic
  64. want |= pix & Invert
  65. case keypix&libqrencode.PVersion != 0:
  66. want = PVersion.Pixel()
  67. case keypix&libqrencode.DataECC != 0:
  68. if pix.Role() == Check || pix.Role() == Extra {
  69. want = pix.Role().Pixel()
  70. } else {
  71. want = Data.Pixel()
  72. }
  73. want |= OffsetPixel(pix.Offset())
  74. want |= pix & Invert
  75. default:
  76. want = Unused.Pixel()
  77. }
  78. if keypix&libqrencode.Black != 0 {
  79. want |= Black
  80. }
  81. if pix != want {
  82. t.Errorf("%v/%v: Pixel[%d][%d] = %v, want %v %#x", v, mask, y, x, pix, want, keypix)
  83. if badpix++; badpix >= 100 {
  84. t.Errorf("stopping after %d bad pixels", badpix)
  85. break Pixel
  86. }
  87. }
  88. }
  89. }
  90. return badpix == 0
  91. }
  92. var input = []Encoding{
  93. String("hello"),
  94. Num("1"),
  95. Num("12"),
  96. Num("123"),
  97. Alpha("AB"),
  98. Alpha("ABC"),
  99. }
  100. func TestVersion(t *testing.T) {
  101. badvers := 0
  102. Version:
  103. for v := Version(1); v <= 40; v++ {
  104. for l := L; l <= H; l++ {
  105. for _, in := range input {
  106. if !test(t, v, l, in) {
  107. if badvers++; badvers >= 10 {
  108. t.Errorf("stopping after %d bad versions", badvers)
  109. break Version
  110. }
  111. }
  112. }
  113. }
  114. }
  115. }
  116. func TestEncode(t *testing.T) {
  117. data := []byte{0x10, 0x20, 0x0c, 0x56, 0x61, 0x80, 0xec, 0x11, 0xec, 0x11, 0xec, 0x11, 0xec, 0x11, 0xec, 0x11}
  118. check := []byte{0xa5, 0x24, 0xd4, 0xc1, 0xed, 0x36, 0xc7, 0x87, 0x2c, 0x55}
  119. rs := gf256.NewRSEncoder(Field, len(check))
  120. out := make([]byte, len(check))
  121. rs.ECC(data, out)
  122. if !bytes.Equal(out, check) {
  123. t.Errorf("have %x want %x", out, check)
  124. }
  125. }