// Author: cirakg & claude ai // Summary: Tests for the Aztec encoder: aztec_code_generator references, decoding dumps (mixed text, UTF-8), limits and stuffing. import Toybox.Lang; import Toybox.Test; // README 12.4 check 1 where comparable: single-class payloads give the same // bits as the reference's optimal sequence, so the symbols must match, // compact and full range (with reference grids), at all four EC levels. (:test) function aztecMatchesReference(logger as Test.Logger) as Boolean { var rows = CodeVectors.AZTEC; for (var i = 0; i < rows.size(); i++) { var row = rows[i] as Array; var payload = row[0] as String; var result = Aztec.encode(payload, row[1] as Number); if (result instanceof Codes.CodeError) { logger.error("row " + i + ": " + result.message); return false; } var expectedSize = row[2] as Number; var expected = row[3] as String; if (result.width != expectedSize || !MatrixFixtures.packedHex(result).equals(expected)) { logger.error("row " + i + " '" + Text.clip(payload, 20) + "': size " + result.width + ", reference " + expectedSize); return false; } } logger.debug("CODES aztec reference rows=" + rows.size()); return true; } // README 12.4 check 2: mixed content (Binary Shift, mode latches), UTF-8 // and long payloads, decoded by tools/check_codes.py. (:test) function aztecDumpForDecoding(logger as Test.Logger) as Boolean { var payloads = ["Boarding pass FAKE 0042, seat 12A", "Zürich ✓ Ünïcödé", "https://example.com/m/fake?id=0042", "abcDEF123 xyz", "!@#$%^&*()", "a", "MiXeD 12 cAsE 34 ."]; var long = ""; for (var i = 0; i < 40; i++) { long += "Fake-Ticket/" + i + " "; } payloads.add(long); for (var i = 0; i < payloads.size(); i++) { var text = payloads[i] as String; var result = Aztec.encode(text, i % 4); if (result instanceof Codes.CodeError) { logger.error("'" + text + "': " + result.message); return false; } MatrixFixtures.dump(logger, Codes.AZTEC, text, result); } return true; } (:test) function aztecStuffingAndLimits(logger as Test.Logger) as Boolean { // Six zero bits in 6-bit codewords: 00000 gets a stuffed 1, then the // last 0 is padded with ones (and its all-ones last bit cleared). var words = Aztec.stuff([0, 0, 0, 0, 0, 0]b, 6); if (words.size() != 2 || words[0] != 1 || words[1] != 0x1F) { logger.error("stuffing gave " + words.toString()); return false; } if (!(Aztec.encode("", 1) instanceof Codes.CodeError)) { logger.error("empty text accepted"); return false; } var big = ""; for (var i = 0; i < 400; i++) { big += "~~~~~~~~~~"; } return Aztec.encode(big, 3) instanceof Codes.CodeError; }