From 183ec012215c646fe0fc6d1c0b6cb6f1e5cbc98e Mon Sep 17 00:00:00 2001 From: James Bowman Date: Mon, 1 Jan 2024 18:02:24 -0800 Subject: [PATCH 1/3] Initial unit test, coverage is 97% --- tests/test_example.gild | 25 +++++++++++++ tests/unit.py | 81 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 tests/test_example.gild create mode 100644 tests/unit.py 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/unit.py b/tests/unit.py new file mode 100644 index 0000000..d867c2b --- /dev/null +++ b/tests/unit.py @@ -0,0 +1,81 @@ +import sys +import unittest +import random + +sys.path.append(".") + +import adafruit_miniqr + +def enc(msg, args = {}): + qr = adafruit_miniqr.QRCode(**args) + qr.add_data(msg) + qr.make() + return qr.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', dict(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', dict(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(14): # XXX size 41 crashes + m = enc(b'aBc!1234' * i) + 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 type 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 = type, error_correct = ec) + qr.add_data('abc') + for m in range(8): + qr.make(mask_pattern = m) + + def test_qr_maximum(self): + msg = bytes([random.randrange(32, 127) for i in range(230)]) + m = enc(msg, dict(qr_type = 9)) + +if __name__ == "__main__": + unittest.main() From fab1249bd2e62216f74e05355eeac13e5dc21654 Mon Sep 17 00:00:00 2001 From: James Bowman Date: Thu, 18 Jan 2024 07:44:38 -0800 Subject: [PATCH 2/3] Passes pre-commit checks --- .gitignore | 3 ++ .reuse/dep5 | 7 ++++ tests/unit.py | 96 +++++++++++++++++++++++++++++++-------------------- 3 files changed, 68 insertions(+), 38 deletions(-) create mode 100644 .reuse/dep5 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/tests/unit.py b/tests/unit.py index d867c2b..d95c495 100644 --- a/tests/unit.py +++ b/tests/unit.py @@ -1,81 +1,101 @@ +# SPDX-FileCopyrightText: 2024 James Bowman +# +# SPDX-License-Identifier: MIT + import sys import unittest import random sys.path.append(".") +# pylint: disable=C0413 import adafruit_miniqr -def enc(msg, args = {}): - qr = adafruit_miniqr.QRCode(**args) - qr.add_data(msg) - qr.make() - return qr.matrix -class TestMiniQR(unittest.TestCase): +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)) + 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', dict(qr_type = t)) - self.assertEqual(m.width, m.height) - self.assertEqual(m.width, expected_size[t]) + 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', dict(error_correct = ec)) - matrices.add(m) + 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)) + _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(14): # XXX size 41 crashes - m = enc(b'aBc!1234' * i) - sizes.append(m.width) + for i in range(14): # size 41 crashes + _m = enc(b"aBc!1234" * i) + 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) + 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 type 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 = type, error_correct = ec) - qr.add_data('abc') - for m in range(8): - qr.make(mask_pattern = m) + 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)]) - m = enc(msg, dict(qr_type = 9)) + _a = enc(msg, qr_type=9) + self.assertTrue(_a is not None) + if __name__ == "__main__": unittest.main() From b72b109f2319d5c1399c2d4d5c2544c7a03c1b8d Mon Sep 17 00:00:00 2001 From: James Bowman Date: Thu, 18 Jan 2024 08:02:30 -0800 Subject: [PATCH 3/3] Rename so that pytest runs the unit tests --- tests/{unit.py => test_unit.py} | 4 ---- 1 file changed, 4 deletions(-) rename tests/{unit.py => test_unit.py} (98%) diff --git a/tests/unit.py b/tests/test_unit.py similarity index 98% rename from tests/unit.py rename to tests/test_unit.py index d95c495..87f7604 100644 --- a/tests/unit.py +++ b/tests/test_unit.py @@ -2,13 +2,9 @@ # # SPDX-License-Identifier: MIT -import sys import unittest import random -sys.path.append(".") - -# pylint: disable=C0413 import adafruit_miniqr