diff options
Diffstat (limited to 'test/codes/Pdf417Test.mc')
| -rw-r--r-- | test/codes/Pdf417Test.mc | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/test/codes/Pdf417Test.mc b/test/codes/Pdf417Test.mc new file mode 100644 index 0000000..8939e03 --- /dev/null +++ b/test/codes/Pdf417Test.mc @@ -0,0 +1,70 @@ +// Author: cirakg & claude ai +// Summary: Tests for the PDF417 encoder: pdf417gen reference rows, decoding dumps of screen-fitted symbols, limits. + +import Toybox.Lang; +import Toybox.Test; + +// README 12.4 check 1: the same rows as pdf417gen for fixed columns and +// levels (compaction, padding, EC, row indicators and patterns). +(:test) +function pdf417MatchesReference(logger as Test.Logger) as Boolean { + var rows = CodeVectors.PDF417; + for (var i = 0; i < rows.size(); i++) { + var row = rows[i] as Array; + var payload = row[0] as String; + var result = Pdf417.encode(payload, row[1] as Number, row[2] as Number); + if (result instanceof Codes.CodeError) { + logger.error("row " + i + ": " + result.message); + return false; + } + var expectedRows = row[3] as Number; + var expectedWidth = row[4] as Number; + if (result.height != expectedRows || result.rowHeight != Pdf417.ROW_HEIGHT || result.width != expectedWidth) { + logger.error("row " + i + " '" + Text.clip(payload, 20) + "': " + result.width + " x " + result.height + + ", reference " + expectedWidth + " x " + expectedRows); + return false; + } + var got = MatrixFixtures.packedHex(result); + if (!got.equals(row[5] as String)) { + logger.error("row " + i + " '" + Text.clip(payload, 20) + "' differs"); + return false; + } + } + logger.debug("CODES pdf417 reference rows=" + rows.size()); + return true; +} + +// README 12.4 check 2: symbols laid out for real screens (columns chosen to +// fit), decoded by tools/check_codes.py. +(:test) +function pdf417DumpForDecoding(logger as Test.Logger) as Boolean { + var payloads = ["Boarding pass FAKE 0042 seat 12A", "Zürich ✓ Ünïcödé fake", "12345678901234567890123456789", + "https://example.com/member/fake?id=0042&level=gold", "a"]; + var screens = [[218, 218, true], [390, 390, true], [320, 360, false]]; + for (var i = 0; i < payloads.size(); i++) { + var s = screens[i % screens.size()] as Array; + var job = new Pdf417.Pdf417Job(payloads[i] as String, 1, s[0] as Number, s[1] as Number, s[2] as Boolean); + Jobs.runToCompletion(job, 1); + var m = job.matrix(); + if (job.error != null || m == null) { + logger.error("'" + payloads[i] + "': " + job.error); + return false; + } + MatrixFixtures.dump(logger, Codes.PDF417, payloads[i] as String, m); + } + return true; +} + +(:test) +function pdf417Limits(logger as Test.Logger) as Boolean { + if (!(Pdf417.encode("", 3, 2) instanceof Codes.CodeError)) { + logger.error("empty text accepted"); + return false; + } + // Two codewords in 30 columns is a single row: PDF417 needs 3. + if (!(Pdf417.encode("ab", 30, 0) instanceof Codes.CodeError)) { + logger.error("a one-row symbol was accepted"); + return false; + } + return Pdf417.autoLevel(40) == 2 && Pdf417.autoLevel(41) == 3 && Pdf417.autoLevel(320) == 4 && Pdf417.autoLevel(321) == 5; +} |
