diff --git a/.gitignore b/.gitignore index db3d538..89da754 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,6 @@ _build .idea .vscode *~ + +# Test coverage reports +.coverage diff --git a/.reuse/dep5 b/.reuse/dep5 new file mode 100644 index 0000000..c03fdb0 --- /dev/null +++ b/.reuse/dep5 @@ -0,0 +1,7 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: Adafruit_CircuitPython_miniQR +Source: https://github.com/adafruit/Adafruit_CircuitPython_miniQR + +Files: tests/*.gild +Copyright: 2019 Translation Company +License: Unlicense diff --git a/adafruit_miniqr.py b/adafruit_miniqr.py index 55b1cae..633fb63 100644 --- a/adafruit_miniqr.py +++ b/adafruit_miniqr.py @@ -95,7 +95,7 @@ def add_data(self, data): self.data_list.append(data) datalen = sum(len(x) for x in self.data_list) if not self.type: - for qr_type in range(1, 6): + for qr_type in range(1, 10): rs_blocks = _get_rs_blocks(qr_type, self.ECC) total_data_count = 0 for block in rs_blocks: diff --git a/tests/test_example.gild b/tests/test_example.gild new file mode 100644 index 0000000..0f66b61 --- /dev/null +++ b/tests/test_example.gild @@ -0,0 +1,25 @@ +XXXXXXX.X.........XXXXXXX +X.....X.X.XX.XXXX.X.....X +X.XXX.X.X.X.XXXXX.X.XXX.X +X.XXX.X..X...XXXX.X.XXX.X +X.XXX.X.X..XXXXXX.X.XXX.X +X.....X.X.XXXX.XX.X.....X +XXXXXXX.X.X.X.X.X.XXXXXXX +........X..X...X......... +..X...XXX.XX.XXXXXXXX.XXX +.X.XX....X.X.XX..X.XXXXX. +X....XX...XXXX.XX.X....X. +..X..X.X.XX.XX.X.XX.XX.XX +...XXXX.XXXX....XXXXX..XX +.X..XX.XXX.XX.XXXXXXX.XXX +.X.XX.XX.X..X.....XX...X. +XXXXXX.....X...X.XX....XX +..XX..XXXX..XXXXXXXXX.XXX +........X.X.X.X.X...XX... +XXXXXXX.XXXXXXXXX.X.X..X. +X.....X...X.X.X.X...XX..X +X.XXX.X........XXXXXXXXX. +X.XXX.X.....XX..XXXXXX.X. +X.XXX.X.X.X...X......X... +X.....X...XXX.XX.XXX...XX +XXXXXXX..XX.XXX..XX...X.X diff --git a/tests/test_unit.py b/tests/test_unit.py new file mode 100644 index 0000000..218a3de --- /dev/null +++ b/tests/test_unit.py @@ -0,0 +1,98 @@ +# SPDX-FileCopyrightText: 2024 James Bowman +# +# SPDX-License-Identifier: MIT + +import unittest +import random + +import adafruit_miniqr + + +def enc(msg, **args): + _q = adafruit_miniqr.QRCode(**args) + _q.add_data(msg) + _q.make() + return _q.matrix + + +class TestMiniQR(unittest.TestCase): + def test_example(self): + # Confirm the simple test that is in the docs + msg = b"https://www.adafruit.com" + _qr = adafruit_miniqr.QRCode() + _qr.add_data(msg) + _qr.make() + with open("tests/test_example.gild") as _f: + self.assertEqual(_f.read(), repr(_qr.matrix)) + + def test_qr_type(self): + # Confirm that qr_type 1-9 increases the matrix size + expected_size = [None, 21, 25, 29, 33, 37, 41, 45, 49, 53] + for _t in range(1, 10): + _m = enc(b"abc", qr_type=_t) + self.assertEqual(_m.width, _m.height) + self.assertEqual(_m.width, expected_size[_t]) + + def test_qr_error_correct(self): + # Confirm that error correct L,M,Q,H give different matrix + matrices = set() + for _ec in ( + adafruit_miniqr.L, + adafruit_miniqr.M, + adafruit_miniqr.Q, + adafruit_miniqr.H, + ): + _m = enc(b"abc", error_correct=_ec) + matrices.add(_m) + self.assertEqual(len(matrices), 4) # All 4 are unique + + def test_qr_pattern_mask(self): + # Confirm that pattern_mask 0-7 gives different matrix + matrices = set() + _qr = adafruit_miniqr.QRCode() + _qr.add_data("test_qr_pattern_mask/1Z") + for _m in range(8): + _qr.make(mask_pattern=_m) + matrices.add(tuple(_qr.matrix.buffer)) + self.assertEqual(len(matrices), 8) # All 8 are unique + + def test_qr_auto(self): + # Confirm that increasing message size increases the matrix size monotonically + sizes = [] + for i in range(29): + msg = b"aBc!1234" * i + _m = enc(msg) + sizes.append(_m.width) + self.assertTrue(len(set(sizes)) > 1) + self.assertEqual(sizes, sorted(sizes)) + + def test_qr_str(self): + # Confirm that bytes and str give the same result + for _s in ("", "abc", "https://www.adafruit.com", "AbCd12"): + _a = enc(_s.encode()) + _b = enc(_s) + self.assertEqual(_a.buffer, _b.buffer) + + def test_qr_all(self): + for _ty in range(1, 10): + for _ec in ( + adafruit_miniqr.L, + adafruit_miniqr.M, + adafruit_miniqr.Q, + adafruit_miniqr.H, + ): + _qr = adafruit_miniqr.QRCode(qr_type=_ty, error_correct=_ec) + _qr.add_data("abc") + for _m in range(8): + _qr.matrix = None + _qr.make(mask_pattern=_m) + self.assertTrue(_qr.matrix is not None) + + def test_qr_maximum(self): + msg = bytes([random.randrange(32, 127) for i in range(230)]) + _a = enc(msg) + self.assertTrue(_a is not None) + + +if __name__ == "__main__": + unittest.main()