Skip to content

Commit 6a8a224

Browse files
authored
Merge pull request #26 from jamesbowman/main
Initial unit test, coverage is 97%
2 parents ddb2200 + b72b109 commit 6a8a224

File tree

4 files changed

+132
-0
lines changed

4 files changed

+132
-0
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -46,3 +46,6 @@ _build
4646
.idea
4747
.vscode
4848
*~
49+
50+
# Test coverage reports
51+
.coverage

.reuse/dep5

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
2+
Upstream-Name: Adafruit_CircuitPython_miniQR
3+
Source: https://github.com/adafruit/Adafruit_CircuitPython_miniQR
4+
5+
Files: tests/*.gild
6+
Copyright: 2019 Translation Company
7+
License: Unlicense

tests/test_example.gild

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
XXXXXXX.X.........XXXXXXX
2+
X.....X.X.XX.XXXX.X.....X
3+
X.XXX.X.X.X.XXXXX.X.XXX.X
4+
X.XXX.X..X...XXXX.X.XXX.X
5+
X.XXX.X.X..XXXXXX.X.XXX.X
6+
X.....X.X.XXXX.XX.X.....X
7+
XXXXXXX.X.X.X.X.X.XXXXXXX
8+
........X..X...X.........
9+
..X...XXX.XX.XXXXXXXX.XXX
10+
.X.XX....X.X.XX..X.XXXXX.
11+
X....XX...XXXX.XX.X....X.
12+
..X..X.X.XX.XX.X.XX.XX.XX
13+
...XXXX.XXXX....XXXXX..XX
14+
.X..XX.XXX.XX.XXXXXXX.XXX
15+
.X.XX.XX.X..X.....XX...X.
16+
XXXXXX.....X...X.XX....XX
17+
..XX..XXXX..XXXXXXXXX.XXX
18+
........X.X.X.X.X...XX...
19+
XXXXXXX.XXXXXXXXX.X.X..X.
20+
X.....X...X.X.X.X...XX..X
21+
X.XXX.X........XXXXXXXXX.
22+
X.XXX.X.....XX..XXXXXX.X.
23+
X.XXX.X.X.X...X......X...
24+
X.....X...XXX.XX.XXX...XX
25+
XXXXXXX..XX.XXX..XX...X.X

tests/test_unit.py

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
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

Comments
 (0)