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