From 140a6660f63f88d05ba9aae0bf1c4b401bb6574d Mon Sep 17 00:00:00 2001 From: cirakg Date: Sun, 25 Oct 2026 14:17:45 +0100 Subject: fix(codes): encoding progress follows the work The QR percentage counted phases and the display froze at 90 % once encoding ended, so the first opening sat at 90 % while the slow stages ran. Each 2D symbology now weights its phases by measured cost, interpolates inside the long ones, and the display splits encode, pack and runs; a cached code counts its runs from 0. Co-Authored-By: Claude Opus 5.5 --- test/codes/CodeCacheTest.mc | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'test') diff --git a/test/codes/CodeCacheTest.mc b/test/codes/CodeCacheTest.mc index 2ad7f05..3b2a02e 100644 --- a/test/codes/CodeCacheTest.mc +++ b/test/codes/CodeCacheTest.mc @@ -110,3 +110,49 @@ function codeRunsCoverExactlyTheDarkModules(logger as Test.Logger) as Boolean { } return true; } + +// Steps a display job to the end and checks its percentage follows the +// work: never down, never above 99, no big jumps, and a real spread (the +// "Encoding" screen once showed 90 % at the first frame and sat there). +function progressIsSteady(job as Codes.DisplayJob) as Boolean { + var last = job.percent(); + var biggest = last; + var steps = 0; + var steady = last < 35; + while (!job.step(1)) { + var now = job.percent(); + steady = steady && now >= last && now <= 99; + biggest = now - last > biggest ? now - last : biggest; + last = now; + steps++; + } + return steady && biggest <= 35 && steps >= 3 && last >= 60 && job.error == null; +} + +(:test) +function displayProgressFollowsTheWork(logger as Test.Logger) as Boolean { + var member = "https://example.com/member/fake-0042?name=Alice%20Example&card=0000111122223333&valid=2027-12-31&level=gold"; + var long = ""; + for (var i = 0; i < 40; i++) { + long += "abcdefghij"; + } + var qr = progressIsSteady(new Codes.DisplayJob(new Qr.QrJob(member, 1, 0, -1), null)); + var qrBig = progressIsSteady(new Codes.DisplayJob(new Qr.QrJob(long, 0, 0, -1), null)); + var qrForced = progressIsSteady(new Codes.DisplayJob(new Qr.QrJob(member, 1, 0, 3), null)); + var dm = progressIsSteady(new Codes.DisplayJob(new DataMatrix.DataMatrixJob(long.substring(0, 200) as String), null)); + var az = progressIsSteady(new Codes.DisplayJob(new Aztec.AztecJob(long.substring(0, 200) as String, 1), null)); + var pdf = progressIsSteady(new Codes.DisplayJob(new Pdf417.Pdf417Job(long.substring(0, 200) as String, 1, 260, 260, true), + null)); + // A cached code only runs the finder: 0 at the start, then up to 99. + var bits = new [60 * 60]b; + for (var i = 0; i < bits.size(); i++) { + bits[i] = (i * 7 / 3) % 2; + } + var packed = Codes.Packed.parse(new Codes.Matrix(60, 60, 4, bits).toBytes()) as Codes.Packed; + var cached = new Codes.DisplayJob(null, packed); + var start = cached.percent(); + var cachedSteady = progressIsSteady(cached); + logger.debug("progress qr=" + qr + " big=" + qrBig + " forced=" + qrForced + " dm=" + dm + " az=" + az + " pdf=" + pdf + + " cached=" + cachedSteady); + return qr && qrBig && qrForced && dm && az && pdf && start == 0 && cachedSteady; +} -- cgit v1.2.3