// 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; }