|
| 1 | +import sys |
| 2 | +import unittest |
| 3 | +import random |
| 4 | + |
| 5 | +sys.path.append(".") |
| 6 | + |
| 7 | +import adafruit_miniqr |
| 8 | + |
| 9 | +def enc(msg, args = {}): |
| 10 | + qr = adafruit_miniqr.QRCode(**args) |
| 11 | + qr.add_data(msg) |
| 12 | + qr.make() |
| 13 | + return qr.matrix |
| 14 | + |
| 15 | +class TestMiniQR(unittest.TestCase): |
| 16 | + |
| 17 | + def test_example(self): |
| 18 | + # Confirm the simple test that is in the docs |
| 19 | + msg = b'https://www.adafruit.com' |
| 20 | + qr = adafruit_miniqr.QRCode() |
| 21 | + qr.add_data(msg) |
| 22 | + qr.make() |
| 23 | + with open("tests/test_example.gild") as f: |
| 24 | + self.assertEqual(f.read(), repr(qr.matrix)) |
| 25 | + |
| 26 | + def test_qr_type(self): |
| 27 | + # Confirm that qr_type 1-9 increases the matrix size |
| 28 | + expected_size = [None, 21, 25, 29, 33, 37, 41, 45, 49, 53] |
| 29 | + for t in range(1, 10): |
| 30 | + m = enc(b'abc', dict(qr_type = t)) |
| 31 | + self.assertEqual(m.width, m.height) |
| 32 | + self.assertEqual(m.width, expected_size[t]) |
| 33 | + |
| 34 | + def test_qr_error_correct(self): |
| 35 | + # Confirm that error correct L,M,Q,H give different matrix |
| 36 | + matrices = set() |
| 37 | + for ec in adafruit_miniqr.L, adafruit_miniqr.M, adafruit_miniqr.Q, adafruit_miniqr.H: |
| 38 | + m = enc(b'abc', dict(error_correct = ec)) |
| 39 | + matrices.add(m) |
| 40 | + self.assertEqual(len(matrices), 4) # All 4 are unique |
| 41 | + |
| 42 | + def test_qr_pattern_mask(self): |
| 43 | + # Confirm that pattern_mask 0-7 gives different matrix |
| 44 | + matrices = set() |
| 45 | + qr = adafruit_miniqr.QRCode() |
| 46 | + qr.add_data('test_qr_pattern_mask/1Z') |
| 47 | + for m in range(8): |
| 48 | + qr.make(mask_pattern = m) |
| 49 | + matrices.add(tuple(qr.matrix.buffer)) |
| 50 | + self.assertEqual(len(matrices), 8) # All 8 are unique |
| 51 | + |
| 52 | + def test_qr_auto(self): |
| 53 | + # Confirm that increasing message size increases the matrix size monotonically |
| 54 | + sizes = [] |
| 55 | + for i in range(14): # XXX size 41 crashes |
| 56 | + m = enc(b'aBc!1234' * i) |
| 57 | + sizes.append(m.width) |
| 58 | + self.assertTrue(len(set(sizes)) > 1) |
| 59 | + self.assertEqual(sizes, sorted(sizes)) |
| 60 | + |
| 61 | + def test_qr_str(self): |
| 62 | + # Confirm that bytes and str give the same result |
| 63 | + for s in ("", "abc", "https://www.adafruit.com", "AbCd12"): |
| 64 | + a = enc(s.encode(), {}) |
| 65 | + b = enc(s, {}) |
| 66 | + self.assertEqual(a.buffer, b.buffer) |
| 67 | + |
| 68 | + def test_qr_all(self): |
| 69 | + for type in range(1, 10): |
| 70 | + for ec in adafruit_miniqr.L, adafruit_miniqr.M, adafruit_miniqr.Q, adafruit_miniqr.H: |
| 71 | + qr = adafruit_miniqr.QRCode(qr_type = type, error_correct = ec) |
| 72 | + qr.add_data('abc') |
| 73 | + for m in range(8): |
| 74 | + qr.make(mask_pattern = m) |
| 75 | + |
| 76 | + def test_qr_maximum(self): |
| 77 | + msg = bytes([random.randrange(32, 127) for i in range(230)]) |
| 78 | + m = enc(msg, dict(qr_type = 9)) |
| 79 | + |
| 80 | +if __name__ == "__main__": |
| 81 | + unittest.main() |
0 commit comments