1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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;
}
|