summaryrefslogtreecommitdiff
path: root/test/codes/Pdf417Test.mc
blob: 8939e03e4abf2462511751c4f18a33735e994929 (plain) (blame)
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;
}