summaryrefslogtreecommitdiff
path: root/test/codes/Pdf417Test.mc
diff options
context:
space:
mode:
authorcirakg <cirakg@cirakg.xyz>2026-10-20 11:24:58 +0200
committercirakg <cirakg@cirakg.xyz>2026-10-20 11:24:58 +0200
commit1251aab9f8f9f38aa5bdefd4fed1f58236166cf8 (patch)
treed9824a2430cff9f6659a5b14b6e437d6b1568b87 /test/codes/Pdf417Test.mc
parentd94eb32c80d2dbf00a45d7e69804f8247240a769 (diff)
test(codes): compare Data Matrix and PDF417 with references and decode them, also from screenshots
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'test/codes/Pdf417Test.mc')
-rw-r--r--test/codes/Pdf417Test.mc70
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;
+}