diff options
Diffstat (limited to 'test/codes/CodeCacheTest.mc')
| -rw-r--r-- | test/codes/CodeCacheTest.mc | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/test/codes/CodeCacheTest.mc b/test/codes/CodeCacheTest.mc index 812acc9..2ad7f05 100644 --- a/test/codes/CodeCacheTest.mc +++ b/test/codes/CodeCacheTest.mc @@ -1,5 +1,5 @@ // Author: cirakg & claude ai -// Summary: Tests for the encrypted barcode matrix cache: round trip, keys of locked entries, invalidation and tampering. +// Summary: Tests for the encrypted barcode matrix cache: round trip, packed format, runs, keys of locked entries, invalidation and tampering. import Toybox.Lang; import Toybox.Test; @@ -53,6 +53,60 @@ function codeCacheOfLockedEntriesNeedsTheSession(logger as Test.Logger) as Boole pdf.rowHeight = 3; var round = Codes.Matrix.fromBytes(pdf.toBytes()); return code == VaultError.LOCKED && back != null && Bytes.equal(back, [3, 1, 4, 1, 0xE0]b) - && Codes.Matrix.fromBytes([3, 1, 4, 1, 0xE0]b) != null && Codes.Matrix.fromBytes([3, 1, 4]b) == null + && Codes.Matrix.fromBytes([2, 0, 3, 0, 1, 4, 1, 0xE0]b) != null && Codes.Matrix.fromBytes([2, 0, 3, 0, 1, 4]b) == null && round != null && round.rowHeight == 3 && Bytes.equal(round.modules, [1, 0, 1, 0, 1, 1]b); } + +// Format 2 holds widths over 255 (wide PDF417); a 0.7 cache (one width +// byte) is refused, so the code is encoded again. +(:test) +function codeCachePackedFormat(logger as Test.Logger) as Boolean { + var bits = new [300 * 2]b; + for (var i = 0; i < bits.size(); i++) { + bits[i] = (i * 7 / 3) % 2; + } + var wide = new Codes.Matrix(300, 2, 2, bits); + var bytes = wide.toBytes(); + var back = Codes.Matrix.fromBytes(bytes); + var oldFormat = Codes.Packed.parse([3, 1, 4, 1, 0xE0]b); + var wrongSize = Codes.Packed.parse(bytes.slice(0, bytes.size() - 1)); + return bytes[0] == 2 && back != null && back.width == 300 && back.height == 2 && Bytes.equal(back.modules, bits) + && oldFormat == null && wrongSize == null && Codes.Packed.parse(null) == null; +} + +// The runs drawn on screen are exactly the dark modules, row by row, +// including runs across byte boundaries and whole dark or light bytes. +(:test) +function codeRunsCoverExactlyTheDarkModules(logger as Test.Logger) as Boolean { + var codes = [Qr.encode("runs, runs, runs", 1, 0, -1) as Qr.MatrixCode]; + var matrices = [new Codes.Matrix(codes[0].size, codes[0].size, 4, codes[0].modules)] as Array<Codes.Matrix>; + var stripes = new [37 * 5]b; + for (var i = 0; i < stripes.size(); i++) { + stripes[i] = (i % 37) < 20 || (i % 37) > 33 ? 1 : 0; + } + matrices.add(new Codes.Matrix(37, 5, 1, stripes)); + for (var c = 0; c < matrices.size(); c++) { + var m = matrices[c]; + var finder = new Codes.RunFinder(Codes.Packed.parse(m.toBytes()) as Codes.Packed); + Jobs.runToCompletion(finder, 1); + var drawn = new [m.width * m.height]b; + var runs = finder.result.runs; + for (var i = 0; i < runs.size(); i++) { + var r = runs[i]; + var y = r >> 20; + var x = (r >> 10) & 0x3FF; + for (var k = 0; k < (r & 0x3FF); k++) { + if (drawn[y * m.width + x + k] == 1) { + logger.error("matrix " + c + ": run " + i + " overlaps"); + return false; + } + drawn[y * m.width + x + k] = 1; + } + } + if (!Bytes.equal(drawn, m.modules)) { + logger.error("matrix " + c + ": runs differ from the modules"); + return false; + } + } + return true; +} |
