Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial unit test, coverage is 97% #26

Merged
merged 3 commits into from
Jan 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,6 @@ _build
.idea
.vscode
*~

# Test coverage reports
.coverage
7 changes: 7 additions & 0 deletions .reuse/dep5
Original file line number Diff line number Diff line change
@@ -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
25 changes: 25 additions & 0 deletions tests/test_example.gild
Original file line number Diff line number Diff line change
@@ -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
97 changes: 97 additions & 0 deletions tests/test_unit.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# 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(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)

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, qr_type=9)
self.assertTrue(_a is not None)


if __name__ == "__main__":
unittest.main()