diff --git a/.trinity/seals/lab_LabT27bCache.json b/.trinity/seals/lab_LabT27bCache.json new file mode 100644 index 0000000000..0120f4b7b8 --- /dev/null +++ b/.trinity/seals/lab_LabT27bCache.json @@ -0,0 +1,41 @@ +{ + "built_by": "t27c-bootstrap@0.5.2+0fba674ef", + "closure": [ + { + "spec": "specs/lab/lab_t27b_text.t27", + "spec_hash": "sha256:9bc927c023fb4bfc51f0123a4ae80ec632149fa9ece72a8a3a550ca86fe761d0" + }, + { + "spec": "specs/lab/text.t27", + "spec_hash": "sha256:5a108e7c6da57c5c4fbd2c3f109092dcf130ca9107b4f559c4bbba750a863c3e" + }, + { + "spec": "specs/tri/crypto/sha256.t27", + "spec_hash": "sha256:7f7cbef299f95f1d9eb4bcacf66292e15e084e633d2d2ac3a751dc47da196b7a" + } + ], + "config": "gen=c,rust,verilog,zig;tests=zig", + "gen_hash_c": "sha256:7032de733dfd8e758c8ec8614a8b5167d050a0399d60caf4dd37eef2c022e0f9", + "gen_hash_rust": "sha256:d138370139ed09e679e478afae9afa3650948cd4add60547b810ec4e412111d9", + "gen_hash_verilog": "sha256:263fe65ce53ba7dc513303eccbe3c296111b3d5930307b8343609200c900abb1", + "gen_hash_zig": "sha256:d943c3114af041f6cc910080b7499a44d7df39f899824e20ece11ea8be1179ad", + "module": "LabT27bCache", + "ring": 12, + "seal_schema": 2, + "sealed_at": "2026-10-19T14:57:10Z", + "sealed_by": "t27c-bootstrap@0.5.2", + "spec_hash": "sha256:0ed5939b0e87fcf7dac618117910406f49617e7aa3c7c1ddfcea3afefb3fb82e", + "spec_path": "specs/lab/lab_t27b_cache.t27", + "tests": { + "failed": 0, + "failing": [], + "forced": false, + "passed": 16, + "total": 16, + "vacuous": 0 + }, + "toolchain": { + "test_runner": "sha256:8512b80da533b79289110fca4a65f3336abd7a059ca4b72ea595d5e33ff8ad10", + "zig": "0.16.0" + } +} \ No newline at end of file diff --git a/.trinity/seals/lab_LabT27bRatchet.json b/.trinity/seals/lab_LabT27bRatchet.json new file mode 100644 index 0000000000..7fc1e49b91 --- /dev/null +++ b/.trinity/seals/lab_LabT27bRatchet.json @@ -0,0 +1,53 @@ +{ + "built_by": "t27c-bootstrap@0.5.2+0fba674ef", + "closure": [ + { + "spec": "specs/lab/lab_t27b_report.t27", + "spec_hash": "sha256:281801183bfea16fee870f7b0d7c48b71c8f24e5b53417f8df88b4026ae67008" + }, + { + "spec": "specs/lab/lab_t27b_text.t27", + "spec_hash": "sha256:9bc927c023fb4bfc51f0123a4ae80ec632149fa9ece72a8a3a550ca86fe761d0" + }, + { + "spec": "specs/lab/text.t27", + "spec_hash": "sha256:5a108e7c6da57c5c4fbd2c3f109092dcf130ca9107b4f559c4bbba750a863c3e" + }, + { + "spec": "specs/tri/lab/receipt.t27", + "spec_hash": "sha256:00d9eec8d7be84dde596c9990b3a5574de24aff9f7a94579fc620eb585712441" + }, + { + "spec": "specs/tri/t27b/ledger_steward.t27", + "spec_hash": "sha256:901c576c4cb4fa673d47180b8f3dee27c6a09f9f9d4d6356d0d95a13178e30c5" + }, + { + "spec": "specs/tri/t27b/steward.t27", + "spec_hash": "sha256:70867c8cd8a8155d82f352b6833168f04c846a736413d6b2420d54774994123e" + } + ], + "config": "gen=c,rust,verilog,zig;tests=zig", + "gen_hash_c": "sha256:a09661c28e5d797aa12e4cfe489ac60ae4349b4a1f37200ca0c5015b8050d294", + "gen_hash_rust": "sha256:efe4bc017d778582c42cc82f5665c522ebf2f85a278e80042b503d2e00b99373", + "gen_hash_verilog": "sha256:fe36eb188af52326382ad8a8b3e95c9c58a66581896e976a0c52129a92b2b277", + "gen_hash_zig": "sha256:36aa2ab6028de40cf7576f469bb3f241d0fbe2e03e036302db505f39a120cb88", + "module": "LabT27bRatchet", + "ring": 12, + "seal_schema": 2, + "sealed_at": "2026-10-19T14:57:22Z", + "sealed_by": "t27c-bootstrap@0.5.2", + "spec_hash": "sha256:cfbc076f4545878e09afff03cc49c5aa1045cd7fb9a54aaf8a29212eed69267f", + "spec_path": "specs/lab/lab_t27b_ratchet.t27", + "tests": { + "failed": 0, + "failing": [], + "forced": false, + "passed": 14, + "total": 14, + "vacuous": 0 + }, + "toolchain": { + "test_runner": "sha256:8512b80da533b79289110fca4a65f3336abd7a059ca4b72ea595d5e33ff8ad10", + "zig": "0.16.0" + } +} \ No newline at end of file diff --git a/.trinity/seals/lab_LabT27bReport.json b/.trinity/seals/lab_LabT27bReport.json new file mode 100644 index 0000000000..431b239ea9 --- /dev/null +++ b/.trinity/seals/lab_LabT27bReport.json @@ -0,0 +1,41 @@ +{ + "built_by": "t27c-bootstrap@0.5.2+0fba674ef", + "closure": [ + { + "spec": "specs/lab/lab_t27b_text.t27", + "spec_hash": "sha256:9bc927c023fb4bfc51f0123a4ae80ec632149fa9ece72a8a3a550ca86fe761d0" + }, + { + "spec": "specs/lab/text.t27", + "spec_hash": "sha256:5a108e7c6da57c5c4fbd2c3f109092dcf130ca9107b4f559c4bbba750a863c3e" + }, + { + "spec": "specs/tri/t27b/ledger_steward.t27", + "spec_hash": "sha256:901c576c4cb4fa673d47180b8f3dee27c6a09f9f9d4d6356d0d95a13178e30c5" + } + ], + "config": "gen=c,rust,verilog,zig;tests=zig", + "gen_hash_c": "sha256:acf57ccef56bd87c835e62b293bc1798e0c01eb07448e63e806d69b791445606", + "gen_hash_rust": "sha256:77b35bcf4dfa00dcfc8fc277cc206146e9266a1b0a6b0a768b7990cd676762f7", + "gen_hash_verilog": "sha256:ee0a40c730fef4cce0c67765d0d20fc53791e1b3fb476cca97cb2aaa116aa066", + "gen_hash_zig": "sha256:2418d7ce413caf6e9967672e8132543388f06e5bcf5d022db43d892ce1034252", + "module": "LabT27bReport", + "ring": 12, + "seal_schema": 2, + "sealed_at": "2026-10-19T14:57:00Z", + "sealed_by": "t27c-bootstrap@0.5.2", + "spec_hash": "sha256:281801183bfea16fee870f7b0d7c48b71c8f24e5b53417f8df88b4026ae67008", + "spec_path": "specs/lab/lab_t27b_report.t27", + "tests": { + "failed": 0, + "failing": [], + "forced": false, + "passed": 29, + "total": 29, + "vacuous": 0 + }, + "toolchain": { + "test_runner": "sha256:8512b80da533b79289110fca4a65f3336abd7a059ca4b72ea595d5e33ff8ad10", + "zig": "0.16.0" + } +} \ No newline at end of file diff --git a/.trinity/seals/lab_LabT27bRun.json b/.trinity/seals/lab_LabT27bRun.json new file mode 100644 index 0000000000..43d8baf93d --- /dev/null +++ b/.trinity/seals/lab_LabT27bRun.json @@ -0,0 +1,45 @@ +{ + "built_by": "t27c-bootstrap@0.5.2+0fba674ef", + "closure": [ + { + "spec": "specs/lab/lab_t27b_text.t27", + "spec_hash": "sha256:9bc927c023fb4bfc51f0123a4ae80ec632149fa9ece72a8a3a550ca86fe761d0" + }, + { + "spec": "specs/lab/text.t27", + "spec_hash": "sha256:5a108e7c6da57c5c4fbd2c3f109092dcf130ca9107b4f559c4bbba750a863c3e" + }, + { + "spec": "specs/tri/lab/receipt.t27", + "spec_hash": "sha256:00d9eec8d7be84dde596c9990b3a5574de24aff9f7a94579fc620eb585712441" + }, + { + "spec": "specs/verified/corpus_receipt.t27", + "spec_hash": "sha256:4aa2b8255db10c18dd43cadedc81e23a3b0363d79d7a36fcf1e86db678106de2" + } + ], + "config": "gen=c,rust,verilog,zig;tests=zig", + "gen_hash_c": "sha256:b7e336ebc9b33f7ab2abfce1c3f9c7e9cebc39b9306724c232569c1ab5737fff", + "gen_hash_rust": "sha256:5230b0a162ffa4a5537785b676f719088ebd7abde887c9c73aff0be9098dfdf9", + "gen_hash_verilog": "sha256:51437285834efc8911d66a7b280def403f9f2199e3c51c05886f5960fc58090a", + "gen_hash_zig": "sha256:23ce41c50b3010ceb91a0c4df6457a30c30606aef1fd1964a05909a65172288f", + "module": "LabT27bRun", + "ring": 12, + "seal_schema": 2, + "sealed_at": "2026-10-19T14:57:33Z", + "sealed_by": "t27c-bootstrap@0.5.2", + "spec_hash": "sha256:321ac19653fee22a6b6aba8dda613784825eb1926f1bdbd000f1096a1437f606", + "spec_path": "specs/lab/lab_t27b_run.t27", + "tests": { + "failed": 0, + "failing": [], + "forced": false, + "passed": 17, + "total": 17, + "vacuous": 0 + }, + "toolchain": { + "test_runner": "sha256:8512b80da533b79289110fca4a65f3336abd7a059ca4b72ea595d5e33ff8ad10", + "zig": "0.16.0" + } +} \ No newline at end of file diff --git a/.trinity/seals/lab_LabT27bText.json b/.trinity/seals/lab_LabT27bText.json new file mode 100644 index 0000000000..bcb6d172d0 --- /dev/null +++ b/.trinity/seals/lab_LabT27bText.json @@ -0,0 +1,33 @@ +{ + "built_by": "t27c-bootstrap@0.5.2+0fba674ef", + "closure": [ + { + "spec": "specs/lab/text.t27", + "spec_hash": "sha256:5a108e7c6da57c5c4fbd2c3f109092dcf130ca9107b4f559c4bbba750a863c3e" + } + ], + "config": "gen=c,rust,verilog,zig;tests=zig", + "gen_hash_c": "sha256:e6d2bd97151eeda426a4edaad94e4326a5cee123be3214fb2c282eb9cc3c87e2", + "gen_hash_rust": "sha256:f795ba0639cf6bd78bb55bfac007f7b8fadd80c7016519f256400581ad7e6d06", + "gen_hash_verilog": "sha256:6510befbf41b8ca8bac258f9b01c6baec21ef839fa16071b66b139a91e3798d8", + "gen_hash_zig": "sha256:d8a17d321bbc7956e6765903afafa3e58df036bc9b4064f20c09d0f60cd4e5d2", + "module": "LabT27bText", + "ring": 12, + "seal_schema": 2, + "sealed_at": "2026-10-19T14:56:48Z", + "sealed_by": "t27c-bootstrap@0.5.2", + "spec_hash": "sha256:9bc927c023fb4bfc51f0123a4ae80ec632149fa9ece72a8a3a550ca86fe761d0", + "spec_path": "specs/lab/lab_t27b_text.t27", + "tests": { + "failed": 0, + "failing": [], + "forced": false, + "passed": 8, + "total": 8, + "vacuous": 0 + }, + "toolchain": { + "test_runner": "sha256:8512b80da533b79289110fca4a65f3336abd7a059ca4b72ea595d5e33ff8ad10", + "zig": "0.16.0" + } +} \ No newline at end of file diff --git a/specs/lab/lab_t27b_cache.t27 b/specs/lab/lab_t27b_cache.t27 new file mode 100644 index 0000000000..b2ed0a5ad1 --- /dev/null +++ b/specs/lab/lab_t27b_cache.t27 @@ -0,0 +1,1941 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/lab/lab_t27b_cache.t27 -- the reference cache of the t27b lab: what a cached verdict depends on, which verdicts are +; kept, and when a kept one is used (issue #11042, epic #11040). +; -- +; The oracle is contrib/railway/t27b-lab/lab.py (imported unedited). A t27c reference verdict is a function of the spec's +; bytes, the bytes of every spec it imports with `use`, the t27c binary and the zig that compiles its output; the lab +; keeps verdicts under the sha256 of exactly those. The tables at the end were computed by running lab.py: use_closure and +; reference_key on a tree of ten files written for the table, reference_cacheable on every verdict word with every +; detail, reference_all itself (its process-spawning parts replaced) for the hit rule and for the two lines it writes, +; first_line with its subprocess replaced, and reference_stamp on binaries written for the table. +; -- +; PORTED, lab.py name -> here: +; reference_cacheable lc_cacheable +; reference_all, the hit rule lc_hit_usable +; reference_all, its two texts lc_log_line, lc_reused +; reference_stamp, first_line lc_stamp, lc_first_line (the line of stdout or stderr, and Python's IndexError words) +; use_closure lc_closure (the edges are t27c's `use-edges` text; lc_reach, lc_path_cmp) +; reference_key lc_key_begin, lc_key_file, lc_key_hex (streaming sha256 over specs/tri/crypto/sha256.t27) +; LEFT OUT, and why: reading the files and the t27c binary, running `t27c use-edges`, the cache file's JSON, the lock and +; the thread pool (they touch the disk or run processes: the runtime, #11040 L3). The caller streams the files of the +; closure into lc_key_file, in the order lc_closure writes them. +; -- +; THE ORDER OF A CLOSURE is pathlib's, not the string order: `specs/a/x.t27` sorts before `specs/a.t27` (comparing +; component by component, a directory `a` sorts before the file `a.t27`), where the strings sort the other way round. +; Both were measured; the table holds ten such cases. A spec that is no key of the edges takes the list of the key `*` +; (what lab.py writes for every spec when it has no t27c to ask), and no list when there is no such key either. +; WHERE THE SPEC DIFFERS FROM THE PYTHON: paths are relative, already normalised and without symlinks (t27c prints them so); +; a closure of more nodes than the caller's buffer is refused (LAB_NO), never cut. +; ASCII only (L3). phi^2 + 1/phi^2 = 3 | TRINITY + +module LabT27bCache; + +use lab::text::{LAB_NO, lab_line_end, lab_line_next, lab_strip_from, lab_strip_to, lab_lit_at, lab_same_span, lab_span_cmp, lab_find_byte, lab_put_span, lab_put_lit, lab_put_count}; +use lab::lab_t27b_text::{lx_out_is}; +use tri::crypto::sha256::{init, update, final, to_hex, SHA256}; + +/// The key of a reference verdict starts with this text and a NUL byte: lab.py's b"t27b-lab-ref-v1\0". +pub const LC_PREFIX : string = "t27b-lab-ref-v1"; +/// The tail of the data a file that cannot be read is hashed as: a NUL byte and these seven letters. +pub const LC_MISSING : string = "missing"; +/// A blocked verdict whose detail starts so says the t27c process was killed by a signal: the lab's +/// doing, not the spec's, and never cached. +pub const LC_KILLED : string = "t27c test-report exited -"; + +/// reference_cacheable: a pass and a fail are facts about the spec; a blocked verdict is one too unless +/// the t27c that said it was killed by a signal; a timeout, a lab error and any other word say something +/// about the lab that minute. +pub fn lc_cacheable(verdict : string, detail : string) -> bool { + if (lab_same_span(verdict, 0, verdict.len, "pass", 0, 4)) { return true; } + if (lab_same_span(verdict, 0, verdict.len, "fail", 0, 4)) { return true; } + if (lab_same_span(verdict, 0, verdict.len, "blocked", 0, 7)) { + return lab_lit_at(detail, 0, detail.len, LC_KILLED) == false; + } + return false; +} + +/// Is a cached entry used: reference_all's test. hit_len is the entry's length (an entry of fewer than two +/// words is none); the entry must be cacheable; and when the per-test verdicts are wanted, a pass or a fail +/// that was cached without them is a miss. +pub fn lc_hit_usable(hit_len : usize, verdict : string, detail : string, has_tests : bool, tests_wanted : bool) -> bool { + if (hit_len < 2) { return false; } + if (lc_cacheable(verdict, detail) == false) { return false; } + if (tests_wanted and has_tests == false) { + if (lab_same_span(verdict, 0, verdict.len, "pass", 0, 4)) { return false; } + if (lab_same_span(verdict, 0, verdict.len, "fail", 0, 4)) { return false; } + } + return true; +} + +/// "%d of %d" of the cache's own count: the hits and everything the lab looked up. +pub fn lc_reused(hits : u64, misses : u64, not_cached : u64, out : []u8, cap : usize, w : usize) -> usize { + var x : usize = lab_put_count(out, cap, w, hits); + x = lab_put_lit(out, cap, x, " of "); + return lab_put_count(out, cap, x, hits + misses + not_cached); +} + +/// The log line before the reference runs: `reference cache: H hits, R to run (STAMP)`. +pub fn lc_log_line(hits : u64, to_run : u64, stamp : string, out : []u8, cap : usize, w : usize) -> usize { + var x : usize = lab_put_lit(out, cap, w, "reference cache: "); + x = lab_put_count(out, cap, x, hits); + x = lab_put_lit(out, cap, x, " hits, "); + x = lab_put_count(out, cap, x, to_run); + x = lab_put_lit(out, cap, x, " to run ("); + x = lab_put_lit(out, cap, x, stamp); + return lab_put_lit(out, cap, x, ")"); +} + +/// reference_stamp: the t27c binary's sha256 (64 hex letters) and the first line of `zig version`. +pub fn lc_stamp(binary_sha : string, zig_line : string, out : []u8, cap : usize, w : usize) -> usize { + var x : usize = lab_put_lit(out, cap, w, "t27c "); + x = lab_put_lit(out, cap, x, binary_sha); + x = lab_put_lit(out, cap, x, " zig "); + return lab_put_lit(out, cap, x, zig_line); +} + +/// first_line's answer for a command that ran: the first line of stdout, or of stderr when stdout is empty, +/// stripped. Output with no text in it is an IndexError that lab.py catches, so the line is the words +/// `unavailable: list index out of range` (stdout that is only spaces is not empty, and stderr is not read). +pub fn lc_first_line(stdout : string, stderr : string, out : []u8, cap : usize, w : usize) -> usize { + var t : string = stdout; + if (stdout.len == 0) { t = stderr; } + const a : usize = lab_strip_from(t, 0, t.len); + const b : usize = lab_strip_to(t, a, t.len); + if (a == b) { return lab_put_lit(out, cap, w, "unavailable: list index out of range"); } + var e : usize = lab_line_end(t, a); + if (e > b) { e = b; } + return lab_put_span(out, cap, w, t, a, e); +} + +// ---- use_closure: the spec and everything it imports ---- +; The imports are t27c's own, `t27c use-edges` prints them: one line per edge, `importer TAB imported`. +; lab.py reads each line with split("\t")[0] and split("\t")[-1] (a line with no tab is its own importer and +; imported), keeps the lists in the order of the lines, and asks for a spec's list by its path; a spec that is +; no key gets the list of the key `*` (what lab.py writes for every spec when it has no t27c to ask), and no +; list at all when there is no such key either. The closure is the spec first, then every spec reachable, once +; each, sorted as pathlib sorts paths: by their components one at a time, so `specs/a/x.t27` comes before +; `specs/a.t27` (the string order is the other way round). Paths are relative and already normalised, as +; t27c prints them (no `..`, no `.`, no double slash). +; A node is three words in the caller's buffer: 0 when its name is the start text and 1 when it is a line of +; the edges, then where the name starts and ends. + +/// The end of the importer of the edge line edges[ls..le]: its first tab, or the line's end. +pub fn lc_edge_key_end(edges : string, ls : usize, le : usize) -> usize { + const tab : usize = lab_find_byte(edges, ls, le, 9); + if (tab == LAB_NO) { return le; } + return tab; +} + +/// Where the imported of the edge line starts: after its last tab, or at the line's start. +pub fn lc_edge_val_from(edges : string, ls : usize, le : usize) -> usize { + var k : usize = le; + while (k > ls) { + if (edges[k - 1] == 9) { return k; } + k = k - 1; + } + return ls; +} + +/// The path text of node i: the start, or a span of the edges. +pub fn lc_node_text(start : string, edges : string, vis : []const u32, i : usize) -> string { + if (vis[3 * i] == 0) { return start; } + return edges; +} + +/// Is the span in the first i nodes of vis. +pub fn lc_seen(start : string, edges : string, vis : []const u32, n : usize, t : string, a : usize, b : usize) -> bool { + var j : usize = 0; + while (j < n) { + if (lab_same_span(lc_node_text(start, edges, vis, j), vis[3 * j + 1] as usize, vis[3 * j + 2] as usize, t, a, b)) { return true; } + j = j + 1; + } + return false; +} + +/// pathlib's order of two relative paths: -1, 0 or 1, comparing the components one at a time; a path that is +/// the first components of another sorts first. +pub fn lc_path_cmp(a : string, a0 : usize, a1 : usize, b : string, b0 : usize, b1 : usize) -> i32 { + var i : usize = a0; + var j : usize = b0; + while (true) { + var ie : usize = lab_find_byte(a, i, a1, 47); + if (ie == LAB_NO) { ie = a1; } + var je : usize = lab_find_byte(b, j, b1, 47); + if (je == LAB_NO) { je = b1; } + const c : i32 = lab_span_cmp(a, i, ie, b, j, je); + if (c != 0) { return c; } + if (ie == a1 and je == b1) { return 0; } + if (ie == a1) { return -1; } + if (je == b1) { return 1; } + i = ie + 1; + j = je + 1; + } + return 0; +} + +/// The nodes reachable from start, in vis (3 words each, room for cap of them); how many, or LAB_NO when there are more than cap. +pub fn lc_reach(edges : string, start : string, vis : []u32, cap : usize) -> usize { + if (cap == 0) { return LAB_NO; } + vis[0] = 0; + vis[1] = 0; + vis[2] = start.len as u32; + var n : usize = 1; + var head : usize = 0; + while (head < n) { + const name : string = lc_node_text(start, edges, vis, head); + const nf : usize = vis[3 * head + 1] as usize; + const nt : usize = vis[3 * head + 2] as usize; + var has_key : bool = false; + var s : usize = 0; + while (s < edges.len) { + const e : usize = lab_line_end(edges, s); + if (lab_same_span(edges, s, lc_edge_key_end(edges, s, e), name, nf, nt)) { has_key = true; } + s = lab_line_next(edges, e); + } + s = 0; + while (s < edges.len) { + const e : usize = lab_line_end(edges, s); + const ke : usize = lc_edge_key_end(edges, s, e); + var hit : bool = false; + if (has_key) { + hit = lab_same_span(edges, s, ke, name, nf, nt); + } else { + hit = lab_same_span(edges, s, ke, "*", 0, 1); + } + if (hit) { + const v : usize = lc_edge_val_from(edges, s, e); + if (lc_seen(start, edges, vis, n, edges, v, e) == false) { + if (n >= cap) { return LAB_NO; } + vis[3 * n] = 1; + vis[3 * n + 1] = v as u32; + vis[3 * n + 2] = e as u32; + n = n + 1; + } + } + s = lab_line_next(edges, e); + } + head = head + 1; + } + return n; +} + +/// use_closure written as lines `path LF`: the start, then the rest sorted. LAB_NO when the closure is wider than cap nodes. +pub fn lc_closure(edges : string, start : string, vis : []u32, cap : usize, out : []u8, ocap : usize, w : usize) -> usize { + const n : usize = lc_reach(edges, start, vis, cap); + if (n == LAB_NO) { return LAB_NO; } + var x : usize = lab_put_lit(out, ocap, w, start); + x = lab_put_lit(out, ocap, x, "\n"); + var have : bool = false; + var last : usize = 0; + var step : usize = 1; + while (step < n) { + var best : usize = LAB_NO; + var i : usize = 1; + while (i < n) { + const ti : string = lc_node_text(start, edges, vis, i); + var later : bool = true; + if (have) { + later = lc_path_cmp(ti, vis[3 * i + 1] as usize, vis[3 * i + 2] as usize, lc_node_text(start, edges, vis, last), vis[3 * last + 1] as usize, vis[3 * last + 2] as usize) > 0; + } + if (later) { + if (best == LAB_NO) { + best = i; + } else { + if (lc_path_cmp(ti, vis[3 * i + 1] as usize, vis[3 * i + 2] as usize, lc_node_text(start, edges, vis, best), vis[3 * best + 1] as usize, vis[3 * best + 2] as usize) < 0) { best = i; } + } + } + i = i + 1; + } + x = lab_put_span(out, ocap, x, lc_node_text(start, edges, vis, best), vis[3 * best + 1] as usize, vis[3 * best + 2] as usize); + x = lab_put_lit(out, ocap, x, "\n"); + last = best; + have = true; + step = step + 1; + } + return x; +} + +// ---- reference_key: the sha256 of everything a reference verdict depends on ---- +; The key is sha256 of: the prefix and a NUL, the stamp and a NUL, then for each path of the closure in order +; the path, a NUL, the decimal length of the file's bytes, a NUL and the bytes. A file that cannot be read +; counts as the eight bytes NUL and `missing`. The caller streams: begin, one file per closure path, hex. + +/// Starts a key: the prefix, a NUL, the stamp, a NUL. +pub fn lc_key_begin(sha : *SHA256, stamp : string) -> void { + var z : [1]u8 = [0]; + update(sha, LC_PREFIX); + update(sha, z[0..1]); + update(sha, stamp); + update(sha, z[0..1]); +} + +/// Adds one file of the closure: its path, NUL, its length, NUL and its bytes (or the missing marker). +pub fn lc_key_file(sha : *SHA256, rel : string, data : string, present : bool) -> void { + var tmp : [32]u8 = [0] ** 32; + var zero : [1]u8 = [0]; + update(sha, rel); + var len : u64 = data.len as u64; + if (present == false) { len = 8; } + const x : usize = lab_put_count(tmp[0..32], 32, 1, len); + tmp[x] = 0; + update(sha, tmp[0..x + 1]); + if (present) { + update(sha, data); + } else { + update(sha, zero[0..1]); + update(sha, LC_MISSING); + } +} + +/// The key as 64 lower-case hex letters, written at w. +pub fn lc_key_hex(sha : *SHA256, out : []u8, cap : usize, w : usize) -> usize { + const h = to_hex(final(sha)); + var k : usize = 0; + while (k < 64) { + if (w + k < cap) { out[w + k] = h[k]; } + k = k + 1; + } + return w + 64; +} + +/// The widest closure a test asks for, in nodes. +pub const LC_TEST_NODES : usize = 100; + +// ---- tests ---- + +test only_a_fact_about_the_spec_is_cached { + assert lc_cacheable("pass", "") == true; + assert lc_cacheable("fail", "1 of 3 tests fail") == true; + assert lc_cacheable("blocked", "does not compile: spec.zig:1:1: error: x") == true; + assert lc_cacheable("blocked", "") == true; + assert lc_cacheable("blocked", "t27c test-report exited 1: x") == true; + assert lc_cacheable("blocked", "t27c test-report exited -9: ") == false; + assert lc_cacheable("blocked", "t27c test-report exited -") == false; + assert lc_cacheable("blocked", "t27c test-report exited") == true; + assert lc_cacheable("timeout", "over 300 s") == false; + assert lc_cacheable("lab_error", "zig ran out of threads/processes in the container") == false; + assert lc_cacheable("pass_vacuous", "") == false; + assert lc_cacheable("", "") == false; + assert lc_cacheable("Pass", "") == false; + assert lc_cacheable("blocked ", "") == false; +} + +test a_hit_needs_two_words_a_cacheable_verdict_and_the_per_test_verdicts_when_they_are_wanted { + assert lc_hit_usable(0, "pass", "", false, false) == false; + assert lc_hit_usable(1, "pass", "", false, false) == false; + assert lc_hit_usable(2, "pass", "", false, false) == true; + assert lc_hit_usable(2, "pass", "", false, true) == false; + assert lc_hit_usable(3, "pass", "", true, true) == true; + assert lc_hit_usable(3, "fail", "x", false, true) == false; + assert lc_hit_usable(3, "blocked", "x", false, true) == true; + assert lc_hit_usable(3, "timeout", "x", true, false) == false; + assert lc_hit_usable(3, "blocked", "t27c test-report exited -9: x", true, false) == false; +} + +test pathlib_sorts_by_component_so_a_directory_sorts_before_a_file_that_extends_its_name { + assert lc_path_cmp("specs/a/x.t27", 0, 13, "specs/a.t27", 0, 11) == -1; + assert lc_path_cmp("specs/a.t27", 0, 11, "specs/a/x.t27", 0, 13) == 1; + assert lc_path_cmp("specs/a/b/c.t27", 0, 15, "specs/a/b.t27", 0, 13) == -1; + assert lc_path_cmp("specs/a-b/z.t27", 0, 15, "specs/a.t27", 0, 11) == -1; + assert lc_path_cmp("specs/a_b/y.t27", 0, 15, "specs/a.t27", 0, 11) == 1; + assert lc_path_cmp("specs/B/w.t27", 0, 13, "specs/a/x.t27", 0, 13) == -1; + assert lc_path_cmp("specs/a", 0, 7, "specs/a/b", 0, 9) == -1; + assert lc_path_cmp("specs/a/b", 0, 9, "specs/a", 0, 7) == 1; + assert lc_path_cmp("specs/a", 0, 7, "specs/a", 0, 7) == 0; + assert lc_path_cmp("a", 0, 1, "b", 0, 1) == -1; + assert lc_path_cmp("zz/a", 1, 4, "z/a", 0, 3) == 0; +} + +test the_start_comes_first_and_the_rest_sorted_and_each_spec_once { + var vis : [300]u32 = undefined; + var out : [512]u8 = undefined; + const e : string = "z\ta\nz\tb\na\tb\nb\ta\nb\tz\n"; + const w : usize = lc_closure(e, "z", &vis, LC_TEST_NODES, &out, 512, 0); + assert lx_out_is(&out, w, "z\na\nb\n") == true; + const x : usize = lc_closure(e, "b", &vis, LC_TEST_NODES, &out, 512, 0); + assert lx_out_is(&out, x, "b\na\nz\n") == true; +} + +test a_spec_that_is_no_key_takes_the_wildcards_list_and_one_that_is_a_key_does_not { + var vis : [300]u32 = undefined; + var out : [512]u8 = undefined; + const e : string = "*\tw1\n*\tw2\nk\tk1\n"; + var w : usize = lc_closure(e, "other", &vis, LC_TEST_NODES, &out, 512, 0); + assert lx_out_is(&out, w, "other\nw1\nw2\n") == true; + w = lc_closure(e, "k", &vis, LC_TEST_NODES, &out, 512, 0); + assert lx_out_is(&out, w, "k\nk1\nw1\nw2\n") == true; + w = lc_closure("k\tk1\n", "k", &vis, LC_TEST_NODES, &out, 512, 0); + assert lx_out_is(&out, w, "k\nk1\n") == true; + w = lc_closure(e, "k1", &vis, LC_TEST_NODES, &out, 512, 0); + assert lx_out_is(&out, w, "k1\nw1\nw2\n") == true; + w = lc_closure("", "x", &vis, LC_TEST_NODES, &out, 512, 0); + assert lx_out_is(&out, w, "x\n") == true; +} + +test an_edge_line_is_split_at_its_first_and_last_tab { + var vis : [300]u32 = undefined; + var out : [512]u8 = undefined; + var w : usize = lc_closure("a\tb\tc\n", "a", &vis, LC_TEST_NODES, &out, 512, 0); + assert lx_out_is(&out, w, "a\nc\n") == true; + w = lc_closure("a\n", "a", &vis, LC_TEST_NODES, &out, 512, 0); + assert lx_out_is(&out, w, "a\n") == true; + w = lc_closure("a\tb", "a", &vis, LC_TEST_NODES, &out, 512, 0); + assert lx_out_is(&out, w, "a\nb\n") == true; + assert lc_edge_key_end("ab\tcd", 0, 5) == 2; + assert lc_edge_key_end("abcd", 0, 4) == 4; + assert lc_edge_val_from("ab\tcd\tef", 0, 8) == 6; + assert lc_edge_val_from("abcd", 0, 4) == 0; + assert lc_edge_val_from("x ab\tcd", 2, 7) == 5; +} + +test a_closure_wider_than_the_buffer_is_refused_not_cut { + var vis : [30]u32 = undefined; + var out : [512]u8 = undefined; + const e : string = "a\tb\nb\tc\nc\td\n"; + assert lc_closure(e, "a", &vis, 4, &out, 512, 0) == 8; + assert lc_closure(e, "a", &vis, 3, &out, 512, 0) == LAB_NO; + assert lc_closure(e, "d", &vis, 1, &out, 512, 0) == 2; + assert lc_closure(e, "a", &vis, 0, &out, 512, 0) == LAB_NO; +} + +test the_key_depends_on_the_stamp_the_path_the_length_and_the_bytes { + var h1 : [64]u8 = undefined; + var h2 : [64]u8 = undefined; + var s1 : SHA256 = init(); + lc_key_begin(&s1, "stamp"); + lc_key_file(&s1, "a", "xy", true); + assert lc_key_hex(&s1, &h1, 64, 0) == 64; + var s2 : SHA256 = init(); + lc_key_begin(&s2, "stamp"); + lc_key_file(&s2, "a", "xy", true); + assert lc_key_hex(&s2, &h2, 64, 0) == 64; + assert lx_out_is(&h1, 64, "00") == false; + var same : bool = true; + var k : usize = 0; + while (k < 64) { + if (h1[k] != h2[k]) { same = false; } + k = k + 1; + } + assert same == true; + var s3 : SHA256 = init(); + lc_key_begin(&s3, "stamq"); + lc_key_file(&s3, "a", "xy", true); + assert lc_key_hex(&s3, &h2, 64, 0) == 64; + var diff : usize = 0; + k = 0; + while (k < 64) { + if (h1[k] != h2[k]) { diff = diff + 1; } + k = k + 1; + } + assert diff > 40; +} + +test a_file_that_cannot_be_read_hashes_as_a_nul_and_the_word_missing { + var d : [8]u8 = undefined; + d[0] = 0; + d[1] = 109; + d[2] = 105; + d[3] = 115; + d[4] = 115; + d[5] = 105; + d[6] = 110; + d[7] = 103; + var h1 : [64]u8 = undefined; + var h2 : [64]u8 = undefined; + var s1 : SHA256 = init(); + lc_key_begin(&s1, "s"); + lc_key_file(&s1, "p", "", false); + assert lc_key_hex(&s1, &h1, 64, 0) == 64; + var s2 : SHA256 = init(); + lc_key_begin(&s2, "s"); + lc_key_file(&s2, "p", d[0..8], true); + assert lc_key_hex(&s2, &h2, 64, 0) == 64; + var k : usize = 0; + while (k < 64) { + assert h1[k] == h2[k]; + k = k + 1; + } + var s3 : SHA256 = init(); + lc_key_begin(&s3, "s"); + lc_key_file(&s3, "p", "", true); + assert lc_key_hex(&s3, &h2, 64, 0) == 64; + var diff : usize = 0; + k = 0; + while (k < 64) { + if (h1[k] != h2[k]) { diff = diff + 1; } + k = k + 1; + } + assert diff > 40; +} + +test the_cache_texts_are_the_labs_words { + var out : [256]u8 = undefined; + assert lx_out_is(&out, lc_reused(3, 4, 5, &out, 256, 0), "3 of 12") == true; + assert lx_out_is(&out, lc_reused(0, 0, 0, &out, 256, 0), "0 of 0") == true; + assert lx_out_is(&out, lc_log_line(2, 6, "S", &out, 256, 0), "reference cache: 2 hits, 6 to run (S)") == true; + assert lx_out_is(&out, lc_stamp("ab", "0.16.0", &out, 256, 0), "t27c ab zig 0.16.0") == true; + assert lx_out_is(&out, lc_first_line("zig 0.16.0\n", "", &out, 256, 0), "zig 0.16.0") == true; + assert lx_out_is(&out, lc_first_line("", "warn\nx", &out, 256, 0), "warn") == true; + assert lx_out_is(&out, lc_first_line(" \n", "x", &out, 256, 0), "unavailable: list index out of range") == true; + assert lx_out_is(&out, lc_first_line("", "", &out, 256, 0), "unavailable: list index out of range") == true; +} + +// BEGIN GENERATED +// The tables below were computed by running contrib/railway/t27b-lab/lab.py's own functions: use_closure and +// reference_key on a tree of ten files written for the table (the files are FS_PATH and FS_DATA; a path that is +// not among them is a file that cannot be read), reference_cacheable on every verdict word with every detail, +// reference_all itself (its process-spawning parts replaced) for the hit rule and for the two lines it +// writes, first_line with its subprocess replaced, and reference_stamp on binaries written for the table. + +// the fixture tree: ten files, and the text each holds +pub const FS_PATH : [10]string = [ + "specs/a.t27", + "specs/a/x.t27", + "specs/a_b/y.t27", + "specs/a-b/z.t27", + "specs/B/w.t27", + "specs/a/b.t27", + "specs/a/b/c.t27", + "specs/m.t27", + "specs/n.t27", + "specs/o/p.t27" +]; + +pub const FS_DATA : [10]string = [ + "module A;\n", + "module AX;\nuse a::b;\n", + "", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n", + "caf\xc3\xa9 \xe3\x81\x82\n", + "tab\there\x0d\nline2\n", + "\n\n\n", + "module M;\nmodule M;\nmodule M;\nmodule M;\nmodule M;\n", + "n", + "ends with quote \"\n" +]; + +// CK: use_closure and reference_key -- 79 cases (stamp, edges, start), the closure as lines and the key +pub const CK_N : usize = 79; +pub const CK_STAMP : [79]string = [ + "t27c cd zig 0", + "t27c cd zig 0", + "", + "t27c cd zig 0", + "", + "", + "t27c cd zig 0", + "", + "t27c ab zig 0.16.0", + "t27c cd zig 0", + "x", + "", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "t27c cd zig 0", + "t27c cd zig 0", + "", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "", + "", + "t27c ab zig 0.16.0", + "t27c cd zig 0", + "x", + "t27c cd zig 0", + "", + "", + "x", + "t27c cd zig 0", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "t27c cd zig 0", + "x", + "t27c cd zig 0", + "t27c ab zig 0.16.0", + "x", + "x", + "", + "x", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "t27c cd zig 0", + "t27c ab zig 0.16.0", + "x", + "", + "x", + "t27c cd zig 0", + "", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "", + "", + "t27c cd zig 0", + "x", + "t27c ab zig 0.16.0", + "", + "x", + "", + "t27c cd zig 0", + "t27c cd zig 0", + "t27c ab zig 0.16.0", + "t27c ab zig 0.16.0", + "", + "", + "t27c cd zig 0", + "t27c ab zig 0.16.0", + "x", + "t27c cd zig 0", + "t27c ab zig 0.16.0", + "", + "", + "x", + "t27c ab zig 0.16.0", + "" +]; + +pub const CK_EDGES : [79]string = [ + "", + "", + "", + "specs/a.t27\tspecs/a/b.t27\nspecs/a/b.t27\tspecs/a/b/c.t27\n", + "specs/a.t27\tspecs/a/b.t27\nspecs/a/b.t27\tspecs/a/b/c.t27\n", + "specs/a.t27\tspecs/a/b.t27\nspecs/a.t27\tspecs/a/x.t27\nspecs/a/b.t27\tspecs/a/b/c.t27\nspecs/a/x.t27\tspecs/a/b/c.t27\n", + "specs/a.t27\tspecs/a/b.t27\nspecs/a/b.t27\tspecs/a.t27\n", + "specs/a.t27\tspecs/a.t27\n", + "specs/a.t27\tspecs/a/b.t27\nspecs/a/b.t27\tspecs/a/x.t27\nspecs/a/x.t27\tspecs/a/b/c.t27\nspecs/a/b/c.t27\tspecs/a.t27\n", + "specs/m.t27\tspecs/a.t27\nspecs/m.t27\tspecs/a/x.t27\nspecs/m.t27\tspecs/a_b/y.t27\nspecs/m.t27\tspecs/a-b/z.t27\nspecs/m.t27\tspecs/B/w.t27\nspecs/m.t27\tspecs/a/b.t27\nspecs/m.t27\tspecs/a/b/c.t27\nspecs/m.t27\tspecs/o/p.t27\n", + "specs/m.t27\tspecs/o/p.t27\nspecs/m.t27\tspecs/a/b/c.t27\nspecs/m.t27\tspecs/a/b.t27\nspecs/m.t27\tspecs/B/w.t27\nspecs/m.t27\tspecs/a-b/z.t27\nspecs/m.t27\tspecs/a_b/y.t27\nspecs/m.t27\tspecs/a/x.t27\nspecs/m.t27\tspecs/a.t27\n", + "specs/m.t27\tspecs/a.t27\nspecs/m.t27\tspecs/a/x.t27\n", + "specs/m.t27\tspecs/a/x.t27\nspecs/m.t27\tspecs/a.t27\n", + "specs/m.t27\tspecs/a/b/c.t27\nspecs/m.t27\tspecs/a/b.t27\nspecs/m.t27\tspecs/a/x.t27\nspecs/m.t27\tspecs/a.t27\n", + "specs/m.t27\tspecs/a_b/y.t27\nspecs/m.t27\tspecs/a-b/z.t27\nspecs/m.t27\tspecs/B/w.t27\n", + "specs/m.t27\tspecs/a-b/z.t27\nspecs/m.t27\tspecs/a_b/y.t27\n", + "specs/m.t27\tspecs/gone.t27\nspecs/m.t27\tspecs/x/gone2.t27\n", + "specs/gone.t27\tspecs/a.t27\n", + "specs/m.t27\tspecs/a/gone3.t27\nspecs/a/gone3.t27\tspecs/a.t27\n", + "*\tspecs/a.t27\n*\tspecs/n.t27\n", + "*\tspecs/a.t27\n*\tspecs/n.t27\n", + "*\tspecs/a.t27\n*\tspecs/n.t27\nspecs/a.t27\tspecs/a/b.t27\n", + "*\tspecs/a.t27\n*\tspecs/n.t27\nspecs/a.t27\tspecs/a/b.t27\n", + "*\tspecs/a/x.t27\nspecs/a.t27\tspecs/a/b.t27\n", + "*\tspecs/a.t27\n*\tspecs/a/x.t27\n*\tspecs/a_b/y.t27\n*\tspecs/a-b/z.t27\n*\tspecs/B/w.t27\n*\tspecs/a/b.t27\n*\tspecs/a/b/c.t27\n*\tspecs/m.t27\n*\tspecs/n.t27\n*\tspecs/o/p.t27\n", + "*\tspecs/a.t27\n*\tspecs/a/x.t27\n*\tspecs/a_b/y.t27\n*\tspecs/a-b/z.t27\n*\tspecs/B/w.t27\n*\tspecs/a/b.t27\n*\tspecs/a/b/c.t27\n*\tspecs/m.t27\n*\tspecs/n.t27\n*\tspecs/o/p.t27\n", + "specs/a.t27\tspecs/a/b.t27\textra\n", + "specs/a.t27\tspecs/a/b.t27\tspecs/a/b/c.t27\n", + "specs/a.t27\n", + "specs/a.t27\nspecs/a/b.t27\n", + "\n\nspecs/a.t27\tspecs/a/b.t27\n\n", + "specs/a.t27\tspecs/a/b.t27", + "specs/a.t27\tspecs/a/b.t27\x0d\nspecs/a/b.t27\tspecs/a/b/c.t27", + "specs/a.t27\tspecs/a/b.t27\x0dspecs/a/b.t27\tspecs/a/b/c.t27\x0d", + "specs/a.t27\tspecs/a/b.t27\x0bspecs/a/b.t27\tspecs/a/b/c.t27\n", + "specs/a.t27\tspecs/a/b.t27\x1cspecs/a/b.t27\tspecs/a/b/c.t27\n", + "specs/a.t27\tspecs/a/b.t27\nspecs/a.t27\tspecs/a/b.t27\n", + "specs/a.t27\tspecs/a/b.t27\nspecs/a.t27\tspecs/a/b.t27\nspecs/a/b.t27\tspecs/a/b/c.t27\nspecs/a/b.t27\tspecs/a/b/c.t27\n", + "specs/a.t27 \tspecs/a/b.t27\nspecs/a.t27\tspecs/a/x.t27\n", + " specs/a.t27\tspecs/a/b.t27\nspecs/a.t27\tspecs/a/x.t27\n", + "specs/a.t27\tspecs/a/b.t27 \n", + "specs/a.t27\tspecs/a/b.t27\n\t\n", + "\tspecs/a/b.t27\n", + "\t\n", + "specs/A.t27\tspecs/a/b.t27\n", + "specs/a/b/c.t27\tspecs/a/x.t27\n", + "specs/a.t27\tspecs/m.t27\nspecs/x/gone2.t27\tspecs/a/b/c.t27\nspecs/o/p.t27\tspecs/gone.t27", + "specs/a/b.t27\tspecs/a.t27\nspecs/a/gone3.t27\tspecs/a/x.t27\nspecs/x/gone2.t27\tspecs/a/x.t27\nspecs/m.t27\tspecs/a/gone3.t27\nspecs/gone.t27\tspecs/n.t27", + "specs/a/b/c.t27\tspecs/gone.t27\nspecs/a/b/c.t27\tspecs/a/b/c.t27\nspecs/a.t27\tspecs/B/w.t27\nspecs/a/gone3.t27\tspecs/o/p.t27\nspecs/a.t27\tspecs/a-b/z.t27\nspecs/o/p.t27\tspecs/gone.t27\nspecs/a.t27\tspecs/a_b/y.t27\nspecs/B/w.t27\tspecs/a.t27\nspecs/a/b.t27\tspecs/B/w.t27\nspecs/a/x.t27\tspecs/a/x.t27\nspecs/gone.t27\tspecs/a-b/z.t27", + "specs/o/p.t27\tspecs/m.t27\nspecs/a_b/y.t27\tspecs/a/b/c.t27\nspecs/a_b/y.t27\tspecs/B/w.t27\nspecs/o/p.t27\tspecs/a-b/z.t27\nspecs/a_b/y.t27\tspecs/x/gone2.t27\nspecs/n.t27\tspecs/a-b/z.t27\nspecs/a/b/c.t27\tspecs/m.t27\nspecs/a/b/c.t27\tspecs/a.t27\nspecs/a.t27\tspecs/n.t27\n", + "specs/o/p.t27\tspecs/m.t27\nspecs/a_b/y.t27\tspecs/x/gone2.t27\nspecs/a_b/y.t27\tspecs/a-b/z.t27\nspecs/gone.t27\tspecs/o/p.t27\n", + "specs/a/x.t27\tspecs/B/w.t27\nspecs/a-b/z.t27\tspecs/a.t27\nspecs/B/w.t27\tspecs/a/b.t27\n", + "specs/m.t27\tspecs/a/b.t27\nspecs/x/gone2.t27\tspecs/n.t27\nspecs/a_b/y.t27\tspecs/o/p.t27\nspecs/a.t27\tspecs/m.t27\nspecs/x/gone2.t27\tspecs/B/w.t27\n", + "specs/B/w.t27\tspecs/a/b.t27\nspecs/a/x.t27\tspecs/a/x.t27\nspecs/a/b.t27\tspecs/x/gone2.t27\nspecs/x/gone2.t27\tspecs/x/gone2.t27\nspecs/a/gone3.t27\tspecs/a/b.t27\nspecs/gone.t27\tspecs/m.t27\nspecs/a/b/c.t27\tspecs/a/gone3.t27", + "specs/a/b/c.t27\tspecs/o/p.t27\nspecs/a/x.t27\tspecs/a/x.t27\nspecs/a/x.t27\tspecs/B/w.t27\nspecs/x/gone2.t27\tspecs/a/b.t27\nspecs/x/gone2.t27\tspecs/x/gone2.t27\nspecs/m.t27\tspecs/m.t27\nspecs/a/x.t27\tspecs/n.t27\nspecs/a.t27\tspecs/B/w.t27\nspecs/m.t27\tspecs/a.t27\n", + "specs/gone.t27\tspecs/m.t27\nspecs/a.t27\tspecs/a/b.t27\nspecs/gone.t27\tspecs/o/p.t27\nspecs/a_b/y.t27\tspecs/a/gone3.t27\nspecs/gone.t27\tspecs/m.t27\nspecs/a-b/z.t27\tspecs/a/b.t27\nspecs/B/w.t27\tspecs/a-b/z.t27\n", + "specs/o/p.t27\tspecs/a/b.t27\nspecs/a_b/y.t27\tspecs/m.t27\nspecs/a.t27\tspecs/x/gone2.t27", + "specs/B/w.t27\tspecs/a-b/z.t27\n", + "specs/o/p.t27\tspecs/m.t27\nspecs/a.t27\tspecs/B/w.t27\nspecs/a.t27\tspecs/gone.t27\nspecs/o/p.t27\tspecs/a/b.t27\nspecs/a/gone3.t27\tspecs/o/p.t27\nspecs/a_b/y.t27\tspecs/a/b/c.t27\nspecs/a.t27\tspecs/a/gone3.t27\nspecs/a-b/z.t27\tspecs/a/gone3.t27\nspecs/a.t27\tspecs/gone.t27\nspecs/a/x.t27\tspecs/gone.t27\n", + "specs/a-b/z.t27\tspecs/m.t27\n", + "specs/a.t27\tspecs/a_b/y.t27\nspecs/a/gone3.t27\tspecs/a/b.t27\nspecs/n.t27\tspecs/n.t27\nspecs/a/gone3.t27\tspecs/a_b/y.t27\nspecs/a/gone3.t27\tspecs/x/gone2.t27\nspecs/a/x.t27\tspecs/a/b/c.t27\nspecs/x/gone2.t27\tspecs/a/b/c.t27", + "specs/a.t27\tspecs/a/b/c.t27\nspecs/gone.t27\tspecs/n.t27\nspecs/a/b.t27\tspecs/m.t27\nspecs/a-b/z.t27\tspecs/a/x.t27\nspecs/a/gone3.t27\tspecs/gone.t27\nspecs/a/x.t27\tspecs/a-b/z.t27\nspecs/a/b/c.t27\tspecs/a/x.t27\nspecs/n.t27\tspecs/a/gone3.t27\nspecs/B/w.t27\tspecs/x/gone2.t27\nspecs/a/b.t27\tspecs/n.t27", + "specs/B/w.t27\tspecs/m.t27\nspecs/a-b/z.t27\tspecs/a/gone3.t27\nspecs/a/b/c.t27\tspecs/a/gone3.t27\nspecs/n.t27\tspecs/a/b.t27\nspecs/a_b/y.t27\tspecs/m.t27\nspecs/n.t27\tspecs/x/gone2.t27\nspecs/gone.t27\tspecs/x/gone2.t27\nspecs/m.t27\tspecs/o/p.t27\n", + "specs/B/w.t27\tspecs/x/gone2.t27\nspecs/a_b/y.t27\tspecs/n.t27\nspecs/n.t27\tspecs/B/w.t27\nspecs/a/b/c.t27\tspecs/o/p.t27\nspecs/a_b/y.t27\tspecs/n.t27\nspecs/o/p.t27\tspecs/m.t27\nspecs/n.t27\tspecs/a/x.t27\n", + "", + "specs/o/p.t27\tspecs/a/x.t27\nspecs/x/gone2.t27\tspecs/a_b/y.t27\nspecs/n.t27\tspecs/m.t27\nspecs/a/gone3.t27\tspecs/a/b/c.t27\nspecs/m.t27\tspecs/m.t27\nspecs/a/b/c.t27\tspecs/m.t27\nspecs/a/x.t27\tspecs/a-b/z.t27\nspecs/a.t27\tspecs/B/w.t27", + "", + "specs/x/gone2.t27\tspecs/a/b.t27\nspecs/m.t27\tspecs/a/x.t27\nspecs/o/p.t27\tspecs/a/x.t27\nspecs/o/p.t27\tspecs/B/w.t27\nspecs/x/gone2.t27\tspecs/n.t27\nspecs/a.t27\tspecs/a/b/c.t27\nspecs/n.t27\tspecs/o/p.t27\nspecs/a-b/z.t27\tspecs/gone.t27\nspecs/a-b/z.t27\tspecs/n.t27\nspecs/n.t27\tspecs/o/p.t27\n", + "specs/a/b.t27\tspecs/a_b/y.t27\nspecs/a/b.t27\tspecs/a-b/z.t27\nspecs/a-b/z.t27\tspecs/a/x.t27\nspecs/a-b/z.t27\tspecs/a_b/y.t27\nspecs/B/w.t27\tspecs/a/b/c.t27\nspecs/a/b/c.t27\tspecs/n.t27\nspecs/a_b/y.t27\tspecs/a-b/z.t27\nspecs/gone.t27\tspecs/a/gone3.t27\nspecs/a-b/z.t27\tspecs/o/p.t27\nspecs/a/b.t27\tspecs/a/x.t27\nspecs/gone.t27\tspecs/a/gone3.t27\n", + "specs/a.t27\tspecs/a.t27\n", + "specs/a/x.t27\tspecs/a-b/z.t27\nspecs/a_b/y.t27\tspecs/B/w.t27\n", + "specs/m.t27\tspecs/a/x.t27\nspecs/a/b.t27\tspecs/a/b/c.t27\n", + "specs/a/b.t27\tspecs/a.t27\nspecs/a.t27\tspecs/a-b/z.t27\nspecs/m.t27\tspecs/a/b.t27\nspecs/a/b/c.t27\tspecs/a-b/z.t27\nspecs/a/x.t27\tspecs/n.t27\nspecs/a/b.t27\tspecs/a/x.t27\n", + "specs/n.t27\tspecs/o/p.t27\nspecs/a/gone3.t27\tspecs/a/gone3.t27\nspecs/a/x.t27\tspecs/x/gone2.t27\nspecs/a_b/y.t27\tspecs/a/b/c.t27\nspecs/a/b.t27\tspecs/n.t27\nspecs/a/gone3.t27\tspecs/a/b/c.t27\nspecs/a/b/c.t27\tspecs/a-b/z.t27\nspecs/a/x.t27\tspecs/a/gone3.t27\nspecs/m.t27\tspecs/a/x.t27", + "specs/gone.t27\tspecs/B/w.t27\nspecs/gone.t27\tspecs/a/b/c.t27\nspecs/n.t27\tspecs/a/x.t27\n", + "specs/a/b/c.t27\tspecs/o/p.t27\nspecs/o/p.t27\tspecs/a/x.t27\nspecs/B/w.t27\tspecs/m.t27\nspecs/a.t27\tspecs/a/gone3.t27\nspecs/a/b/c.t27\tspecs/a.t27\nspecs/B/w.t27\tspecs/B/w.t27\nspecs/n.t27\tspecs/n.t27\nspecs/n.t27\tspecs/o/p.t27\nspecs/a/x.t27\tspecs/gone.t27\nspecs/gone.t27\tspecs/a/x.t27\nspecs/gone.t27\tspecs/a/gone3.t27\n", + "specs/a_b/y.t27\tspecs/m.t27\nspecs/o/p.t27\tspecs/a.t27\nspecs/m.t27\tspecs/a/b/c.t27\nspecs/a/b/c.t27\tspecs/o/p.t27\nspecs/n.t27\tspecs/B/w.t27\nspecs/B/w.t27\tspecs/n.t27\n", + "", + "specs/a/gone3.t27\tspecs/gone.t27\nspecs/a/b.t27\tspecs/x/gone2.t27\nspecs/o/p.t27\tspecs/x/gone2.t27\nspecs/a/x.t27\tspecs/a/gone3.t27\nspecs/a/b/c.t27\tspecs/x/gone2.t27\nspecs/a/gone3.t27\tspecs/a-b/z.t27\nspecs/a/x.t27\tspecs/a/gone3.t27\nspecs/m.t27\tspecs/a_b/y.t27\nspecs/a-b/z.t27\tspecs/o/p.t27\nspecs/a.t27\tspecs/o/p.t27\n" +]; + +pub const CK_START : [79]string = [ + "specs/a.t27", + "specs/gone.t27", + "specs/m.t27", + "specs/a.t27", + "specs/a/b/c.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a/b.t27", + "specs/m.t27", + "specs/m.t27", + "specs/m.t27", + "specs/m.t27", + "specs/m.t27", + "specs/m.t27", + "specs/m.t27", + "specs/m.t27", + "specs/gone.t27", + "specs/m.t27", + "specs/m.t27", + "specs/a.t27", + "specs/m.t27", + "specs/a.t27", + "specs/a/b.t27", + "specs/m.t27", + "specs/gone.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/a.t27", + "specs/gone.t27", + "specs/gone.t27", + "specs/n.t27", + "specs/a/b.t27", + "specs/a-b/z.t27", + "specs/B/w.t27", + "specs/a_b/y.t27", + "specs/a.t27", + "specs/m.t27", + "specs/x/gone2.t27", + "specs/a/gone3.t27", + "specs/B/w.t27", + "specs/a/b/c.t27", + "specs/gone.t27", + "specs/x/gone2.t27", + "specs/m.t27", + "specs/m.t27", + "specs/a/x.t27", + "specs/o/p.t27", + "specs/a.t27", + "specs/a/gone3.t27", + "specs/a-b/z.t27", + "specs/a_b/y.t27", + "specs/gone.t27", + "specs/o/p.t27", + "specs/a/x.t27", + "specs/n.t27", + "specs/x/gone2.t27", + "specs/a/b.t27", + "specs/m.t27", + "specs/a/b/c.t27", + "specs/gone.t27", + "specs/a-b/z.t27", + "specs/a/x.t27" +]; + +pub const CK_CLOSURE : [79]string = [ + "specs/a.t27\n", + "specs/gone.t27\n", + "specs/m.t27\n", + "specs/a.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\n", + "specs/a/b/c.t27\n", + "specs/a.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\nspecs/a/x.t27\n", + "specs/a.t27\nspecs/a/b.t27\n", + "specs/a.t27\n", + "specs/a/b.t27\nspecs/a/b/c.t27\nspecs/a/x.t27\nspecs/a.t27\n", + "specs/m.t27\nspecs/B/w.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\nspecs/a/x.t27\nspecs/a-b/z.t27\nspecs/a.t27\nspecs/a_b/y.t27\nspecs/o/p.t27\n", + "specs/m.t27\nspecs/B/w.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\nspecs/a/x.t27\nspecs/a-b/z.t27\nspecs/a.t27\nspecs/a_b/y.t27\nspecs/o/p.t27\n", + "specs/m.t27\nspecs/a/x.t27\nspecs/a.t27\n", + "specs/m.t27\nspecs/a/x.t27\nspecs/a.t27\n", + "specs/m.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\nspecs/a/x.t27\nspecs/a.t27\n", + "specs/m.t27\nspecs/B/w.t27\nspecs/a-b/z.t27\nspecs/a_b/y.t27\n", + "specs/m.t27\nspecs/a-b/z.t27\nspecs/a_b/y.t27\n", + "specs/m.t27\nspecs/gone.t27\nspecs/x/gone2.t27\n", + "specs/gone.t27\nspecs/a.t27\n", + "specs/m.t27\nspecs/a/gone3.t27\nspecs/a.t27\n", + "specs/m.t27\nspecs/a.t27\nspecs/n.t27\n", + "specs/a.t27\nspecs/n.t27\n", + "specs/m.t27\nspecs/a/b.t27\nspecs/a.t27\nspecs/n.t27\n", + "specs/a.t27\nspecs/a/b.t27\nspecs/n.t27\n", + "specs/a/b.t27\nspecs/a/x.t27\n", + "specs/m.t27\nspecs/B/w.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\nspecs/a/x.t27\nspecs/a-b/z.t27\nspecs/a.t27\nspecs/a_b/y.t27\nspecs/n.t27\nspecs/o/p.t27\n", + "specs/gone.t27\nspecs/B/w.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\nspecs/a/x.t27\nspecs/a-b/z.t27\nspecs/a.t27\nspecs/a_b/y.t27\nspecs/m.t27\nspecs/n.t27\nspecs/o/p.t27\n", + "specs/a.t27\nextra\n", + "specs/a.t27\nspecs/a/b/c.t27\n", + "specs/a.t27\n", + "specs/a.t27\n", + "specs/a.t27\nspecs/a/b.t27\n", + "specs/a.t27\nspecs/a/b.t27\n", + "specs/a.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\n", + "specs/a.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\n", + "specs/a.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\n", + "specs/a.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\n", + "specs/a.t27\nspecs/a/b.t27\n", + "specs/a.t27\nspecs/a/b/c.t27\nspecs/a/b.t27\n", + "specs/a.t27\nspecs/a/x.t27\n", + "specs/a.t27\nspecs/a/x.t27\n", + "specs/a.t27\nspecs/a/b.t27 \n", + "specs/a.t27\nspecs/a/b.t27\n", + "specs/a.t27\n", + "specs/a.t27\n", + "specs/a.t27\n", + "specs/gone.t27\n", + "specs/gone.t27\n", + "specs/n.t27\n", + "specs/a/b.t27\nspecs/B/w.t27\nspecs/a-b/z.t27\nspecs/a.t27\nspecs/a_b/y.t27\n", + "specs/a-b/z.t27\n", + "specs/B/w.t27\n", + "specs/a_b/y.t27\n", + "specs/a.t27\nspecs/a/b.t27\nspecs/m.t27\n", + "specs/m.t27\n", + "specs/x/gone2.t27\nspecs/a/b.t27\n", + "specs/a/gone3.t27\n", + "specs/B/w.t27\n", + "specs/a/b/c.t27\n", + "specs/gone.t27\n", + "specs/x/gone2.t27\n", + "specs/m.t27\n", + "specs/m.t27\n", + "specs/a/x.t27\n", + "specs/o/p.t27\nspecs/m.t27\n", + "specs/a.t27\n", + "specs/a/gone3.t27\nspecs/a/b/c.t27\nspecs/m.t27\n", + "specs/a-b/z.t27\n", + "specs/a_b/y.t27\n", + "specs/gone.t27\nspecs/a/gone3.t27\n", + "specs/o/p.t27\n", + "specs/a/x.t27\nspecs/a-b/z.t27\n", + "specs/n.t27\n", + "specs/x/gone2.t27\n", + "specs/a/b.t27\nspecs/n.t27\nspecs/o/p.t27\n", + "specs/m.t27\n", + "specs/a/b/c.t27\nspecs/a/gone3.t27\nspecs/a/x.t27\nspecs/a.t27\nspecs/gone.t27\nspecs/o/p.t27\n", + "specs/gone.t27\n", + "specs/a-b/z.t27\n", + "specs/a/x.t27\nspecs/a/gone3.t27\nspecs/a-b/z.t27\nspecs/gone.t27\nspecs/o/p.t27\nspecs/x/gone2.t27\n" +]; + +pub const CK_KEY : [79]string = [ + "0b83f8cb4f6844f4589f94e01a2c4e70d55e86efb22c95416e1c9062399aefda", + "41499fa3836d89ee03fde0d418de578d260f6540dd262d39deba16b40ae604bf", + "6c73d1364ba7fda8161a8b7a1c165d0bdd9b5b5e896845ac74cb5692fe5b0a5d", + "ae46ddf0c15a50b4da262137540a4524e0f87851b1821dc2a69bd38e834a6e8d", + "aa85abc6474754f2182854958ccc7f75fbba76fac451691dc23b2857a8e3d4de", + "4860efef6182bc9d6a82cc73efe007a6c427a39fd17d97638643125e457da03a", + "6416424dce2b5d0b05e6e0ffecb7267198f18c2a3ed92162b16791e4846a5d0d", + "43eb88eab76691a563e748c5c5c35cfe27382ff987bb54b1f0b04a177c68b36b", + "924de8c3707f521781fef6179f4a73fed146d4b9701f78c435949b02298649e8", + "51fad5d1da8e607010e8039cccbdcdbdc91bfbf20d9abefa346390e0b0936fa8", + "988d7c2917cac2c800694fb5dc69181b2aeddf8f5a8e7543bd4e78be88a8da95", + "a4e39274af8d3b23fa43a741af33f9ad50ad90d9dbb4f732d0f9a0de0afa5246", + "799ea9eb02284be38c4694865eb0d83f045272fa20e9f3df68977b43a29a6190", + "e8c63524232da91f38d76c44280af8a14cc17500aa4f47c1883626d57d532e84", + "029d21c1d9734bb2743e92b3cde75c487d9126627e98478bdd6915aab09eed80", + "a14a53d6027bf2348f309d3f6a241e273278be4fa83812fe3281d9391308ed97", + "ceb5c0db603901716a509be56412778a5764bd5b8291c204a8e9350ff6b6fea4", + "85c92c18153c4cc81a501eaaf62180f748f42c4d750197c94be06bc8584b57eb", + "2b551fec332e7fbc741123b6a0247c3ec11bfe9a096a5bc6e90b9d1e215e2d24", + "4a2243acd6406937c35cf97502051151b8075a3f383a729f6e049bb6d6bb3b24", + "ec1567b1463491012e679cb3516f24104a46a8dd239f2dda223d38a8a7a5f24f", + "048b641835bcb68a416a5c30f49390c471fbddbb96d2006b130cbdc0adb3b2db", + "94aa302c5c90dc8be9592dafe8f5c4b47dbda4cadb120c12cd216cb807beeefc", + "f66a809ac9129386325de718d87444af879ae7e5aaf4c418cfa98b8e3a3ec401", + "6be1f60b8b6c93b6f13485ec0166671e3a9bfc609953e5f77607463bbe659cd5", + "9f561826826d0e39469a3a42c6a31818a655c2662a64b33894d6d87296133dfb", + "a23885785cee950283e51e1d9897b6b0e3be713672fee841012ed8a01e3abb56", + "b6bbdb47757cd066aca5b95a322d740d8e3660f519c32eb836cac2837708f817", + "43eb88eab76691a563e748c5c5c35cfe27382ff987bb54b1f0b04a177c68b36b", + "0edf24a96d59572e85e08177f86c2c3f1fb516c59bc47af4bc13da69d770fd5b", + "6416424dce2b5d0b05e6e0ffecb7267198f18c2a3ed92162b16791e4846a5d0d", + "8cfedb56feb726fa43f3b059669ecb04e50100051e2d8a9882031b1b334e5416", + "6901ab152c605f64cdf6735eb176fddb2d92d78003bddf7eaf3e8217b36f9f11", + "ae46ddf0c15a50b4da262137540a4524e0f87851b1821dc2a69bd38e834a6e8d", + "a8b910e269beee4ac7f3d799870b37eb2bd671b4a1053b40bef0aee0278512d7", + "ae46ddf0c15a50b4da262137540a4524e0f87851b1821dc2a69bd38e834a6e8d", + "8cfedb56feb726fa43f3b059669ecb04e50100051e2d8a9882031b1b334e5416", + "a8b910e269beee4ac7f3d799870b37eb2bd671b4a1053b40bef0aee0278512d7", + "7d9347a3be0fd7815f52ba99ee1466f2047238cb28e942425a15b94e0d863969", + "5ab904e198aada1ab17c525d803a3ebdf41a8a10266765052c1fe619d5415eca", + "371cbd0badef377cc4dbaec3e24b2e9e9b62d37dd5836678138454fd89a95977", + "8cfedb56feb726fa43f3b059669ecb04e50100051e2d8a9882031b1b334e5416", + "7f1bad572578acd7522fdc4b306462140521a39e5b3a7190ea0879022b388cae", + "7f1bad572578acd7522fdc4b306462140521a39e5b3a7190ea0879022b388cae", + "0b83f8cb4f6844f4589f94e01a2c4e70d55e86efb22c95416e1c9062399aefda", + "3e21f58d6015da6c3b1546a2b3a1b1996ae8df24c56f34c4c5f7e47eaae6b559", + "c36656fce030214fab07b27f130638e8714eb0d331d338185a1d89cfed994977", + "59c733ec98e39f60a51277321d085af481680e1e2c774e894483ef080a41f7d2", + "0aef3394f4578a2ce865f341dd1571a59f893c9bd4830866182d7ca070facc10", + "9b7c03c0cbe8c11249f96c90afd000598c0d7fecda22ec07f0cef8e270ac4f78", + "6561455fa56a28916dab80f20d24a600f56b18e49bb465302e9088e75f7c4160", + "aeaf674a5043bd2b94761faca516aba6f4501ab0c38e4f7d061ce5f8b3040265", + "e85d6b6b239fde69ab9a55ae76151992e6f88163009e3714fc85fb0365d75d1b", + "9854ee693926e606ccdd38a99687c2ec1525968caac01c1485620bfd250207b6", + "a0d72ec5616c9eb69d69c146c73bc9d02cdf3f9ba8c7b6a88fc7cc735855feea", + "c42b719769504d7453f9c9308ab4d8ca601df26e8cff5a4841364013e63d3f9c", + "6561455fa56a28916dab80f20d24a600f56b18e49bb465302e9088e75f7c4160", + "7467466f3ab2def7b26d124ef5e4fb24f52b724baff9e3a05245f071b9458716", + "c36656fce030214fab07b27f130638e8714eb0d331d338185a1d89cfed994977", + "44b14e02e22b6793737fd23c9252ea3c360a29a92a37a6e18f3b6bfb289c6680", + "6c73d1364ba7fda8161a8b7a1c165d0bdd9b5b5e896845ac74cb5692fe5b0a5d", + "324a8847a72f3b1305b79de006a5f82a865aa107a11ec6643b8558b31f162c84", + "cec35166c11c06a7c08977e56801a9b6143c9d68427dac71b65b46c6d39cd384", + "37b8603cef3d84534240eaba5a1e6c222fe434433de06d08291d79b815d5f6e2", + "0b83f8cb4f6844f4589f94e01a2c4e70d55e86efb22c95416e1c9062399aefda", + "7ee26a3f900acd66367882977dc6cb07b9e2130d04512a37a281cee7f76fbc2c", + "7210657edf9d62138488a91fde13a54f93b91883fcb67f5577a822d5d5be03be", + "25767a33d2a0543cb39ffc42ad92b3adacee5554c9be8156cf09ba32e13a310e", + "88b22dcfe716c79de596aae36f101671d273bcb13a4b0a746017e14ffe1d2111", + "2dc4f2d8340ad8902d9cd936aa57deb205cd30e79695b37c7bab50a1c3f9b63d", + "acfa396f5b4834bd986f0fba73ceebe3353014491b1a31ab5e054f0ed21dc4f8", + "401b9e3505109479813bdbde928e5c34cb8d81fe37dedd584bdf27de77396460", + "fb6e5f0e7741979731e068a4be90f7b6595d64f92e6ce10dabf85a435258a439", + "3107ecd98403f08549d5e02e05cdc5aaa323d2c30297c639c1616edc3e6cbf42", + "6c73d1364ba7fda8161a8b7a1c165d0bdd9b5b5e896845ac74cb5692fe5b0a5d", + "1e0e98934a7b85ab2c5dd74723e5b76aac5354bb0a38422ee084979f52cd6711", + "c36656fce030214fab07b27f130638e8714eb0d331d338185a1d89cfed994977", + "7210657edf9d62138488a91fde13a54f93b91883fcb67f5577a822d5d5be03be", + "d936e0cf2670327dddeb9788c1f474e1e5bd9efee4cf134c7975985d273e3a6d" +]; + +// CA: reference_cacheable -- 130 (verdict, detail) pairs +pub const CA_N : usize = 130; +pub const CA_V : [130]string = [ + "pass", + "pass", + "pass", + "pass", + "pass", + "pass", + "pass", + "pass", + "pass", + "pass", + "fail", + "fail", + "fail", + "fail", + "fail", + "fail", + "fail", + "fail", + "fail", + "fail", + "blocked", + "blocked", + "blocked", + "blocked", + "blocked", + "blocked", + "blocked", + "blocked", + "blocked", + "blocked", + "timeout", + "timeout", + "timeout", + "timeout", + "timeout", + "timeout", + "timeout", + "timeout", + "timeout", + "timeout", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "pass_vacuous", + "pass_vacuous", + "pass_vacuous", + "pass_vacuous", + "pass_vacuous", + "pass_vacuous", + "pass_vacuous", + "pass_vacuous", + "pass_vacuous", + "pass_vacuous", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "Pass", + "Pass", + "Pass", + "Pass", + "Pass", + "Pass", + "Pass", + "Pass", + "Pass", + "Pass", + "blocked ", + "blocked ", + "blocked ", + "blocked ", + "blocked ", + "blocked ", + "blocked ", + "blocked ", + "blocked ", + "blocked ", + "mismatch", + "mismatch", + "mismatch", + "mismatch", + "mismatch", + "mismatch", + "mismatch", + "mismatch", + "mismatch", + "mismatch", + "crash", + "crash", + "crash", + "crash", + "crash", + "crash", + "crash", + "crash", + "crash", + "crash", + "not run", + "not run", + "not run", + "not run", + "not run", + "not run", + "not run", + "not run", + "not run", + "not run", + "weird", + "weird", + "weird", + "weird", + "weird", + "weird", + "weird", + "weird", + "weird", + "weird" +]; + +pub const CA_D : [130]string = [ + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV", + "", + "x", + "t27c test-report exited -9: ", + "t27c test-report exited -", + "t27c test-report exited 1: boom", + "t27c test-report exited", + "t27c test-report exited 0: ", + " t27c test-report exited -9", + "does not compile: spec.zig:1:1: error: x", + "t27c test-report exited -11: SIGSEGV" +]; + +pub const CA_OK : [130]u8 = [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 +]; + +// HT: the cache hit rule of reference_all -- 100 entries (length, verdict, detail, has per-test verdicts, wanted) and whether it hit +pub const HT_N : usize = 100; +pub const HT_LEN : [100]usize = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3 +]; + +pub const HT_V : [100]string = [ + "blocked", + "blocked", + "blocked", + "blocked", + "fail", + "fail", + "fail", + "fail", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "pass", + "pass", + "pass", + "pass", + "timeout", + "timeout", + "timeout", + "timeout", + "blocked", + "blocked", + "blocked", + "blocked", + "fail", + "fail", + "fail", + "fail", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "pass", + "pass", + "pass", + "pass", + "timeout", + "timeout", + "timeout", + "timeout", + "blocked", + "blocked", + "blocked", + "blocked", + "fail", + "fail", + "fail", + "fail", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "pass", + "pass", + "pass", + "pass", + "timeout", + "timeout", + "timeout", + "timeout", + "blocked", + "blocked", + "blocked", + "blocked", + "blocked", + "blocked", + "blocked", + "blocked", + "fail", + "fail", + "fail", + "fail", + "fail", + "fail", + "fail", + "fail", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "lab_error", + "pass", + "pass", + "pass", + "pass", + "pass", + "pass", + "pass", + "pass", + "timeout", + "timeout", + "timeout", + "timeout", + "timeout", + "timeout", + "timeout", + "timeout" +]; + +pub const HT_D : [100]string = [ + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "", + "", + "", + "", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x", + "t27c test-report exited -9: x" +]; + +pub const HT_HAS : [100]u8 = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, + 0, 0, 1, 1 +]; + +pub const HT_WANT : [100]u8 = [ + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1 +]; + +pub const HT_OK : [100]u8 = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0 +]; + +// ST: the counts of a reference_all run, the line it logs and the `reused` text of the run -- 64 runs +pub const ST_N : usize = 64; +pub const ST_HITS : [64]u64 = [ + 0, 0, 1, 2, 0, 0, 4, 1, 2, 0, 3, 0, 2, 0, 0, 0, 1, 1, 6, 0, 2, 0, 3, 1, 4, 1, 1, 1, 3, 0, 4, 1, + 1, 4, 3, 1, 1, 1, 0, 0, 0, 1, 3, 0, 1, 2, 0, 1, 5, 1, 0, 2, 1, 0, 0, 2, 2, 2, 3, 3, 1, 1, 3, 0 +]; + +pub const ST_MISSES : [64]u64 = [ + 0, 2, 2, 3, 0, 0, 0, 2, 0, 2, 0, 0, 0, 3, 1, 0, 2, 1, 1, 0, 1, 1, 0, 4, 1, 5, 2, 0, 0, 2, 1, 1, + 1, 2, 2, 0, 0, 0, 1, 2, 0, 4, 2, 3, 1, 4, 0, 3, 1, 3, 0, 0, 3, 1, 4, 3, 1, 1, 0, 3, 2, 6, 3, 0 +]; + +pub const ST_NOT_CACHED : [64]u64 = [ + 0, 3, 2, 3, 0, 0, 0, 2, 1, 2, 2, 1, 3, 1, 0, 0, 2, 0, 1, 1, 3, 0, 3, 1, 2, 2, 3, 2, 1, 1, 3, 2, + 0, 1, 1, 0, 1, 0, 0, 3, 0, 1, 3, 0, 1, 1, 0, 0, 1, 1, 1, 4, 2, 0, 4, 1, 1, 0, 0, 2, 0, 1, 1, 0 +]; + +pub const ST_TO_RUN : [64]u64 = [ + 0, 5, 4, 6, 0, 0, 0, 4, 1, 4, 2, 1, 3, 4, 1, 0, 4, 1, 2, 1, 4, 1, 3, 5, 3, 7, 5, 2, 1, 3, 4, 3, + 1, 3, 3, 0, 1, 0, 1, 5, 0, 5, 5, 3, 2, 5, 0, 3, 2, 4, 1, 4, 5, 1, 8, 4, 2, 1, 0, 5, 2, 7, 4, 0 +]; + +pub const ST_LOG : [64]string = [ + "reference cache: 0 hits, 0 to run (STAMP)", + "reference cache: 0 hits, 5 to run (STAMP)", + "reference cache: 1 hits, 4 to run (STAMP)", + "reference cache: 2 hits, 6 to run (STAMP)", + "reference cache: 0 hits, 0 to run (STAMP)", + "reference cache: 0 hits, 0 to run (STAMP)", + "reference cache: 4 hits, 0 to run (STAMP)", + "reference cache: 1 hits, 4 to run (STAMP)", + "reference cache: 2 hits, 1 to run (STAMP)", + "reference cache: 0 hits, 4 to run (STAMP)", + "reference cache: 3 hits, 2 to run (STAMP)", + "reference cache: 0 hits, 1 to run (STAMP)", + "reference cache: 2 hits, 3 to run (STAMP)", + "reference cache: 0 hits, 4 to run (STAMP)", + "reference cache: 0 hits, 1 to run (STAMP)", + "reference cache: 0 hits, 0 to run (STAMP)", + "reference cache: 1 hits, 4 to run (STAMP)", + "reference cache: 1 hits, 1 to run (STAMP)", + "reference cache: 6 hits, 2 to run (STAMP)", + "reference cache: 0 hits, 1 to run (STAMP)", + "reference cache: 2 hits, 4 to run (STAMP)", + "reference cache: 0 hits, 1 to run (STAMP)", + "reference cache: 3 hits, 3 to run (STAMP)", + "reference cache: 1 hits, 5 to run (STAMP)", + "reference cache: 4 hits, 3 to run (STAMP)", + "reference cache: 1 hits, 7 to run (STAMP)", + "reference cache: 1 hits, 5 to run (STAMP)", + "reference cache: 1 hits, 2 to run (STAMP)", + "reference cache: 3 hits, 1 to run (STAMP)", + "reference cache: 0 hits, 3 to run (STAMP)", + "reference cache: 4 hits, 4 to run (STAMP)", + "reference cache: 1 hits, 3 to run (STAMP)", + "reference cache: 1 hits, 1 to run (STAMP)", + "reference cache: 4 hits, 3 to run (STAMP)", + "reference cache: 3 hits, 3 to run (STAMP)", + "reference cache: 1 hits, 0 to run (STAMP)", + "reference cache: 1 hits, 1 to run (STAMP)", + "reference cache: 1 hits, 0 to run (STAMP)", + "reference cache: 0 hits, 1 to run (STAMP)", + "reference cache: 0 hits, 5 to run (STAMP)", + "reference cache: 0 hits, 0 to run (STAMP)", + "reference cache: 1 hits, 5 to run (STAMP)", + "reference cache: 3 hits, 5 to run (STAMP)", + "reference cache: 0 hits, 3 to run (STAMP)", + "reference cache: 1 hits, 2 to run (STAMP)", + "reference cache: 2 hits, 5 to run (STAMP)", + "reference cache: 0 hits, 0 to run (STAMP)", + "reference cache: 1 hits, 3 to run (STAMP)", + "reference cache: 5 hits, 2 to run (STAMP)", + "reference cache: 1 hits, 4 to run (STAMP)", + "reference cache: 0 hits, 1 to run (STAMP)", + "reference cache: 2 hits, 4 to run (STAMP)", + "reference cache: 1 hits, 5 to run (STAMP)", + "reference cache: 0 hits, 1 to run (STAMP)", + "reference cache: 0 hits, 8 to run (STAMP)", + "reference cache: 2 hits, 4 to run (STAMP)", + "reference cache: 2 hits, 2 to run (STAMP)", + "reference cache: 2 hits, 1 to run (STAMP)", + "reference cache: 3 hits, 0 to run (STAMP)", + "reference cache: 3 hits, 5 to run (STAMP)", + "reference cache: 1 hits, 2 to run (STAMP)", + "reference cache: 1 hits, 7 to run (STAMP)", + "reference cache: 3 hits, 4 to run (STAMP)", + "reference cache: 0 hits, 0 to run (STAMP)" +]; + +pub const ST_REUSED : [64]string = [ + "0 of 0", + "0 of 5", + "1 of 5", + "2 of 8", + "0 of 0", + "0 of 0", + "4 of 4", + "1 of 5", + "2 of 3", + "0 of 4", + "3 of 5", + "0 of 1", + "2 of 5", + "0 of 4", + "0 of 1", + "0 of 0", + "1 of 5", + "1 of 2", + "6 of 8", + "0 of 1", + "2 of 6", + "0 of 1", + "3 of 6", + "1 of 6", + "4 of 7", + "1 of 8", + "1 of 6", + "1 of 3", + "3 of 4", + "0 of 3", + "4 of 8", + "1 of 4", + "1 of 2", + "4 of 7", + "3 of 6", + "1 of 1", + "1 of 2", + "1 of 1", + "0 of 1", + "0 of 5", + "0 of 0", + "1 of 6", + "3 of 8", + "0 of 3", + "1 of 3", + "2 of 7", + "0 of 0", + "1 of 4", + "5 of 7", + "1 of 5", + "0 of 1", + "2 of 6", + "1 of 6", + "0 of 1", + "0 of 8", + "2 of 6", + "2 of 4", + "2 of 3", + "3 of 3", + "3 of 8", + "1 of 3", + "1 of 8", + "3 of 7", + "0 of 0" +]; + +// FL: first_line -- 64 (stdout, stderr) pairs and the line +pub const FL_N : usize = 64; +pub const FL_OUT : [64]string = [ + "zig 0.16.0\n", + "zig 0.16.0\n", + "zig 0.16.0\n", + "zig 0.16.0\n", + "", + "", + "", + "", + " \n", + " \n", + " \n", + " \n", + "\n\n x \n y", + "\n\n x \n y", + "\n\n x \n y", + "\n\n x \n y", + "a\x0bb", + "a\x0bb", + "a\x0bb", + "a\x0bb", + " ", + " ", + " ", + " ", + "a\x0d\nb", + "a\x0d\nb", + "a\x0d\nb", + "a\x0d\nb", + "\xc2\xa0v\xc2\xa0\nw", + "\xc2\xa0v\xc2\xa0\nw", + "\xc2\xa0v\xc2\xa0\nw", + "\xc2\xa0v\xc2\xa0\nw", + "abc \ndef", + "abc \ndef", + "abc \ndef", + "abc \ndef", + "x", + "x", + "x", + "x", + "\tx\t", + "\tx\t", + "\tx\t", + "\tx\t", + "line1\nline2\n", + "line1\nline2\n", + "line1\nline2\n", + "line1\nline2\n", + "\xe3\x80\x80\n\xe3\x80\x80", + "\xe3\x80\x80\n\xe3\x80\x80", + "\xe3\x80\x80\n\xe3\x80\x80", + "\xe3\x80\x80\n\xe3\x80\x80", + "a\xe2\x80\xa8b", + "a\xe2\x80\xa8b", + "a\xe2\x80\xa8b", + "a\xe2\x80\xa8b", + "v\xc2\x85w", + "v\xc2\x85w", + "v\xc2\x85w", + "v\xc2\x85w", + "\x1f \x1f", + "\x1f \x1f", + "\x1f \x1f", + "\x1f \x1f" +]; + +pub const FL_ERR : [64]string = [ + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2", + "", + "err 0.1\n", + " \n", + "e1\ne2" +]; + +pub const FL_LINE : [64]string = [ + "zig 0.16.0", + "zig 0.16.0", + "zig 0.16.0", + "zig 0.16.0", + "unavailable: list index out of range", + "err 0.1", + "unavailable: list index out of range", + "e1", + "unavailable: list index out of range", + "unavailable: list index out of range", + "unavailable: list index out of range", + "unavailable: list index out of range", + "x ", + "x ", + "x ", + "x ", + "a", + "a", + "a", + "a", + "unavailable: list index out of range", + "unavailable: list index out of range", + "unavailable: list index out of range", + "unavailable: list index out of range", + "a", + "a", + "a", + "a", + "v\xc2\xa0", + "v\xc2\xa0", + "v\xc2\xa0", + "v\xc2\xa0", + "abc ", + "abc ", + "abc ", + "abc ", + "x", + "x", + "x", + "x", + "x", + "x", + "x", + "x", + "line1", + "line1", + "line1", + "line1", + "unavailable: list index out of range", + "unavailable: list index out of range", + "unavailable: list index out of range", + "unavailable: list index out of range", + "a", + "a", + "a", + "a", + "v", + "v", + "v", + "v", + "unavailable: list index out of range", + "unavailable: list index out of range", + "unavailable: list index out of range", + "unavailable: list index out of range" +]; + +// SM: reference_stamp -- 8 binaries (their bytes), the zig line and the stamp +pub const SM_N : usize = 8; +pub const SM_BIN : [8]string = [ + "", + "a", + "abc", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "\x7fELF\x01\x02\x03 caf\xc3\xa9 \xe3\x81\x82\n", + "t27c binary text\nt27c binary text\nt27c binary text\nt27c binary text\nt27c binary text\n" +]; + +pub const SM_ZIG : [8]string = [ + "0.16.0", + "unavailable: list index out of range", + "", + "0.14.1\n", + "0.16.0", + "unavailable: list index out of range", + "", + "0.14.1\n" +]; + +pub const SM_STAMP : [8]string = [ + "t27c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 zig 0.16.0", + "t27c ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb zig unavailable: list index out of range", + "t27c ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad zig ", + "t27c d5e285683cd4efc02d021a5c62014694958901005d6f71e89e0989fac77e4072 zig 0.14.1\n", + "t27c 04c26261370ee7541549d16dee320c723e3fd14671e66a099afe0a377c16888e zig 0.16.0", + "t27c 7ce100971f64e7001e8fe5a51973ecdfe1ced42befe7ee8d5fd6219506b5393c zig unavailable: list index out of range", + "t27c e33656e8a817e61e31261ff0fad3266937f527562f9be5ae0ae653069efeb083 zig ", + "t27c f52acfb7e3ed2e285a38812fce87f34470e23df837e40627c4496c4051ff33e6 zig 0.14.1\n" +]; + + +/// Test driver: the index of rel in the fixture tree, or LAB_NO when the tree has no such file. +fn lc_test_find(rel : string) -> usize { + var i : usize = 0; + while (i < 10) { + if (lab_same_span(FS_PATH[i], 0, FS_PATH[i].len, rel, 0, rel.len)) { return i; } + i = i + 1; + } + return LAB_NO; +} + +/// Test driver: the key of the closure of start over the fixture tree, written at out[0..64]; 64 on success. +fn lc_test_key(stamp : string, edges : string, start : string, out : []u8) -> usize { + var vis : [300]u32 = undefined; + var text : [4096]u8 = undefined; + const w : usize = lc_closure(edges, start, &vis, 100, &text, 4096, 0); + if (w == LAB_NO) { return 0; } + var sha : SHA256 = init(); + lc_key_begin(&sha, stamp); + var s : usize = 0; + while (s < w) { + var e : usize = s; + while (e < w and text[e] != 10) { + e = e + 1; + } + const f : usize = lc_test_find(text[s..e]); + if (f == LAB_NO) { + lc_key_file(&sha, text[s..e], "", false); + } else { + lc_key_file(&sha, text[s..e], FS_DATA[f], true); + } + s = e + 1; + } + return lc_key_hex(&sha, out, 64, 0); +} + +/// Test driver: the stamp of a binary and a zig line, the binary hashed here. +fn lc_test_stamp(bin : string, zig : string, out : []u8, cap : usize) -> usize { + var sha : SHA256 = init(); + update(&sha, bin); + var hex : [64]u8 = undefined; + const x : usize = lc_key_hex(&sha, &hex, 64, 0); + return lc_stamp(hex[0..x], zig, out, cap, 0); +} + +test the_closure_and_the_key_equal_the_pythons_on_every_case { + var vis : [300]u32 = undefined; + var text : [4096]u8 = undefined; + var hex : [64]u8 = undefined; + var i : usize = 0; + while (i < CK_N) { + const w : usize = lc_closure(CK_EDGES[i], CK_START[i], &vis, 100, &text, 4096, 0); + assert lx_out_is(&text, w, CK_CLOSURE[i]) == true; + assert lc_test_key(CK_STAMP[i], CK_EDGES[i], CK_START[i], &hex) == 64; + assert lx_out_is(&hex, 64, CK_KEY[i]) == true; + i = i + 1; + } +} + +test cacheable_equals_the_pythons_on_every_verdict_and_detail { + var i : usize = 0; + while (i < CA_N) { + assert lc_cacheable(CA_V[i], CA_D[i]) == (CA_OK[i] == 1); + i = i + 1; + } +} + +test the_hit_rule_equals_reference_all_on_every_entry { + var i : usize = 0; + while (i < HT_N) { + assert lc_hit_usable(HT_LEN[i], HT_V[i], HT_D[i], HT_HAS[i] == 1, HT_WANT[i] == 1) == (HT_OK[i] == 1); + i = i + 1; + } +} + +test the_cache_line_and_the_reused_text_equal_the_pythons { + var out : [256]u8 = undefined; + var i : usize = 0; + while (i < ST_N) { + const w : usize = lc_log_line(ST_HITS[i], ST_TO_RUN[i], "STAMP", &out, 256, 0); + assert lx_out_is(&out, w, ST_LOG[i]) == true; + const r : usize = lc_reused(ST_HITS[i], ST_MISSES[i], ST_NOT_CACHED[i], &out, 256, 0); + assert lx_out_is(&out, r, ST_REUSED[i]) == true; + i = i + 1; + } +} + +test first_line_equals_the_pythons_on_every_output_pair { + var out : [256]u8 = undefined; + var i : usize = 0; + while (i < FL_N) { + const w : usize = lc_first_line(FL_OUT[i], FL_ERR[i], &out, 256, 0); + assert lx_out_is(&out, w, FL_LINE[i]) == true; + i = i + 1; + } +} + +test the_stamp_equals_reference_stamp_on_every_binary { + var out : [512]u8 = undefined; + var i : usize = 0; + while (i < SM_N) { + const w : usize = lc_test_stamp(SM_BIN[i], SM_ZIG[i], &out, 512); + assert lx_out_is(&out, w, SM_STAMP[i]) == true; + i = i + 1; + } +} +// END GENERATED diff --git a/specs/lab/lab_t27b_ratchet.t27 b/specs/lab/lab_t27b_ratchet.t27 new file mode 100644 index 0000000000..5289710d06 --- /dev/null +++ b/specs/lab/lab_t27b_ratchet.t27 @@ -0,0 +1,1593 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/lab/lab_t27b_ratchet.t27 -- the per-spec ratchet of a t27b lab run against the ledger (issue #11042, epic #11040). +; -- +; lab.py's ratchet(doc, log) runs the checker of the commit it measured, scripts/tri_loop/t27b.py ratchet, and records +; its verdict. The decision is that checker's ratchet(): every ledger row against its spec's result in the run, every +; spec the reference passes that the ledger does not name, and the cap. Which finding a row gets was already a spec +; (specs/tri/t27b/steward.t27: entry_code, unlisted, over_cap, ratchet_is_red); this file reuses those by `use`, reads +; the run and the ledger as they are written, words the findings and counts them: what t27b.py did in Python. +; -- +; The oracle is `python3 scripts/tri_loop/t27b.py ratchet --run RUN --ledger LEDGER`, run on every case of the table at +; the end of this file. For each case the table holds its exit code, its nine counts, the finding lines it printed and, +; for the first RA_FULL_N cases, its whole output with the summary line. 0 differences. +; -- +; WHAT IS READ. The run is json.dumps(doc, indent=1) of lab.py's document: a result is an object at indent 2 of the +; `results` list and its keys are at indent 3 (reused from specs/tri/lab/receipt.t27, which reads the same layout); +; `blockers` is read for its first item, then `detail`. The ledger is scripts/tri_loop/t27b.py dump_ledger's layout (its +; header at indent 1, one row an object on one line); a row written by hand with other spacing is read if it stays one +; line. A string is read as Python's json reads it (escapes, surrogate pairs, UTF-8), compared and cut by characters. +; A value Python reads as false (nothing, null, "", false, 0, [], {}) is the verdict `missing`; any other word the rules +; have no code for makes the whole ratchet unreadable, as t27b_rules.py does (exit 2), but only when it is looked at: +; an overwritten duplicate row, or the t27b word of a spec nobody reads, is never examined. +; -- +; WHAT A RESULT IS. lt_ratchet writes the finding lines and the summary line as `tri t27b ratchet` prints them, and sets +; res[0..9] to the counts in its order, res[9] to the status (LT_GREEN, LT_RED, LT_UNREADABLE), res[10] to why a ratchet +; was unreadable (LT_U_*: no results, no reference verdict, no ledger, a ledger row or header it does not read, a result +; it does not read, an unknown verdict word, a table wider than its buffer, a string with an invalid escape) and res[11] +; to the non-pass rows. work is 6 * cap_e + 6 * cap_r words. +; -- +; WHERE THE SPEC DIFFERS FROM THE PYTHON. A result with no `file`, a first blocker that is not a string and a ledger that +; spreads a row over several lines make Python raise (exit 1 with a traceback, which lab.py records as ok false) or read +; them; here they are LT_UNREADABLE, never a guess. repr() of a reason is exact for ASCII and for the Unicode spaces and +; format marks listed in lt_put_repr; another non-printable character is written as it is. A non-integer cap is printed +; as written. A cap above 4294967295 wraps modulo 2**32, as ctypes does when t27b.py hands it to steward.t27. +; ASCII only (L3). phi^2 + 1/phi^2 = 3 | TRINITY + +module LabT27bRatchet; + +use lab::text::{LAB_NO, lab_line_end, lab_line_next, lab_same_span, lab_char_len, lab_char_val, lab_put_char, lab_put_span, lab_put_lit, lab_put_count}; +use lab::lab_t27b_text::{LX_BIG, lx_digits_end, lx_dec_value, lx_put_pad, lx_out_is}; +use tri::lab::receipt::{span_is, line_is, key_at, value_from, value_to, results_at, next_object, object_end}; +use lab::lab_t27b_report::{lr_word, lr_word_code, LR_UNKNOWN}; +use tri::t27b::steward::is_pass; +use tri::t27b::steward::entry_code; +use tri::t27b::steward::unlisted; +use tri::t27b::steward::over_cap; +use tri::t27b::steward::ratchet_is_red; +use tri::t27b::ledger_steward::T_PASS_VACUOUS; +use tri::t27b::ledger_steward::T_MISSING; +use tri::t27b::ledger_steward::RC_VACUITY_MEASURED; +use tri::t27b::ledger_steward::RC_UNEXPECTED_FAILURE; +use tri::t27b::ledger_steward::RC_UNEXPECTED_PASS; +use tri::t27b::ledger_steward::RC_MOVED; +use tri::t27b::ledger_steward::RC_STALE; +use tri::t27b::ledger_steward::RC_UNJUDGED; +use tri::t27b::ledger_steward::RC_UNLISTED; +use tri::t27b::ledger_steward::RC_OVER_CAP; +use tri::t27b::ledger_steward::RC_BAD_REASON; + +// ---- JSON text ---- +; The run and the ledger are JSON that Python wrote. A string in them is read as Python's json reads it: an +; escape \" \\ \/ \b \f \n \r \t or \uXXXX (a high and a low surrogate together are one character), any +; other byte as UTF-8. A text with an invalid escape is not read, and neither is a lone surrogate. + +pub fn lt_hex_val(c : u8) -> u32 { + if (c >= 48 and c <= 57) { return (c - 48) as u32; } + if (c >= 97 and c <= 102) { return (c - 87) as u32; } + if (c >= 65 and c <= 70) { return (c - 55) as u32; } + return 16; +} + +/// The four hex digits at t[i..i+4] (inside t[..e]) as a number; 65536 when they are not four hex digits. +pub fn lt_u4(t : string, i : usize, e : usize) -> u32 { + if (i + 4 > e) { return 65536; } + var v : u32 = 0; + var k : usize = 0; + while (k < 4) { + const d : u32 = lt_hex_val(t[i + k]); + if (d == 16) { return 65536; } + v = v * 16 + d; + k = k + 1; + } + return v; +} + +/// One character of the JSON string body t[i..e], packed as code point * 16 + the bytes it takes (at most 12). +/// 0 when the text at i is no character (an invalid escape, a lone surrogate): the reader refuses the text. +pub fn lt_char(t : string, i : usize, e : usize) -> u32 { + const c : u8 = t[i]; + if (c != 92) { + const n : usize = lab_char_len(t, i, e); + return lab_char_val(t, i, e) * 16 + (n as u32); + } + if (i + 1 >= e) { return 0; } + const d : u8 = t[i + 1]; + if (d == 34) { return 34 * 16 + 2; } + if (d == 92) { return 92 * 16 + 2; } + if (d == 47) { return 47 * 16 + 2; } + if (d == 98) { return 8 * 16 + 2; } + if (d == 102) { return 12 * 16 + 2; } + if (d == 110) { return 10 * 16 + 2; } + if (d == 114) { return 13 * 16 + 2; } + if (d == 116) { return 9 * 16 + 2; } + if (d != 117) { return 0; } + const u : u32 = lt_u4(t, i + 2, e); + if (u == 65536) { return 0; } + if (u >= 56320 and u <= 57343) { return 0; } + if (u >= 55296 and u <= 56319) { + if (i + 12 > e or t[i + 6] != 92 or t[i + 7] != 117) { return 0; } + const l : u32 = lt_u4(t, i + 8, e); + if (l < 56320 or l > 57343) { return 0; } + return (65536 + (u - 55296) * 1024 + (l - 56320)) * 16 + 12; + } + return u * 16 + 6; +} + +/// Do the JSON string bodies t[a0..a1] and u[b0..b1] decode to the same characters. +pub fn lt_json_same(t : string, a0 : usize, a1 : usize, u : string, b0 : usize, b1 : usize) -> bool { + var i : usize = a0; + var j : usize = b0; + while (i < a1 and j < b1) { + const x : u32 = lt_char(t, i, a1); + const y : u32 = lt_char(u, j, b1); + if (x == 0 or y == 0) { return false; } + if (x / 16 != y / 16) { return false; } + i = i + ((x % 16) as usize); + j = j + ((y % 16) as usize); + } + return i == a1 and j == b1; +} + +/// Python's order of the decoded strings: -1, 0 or 1 by code point. 2 when a text is not readable. +pub fn lt_json_cmp(t : string, a0 : usize, a1 : usize, u : string, b0 : usize, b1 : usize) -> i32 { + var i : usize = a0; + var j : usize = b0; + while (i < a1 and j < b1) { + const x : u32 = lt_char(t, i, a1); + const y : u32 = lt_char(u, j, b1); + if (x == 0 or y == 0) { return 2; } + if (x / 16 < y / 16) { return -1; } + if (x / 16 > y / 16) { return 1; } + i = i + ((x % 16) as usize); + j = j + ((y % 16) as usize); + } + if (i < a1) { return 1; } + if (j < b1) { return -1; } + return 0; +} + +/// Where the first n characters of the JSON string body t[a..b] end: Python's s[:n]. b when there are fewer; +/// LAB_NO when the text is not readable. +pub fn lt_json_cut(t : string, a : usize, b : usize, n : usize) -> usize { + var i : usize = a; + var seen : usize = 0; + while (i < b and seen < n) { + const x : u32 = lt_char(t, i, b); + if (x == 0) { return LAB_NO; } + i = i + ((x % 16) as usize); + seen = seen + 1; + } + return i; +} + +/// Is the JSON string body t[a..b] readable. +pub fn lt_json_ok(t : string, a : usize, b : usize) -> bool { + return lt_json_cut(t, a, b, b - a + 1) != LAB_NO; +} + +/// Writes the characters of the JSON string body t[a..b] as UTF-8 (what Python prints), at most n of them. +pub fn lt_put_json(out : []u8, cap : usize, w : usize, t : string, a : usize, b : usize, n : usize) -> usize { + var x : usize = w; + var i : usize = a; + var seen : usize = 0; + while (i < b and seen < n) { + const c : u32 = lt_char(t, i, b); + if (c == 0) { return x; } + x = lab_put_char(out, cap, x, c / 16); + i = i + ((c % 16) as usize); + seen = seen + 1; + } + return x; +} + +/// Python's repr of the string body t[a..b] (what `!r` writes in the finding for a bad reason): single quotes, +/// unless the text holds a single quote and no double quote; \\ \n \r \t and \xNN for the other ASCII +/// controls. A character above U+007E is written as it is, except the C1 controls, the no-break space and the +/// soft hyphen (\xNN) and the Unicode spaces and format marks (\uNNNN): the other non-printable ones are not told. +pub fn lt_put_repr(out : []u8, cap : usize, w : usize, t : string, a : usize, b : usize) -> usize { + var has_s : bool = false; + var has_d : bool = false; + var i : usize = a; + while (i < b) { + const c : u32 = lt_char(t, i, b); + if (c == 0) { return w; } + if (c / 16 == 39) { has_s = true; } + if (c / 16 == 34) { has_d = true; } + i = i + ((c % 16) as usize); + } + var q : u8 = 39; + if (has_s and has_d == false) { q = 34; } + var x : usize = lab_put_char(out, cap, w, q as u32); + i = a; + while (i < b) { + const c : u32 = lt_char(t, i, b); + const cp : u32 = c / 16; + i = i + ((c % 16) as usize); + if (cp == 92) { + x = lab_put_lit(out, cap, x, "\\\\"); + } else { + if (cp == (q as u32)) { + x = lab_put_lit(out, cap, x, "\\"); + x = lab_put_char(out, cap, x, cp); + } else { + if (cp == 10) { + x = lab_put_lit(out, cap, x, "\\n"); + } else { + if (cp == 13) { + x = lab_put_lit(out, cap, x, "\\r"); + } else { + if (cp == 9) { + x = lab_put_lit(out, cap, x, "\\t"); + } else { + if (cp < 32 or (cp >= 127 and cp <= 160) or cp == 173) { + x = lab_put_lit(out, cap, x, "\\x"); + x = lt_put_hex2(out, cap, x, cp); + } else { + if ((cp >= 8192 and cp <= 8207) or (cp >= 8232 and cp <= 8239) or (cp >= 8287 and cp <= 8303) or cp == 12288 or cp == 65279) { + x = lab_put_lit(out, cap, x, "\\u"); + x = lt_put_hex2(out, cap, x, cp / 256); + x = lt_put_hex2(out, cap, x, cp % 256); + } else { + x = lab_put_char(out, cap, x, cp); + } + } + } + } + } + } + } + } + return lab_put_char(out, cap, x, q as u32); +} + +/// One lower-case hex digit of v (v < 16) as its byte. +pub fn lt_hex_char(v : u32) -> u32 { + if (v < 10) { return 48 + v; } + return 87 + v; +} + +/// Writes v (v < 256) as two lower-case hex digits. +pub fn lt_put_hex2(out : []u8, cap : usize, w : usize, v : u32) -> usize { + const x : usize = lab_put_char(out, cap, w, lt_hex_char((v / 16) % 16)); + return lab_put_char(out, cap, x, lt_hex_char(v % 16)); +} + +// ---- one-line JSON objects: a row of the ledger ---- + +pub fn lt_ws(c : u8) -> bool { + return c == 32 or c == 9 or c == 13 or c == 10; +} + +pub fn lt_skip(t : string, i : usize, e : usize) -> usize { + var k : usize = i; + while (k < e and lt_ws(t[k])) { + k = k + 1; + } + return k; +} + +/// The offset of the quote that ends the string whose body starts at s, within t[..e]; LAB_NO when it does not end. +pub fn lt_str_end(t : string, s : usize, e : usize) -> usize { + var k : usize = s; + while (k < e) { + if (t[k] == 92) { + k = k + 2; + } else { + if (t[k] == 34) { return k; } + k = k + 1; + } + } + return LAB_NO; +} + +/// Where the value that starts at t[i] ends: past its closing quote for a string, else at the next comma or +/// closing brace outside any brackets. LAB_NO when it does not end. +pub fn lt_value_end(t : string, i : usize, e : usize) -> usize { + if (t[i] == 34) { + const q : usize = lt_str_end(t, i + 1, e); + if (q == LAB_NO) { return LAB_NO; } + return q + 1; + } + var depth : u32 = 0; + var k : usize = i; + while (k < e) { + const c : u8 = t[k]; + if (c == 34) { + const s : usize = lt_str_end(t, k + 1, e); + if (s == LAB_NO) { return LAB_NO; } + k = s + 1; + } else { + if (c == 91 or c == 123) { + depth = depth + 1; + k = k + 1; + } else { + if (c == 93 or c == 125) { + if (depth == 0) { return k; } + depth = depth - 1; + k = k + 1; + } else { + if (c == 44 and depth == 0) { return k; } + k = k + 1; + } + } + } + } + return k; +} + +/// Reads the one-line JSON object t[ls..le] (a trailing comma is allowed) for key. When it is found, sp[0] and +/// sp[1] are its value (a string's body without quotes, any other value as written) and sp[2] is 1 for a string. +/// 0: no such key; 1: found, the last one if it comes twice; 2: the line is not an object this reader reads. +pub fn lt_obj(t : string, ls : usize, le : usize, key : string, sp : []usize) -> u8 { + var i : usize = lt_skip(t, ls, le); + if (i >= le or t[i] != 123) { return 2; } + i = lt_skip(t, i + 1, le); + var found : u8 = 0; + if (i < le and t[i] == 125) { + i = i + 1; + } else { + var more : bool = true; + while (more) { + if (i >= le or t[i] != 34) { return 2; } + const ke : usize = lt_str_end(t, i + 1, le); + if (ke == LAB_NO) { return 2; } + const ks : usize = i + 1; + i = lt_skip(t, ke + 1, le); + if (i >= le or t[i] != 58) { return 2; } + i = lt_skip(t, i + 1, le); + if (i >= le) { return 2; } + const ve : usize = lt_value_end(t, i, le); + if (ve == LAB_NO) { return 2; } + var vs : usize = i; + var vt : usize = ve; + var is_str : usize = 0; + if (t[i] == 34) { + vs = i + 1; + vt = ve - 1; + is_str = 1; + } else { + while (vt > vs and lt_ws(t[vt - 1])) { + vt = vt - 1; + } + if (vt == vs) { return 2; } + } + if (lab_same_span(t, ks, ke, key, 0, key.len)) { + found = 1; + sp[0] = vs; + sp[1] = vt; + sp[2] = is_str; + } + i = lt_skip(t, ve, le); + if (i >= le) { return 2; } + if (t[i] == 44) { + i = lt_skip(t, i + 1, le); + } else { + if (t[i] != 125) { return 2; } + i = i + 1; + more = false; + } + } + } + i = lt_skip(t, i, le); + if (i < le and t[i] == 44) { i = lt_skip(t, i + 1, le); } + if (i != le) { return 2; } + return found; +} + +// ---- the ledger and the run ---- + +pub const LT_REASONS : [3]string = ["unimplemented", "reference-bug", "n/a"]; +/// A finding's kind by steward.t27's code (index 0 is none). +pub const LT_KIND_NAMES : [10]string = ["", "VACUITY MEASURED", "UNEXPECTED FAILURE", "UNEXPECTED PASS", "MOVED", "STALE", "UNJUDGED", "UNLISTED", "OVER CAP", "BAD REASON"]; +/// The order `tri t27b ratchet` counts its kinds in (KINDS in t27b.py), as steward.t27's codes. +pub const LT_REPORT_ORDER : [9]u8 = [2, 3, 7, 5, 8, 9, 4, 6, 1]; +/// The width a kind is padded to in a finding line. +pub const LT_KIND_WIDTH : usize = 19; + +/// Why a ratchet could not be read (res[10]): none, the run has no results, none of them has a reference verdict, +/// the ledger is empty, a ledger row or header is not in a layout this reads, a run result is not, a verdict word +/// the rules do not know, a table is wider than its buffer, a string with an invalid escape. +pub const LT_U_NONE : u32 = 0; +pub const LT_U_NO_RESULTS : u32 = 1; +pub const LT_U_NO_REFERENCE : u32 = 2; +pub const LT_U_NO_LEDGER : u32 = 3; +pub const LT_U_LEDGER : u32 = 4; +pub const LT_U_RUN : u32 = 5; +pub const LT_U_WORD : u32 = 6; +pub const LT_U_CAPACITY : u32 = 7; +pub const LT_U_TEXT : u32 = 8; + +/// The status of a ratchet (res[9]): no finding is red, one is, or it could not be read. +pub const LT_GREEN : u32 = 0; +pub const LT_RED : u32 = 1; +pub const LT_UNREADABLE : u32 = 2; + +/// The slot of a finding code in the report order. +pub fn lt_slot(code : u8) -> usize { + var k : usize = 0; + while (k < 9) { + if (LT_REPORT_ORDER[k] == code) { return k; } + k = k + 1; + } + return 9; +} + +/// The verdict code of a JSON value of `t27b` or `reference`: T_MISSING for a value Python reads as false +/// (nothing, null, "", false, 0, [], {}), LR_UNKNOWN for a word steward.t27 has no code for. +pub fn lt_word_of(t : string, found : bool, a : usize, b : usize, is_str : bool) -> u8 { + if (found == false) { return T_MISSING; } + if (is_str) { + if (a == b) { return T_MISSING; } + return lr_word_code(t, a, b); + } + if (span_is(t, a, b, "null") or span_is(t, a, b, "false") or span_is(t, a, b, "0") or span_is(t, a, b, "0.0") or span_is(t, a, b, "[]") or span_is(t, a, b, "{}")) { return T_MISSING; } + return LR_UNKNOWN; +} + +/// A result's key at its own indent: sp[0], sp[1] the value (a string's body, else the value as written), sp[2] 1 for a string. +pub fn lt_run_val(run : string, o : usize, e : usize, key : string, sp : []usize) -> bool { + const v : usize = key_at(run, o, e, 3, key); + if (v > run.len) { return false; } + sp[0] = value_from(run, v); + sp[1] = value_to(run, v); + sp[2] = 0; + if (v < run.len and run[v] == 34) { sp[2] = 1; } + return true; +} + +/// The verdict code of key (`t27b` or `reference`) of the result t[o..e]. +pub fn lt_run_word(run : string, o : usize, e : usize, key : string) -> u8 { + var sp : [3]usize = undefined; + const f : bool = lt_run_val(run, o, e, key, &sp); + return lt_word_of(run, f, sp[0], sp[1], sp[2] == 1); +} + +/// The first blocker of the result, or its detail when it has none: lab_run's `blockers[0] if blockers else +/// (detail or "")`. 1 with the string body in sp[0..2] (empty when there is none), 2 when the result has them +/// in a shape this does not read (a first blocker that is not a string, a detail that is not text). +pub fn lt_first_text(run : string, o : usize, e : usize, sp : []usize) -> u8 { + const bv : usize = key_at(run, o, e, 3, "blockers"); + if (bv <= run.len) { + if (bv < run.len and run[bv] == 91) { + if (bv + 1 < run.len and run[bv + 1] == 93) { + sp[0] = 0; + } else { + const nl : usize = lab_line_end(run, bv) + 1; + var q : usize = nl; + while (q < run.len and run[q] == 32) { + q = q + 1; + } + if (q - nl != 4 or q >= run.len or run[q] != 34) { return 2; } + sp[0] = q + 1; + sp[1] = value_to(run, q); + return 1; + } + } else { + if (span_is(run, value_from(run, bv), value_to(run, bv), "null") == false) { return 2; } + } + } + sp[0] = 0; + sp[1] = 0; + var d : [3]usize = undefined; + if (lt_run_val(run, o, e, "detail", &d) == false) { return 1; } + if (d[2] == 1) { + sp[0] = d[0]; + sp[1] = d[1]; + return 1; + } + if (span_is(run, d[0], d[1], "null") or span_is(run, d[0], d[1], "false") or span_is(run, d[0], d[1], "0") or span_is(run, d[0], d[1], "[]")) { return 1; } + return 2; +} + +/// How many ledger rows the lines from `at` hold (the entries array of dump_ledger's layout: one object a line). +/// ent is five words a row: the line's start and end, the path's start and end, and 1 while no later row has +/// the same path. LAB_NO when a row is not a one-line object with a string path, LAB_NO - 1 when there are more +/// than cap rows. +pub fn lt_collect_entries(ledger : string, ent : []u32, cap : usize) -> usize { + var at : usize = 0; + var start : usize = LAB_NO; + while (at < ledger.len and start == LAB_NO) { + const e : usize = lab_line_end(ledger, at); + if (line_is(ledger, at, e, 1, "\"entries\": [")) { start = lab_line_next(ledger, e); } + if (line_is(ledger, at, e, 1, "\"entries\": []")) { start = ledger.len; } + at = lab_line_next(ledger, e); + } + if (start == LAB_NO) { return 0; } + var n : usize = 0; + var sp : [3]usize = undefined; + var s : usize = start; + var closed : bool = false; + while (s < ledger.len and closed == false) { + const e : usize = lab_line_end(ledger, s); + if (line_is(ledger, s, e, 1, "]")) { + closed = true; + } else { + if (lt_skip(ledger, s, e) < e) { + if (lt_obj(ledger, s, e, "path", &sp) != 1 or sp[2] != 1) { return LAB_NO; } + if (lt_json_ok(ledger, sp[0], sp[1]) == false) { return LAB_NO; } + if (n >= cap) { return LAB_NO - 1; } + var j : usize = 0; + while (j < n) { + if (ent[5 * j + 4] == 1) { + if (lt_json_same(ledger, ent[5 * j + 2] as usize, ent[5 * j + 3] as usize, ledger, sp[0], sp[1])) { ent[5 * j + 4] = 0; } + } + j = j + 1; + } + ent[5 * n] = s as u32; + ent[5 * n + 1] = e as u32; + ent[5 * n + 2] = sp[0] as u32; + ent[5 * n + 3] = sp[1] as u32; + ent[5 * n + 4] = 1; + n = n + 1; + } + s = lab_line_next(ledger, e); + } + } + return n; +} + +/// The results of the run: rt is five words each (the object's start and end, its file's start and end, 1 while +/// no later result has the same file). flag[0] is set when one has `"reference": "pass"`. LAB_NO when a result has +/// no file that reads, LAB_NO - 1 when there are more than cap. +pub fn lt_collect_results(run : string, rt : []u32, cap : usize, flag : []u32) -> usize { + flag[0] = 0; + var n : usize = 0; + var o : usize = next_object(run, results_at(run)); + var sp : [3]usize = undefined; + while (o < run.len) { + const e : usize = object_end(run, o); + const v : usize = key_at(run, o, e, 3, "file"); + if (v > run.len or run[v] != 34) { return LAB_NO; } + const pf : usize = value_from(run, v); + const pt : usize = value_to(run, v); + if (lt_json_ok(run, pf, pt) == false) { return LAB_NO; } + if (lt_run_val(run, o, e, "reference", &sp)) { + if (sp[2] == 1 and span_is(run, sp[0], sp[1], "pass")) { flag[0] = 1; } + } + if (n >= cap) { return LAB_NO - 1; } + var j : usize = 0; + while (j < n) { + if (rt[5 * j + 4] == 1) { + if (lt_json_same(run, rt[5 * j + 2] as usize, rt[5 * j + 3] as usize, run, pf, pt)) { rt[5 * j + 4] = 0; } + } + j = j + 1; + } + rt[5 * n] = o as u32; + rt[5 * n + 1] = e as u32; + rt[5 * n + 2] = pf as u32; + rt[5 * n + 3] = pt as u32; + rt[5 * n + 4] = 1; + n = n + 1; + o = next_object(run, e); + } + return n; +} + +/// The rows of tab (five words each, n of them) that still count, in the order of their paths: ord gets their +/// indexes; how many, or LAB_NO when a path is not readable. +pub fn lt_sort(t : string, tab : []const u32, n : usize, ord : []u32) -> usize { + var m : usize = 0; + var i : usize = 0; + while (i < n) { + if (tab[5 * i + 4] == 1) { + var j : usize = m; + var going : bool = true; + while (going and j > 0) { + const p : usize = ord[j - 1] as usize; + const c : i32 = lt_json_cmp(t, tab[5 * p + 2] as usize, tab[5 * p + 3] as usize, t, tab[5 * i + 2] as usize, tab[5 * i + 3] as usize); + if (c == 2) { return LAB_NO; } + if (c > 0) { + ord[j] = ord[j - 1]; + j = j - 1; + } else { + going = false; + } + } + ord[j] = i as u32; + m = m + 1; + } + i = i + 1; + } + return m; +} + +/// The row of tab (in the order ord, m rows) whose path is u[a..b]; LAB_NO when none is. +pub fn lt_find(t : string, tab : []const u32, ord : []const u32, m : usize, u : string, a : usize, b : usize) -> usize { + var lo : usize = 0; + var hi : usize = m; + while (lo < hi) { + const mid : usize = (lo + hi) / 2; + const r : usize = ord[mid] as usize; + const c : i32 = lt_json_cmp(t, tab[5 * r + 2] as usize, tab[5 * r + 3] as usize, u, a, b); + if (c == 0) { return r; } + if (c < 0) { + lo = mid + 1; + } else { + hi = mid; + } + } + return LAB_NO; +} + +/// str() of a JSON value, at most n characters of it: None, True, False, a string's characters, a number as written. +pub fn lt_put_pystr(out : []u8, cap : usize, w : usize, t : string, found : bool, a : usize, b : usize, is_str : bool, n : usize) -> usize { + if (found == false) { return lab_put_lit(out, cap, w, "None"); } + if (is_str) { return lt_put_json(out, cap, w, t, a, b, n); } + if (span_is(t, a, b, "null")) { return lab_put_lit(out, cap, w, "None"); } + if (span_is(t, a, b, "true")) { return lab_put_lit(out, cap, w, "True"); } + if (span_is(t, a, b, "false")) { return lab_put_lit(out, cap, w, "False"); } + var e : usize = b; + if (e - a > n) { e = a + n; } + return lab_put_span(out, cap, w, t, a, e); +} + +/// The head of a finding line: the kind padded to 19, a space, the path, a colon and a space. +pub fn lt_put_head(out : []u8, cap : usize, w : usize, code : u8, t : string, pf : usize, pt : usize) -> usize { + var x : usize = lab_put_lit(out, cap, w, LT_KIND_NAMES[code as usize]); + x = lx_put_pad(out, cap, x, LT_KIND_WIDTH - LT_KIND_NAMES[code as usize].len); + x = lab_put_lit(out, cap, x, " "); + x = lt_put_json(out, cap, x, t, pf, pt, LX_BIG as usize); + return lab_put_lit(out, cap, x, ": "); +} + +/// The `source` object of the ledger: sp[0] is where its keys start and sp[1] where its closing line starts. +/// 0: there is none, or it is null; 1: an object; 2: it is something else. +pub fn lt_source(ledger : string, sp : []usize) -> u8 { + const v : usize = key_at(ledger, 0, ledger.len, 1, "source"); + if (v > ledger.len) { return 0; } + if (v < ledger.len and ledger[v] == 123) { + if (v + 1 < ledger.len and ledger[v + 1] == 125) { + sp[0] = v; + sp[1] = v; + return 1; + } + const first : usize = lab_line_end(ledger, v) + 1; + var k : usize = first; + while (k < ledger.len) { + const e : usize = lab_line_end(ledger, k); + if (line_is(ledger, k, e, 1, "}")) { + sp[0] = first; + sp[1] = k; + return 1; + } + k = lab_line_next(ledger, e); + } + return 2; + } + if (span_is(ledger, value_from(ledger, v), value_to(ledger, v), "null")) { return 0; } + return 2; +} + +/// Is the value of max_not_pass a cap: a whole number that is not negative (and not a boolean, a float or text). +pub fn lt_cap_has(t : string, found : bool, a : usize, b : usize, is_str : bool) -> bool { + if (found == false or is_str or b <= a) { return false; } + if (lx_digits_end(t, a, b) == b) { return true; } + if (t[a] == 45 and b - a > 1 and lx_digits_end(t, a + 1, b) == b) { return lx_dec_value(t, a + 1, b) == 0; } + return false; +} + +/// Writes str(commit)[:9] for the key of a header: the first nine characters of a value, `None` when there is none. +pub fn lt_put_commit(out : []u8, cap : usize, w : usize, t : string, v : usize) -> usize { + if (v > t.len) { return lab_put_lit(out, cap, w, "None"); } + return lt_put_pystr(out, cap, w, t, true, value_from(t, v), value_to(t, v), v < t.len and t[v] == 34, 9); +} + +/// Sets the answer to unreadable, with its reason; the text of the call is not valid then. +pub fn lt_fail(res : []u32, w : usize, why : u32) -> usize { + res[9] = LT_UNREADABLE; + res[10] = why; + return w; +} + +/// Writes the blocker of the result t[o..e] cut at 200 characters, from the span in sp (a first blocker or a detail). +pub fn lt_put_blocker(out : []u8, cap : usize, w : usize, run : string, sp : []const usize) -> usize { + const cut : usize = lt_json_cut(run, sp[0], sp[1], 200); + return lt_put_json(out, cap, w, run, sp[0], cut, 200); +} + +/// The ratchet of a run against a ledger (`tri t27b ratchet`, ratchet() in scripts/tri_loop/t27b.py), read from the +/// run document and the ledger as Python wrote them. Findings are written at w, one line each, then the summary +/// line, exactly as the command prints them; the cursor after them is returned. res[0..9] are the counts per kind in +/// the command's order, res[9] the status (LT_GREEN, LT_RED, LT_UNREADABLE: then nothing is valid), res[10] the +/// reason it was unreadable, res[11] the number of non-pass rows. work holds the tables: 6 * cap_e + 6 * cap_r words, +/// room for cap_e ledger rows and cap_r run results. +pub fn lt_ratchet(run : string, ledger : string, work : []u32, cap_e : usize, cap_r : usize, out : []u8, cap : usize, w : usize, res : []u32) -> usize { + var q : usize = 0; + while (q < 12) { + res[q] = 0; + q = q + 1; + } + const ent : []u32 = work[0..5 * cap_e]; + const eord : []u32 = work[5 * cap_e..6 * cap_e]; + const rt : []u32 = work[6 * cap_e..6 * cap_e + 5 * cap_r]; + const rord : []u32 = work[6 * cap_e + 5 * cap_r..6 * cap_e + 6 * cap_r]; + var flag : [1]u32 = [0]; + const nr : usize = lt_collect_results(run, rt, cap_r, &flag); + if (nr == LAB_NO) { return lt_fail(res, w, LT_U_RUN); } + if (nr == LAB_NO - 1) { return lt_fail(res, w, LT_U_CAPACITY); } + if (nr == 0) { return lt_fail(res, w, LT_U_NO_RESULTS); } + if (flag[0] == 0) { return lt_fail(res, w, LT_U_NO_REFERENCE); } + if (ledger.len == 0) { return lt_fail(res, w, LT_U_NO_LEDGER); } + const ne : usize = lt_collect_entries(ledger, ent, cap_e); + if (ne == LAB_NO) { return lt_fail(res, w, LT_U_LEDGER); } + if (ne == LAB_NO - 1) { return lt_fail(res, w, LT_U_CAPACITY); } + const me : usize = lt_sort(ledger, ent, ne, eord); + const mr : usize = lt_sort(run, rt, nr, rord); + if (me == LAB_NO or mr == LAB_NO) { return lt_fail(res, w, LT_U_TEXT); } + var src : [2]usize = [0, 0]; + const sk : u8 = lt_source(ledger, &src); + if (sk == 2) { return lt_fail(res, w, LT_U_LEDGER); } + var counted : bool = true; + var ledger_commit : usize = ledger.len + 1; + if (sk == 1) { + const av : usize = key_at(ledger, src[0], src[1], 2, "asserts_counted"); + if (av <= ledger.len) { + if (span_is(ledger, value_from(ledger, av), value_to(ledger, av), "false")) { counted = false; } + } + ledger_commit = key_at(ledger, src[0], src[1], 2, "commit"); + } + var x : usize = w; + var sp : [3]usize = undefined; + var bsp : [3]usize = undefined; + var lsp : [3]usize = undefined; + var i : usize = 0; + while (i < me) { + const ei : usize = eord[i] as usize; + const ls : usize = ent[5 * ei] as usize; + const le : usize = ent[5 * ei + 1] as usize; + const pf : usize = ent[5 * ei + 2] as usize; + const pt : usize = ent[5 * ei + 3] as usize; + const tf : bool = lt_obj(ledger, ls, le, "t27b", &sp) == 1; + const want : u8 = lt_word_of(ledger, tf, sp[0], sp[1], sp[2] == 1); + if (want == LR_UNKNOWN) { return lt_fail(res, w, LT_U_WORD); } + const rf : bool = lt_obj(ledger, ls, le, "reason", &lsp) == 1; + if (is_pass(want) == false) { + var good : bool = false; + if (rf and lsp[2] == 1) { + var r : usize = 0; + while (r < 3) { + if (lab_same_span(ledger, lsp[0], lsp[1], LT_REASONS[r], 0, LT_REASONS[r].len)) { good = true; } + r = r + 1; + } + } + if (good == false) { + x = lt_put_head(out, cap, x, RC_BAD_REASON, ledger, pf, pt); + x = lab_put_lit(out, cap, x, "reason "); + if (rf and lsp[2] == 1) { + x = lt_put_repr(out, cap, x, ledger, lsp[0], lsp[1]); + } else { + x = lt_put_pystr(out, cap, x, ledger, rf, lsp[0], lsp[1], false, LX_BIG as usize); + } + x = lab_put_lit(out, cap, x, " is not one of unimplemented, reference-bug, n/a\n"); + res[lt_slot(RC_BAD_REASON)] = res[lt_slot(RC_BAD_REASON)] + 1; + } + } + const ri : usize = lt_find(run, rt, rord, mr, ledger, pf, pt); + if (ri == LAB_NO) { + x = lt_put_head(out, cap, x, RC_STALE, ledger, pf, pt); + x = lab_put_lit(out, cap, x, "not in this run: the spec is gone or was renamed\n"); + res[lt_slot(RC_STALE)] = res[lt_slot(RC_STALE)] + 1; + } else { + const o : usize = rt[5 * ri] as usize; + const e : usize = rt[5 * ri + 1] as usize; + const ref_c : u8 = lt_run_word(run, o, e, "reference"); + const got : u8 = lt_run_word(run, o, e, "t27b"); + if (ref_c == LR_UNKNOWN or got == LR_UNKNOWN) { return lt_fail(res, w, LT_U_WORD); } + var has_b : bool = false; + if (is_pass(got) == false) { + if (lt_first_text(run, o, e, &bsp) != 1) { return lt_fail(res, w, LT_U_RUN); } + if (lt_json_cut(run, bsp[0], bsp[1], 200) == LAB_NO) { return lt_fail(res, w, LT_U_TEXT); } + has_b = true; + } + const bf : bool = lt_obj(ledger, ls, le, "blocker", &lsp) == 1; + var same : bool = false; + if (has_b) { + if (bf and lsp[2] == 1) { same = lt_json_same(run, bsp[0], lt_json_cut(run, bsp[0], bsp[1], 200), ledger, lsp[0], lsp[1]); } + } else { + same = bf == false or (lsp[2] == 0 and span_is(ledger, lsp[0], lsp[1], "null")); + } + const kind : u8 = entry_code(want, ref_c, got, counted, same); + if (kind != 0) { + x = lt_put_head(out, cap, x, kind, ledger, pf, pt); + if (kind == RC_STALE) { + x = lab_put_lit(out, cap, x, "the reference does not pass it any more ("); + x = lab_put_lit(out, cap, x, lr_word(ref_c)); + x = lab_put_lit(out, cap, x, ": "); + var dsp : [3]usize = undefined; + if (lt_run_val(run, o, e, "reference_detail", &dsp)) { + if (dsp[2] == 1) { + x = lt_put_json(out, cap, x, run, dsp[0], dsp[1], 120); + } else { + if (span_is(run, dsp[0], dsp[1], "null") == false and span_is(run, dsp[0], dsp[1], "false") == false and span_is(run, dsp[0], dsp[1], "0") == false and span_is(run, dsp[0], dsp[1], "[]") == false) { return lt_fail(res, w, LT_U_RUN); } + } + } + x = lab_put_lit(out, cap, x, ")\n"); + } + if (kind == RC_UNJUDGED) { + x = lab_put_lit(out, cap, x, "reference "); + x = lab_put_lit(out, cap, x, lr_word(ref_c)); + x = lab_put_lit(out, cap, x, ": no verdict either way\n"); + } + if (kind == RC_VACUITY_MEASURED) { + x = lab_put_lit(out, cap, x, "ledger pass was blessed before asserts were counted; this run counts 0 runtime asserts: bless to record pass_vacuous\n"); + } + if (kind == RC_UNEXPECTED_FAILURE) { + x = lab_put_lit(out, cap, x, "ledger "); + x = lab_put_lit(out, cap, x, lr_word(want)); + x = lab_put_lit(out, cap, x, ", now "); + if (got == T_PASS_VACUOUS) { + x = lab_put_lit(out, cap, x, "passes with 0 runtime asserts"); + } else { + x = lab_put_lit(out, cap, x, lr_word(got)); + x = lab_put_lit(out, cap, x, ": "); + x = lt_put_blocker(out, cap, x, run, &bsp); + } + x = lab_put_lit(out, cap, x, "\n"); + } + if (kind == RC_UNEXPECTED_PASS) { + if (want == T_PASS_VACUOUS) { + x = lab_put_lit(out, cap, x, "ledger pass_vacuous, now a pass with "); + const af : bool = lt_run_val(run, o, e, "asserts", &sp); + x = lt_put_pystr(out, cap, x, run, af, sp[0], sp[1], sp[2] == 1, LX_BIG as usize); + x = lab_put_lit(out, cap, x, " runtime asserts\n"); + } else { + x = lab_put_lit(out, cap, x, "ledger "); + x = lab_put_lit(out, cap, x, lr_word(want)); + x = lab_put_lit(out, cap, x, " ("); + x = lt_put_pystr(out, cap, x, ledger, bf, lsp[0], lsp[1], lsp[2] == 1, LX_BIG as usize); + x = lab_put_lit(out, cap, x, "), now "); + x = lab_put_lit(out, cap, x, lr_word(got)); + x = lab_put_lit(out, cap, x, "\n"); + } + } + if (kind == RC_MOVED) { + x = lab_put_lit(out, cap, x, lr_word(want)); + x = lab_put_lit(out, cap, x, " ("); + x = lt_put_pystr(out, cap, x, ledger, bf, lsp[0], lsp[1], lsp[2] == 1, LX_BIG as usize); + x = lab_put_lit(out, cap, x, ") -> "); + x = lab_put_lit(out, cap, x, lr_word(got)); + x = lab_put_lit(out, cap, x, " ("); + x = lt_put_blocker(out, cap, x, run, &bsp); + x = lab_put_lit(out, cap, x, ")\n"); + } + res[lt_slot(kind)] = res[lt_slot(kind)] + 1; + } + } + i = i + 1; + } + var j : usize = 0; + while (j < mr) { + const rj : usize = rord[j] as usize; + const o2 : usize = rt[5 * rj] as usize; + const e2 : usize = rt[5 * rj + 1] as usize; + const ref2 : u8 = lt_run_word(run, o2, e2, "reference"); + if (ref2 == LR_UNKNOWN) { return lt_fail(res, w, LT_U_WORD); } + const listed : bool = lt_find(ledger, ent, eord, me, run, rt[5 * rj + 2] as usize, rt[5 * rj + 3] as usize) != LAB_NO; + if (unlisted(ref2, listed)) { + const got2 : u8 = lt_run_word(run, o2, e2, "t27b"); + if (got2 == LR_UNKNOWN) { return lt_fail(res, w, LT_U_WORD); } + x = lt_put_head(out, cap, x, RC_UNLISTED, run, rt[5 * rj + 2] as usize, rt[5 * rj + 3] as usize); + x = lab_put_lit(out, cap, x, "the reference passes it and the ledger does not name it (t27b "); + x = lab_put_lit(out, cap, x, lr_word(got2)); + if (is_pass(got2) == false) { + if (lt_first_text(run, o2, e2, &bsp) != 1) { return lt_fail(res, w, LT_U_RUN); } + const cut2 : usize = lt_json_cut(run, bsp[0], bsp[1], 200); + if (cut2 == LAB_NO) { return lt_fail(res, w, LT_U_TEXT); } + if (cut2 > bsp[0]) { + x = lab_put_lit(out, cap, x, ": "); + x = lt_put_blocker(out, cap, x, run, &bsp); + } + } + x = lab_put_lit(out, cap, x, ")\n"); + res[lt_slot(RC_UNLISTED)] = res[lt_slot(RC_UNLISTED)] + 1; + } + j = j + 1; + } + var not_pass : u32 = 0; + var m : usize = 0; + while (m < me) { + const mi : usize = eord[m] as usize; + const tf2 : bool = lt_obj(ledger, ent[5 * mi] as usize, ent[5 * mi + 1] as usize, "t27b", &sp) == 1; + if (is_pass(lt_word_of(ledger, tf2, sp[0], sp[1], sp[2] == 1)) == false) { not_pass = not_pass + 1; } + m = m + 1; + } + res[11] = not_pass; + const cf : usize = key_at(ledger, 0, ledger.len, 1, "max_not_pass"); + var cfound : bool = false; + var ca : usize = 0; + var cb : usize = 0; + var cstr : bool = false; + if (cf <= ledger.len) { + cfound = true; + ca = value_from(ledger, cf); + cb = value_to(ledger, cf); + cstr = cf < ledger.len and ledger[cf] == 34; + } + const has_cap : bool = lt_cap_has(ledger, cfound, ca, cb, cstr); + var cap_v : u32 = 0; + if (has_cap and cb > ca and ledger[ca] != 45) { cap_v = (lx_dec_value(ledger, ca, cb) % 4294967296) as u32; } + if (over_cap(not_pass, cap_v, has_cap)) { + x = lab_put_lit(out, cap, x, "OVER CAP"); + x = lx_put_pad(out, cap, x, LT_KIND_WIDTH - 8); + x = lab_put_lit(out, cap, x, " -: "); + x = lab_put_count(out, cap, x, not_pass as u64); + x = lab_put_lit(out, cap, x, " non-pass entries, max_not_pass "); + x = lt_put_pystr(out, cap, x, ledger, cfound, ca, cb, cstr, LX_BIG as usize); + x = lab_put_lit(out, cap, x, "\n"); + res[lt_slot(RC_OVER_CAP)] = res[lt_slot(RC_OVER_CAP)] + 1; + } + var red : u32 = 0; + var s : usize = 0; + while (s < 9) { + if (ratchet_is_red(LT_REPORT_ORDER[s])) { red = red + res[s]; } + s = s + 1; + } + var status : u32 = LT_GREEN; + if (red > 0) { status = LT_RED; } + res[9] = status; + x = lab_put_lit(out, cap, x, "tri t27b ratchet: "); + if (red > 0) { + x = lab_put_lit(out, cap, x, "red"); + } else { + x = lab_put_lit(out, cap, x, "green"); + } + x = lab_put_lit(out, cap, x, " -- run "); + x = lt_put_commit(out, cap, x, run, key_at(run, 0, results_at(run), 1, "commit")); + x = lab_put_lit(out, cap, x, " vs ledger "); + if (ledger_commit > ledger.len) { + x = lab_put_lit(out, cap, x, "None"); + } else { + x = lt_put_commit(out, cap, x, ledger, ledger_commit); + } + x = lab_put_lit(out, cap, x, ": "); + var c : usize = 0; + while (c < 9) { + x = lab_put_lit(out, cap, x, LT_KIND_NAMES[LT_REPORT_ORDER[c] as usize]); + x = lab_put_lit(out, cap, x, " "); + x = lab_put_count(out, cap, x, res[c] as u64); + if (c < 8) { x = lab_put_lit(out, cap, x, ", "); } + c = c + 1; + } + return lab_put_lit(out, cap, x, "\n"); +} + +// ---- tests ---- + +/// A run and a ledger small enough to read, in the layouts lab.py and dump_ledger write. +pub const LT_RUN : string = "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprFoo\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n"; +pub const LT_LEDGER : string = "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a.t27\", \"t27b\": \"pass\"},\n {\"path\": \"specs/b.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprFoo\", \"reason\": \"unimplemented\"}\n ]\n}\n"; +pub const LT_WORK : usize = 32; + +test the_small_run_and_ledger_agree_and_the_summary_line_says_green { + var work : [384]u32 = undefined; + var out : [2048]u8 = undefined; + var res : [12]u32 = undefined; + const w : usize = lt_ratchet(LT_RUN, LT_LEDGER, &work, LT_WORK, LT_WORK, &out, 2048, 0, &res); + assert res[9] == LT_GREEN; + assert res[11] == 1; + var k : usize = 0; + while (k < 9) { + assert res[k] == 0; + k = k + 1; + } + assert lx_out_is(&out, w, "tri t27b ratchet: green -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 0, UNEXPECTED PASS 0, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n") == true; +} + +test a_run_that_drops_a_pass_a_blocker_and_a_spec_is_red_with_one_line_each { + var work : [384]u32 = undefined; + var out : [2048]u8 = undefined; + var res : [12]u32 = undefined; + const run : string = "{\n \"commit\": \"c1\",\n \"results\": [\n {\n \"file\": \"specs/a.t27\",\n \"t27b\": \"crash\",\n \"blockers\": [\n \"boom\"\n ],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprBar\"\n ],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/new.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n"; + const w : usize = lt_ratchet(run, LT_LEDGER, &work, LT_WORK, LT_WORK, &out, 2048, 0, &res); + assert res[9] == LT_RED; + assert res[0] == 1; + assert res[2] == 1; + assert res[6] == 1; + assert lx_out_is(&out, w, "UNEXPECTED FAILURE specs/a.t27: ledger pass, now crash: boom\nMOVED specs/b.t27: blocked (ExprFoo) -> blocked (ExprBar)\nUNLISTED specs/new.t27: the reference passes it and the ledger does not name it (t27b pass)\ntri t27b ratchet: red -- run c1 vs ledger 2520ee1a5: UNEXPECTED FAILURE 1, UNEXPECTED PASS 0, UNLISTED 1, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 1, UNJUDGED 0, VACUITY MEASURED 0\n") == true; +} + +test every_way_to_be_unreadable_has_its_own_reason_and_writes_nothing { + var work : [384]u32 = undefined; + var out : [2048]u8 = undefined; + var res : [12]u32 = undefined; + assert lt_ratchet("{\n \"commit\": \"c\"\n}\n", LT_LEDGER, &work, LT_WORK, LT_WORK, &out, 2048, 5, &res) == 5; + assert res[9] == LT_UNREADABLE; + assert res[10] == LT_U_RUN or res[10] == LT_U_NO_RESULTS; + const noref : string = "{\n \"results\": [\n {\n \"file\": \"a\",\n \"t27b\": \"pass\",\n \"reference\": \"blocked\"\n }\n ]\n}\n"; + assert lt_ratchet(noref, LT_LEDGER, &work, LT_WORK, LT_WORK, &out, 2048, 0, &res) == 0; + assert res[10] == LT_U_NO_REFERENCE; + assert lt_ratchet(LT_RUN, "", &work, LT_WORK, LT_WORK, &out, 2048, 0, &res) == 0; + assert res[10] == LT_U_NO_LEDGER; + assert lt_ratchet(LT_RUN, "{\n \"entries\": [\n not an object\n ]\n}\n", &work, LT_WORK, LT_WORK, &out, 2048, 0, &res) == 0; + assert res[10] == LT_U_LEDGER; + assert lt_ratchet(LT_RUN, "{\n \"entries\": [\n {\"t27b\": \"pass\"}\n ]\n}\n", &work, LT_WORK, LT_WORK, &out, 2048, 0, &res) == 0; + assert res[10] == LT_U_LEDGER; + assert lt_ratchet(LT_RUN, "{\n \"source\": 5,\n \"entries\": []\n}\n", &work, LT_WORK, LT_WORK, &out, 2048, 0, &res) == 0; + assert res[10] == LT_U_LEDGER; + const bad : string = "{\n \"entries\": [\n {\"path\": \"specs/a.t27\", \"t27b\": \"bogus\"}\n ]\n}\n"; + assert lt_ratchet(LT_RUN, bad, &work, LT_WORK, LT_WORK, &out, 2048, 0, &res) == 0; + assert res[10] == LT_U_WORD; + const esc : string = "{\n \"entries\": [\n {\"path\": \"specs/\\q.t27\", \"t27b\": \"pass\"}\n ]\n}\n"; + assert lt_ratchet(LT_RUN, esc, &work, LT_WORK, LT_WORK, &out, 2048, 0, &res) == 0; + assert res[10] == LT_U_LEDGER; +} + +test a_table_that_is_too_wide_for_its_buffer_is_refused_not_cut { + var work : [384]u32 = undefined; + var out : [2048]u8 = undefined; + var res : [12]u32 = undefined; + assert lt_ratchet(LT_RUN, LT_LEDGER, &work, 1, LT_WORK, &out, 2048, 0, &res) == 0; + assert res[10] == LT_U_CAPACITY; + assert lt_ratchet(LT_RUN, LT_LEDGER, &work, LT_WORK, 1, &out, 2048, 0, &res) == 0; + assert res[10] == LT_U_CAPACITY; + assert lt_ratchet(LT_RUN, LT_LEDGER, &work, 2, 2, &out, 2048, 0, &res) > 0; + assert res[9] == LT_GREEN; +} + +test a_clipped_output_still_advances_the_cursor { + var work : [384]u32 = undefined; + var out : [16]u8 = undefined; + var res : [12]u32 = undefined; + const w : usize = lt_ratchet(LT_RUN, LT_LEDGER, &work, LT_WORK, LT_WORK, &out, 16, 0, &res); + assert w == 190; + assert res[9] == LT_GREEN; +} + +test a_json_character_is_one_of_five_shapes_and_a_bad_escape_is_none { + assert lt_char("a", 0, 1) == 97 * 16 + 1; + assert lt_char("\\n", 0, 2) == 10 * 16 + 2; + assert lt_char("\\t", 0, 2) == 9 * 16 + 2; + assert lt_char("\\r", 0, 2) == 13 * 16 + 2; + assert lt_char("\\b", 0, 2) == 8 * 16 + 2; + assert lt_char("\\f", 0, 2) == 12 * 16 + 2; + assert lt_char("\\\"", 0, 2) == 34 * 16 + 2; + assert lt_char("\\\\", 0, 2) == 92 * 16 + 2; + assert lt_char("\\/", 0, 2) == 47 * 16 + 2; + assert lt_char("\\u0041", 0, 6) == 65 * 16 + 6; + assert lt_char("\\u00e9", 0, 6) == 233 * 16 + 6; + assert lt_char("\\u00E9", 0, 6) == 233 * 16 + 6; + assert lt_char("\\ud83d\\ude00", 0, 12) == 128512 * 16 + 12; + assert lt_char("\\q", 0, 2) == 0; + assert lt_char("\\u12", 0, 4) == 0; + assert lt_char("\\u12g4", 0, 6) == 0; + assert lt_char("\\ud83d", 0, 6) == 0; + assert lt_char("\\ud83dx", 0, 7) == 0; + assert lt_char("\\ude00", 0, 6) == 0; + assert lt_char("\\ud83d\\u0041", 0, 12) == 0; + assert lt_char("\\", 0, 1) == 0; + assert lt_char("\xc3\xa9", 0, 2) == 233 * 16 + 2; + assert lt_char("\xe4\xb8\xad", 0, 3) == 20013 * 16 + 3; +} + +test json_strings_compare_cut_and_write_as_python_strings { + assert lt_json_same("a\\u0062c", 0, 8, "abc", 0, 3) == true; + assert lt_json_same("ab", 0, 2, "abc", 0, 3) == false; + assert lt_json_same("abc", 0, 3, "ab", 0, 2) == false; + assert lt_json_same("\\q", 0, 2, "\\q", 0, 2) == false; + assert lt_json_same("", 0, 0, "", 0, 0) == true; + assert lt_json_cmp("a", 0, 1, "b", 0, 1) == -1; + assert lt_json_cmp("\\u00e9", 0, 6, "z", 0, 1) == 1; + assert lt_json_cmp("ab", 0, 2, "abc", 0, 3) == -1; + assert lt_json_cmp("abc", 0, 3, "ab", 0, 2) == 1; + assert lt_json_cmp("a\\u0062", 0, 7, "ab", 0, 2) == 0; + assert lt_json_cmp("\\q", 0, 2, "a", 0, 1) == 2; + assert lt_json_cut("abcdef", 0, 6, 3) == 3; + assert lt_json_cut("abcdef", 0, 6, 9) == 6; + assert lt_json_cut("a\\u00e9\\ud83d\\ude00z", 0, 21, 3) == 19; + assert lt_json_cut("a\\u00e9\\ud83d\\ude00z", 0, 21, 2) == 7; + assert lt_json_cut("\\q", 0, 2, 1) == LAB_NO; + assert lt_json_ok("fine \\u00e9", 0, 11) == true; + assert lt_json_ok("bad \\q", 0, 6) == false; + var out : [64]u8 = undefined; + assert lx_out_is(&out, lt_put_json(&out, 64, 0, "a\\u00e9\\n", 0, 9, 99), "a\xc3\xa9\n") == true; + assert lx_out_is(&out, lt_put_json(&out, 64, 0, "abcdef", 0, 6, 4), "abcd") == true; + assert lx_out_is(&out, lt_put_json(&out, 64, 0, "\\ud83d\\ude00", 0, 12, 99), "\xf0\x9f\x98\x80") == true; +} + +test repr_chooses_its_quote_and_escapes_as_python_does { + var out : [64]u8 = undefined; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "bogus", 0, 5), "'bogus'") == true; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "it's", 0, 4), "\"it's\"") == true; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "say \\\"hi\\\"", 0, 10), "'say \"hi\"'") == true; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "it's \\\"both\\\"", 0, 13), "'it\\'s \"both\"'") == true; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "a\\\\b", 0, 4), "'a\\\\b'") == true; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "a\\nb\\tc\\r", 0, 9), "'a\\nb\\tc\\r'") == true; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "\\u0001", 0, 6), "'\\x01'") == true; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "\\u00a0", 0, 6), "'\\xa0'") == true; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "\\u2028", 0, 6), "'\\u2028'") == true; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "\\u00e9", 0, 6), "'\xc3\xa9'") == true; + assert lx_out_is(&out, lt_put_repr(&out, 64, 0, "", 0, 0), "''") == true; +} + +test a_one_line_object_is_read_for_its_last_key_and_a_bad_line_is_not_read { + var sp : [3]usize = undefined; + const row : string = "{\"path\": \"x\", \"t27b\": \"pass\", \"n\": [1, {\"k\": \"}\"}], \"z\": 7, \"t27b\": \"fail\"},"; + assert lt_obj(row, 0, row.len, "t27b", &sp) == 1; + assert sp[2] == 1; + assert lab_same_span(row, sp[0], sp[1], "fail", 0, 4) == true; + assert lt_obj(row, 0, row.len, "z", &sp) == 1; + assert sp[2] == 0; + assert lab_same_span(row, sp[0], sp[1], "7", 0, 1) == true; + assert lt_obj(row, 0, row.len, "n", &sp) == 1; + assert lab_same_span(row, sp[0], sp[1], "[1, {\"k\": \"}\"}]", 0, 15) == true; + assert lt_obj(row, 0, row.len, "missing", &sp) == 0; + assert lt_obj("{ \"a\" : 1 , \"b\" : \"x y\" }", 0, 25, "b", &sp) == 1; + assert lt_obj("{}", 0, 2, "a", &sp) == 0; + assert lt_obj("{\"a\": 1} ", 0, 10, "a", &sp) == 1; + assert lt_obj("not an object", 0, 13, "a", &sp) == 2; + assert lt_obj("{\"a\" 1}", 0, 7, "a", &sp) == 2; + assert lt_obj("{\"a\": \"unterminated}", 0, 20, "a", &sp) == 2; + assert lt_obj("{\"a\": 1", 0, 7, "a", &sp) == 2; + assert lt_obj("{\"a\": 1} x", 0, 10, "a", &sp) == 2; + assert lt_obj("{\"a\": }", 0, 7, "a", &sp) == 2; + assert lt_obj("{a: 1}", 0, 6, "a", &sp) == 2; + assert lt_obj("{\"a\": 1,}", 0, 9, "a", &sp) == 2; +} + +test a_cap_is_a_whole_number_that_is_not_negative { + assert lt_cap_has("127", true, 0, 3, false) == true; + assert lt_cap_has("0", true, 0, 1, false) == true; + assert lt_cap_has("-0", true, 0, 2, false) == true; + assert lt_cap_has("-1", true, 0, 2, false) == false; + assert lt_cap_has("1.5", true, 0, 3, false) == false; + assert lt_cap_has("1e2", true, 0, 3, false) == false; + assert lt_cap_has("true", true, 0, 4, false) == false; + assert lt_cap_has("null", true, 0, 4, false) == false; + assert lt_cap_has("127", true, 0, 3, true) == false; + assert lt_cap_has("", true, 0, 0, false) == false; + assert lt_cap_has("127", false, 0, 3, false) == false; +} + +test a_duplicate_path_keeps_the_last_row_and_the_rows_sort_by_decoded_path { + var ent : [40]u32 = undefined; + var ord : [8]u32 = undefined; + const led : string = "{\n \"entries\": [\n {\"path\": \"b\", \"t27b\": \"pass\"},\n {\"path\": \"a\", \"t27b\": \"pass\"},\n {\"path\": \"\\u0062\", \"t27b\": \"blocked\"},\n {\"path\": \"\\u00e9\", \"t27b\": \"pass\"}\n ]\n}\n"; + assert lt_collect_entries(led, &ent, 8) == 4; + assert ent[4] == 0; + assert ent[9] == 1; + assert ent[14] == 1; + assert ent[19] == 1; + assert lt_sort(led, &ent, 4, &ord) == 3; + assert ord[0] == 1; + assert ord[1] == 2; + assert ord[2] == 3; + assert lt_find(led, &ent, &ord, 3, "a", 0, 1) == 1; + assert lt_find(led, &ent, &ord, 3, "b", 0, 1) == 2; + assert lt_find(led, &ent, &ord, 3, "\xc3\xa9", 0, 2) == 3; + assert lt_find(led, &ent, &ord, 3, "\\u00e9", 0, 6) == 3; + assert lt_find(led, &ent, &ord, 3, "zz", 0, 2) == LAB_NO; + assert lt_collect_entries("{\n}\n", &ent, 8) == 0; + assert lt_collect_entries("{\n \"entries\": []\n}\n", &ent, 8) == 0; +} + +test the_results_of_a_run_are_found_by_their_own_file_key_not_a_nested_one { + var rt : [20]u32 = undefined; + var flag : [1]u32 = [0]; + const run : string = "{\n \"results\": [\n {\n \"file\": \"a\",\n \"test_verdicts\": {\n \"file\": true\n },\n \"reference\": \"pass\"\n },\n {\n \"file\": \"b\",\n \"reference\": \"fail\"\n }\n ]\n}\n"; + assert lt_collect_results(run, &rt, 4, &flag) == 2; + assert flag[0] == 1; + assert lab_same_span(run, rt[2] as usize, rt[3] as usize, "a", 0, 1) == true; + assert lab_same_span(run, rt[7] as usize, rt[8] as usize, "b", 0, 1) == true; + assert lt_collect_results(run, &rt, 1, &flag) == LAB_NO - 1; + const nofile : string = "{\n \"results\": [\n {\n \"t27b\": \"pass\"\n }\n ]\n}\n"; + assert lt_collect_results(nofile, &rt, 4, &flag) == LAB_NO; +} + +test a_verdict_value_that_python_reads_as_false_is_missing_and_one_it_does_not_know_is_unknown { + assert lt_word_of("pass", true, 0, 4, true) == 0; + assert lt_word_of("", true, 0, 0, true) == T_MISSING; + assert lt_word_of("", false, 0, 0, false) == T_MISSING; + assert lt_word_of("null", true, 0, 4, false) == T_MISSING; + assert lt_word_of("false", true, 0, 5, false) == T_MISSING; + assert lt_word_of("0", true, 0, 1, false) == T_MISSING; + assert lt_word_of("[]", true, 0, 2, false) == T_MISSING; + assert lt_word_of("{}", true, 0, 2, false) == T_MISSING; + assert lt_word_of("true", true, 0, 4, false) == LR_UNKNOWN; + assert lt_word_of("5", true, 0, 1, false) == LR_UNKNOWN; + assert lt_word_of("bogus", true, 0, 5, true) == LR_UNKNOWN; + assert lt_word_of("not run", true, 0, 7, true) == 9; + assert lt_slot(2) == 0; + assert lt_slot(1) == 8; + assert lt_slot(9) == 5; + assert lt_slot(0) == 9; +} + +// BEGIN GENERATED +// The table below was computed by running scripts/tri_loop/t27b.py ratchet (the checker lab.py calls) on each run +// document and ledger: runs written with json.dumps(indent=1) as lab.py writes them, ledgers with the checker's own +// dump_ledger, a few rows written by hand the way a person edits the ledger. For every case: its exit code (0 green, +// 1 red, 2 unreadable), the nine counts, the finding lines the command printed, and for the first RA_FULL_N cases +// the whole output including the summary line. Each run and each ledger is written once; a case names its two. + +pub const RA_N : usize = 125; +pub const RA_FULL_N : usize = 12; +pub const RA_RUNS : [70]string = [ + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"finished\": \"2026-10-19T01:07:28Z\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass_vacuous\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/c/three.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass_vacuous\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"asserts\": 7,\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprIdentifier(undeclared)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"frontend\",\n \"blockers\": [\n \"same\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"a\",\n \"b\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"b\",\n \"a\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"detail\": \"from detail\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"blocked\",\n \"reference_detail\": \"does not compile: x\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"fail\",\n \"reference_detail\": \"1 of 3 tests fail\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"blocked\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"timeout\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"lab_error\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"not run\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprFoo\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"blocked\",\n \"detail\": \"why\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass_vacuous\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"fail\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"fail\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"crash\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprCall(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"quote \\\" and \\\\ back\",\n \"b\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"caf\\u00e9 \\u4e2d \\ud83d\\ude00 end\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00tail\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/caf\\u00e9/\\u4e2d.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/q\\\"uote/\\\\b.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"blocked\",\n \"reference_detail\": \"dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"blocked\",\n \"reference_detail\": \"\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\\u4e2d\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"blocked\",\n \"reference_detail\": \"\\\"q\\\" \\\\ \\u00e9\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"blocked\",\n \"reference_detail\": \"\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"blocked\",\n \"reference_detail\": null\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/c/three.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"blocked\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": null,\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"image\": {\n \"lab_py_sha\": \"abc\",\n \"commit\": \"nested-not-the-run\",\n \"built\": null\n },\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": null,\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": null\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"missing\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"not run\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"lab_error\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"timeout\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"mismatch\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"crash\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"fail\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"codegen\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"asserts\": 12,\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\",\n \"asserts\": null\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"reference\": \"pass\",\n \"blockers\": []\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": []\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"blocked\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"bogusword\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"bogusword\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"bogusword\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"blocked\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/a/one.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/b/two.t27\",\n \"t27b\": \"bogusword\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/g0/f0.t27\",\n \"t27b\": \"fail\",\n \"detail\": \"d\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/g1/f1.t27\",\n \"t27b\": \"timeout\",\n \"detail\": \"d\",\n \"blockers\": [\n \"ConstDecl\"\n ],\n \"reference\": \"lab_error\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/g2/f6.t27\",\n \"t27b\": \"crash\",\n \"detail\": \"d\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/g0/f0.t27\",\n \"t27b\": \"mismatch\",\n \"detail\": \"d\",\n \"blockers\": [\n \"ConstDecl\"\n ],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/g1/f1.t27\",\n \"t27b\": \"blocked\",\n \"detail\": \"d\",\n \"blockers\": [\n \"x\",\n \"y\"\n ],\n \"reference\": \"blocked\"\n },\n {\n \"file\": \"specs/g1/f5.t27\",\n \"t27b\": \"blocked\",\n \"detail\": \"d\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/g3/f3.t27\",\n \"t27b\": \"blocked\",\n \"detail\": \"d\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"lab_error\",\n \"reference_detail\": \"ref why\"\n },\n {\n \"file\": \"specs/g0/f4.t27\",\n \"t27b\": \"codegen\",\n \"blockers\": [\n \"ExprCall(undeclared fn)\"\n ],\n \"reference\": \"fail\",\n \"reference_detail\": \"ref why\"\n },\n {\n \"file\": \"specs/g2/f2.t27\",\n \"t27b\": \"fail\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/g0/f0.t27\",\n \"t27b\": \"fail\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/g1/f1.t27\",\n \"t27b\": \"pass_vacuous\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/g2/f2.t27\",\n \"t27b\": \"blocked\",\n \"detail\": \"d\",\n \"blockers\": [\n \"x\",\n \"y\"\n ],\n \"reference\": \"fail\",\n \"reference_detail\": \"ref why\"\n },\n {\n \"file\": \"specs/g0/f0.t27\",\n \"t27b\": \"blocked\",\n \"detail\": \"d\",\n \"blockers\": [\n \"x\",\n \"y\"\n ],\n \"reference\": \"timeout\",\n \"reference_detail\": \"ref why\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/g0/f0.t27\",\n \"t27b\": \"pass_vacuous\",\n \"blockers\": [],\n \"reference\": \"pass\"\n }\n ]\n}\n", + "{\n \"commit\": \"891a9087afcbc45ca68c87c07a2e4ff0ae5db00c\",\n \"results\": [\n {\n \"file\": \"specs/g0/f0.t27\",\n \"t27b\": \"codegen\",\n \"blockers\": [],\n \"reference\": \"fail\"\n },\n {\n \"file\": \"specs/g2/f2.t27\",\n \"t27b\": \"pass\",\n \"blockers\": [],\n \"reference\": \"pass\"\n },\n {\n \"file\": \"specs/g3/f3.t27\",\n \"t27b\": \"fail\",\n \"blockers\": [\n \"ConstDecl\"\n ],\n \"reference\": \"fail\",\n \"reference_detail\": \"ref why\"\n },\n {\n \"file\": \"specs/g1/f1.t27\",\n \"t27b\": \"pass_vacuous\",\n \"blockers\": [],\n \"reference\": \"timeout\"\n }\n ]\n}\n" +]; + +pub const RA_LEDGERS : [75]string = [ + "{\n \"schema_version\": 1,\n \"generated_by\": \"x\",\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"ref\": \"master\",\n \"finished\": \"2026-10-19T01:07:28Z\",\n \"asserts_counted\": true\n },\n \"reasons\": {\n \"unimplemented\": \"u\",\n \"reference-bug\": \"r\",\n \"n/a\": \"n\"\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"},\n {\"path\": \"specs/b/two.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"},\n {\"path\": \"specs/b/two.t27\", \"t27b\": \"pass_vacuous\"},\n {\"path\": \"specs/c/three.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": false\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass_vacuous\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"x\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"same\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"a\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"from detail\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"other\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/b/two.t27\", \"t27b\": \"pass\"},\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 2,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"},\n {\"path\": \"specs/b/two.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": null,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": -1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1.5,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": true,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": \"1\",\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 4294967296,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"bogus\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": null}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": 5}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"it's\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"say \\\"hi\\\"\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"it's \\\"both\\\"\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"back\\\\slash\\ttab\\nnl\\u0001\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"caf\\u00e9 \\u4e2d \\ud83d\\ude00\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"\\u00a0x\\u00ad\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\", \"reason\": \"bogus\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00tail\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\\ud83d\\ude00\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/caf\\u00e9/\\u4e2d.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/b/two.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/b/two.t27\", \"t27b\": \"pass\"},\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"},\n {\"path\": \"specs/c/three.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"},\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"},\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"bogusword\"},\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\":\"specs/a/one.t27\",\"t27b\":\"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n { \"path\" : \"specs/a/one.t27\" , \"t27b\" : \"pass\" }\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"t27b\": \"pass\", \"path\": \"specs/a/one.t27\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\", \"path\": \"specs/z.t27\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"},\n\n {\"path\": \"specs/b/two.t27\", \"t27b\": \"blocked\", \"blocker\": \"x\", \"reason\": \"n/a\"}\n\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": []\n}\n", + "{\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": null,\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {},\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": null\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": 0\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\"\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": null\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": 12345678901234\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": null}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"missing\", \"blocker\": \"x\", \"reason\": \"n/a\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"missing\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"not run\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"codegen\", \"blocker\": \"x\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": \"bogusword\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/a/one.t27\", \"t27b\": 5}\n ]\n}\n", + "", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/g1/f1.t27\", \"t27b\": \"pass_vacuous\"},\n {\"path\": \"specs/gone/0.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": null,\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/g1/f5.t27\", \"t27b\": \"pass\"},\n {\"path\": \"specs/g3/f3.t27\", \"t27b\": \"pass\"},\n {\"path\": \"specs/g0/f4.t27\", \"t27b\": \"pass\"},\n {\"path\": \"specs/g2/f6.t27\", \"t27b\": \"pass\"}\n ]\n}\n", + "{\n \"max_not_pass\": 1,\n \"entries\": [\n {\"path\": \"specs/g0/f0.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"reference-bug\"}\n ]\n}\n", + "{\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/gone/3.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"unimplemented\"},\n {\"path\": \"specs/g1/f1.t27\", \"t27b\": \"blocked\", \"blocker\": \"ConstDecl\", \"reason\": \"n/a\"},\n {\"path\": \"specs/g0/f0.t27\", \"t27b\": \"codegen\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"reference-bug\"}\n ]\n}\n", + "{\n \"source\": {\n \"commit\": \"2520ee1a5985688b0ec2fc5c0d8867d6add1a6a9\",\n \"asserts_counted\": true\n },\n \"max_not_pass\": 0,\n \"entries\": [\n {\"path\": \"specs/g0/f0.t27\", \"t27b\": \"blocked\", \"blocker\": \"d\", \"reason\": \"unimplemented\"}\n ]\n}\n", + "{\n \"source\": null,\n \"max_not_pass\": 2,\n \"entries\": [\n {\"path\": \"specs/g3/f3.t27\", \"t27b\": \"blocked\", \"blocker\": \"ExprCall(undeclared fn)\", \"reason\": \"reference-bug\"},\n {\"path\": \"specs/g0/f0.t27\", \"t27b\": \"pass_vacuous\"},\n {\"path\": \"specs/g2/f2.t27\", \"t27b\": \"pass\"},\n {\"path\": \"specs/g1/f1.t27\", \"t27b\": \"frontend\", \"blocker\": \"ConstDecl\", \"reason\": \"reference-bug\"}\n ]\n}\n" +]; + +pub const RA_RUN_AT : [125]usize = [ + 0, 1, 2, 3, 3, 3, 4, 3, 2, 5, 3, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 25, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 5, 26, 26, 26, 5, + 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, + 3, 3, 3, 5, 5, 5, 41, 42, 43, 44, 45, 46, 47, 2, 2, 2, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, + 58, 59, 60, 61, 62, 63, 5, 5, 5, 64, 65, 66, 67, 68, 69 +]; + +pub const RA_LED_AT : [125]usize = [ + 0, 1, 2, 2, 3, 2, 4, 4, 4, 5, 6, 5, 7, 8, 8, 9, 10, 11, 11, 12, 12, 12, 12, 12, 12, 2, 2, 2, 2, + 2, 2, 2, 13, 14, 5, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 10, 35, 2, 2, 36, 37, 38, 39, 12, 12, 12, 12, 12, 40, 2, 2, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 2, 2, 2, 2, 2, 39, 39, 60, 61, 62, 63, 64, 2, 2, 2, + 12, 65, 4, 4, 4, 2, 2, 2, 2, 2, 2, 66, 67, 68, 69, 70, 71, 72, 73, 74 +]; + +pub const RA_STATUS : [125]u32 = [ + 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 2, 2, 2, 2, 0, 2, 2, 2, 2, 1, 1, 0, 1, 1, 1 +]; + +pub const RA_COUNTS : [1125]u32 = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 2, 0, 2, 1, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 1, 0 +]; + +pub const RA_NOTPASS : [125]u32 = [ + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 3, 1, 2 +]; + +pub const RA_FIND : [125]string = [ + "", + "", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: ExprCall(undeclared fn)\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now passes with 0 runtime asserts\n", + "VACUITY MEASURED specs/a/one.t27: ledger pass was blessed before asserts were counted; this run counts 0 runtime asserts: bless to record pass_vacuous\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now passes with 0 runtime asserts\n", + "UNEXPECTED PASS specs/a/one.t27: ledger pass_vacuous, now a pass with 7 runtime asserts\n", + "", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass_vacuous, now blocked: ExprCall(undeclared fn)\n", + "UNEXPECTED PASS specs/a/one.t27: ledger blocked (ExprCall(undeclared fn)), now pass\n", + "UNEXPECTED PASS specs/a/one.t27: ledger blocked (x), now pass_vacuous\n", + "MOVED specs/a/one.t27: blocked (ExprCall(undeclared fn)) -> blocked (ExprIdentifier(undeclared))\n", + "", + "", + "MOVED specs/a/one.t27: blocked (a) -> blocked (b)\n", + "", + "MOVED specs/a/one.t27: blocked (other) -> blocked (from detail)\n", + "", + "", + "STALE specs/a/one.t27: the reference does not pass it any more (blocked: does not compile: x)\n", + "STALE specs/a/one.t27: the reference does not pass it any more (fail: 1 of 3 tests fail)\n", + "STALE specs/a/one.t27: the reference does not pass it any more (blocked: )\n", + "UNJUDGED specs/a/one.t27: reference timeout: no verdict either way\n", + "UNJUDGED specs/a/one.t27: reference lab_error: no verdict either way\n", + "UNJUDGED specs/a/one.t27: reference not run: no verdict either way\n", + "UNLISTED specs/b/two.t27: the reference passes it and the ledger does not name it (t27b pass)\n", + "UNLISTED specs/b/two.t27: the reference passes it and the ledger does not name it (t27b blocked: ExprFoo)\n", + "UNLISTED specs/b/two.t27: the reference passes it and the ledger does not name it (t27b blocked: why)\n", + "UNLISTED specs/b/two.t27: the reference passes it and the ledger does not name it (t27b blocked)\n", + "UNLISTED specs/b/two.t27: the reference passes it and the ledger does not name it (t27b pass_vacuous)\n", + "", + "UNLISTED specs/b/two.t27: the reference passes it and the ledger does not name it (t27b crash: ExprCall(undeclared fn))\n", + "STALE specs/b/two.t27: not in this run: the spec is gone or was renamed\n", + "OVER CAP -: 1 non-pass entries, max_not_pass 0\n", + "", + "OVER CAP -: 1 non-pass entries, max_not_pass None\n", + "OVER CAP -: 1 non-pass entries, max_not_pass None\n", + "OVER CAP -: 1 non-pass entries, max_not_pass -1\n", + "OVER CAP -: 1 non-pass entries, max_not_pass 1.5\n", + "OVER CAP -: 1 non-pass entries, max_not_pass True\n", + "OVER CAP -: 1 non-pass entries, max_not_pass 1\n", + "OVER CAP -: 1 non-pass entries, max_not_pass 4294967296\n", + "BAD REASON specs/a/one.t27: reason 'bogus' is not one of unimplemented, reference-bug, n/a\n", + "BAD REASON specs/a/one.t27: reason None is not one of unimplemented, reference-bug, n/a\n", + "BAD REASON specs/a/one.t27: reason None is not one of unimplemented, reference-bug, n/a\n", + "BAD REASON specs/a/one.t27: reason 5 is not one of unimplemented, reference-bug, n/a\n", + "BAD REASON specs/a/one.t27: reason \"it's\" is not one of unimplemented, reference-bug, n/a\n", + "BAD REASON specs/a/one.t27: reason 'say \"hi\"' is not one of unimplemented, reference-bug, n/a\n", + "BAD REASON specs/a/one.t27: reason 'it\\'s \"both\"' is not one of unimplemented, reference-bug, n/a\n", + "BAD REASON specs/a/one.t27: reason 'back\\\\slash\\ttab\\nnl\\x01' is not one of unimplemented, reference-bug, n/a\n", + "BAD REASON specs/a/one.t27: reason 'caf\xc3\xa9 \xe4\xb8\xad \xf0\x9f\x98\x80' is not one of unimplemented, reference-bug, n/a\n", + "BAD REASON specs/a/one.t27: reason '\\xa0x\\xad' is not one of unimplemented, reference-bug, n/a\n", + "", + "", + "MOVED specs/a/one.t27: blocked (ExprCall(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)) -> blocked (ExprCall(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)\n", + "MOVED specs/a/one.t27: blocked (other) -> blocked (ExprCall(xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx)\n", + "BAD REASON specs/a/one.t27: reason None is not one of unimplemented, reference-bug, n/a\nUNEXPECTED PASS specs/a/one.t27: ledger blocked (None), now pass\nOVER CAP -: 1 non-pass entries, max_not_pass 0\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: quote \" and \\ back\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: caf\xc3\xa9 \xe4\xb8\xad \xf0\x9f\x98\x80 end\n", + "", + "", + "UNEXPECTED FAILURE specs/caf\xc3\xa9/\xe4\xb8\xad.t27: ledger pass, now blocked: ExprCall(undeclared fn)\n", + "UNLISTED specs/q\"uote/\\b.t27: the reference passes it and the ledger does not name it (t27b pass)\n", + "STALE specs/a/one.t27: the reference does not pass it any more (blocked: dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd)\n", + "STALE specs/a/one.t27: the reference does not pass it any more (blocked: \xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad\xe4\xb8\xad)\n", + "STALE specs/a/one.t27: the reference does not pass it any more (blocked: \"q\" \\ \xc3\xa9)\n", + "STALE specs/a/one.t27: the reference does not pass it any more (blocked: )\n", + "STALE specs/a/one.t27: the reference does not pass it any more (blocked: )\n", + "UNEXPECTED PASS specs/a/one.t27: ledger blocked (ExprCall(undeclared fn)), now pass\nUNEXPECTED FAILURE specs/b/two.t27: ledger pass, now blocked: ExprCall(undeclared fn)\nUNEXPECTED FAILURE specs/c/three.t27: ledger pass, now blocked: ExprCall(undeclared fn)\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: ExprCall(undeclared fn)\n", + "", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: ExprCall(undeclared fn)\n", + "", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: ExprCall(undeclared fn)\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: ExprCall(undeclared fn)\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: ExprCall(undeclared fn)\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: ExprCall(undeclared fn)\n", + "STALE specs/z.t27: not in this run: the spec is gone or was renamed\nUNLISTED specs/a/one.t27: the reference passes it and the ledger does not name it (t27b blocked: ExprCall(undeclared fn))\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: ExprCall(undeclared fn)\nSTALE specs/b/two.t27: not in this run: the spec is gone or was renamed\nOVER CAP -: 1 non-pass entries, max_not_pass 0\n", + "UNLISTED specs/a/one.t27: the reference passes it and the ledger does not name it (t27b pass)\n", + "UNLISTED specs/a/one.t27: the reference passes it and the ledger does not name it (t27b pass)\n", + "", + "", + "", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now passes with 0 runtime asserts\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now passes with 0 runtime asserts\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now passes with 0 runtime asserts\n", + "", + "", + "", + "", + "", + "", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now missing: ExprCall(undeclared fn)\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now missing: ExprCall(undeclared fn)\n", + "", + "", + "BAD REASON specs/a/one.t27: reason None is not one of unimplemented, reference-bug, n/a\nMOVED specs/a/one.t27: missing (None) -> blocked (ExprCall(undeclared fn))\nOVER CAP -: 1 non-pass entries, max_not_pass 0\n", + "BAD REASON specs/a/one.t27: reason None is not one of unimplemented, reference-bug, n/a\nMOVED specs/a/one.t27: missing (None) -> blocked (ExprCall(undeclared fn))\nOVER CAP -: 1 non-pass entries, max_not_pass 0\n", + "MOVED specs/a/one.t27: missing (x) -> blocked (ExprCall(undeclared fn))\nOVER CAP -: 1 non-pass entries, max_not_pass 0\n", + "", + "", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now lab_error: ExprCall(undeclared fn)\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now timeout: ExprCall(undeclared fn)\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now mismatch: ExprCall(undeclared fn)\n", + "STALE specs/a/one.t27: the reference does not pass it any more (fail: )\n", + "MOVED specs/a/one.t27: codegen (x) -> codegen (ExprCall(undeclared fn))\n", + "UNEXPECTED PASS specs/a/one.t27: ledger pass_vacuous, now a pass with 12 runtime asserts\n", + "UNEXPECTED PASS specs/a/one.t27: ledger pass_vacuous, now a pass with None runtime asserts\n", + "UNEXPECTED PASS specs/a/one.t27: ledger pass_vacuous, now a pass with None runtime asserts\n", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "UNJUDGED specs/g1/f1.t27: reference lab_error: no verdict either way\nSTALE specs/gone/0.t27: not in this run: the spec is gone or was renamed\nUNLISTED specs/g0/f0.t27: the reference passes it and the ledger does not name it (t27b fail: ExprCall(undeclared fn))\n", + "STALE specs/g0/f4.t27: the reference does not pass it any more (fail: ref why)\nUNEXPECTED FAILURE specs/g1/f5.t27: ledger pass, now blocked: ExprCall(undeclared fn)\nUNEXPECTED FAILURE specs/g2/f6.t27: ledger pass, now crash: d\nUNJUDGED specs/g3/f3.t27: reference lab_error: no verdict either way\nUNLISTED specs/g0/f0.t27: the reference passes it and the ledger does not name it (t27b mismatch: ConstDecl)\nUNLISTED specs/g2/f2.t27: the reference passes it and the ledger does not name it (t27b fail)\n", + "MOVED specs/g0/f0.t27: blocked (ExprCall(undeclared fn)) -> fail ()\n", + "UNJUDGED specs/g0/f0.t27: reference timeout: no verdict either way\nUNEXPECTED PASS specs/g1/f1.t27: ledger blocked (ConstDecl), now pass_vacuous\nSTALE specs/gone/3.t27: not in this run: the spec is gone or was renamed\nOVER CAP -: 3 non-pass entries, max_not_pass 0\n", + "UNEXPECTED PASS specs/g0/f0.t27: ledger blocked (d), now pass_vacuous\nOVER CAP -: 1 non-pass entries, max_not_pass 0\n", + "STALE specs/g0/f0.t27: the reference does not pass it any more (fail: )\nUNJUDGED specs/g1/f1.t27: reference timeout: no verdict either way\nSTALE specs/g3/f3.t27: the reference does not pass it any more (fail: ref why)\n" +]; + +pub const RA_FULL : [12]string = [ + "tri t27b ratchet: green -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 0, UNEXPECTED PASS 0, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n", + "tri t27b ratchet: green -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 0, UNEXPECTED PASS 0, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now blocked: ExprCall(undeclared fn)\ntri t27b ratchet: red -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 1, UNEXPECTED PASS 0, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now passes with 0 runtime asserts\ntri t27b ratchet: red -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 1, UNEXPECTED PASS 0, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n", + "VACUITY MEASURED specs/a/one.t27: ledger pass was blessed before asserts were counted; this run counts 0 runtime asserts: bless to record pass_vacuous\ntri t27b ratchet: green -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 0, UNEXPECTED PASS 0, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 1\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass, now passes with 0 runtime asserts\ntri t27b ratchet: red -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 1, UNEXPECTED PASS 0, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n", + "UNEXPECTED PASS specs/a/one.t27: ledger pass_vacuous, now a pass with 7 runtime asserts\ntri t27b ratchet: red -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 0, UNEXPECTED PASS 1, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n", + "tri t27b ratchet: green -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 0, UNEXPECTED PASS 0, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n", + "UNEXPECTED FAILURE specs/a/one.t27: ledger pass_vacuous, now blocked: ExprCall(undeclared fn)\ntri t27b ratchet: red -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 1, UNEXPECTED PASS 0, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n", + "UNEXPECTED PASS specs/a/one.t27: ledger blocked (ExprCall(undeclared fn)), now pass\ntri t27b ratchet: red -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 0, UNEXPECTED PASS 1, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n", + "UNEXPECTED PASS specs/a/one.t27: ledger blocked (x), now pass_vacuous\ntri t27b ratchet: red -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 0, UNEXPECTED PASS 1, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 0, UNJUDGED 0, VACUITY MEASURED 0\n", + "MOVED specs/a/one.t27: blocked (ExprCall(undeclared fn)) -> blocked (ExprIdentifier(undeclared))\ntri t27b ratchet: green -- run 891a9087a vs ledger 2520ee1a5: UNEXPECTED FAILURE 0, UNEXPECTED PASS 0, UNLISTED 0, STALE 0, OVER CAP 0, BAD REASON 0, MOVED 1, UNJUDGED 0, VACUITY MEASURED 0\n" +]; + + +test the_ratchet_equals_the_pythons_checker_on_every_case { + var work : [768]u32 = undefined; + var out : [16384]u8 = undefined; + var res : [12]u32 = undefined; + var i : usize = 0; + while (i < RA_N) { + const w : usize = lt_ratchet(RA_RUNS[RA_RUN_AT[i]], RA_LEDGERS[RA_LED_AT[i]], &work, 64, 64, &out, 16384, 0, &res); + assert res[9] == RA_STATUS[i]; + if (RA_STATUS[i] != 2) { + var k : usize = 0; + while (k < 9) { + assert res[k] == RA_COUNTS[9 * i + k]; + k = k + 1; + } + assert res[11] == RA_NOTPASS[i]; + assert lx_out_is(&out, RA_FIND[i].len, RA_FIND[i]) == true; + assert out[w - 1] == 10; + assert out[RA_FIND[i].len] == 116; + if (i < RA_FULL_N) { + assert lx_out_is(&out, w, RA_FULL[i]) == true; + } + } + i = i + 1; + } +} +// END GENERATED diff --git a/specs/lab/lab_t27b_report.t27 b/specs/lab/lab_t27b_report.t27 new file mode 100644 index 0000000000..f37157e4d9 --- /dev/null +++ b/specs/lab/lab_t27b_report.t27 @@ -0,0 +1,2073 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/lab/lab_t27b_report.t27 -- how the t27b lab reads what `t27c test-report` and `cargo test` print, and how it sums +; a run (issue #11042, epic #11040: the lab's decisions in .t27, pure functions that any host or job node can run). +; -- +; The oracle is contrib/railway/t27b-lab/lab.py until the cutover. It is imported unedited, and every table at the end of +; this file was computed by running its own functions (python3), on small texts written for the table: the real shapes +; of `t27c test-report` (a pass; a fail with a vacuous pass; a spec that does not compile; a machine with no zig), then +; cases that break each rule on its edge. No case has a host, a token or a path outside specs/. +; -- +; PORTED, lab.py name -> here (a verdict is steward.t27's code: pass 0, blocked 2, fail 5, timeout 8, lab_error 11): +; parse_test_report lr_report_verdict, lr_report_detail +; parse_test_verdicts lr_verdicts (a table of three words a test), lr_table_text +; disagreements lr_disagreements (names in Python's order, one line each) +; parse_cargo_test lr_cargo_totals +; reference_one, once the process has ended lr_ref_verdict, lr_ref_detail, lr_over_detail, lr_spawn_detail, lr_keeps_tests +; lab_run's summary block lr_summary_field, lr_put_summary, lr_put_reference_summary, lr_summary_crash +; LEFT OUT, and why: starting t27c with a timeout and a scratch directory, the worker pool and the cache file (they run +; processes and touch the disk: the runtime, #11040 L3); the cache rules are in lab_t27b_cache.t27. +; -- +; WHAT THE TEXT RULES ARE. Lines are str.splitlines (ten breaks), blank and stripped lines use str.isspace (thirty +; spaces) and `[:300]` counts characters: all three come from specs/lab/text.t27 (LabText), read there off Python 3.14. +; The regex `\s*(tests|FAIL)\s+(\d+)\s*$` of parse_test_report is lr_count_from, once per key. The last `tests N` and the +; last `FAIL N` win, as in lab.py's dict; the first line whose stripped text starts with BLOCKED wins over every count. +; -- +; WHERE THE SPEC DIFFERS FROM THE PYTHON, each pinned by a test below: +; - a count above 18446744073709551615 reads as that number (Python's int has no ceiling); only a detail that prints +; such a count differs, and a verdict never does +; - \d and \w are the ASCII classes, so a Unicode digit or letter is not one (cargo's words and t27c's counts are ASCII) +; - a table wider than the caller's buffer is no table (Python has no limit); lr_verdicts says so with LR_NONE +; WHAT THE PORT FOUND IN lab.py, reproduced and not repaired (the spec states what the Python does): +; - lab_run reads r["reference"] of every merged result before it builds the summary, so a run in which the reference +; step produced nothing for some file raises KeyError and is never published: lr_summary_crash is that condition +; - run() keeps at most the last 2001 to 4000 lines of a command's output (it drops the oldest 2000 whenever the list +; passes 4000), so parse_cargo_test sums a long cargo run from its tail +; ASCII only (L3). phi^2 + 1/phi^2 = 3 | TRINITY + +module LabT27bReport; + +use lab::text::{LAB_NO, lab_line_end, lab_line_next, lab_strip_from, lab_strip_to, lab_lit_at, lab_has_lit, lab_same_span, lab_span_cmp, lab_cut_chars, lab_put_span, lab_put_lit, lab_put_count}; +use lab::lab_t27b_text::{LX_BIG, lx_is_word, lx_digits_end, lx_dec_value, lx_add_sat, lx_uline_end, lx_ubreak_len, lx_put_idec, lx_out_is}; +use tri::t27b::ledger_steward::T_PASS; +use tri::t27b::ledger_steward::T_PASS_VACUOUS; +use tri::t27b::ledger_steward::T_BLOCKED; +use tri::t27b::ledger_steward::T_FRONTEND; +use tri::t27b::ledger_steward::T_CODEGEN; +use tri::t27b::ledger_steward::T_FAIL; +use tri::t27b::ledger_steward::T_MISMATCH; +use tri::t27b::ledger_steward::T_CRASH; +use tri::t27b::ledger_steward::T_TIMEOUT; +use tri::t27b::ledger_steward::T_NOT_RUN; +use tri::t27b::ledger_steward::T_MISSING; + +/// "No such table", and the null of a summary field: the answers that are not a count. +pub const LR_NONE : u32 = 4294967295; +pub const LR_NULL : u64 = 18446744073709551615; + +/// steward.t27's verdict code 11: the lab could not run the reference (no verdict either way). +pub const T_LAB_ERROR : u8 = 11; +/// A word that is none of the twelve verdict words. +pub const LR_UNKNOWN : u8 = 255; + +/// A detail is cut at this many characters: lab.py's [:300]. +pub const LR_DETAIL_MAX : usize = 300; + +pub const LR_WORDS : [12]string = ["pass", "pass_vacuous", "blocked", "frontend", "codegen", "fail", "mismatch", "crash", "timeout", "not run", "missing", "lab_error"]; + +/// The verdict word of a code; "" for a code out of range. +pub fn lr_word(code : u8) -> string { + if (code >= 12) { return ""; } + return LR_WORDS[code as usize]; +} + +/// The code of the verdict word t[a..b] (steward.t27's numbering); LR_UNKNOWN for any other text. +pub fn lr_word_code(t : string, a : usize, b : usize) -> u8 { + var k : usize = 0; + while (k < 12) { + if (lab_same_span(t, a, b, LR_WORDS[k], 0, LR_WORDS[k].len)) { return k as u8; } + k = k + 1; + } + return LR_UNKNOWN; +} + +/// A line that is `\s*key\s+DIGITS\s*$`: where the digits start; e + 1 when the line is not that. +/// t[at..e] is the line. +pub fn lr_count_from(t : string, at : usize, e : usize, key : string) -> usize { + const a : usize = lab_strip_from(t, at, e); + if (lab_lit_at(t, a, e, key) == false) { return e + 1; } + const j : usize = a + key.len; + const k : usize = lab_strip_from(t, j, e); + if (k == j) { return e + 1; } + const d : usize = lx_digits_end(t, k, e); + if (d == k) { return e + 1; } + if (lab_strip_from(t, d, e) != e) { return e + 1; } + return k; +} + +/// Reads a report as parse_test_report does. st[0] and st[1] are the span of the BLOCKED detail of the +/// first line whose stripped text starts with BLOCKED (st[0] is LX_BIG when no line does); st[2] says a +/// `tests N` line was read and st[3] is the last N; st[4] and st[5] are the same for `FAIL N`. +pub fn lr_scan(t : string, st : []u64) -> void { + st[0] = LX_BIG; + st[1] = 0; + st[2] = 0; + st[3] = 0; + st[4] = 0; + st[5] = 0; + var at : usize = 0; + while (at < t.len) { + const e : usize = lab_line_end(t, at); + const a : usize = lab_strip_from(t, at, e); + const b : usize = lab_strip_to(t, a, e); + if (lab_lit_at(t, a, b, "BLOCKED") and st[0] == LX_BIG) { + const f : usize = lab_strip_from(t, a + 7, b); + st[0] = f as u64; + st[1] = lab_cut_chars(t, f, b, LR_DETAIL_MAX) as u64; + } + const ft : usize = lr_count_from(t, at, e, "tests"); + if (ft <= e) { + st[2] = 1; + st[3] = lx_dec_value(t, ft, lx_digits_end(t, ft, e)); + } + const ff : usize = lr_count_from(t, at, e, "FAIL"); + if (ff <= e) { + st[4] = 1; + st[5] = lx_dec_value(t, ff, lx_digits_end(t, ff, e)); + } + at = lab_line_next(t, e); + } +} + +/// parse_test_report's verdict, as a steward.t27 code: T_PASS when it compiled and every test it ran +/// passed (`tests` and `FAIL 0` both read), T_FAIL when `FAIL` is not 0, T_BLOCKED when a line says +/// BLOCKED or the numbers cannot be read. +pub fn lr_report_verdict(t : string) -> u8 { + var st : [6]u64 = undefined; + lr_scan(t, &st); + if (st[0] != LX_BIG) { return T_BLOCKED; } + if (st[2] == 1 and st[4] == 1 and st[5] == 0) { return T_PASS; } + if (st[2] == 1 and st[4] == 1) { return T_FAIL; } + return T_BLOCKED; +} + +/// parse_test_report's second value, written at w: the BLOCKED line's rest, `F of T tests fail`, the +/// unreadable words, or nothing for a pass. +pub fn lr_report_detail(t : string, out : []u8, cap : usize, w : usize) -> usize { + var st : [6]u64 = undefined; + lr_scan(t, &st); + if (st[0] != LX_BIG) { return lab_put_span(out, cap, w, t, st[0] as usize, st[1] as usize); } + if (st[2] == 1 and st[4] == 1 and st[5] == 0) { return w; } + if (st[2] == 1 and st[4] == 1) { + var x : usize = lab_put_count(out, cap, w, st[5]); + x = lab_put_lit(out, cap, x, " of "); + x = lab_put_count(out, cap, x, st[3]); + return lab_put_lit(out, cap, x, " tests fail"); + } + return lab_put_lit(out, cap, w, "unreadable test-report output"); +} + +// ---- parse_test_verdicts: the per-test table ---- +; A table is a caller's []u32 of three words per test: where the name starts and ends in the report text, +; and 1 when the test passed. Names are unique, in the order they first appear; a name that comes again +; keeps its place and takes the new verdict (a dict's order and last write). cap is the number of tests +; the buffer holds. + +/// parse_test_verdicts: the number of tests of the verbose report t, or LR_NONE when the list could be +/// partial: no `--- test report:` line, a line after it that is neither `pass name` nor `FAIL name` +/// before the blank one, no `tests N` line, a count that is not the number of names, or a table wider +/// than cap. +pub fn lr_verdicts(t : string, tab : []u32, cap : usize) -> u32 { + var at : usize = 0; + var found : bool = false; + while (at < t.len and found == false) { + const e : usize = lab_line_end(t, at); + if (lab_lit_at(t, at, e, "--- test report:")) { found = true; } + at = lab_line_next(t, e); + } + if (found == false) { return LR_NONE; } + var n : usize = 0; + var done : bool = false; + while (at < t.len and done == false) { + const e : usize = lab_line_end(t, at); + const a : usize = lab_strip_from(t, at, e); + if (a == e) { + done = true; + } else { + var ok : u32 = 0; + if (lab_lit_at(t, a, e, "pass ")) { + ok = 1; + } else { + if (lab_lit_at(t, a, e, "FAIL ") == false) { return LR_NONE; } + } + var j : usize = 0; + var at_j : usize = n; + while (j < n) { + if (lab_same_span(t, tab[3 * j] as usize, tab[3 * j + 1] as usize, t, a + 6, e)) { at_j = j; } + j = j + 1; + } + if (at_j == n) { + if (n >= cap) { return LR_NONE; } + tab[3 * n] = (a + 6) as u32; + tab[3 * n + 1] = e as u32; + n = n + 1; + } + tab[3 * at_j + 2] = ok; + at = lab_line_next(t, e); + } + } + var total : u64 = LX_BIG; + var has_total : bool = false; + var s : usize = 0; + while (s < t.len and has_total == false) { + const e : usize = lab_line_end(t, s); + const f : usize = lr_count_from(t, s, e, "tests"); + if (f <= e) { + has_total = true; + total = lx_dec_value(t, f, lx_digits_end(t, f, e)); + } + s = lab_line_next(t, e); + } + if (has_total == false) { return LR_NONE; } + if (total != (n as u64)) { return LR_NONE; } + return n as u32; +} + +// ---- disagreements: where two tables differ ---- + +/// Compares name i of table a (side 1) or b (side 2) with name j of table a or b: -1, 0 or 1. +pub fn lr_name_cmp(a : string, at : []const u32, b : string, bt : []const u32, s1 : u8, i : usize, s2 : u8, j : usize) -> i32 { + var t1 : string = a; + var f1 : u32 = at[3 * i]; + var e1 : u32 = at[3 * i + 1]; + if (s1 == 2) { + t1 = b; + f1 = bt[3 * i]; + e1 = bt[3 * i + 1]; + } + var t2 : string = a; + var f2 : u32 = at[3 * j]; + var e2 : u32 = at[3 * j + 1]; + if (s2 == 2) { + t2 = b; + f2 = bt[3 * j]; + e2 = bt[3 * j + 1]; + } + return lab_span_cmp(t1, f1 as usize, e1 as usize, t2, f2 as usize, e2 as usize); +} + +/// The index in table b (or a) of the test named like name i of the other table; LAB_NO when it has none. +pub fn lr_name_in(a : string, at : []const u32, an : usize, b : string, bt : []const u32, bn : usize, from_a : bool, i : usize) -> usize { + var j : usize = 0; + if (from_a) { + while (j < bn) { + if (lab_same_span(a, at[3 * i] as usize, at[3 * i + 1] as usize, b, bt[3 * j] as usize, bt[3 * j + 1] as usize)) { return j; } + j = j + 1; + } + return LAB_NO; + } + while (j < an) { + if (lab_same_span(b, bt[3 * i] as usize, bt[3 * i + 1] as usize, a, at[3 * j] as usize, at[3 * j + 1] as usize)) { return j; } + j = j + 1; + } + return LAB_NO; +} + +/// The word of a test's verdict in a message: pass, or FAIL. +pub fn lr_ok_word(ok : u32) -> string { + if (ok == 1) { return "pass"; } + return "FAIL"; +} + +/// disagreements(t27b, reference): one line per test whose verdict differs, or that only one side ran, +/// in name order, each ended by a newline. a is the t27b table (text a, an tests), b the reference's. +pub fn lr_disagreements(a : string, at : []const u32, an : usize, b : string, bt : []const u32, bn : usize, out : []u8, cap : usize) -> usize { + var w : usize = 0; + var have : bool = false; + var ls : u8 = 0; + var li : usize = 0; + var step : usize = 0; + var finished : bool = false; + while (step < an + bn and finished == false) { + var bs : u8 = 0; + var bi : usize = 0; + var i : usize = 0; + while (i < an) { + var later : bool = true; + if (have) { later = lr_name_cmp(a, at, b, bt, 1, i, ls, li) > 0; } + if (later) { + if (bs == 0 or lr_name_cmp(a, at, b, bt, 1, i, bs, bi) < 0) { + bs = 1; + bi = i; + } + } + i = i + 1; + } + var j : usize = 0; + while (j < bn) { + var later : bool = true; + if (have) { later = lr_name_cmp(a, at, b, bt, 2, j, ls, li) > 0; } + if (later) { + if (bs == 0 or lr_name_cmp(a, at, b, bt, 2, j, bs, bi) < 0) { + bs = 2; + bi = j; + } + } + j = j + 1; + } + if (bs == 0) { + finished = true; + } else { + var ia : usize = LAB_NO; + var jb : usize = LAB_NO; + var nf : usize = 0; + var nt : usize = 0; + if (bs == 1) { + ia = bi; + jb = lr_name_in(a, at, an, b, bt, bn, true, bi); + nf = at[3 * bi] as usize; + nt = at[3 * bi + 1] as usize; + } else { + jb = bi; + ia = lr_name_in(a, at, an, b, bt, bn, false, bi); + nf = bt[3 * bi] as usize; + nt = bt[3 * bi + 1] as usize; + } + var src : string = a; + if (bs == 2) { src = b; } + if (ia != LAB_NO and jb != LAB_NO) { + if (at[3 * ia + 2] != bt[3 * jb + 2]) { + w = lab_put_span(out, cap, w, src, nf, nt); + w = lab_put_lit(out, cap, w, ": t27b "); + w = lab_put_lit(out, cap, w, lr_ok_word(at[3 * ia + 2])); + w = lab_put_lit(out, cap, w, ", reference "); + w = lab_put_lit(out, cap, w, lr_ok_word(bt[3 * jb + 2])); + w = lab_put_lit(out, cap, w, "\n"); + } + } else { + if (ia != LAB_NO) { + w = lab_put_span(out, cap, w, src, nf, nt); + w = lab_put_lit(out, cap, w, ": t27b "); + w = lab_put_lit(out, cap, w, lr_ok_word(at[3 * ia + 2])); + w = lab_put_lit(out, cap, w, ", reference has no such test\n"); + } else { + w = lab_put_span(out, cap, w, src, nf, nt); + w = lab_put_lit(out, cap, w, ": t27b has no such test, reference "); + w = lab_put_lit(out, cap, w, lr_ok_word(bt[3 * jb + 2])); + w = lab_put_lit(out, cap, w, "\n"); + } + } + have = true; + ls = bs; + li = bi; + } + step = step + 1; + } + return w; +} + +// ---- parse_cargo_test: the totals of a cargo test run ---- + +/// Does a `test result: WORD. P passed; F failed; I ignored` begin at t[p]? Where the ignored count ends, +/// or LAB_NO. The numbers start at the offsets written into num[0..6): P from and to, F, I. +pub fn lr_cargo_at(t : string, p : usize, e : usize, num : []usize) -> usize { + if (lab_lit_at(t, p, e, "test result: ") == false) { return LAB_NO; } + var q : usize = p + 13; + while (q < e and lx_is_word(t[q])) { + q = q + 1; + } + if (q == p + 13) { return LAB_NO; } + if (lab_lit_at(t, q, e, ". ") == false) { return LAB_NO; } + q = q + 2; + var k : usize = 0; + while (k < 3) { + const d : usize = lx_digits_end(t, q, e); + if (d == q) { return LAB_NO; } + num[2 * k] = q; + num[2 * k + 1] = d; + q = d; + if (k == 0) { + if (lab_lit_at(t, q, e, " passed; ") == false) { return LAB_NO; } + q = q + 9; + } + if (k == 1) { + if (lab_lit_at(t, q, e, " failed; ") == false) { return LAB_NO; } + q = q + 9; + } + if (k == 2) { + if (lab_lit_at(t, q, e, " ignored") == false) { return LAB_NO; } + q = q + 8; + } + k = k + 1; + } + return q; +} + +/// parse_cargo_test over the output t (lines as a text-mode read gives them): tot[0] passed, tot[1] failed, +/// tot[2] ignored, tot[3] suites, summed over every line that holds a result line anywhere in it. +pub fn lr_cargo_totals(t : string, tot : []u64) -> void { + tot[0] = 0; + tot[1] = 0; + tot[2] = 0; + tot[3] = 0; + var num : [6]usize = undefined; + var at : usize = 0; + while (at < t.len) { + const e : usize = lx_uline_end(t, at); + var p : usize = at; + var hit : bool = false; + while (p < e and hit == false) { + if (lr_cargo_at(t, p, e, &num) != LAB_NO) { hit = true; } + p = p + 1; + } + if (hit) { + tot[3] = lx_add_sat(tot[3], 1); + tot[0] = lx_add_sat(tot[0], lx_dec_value(t, num[0], num[1])); + tot[1] = lx_add_sat(tot[1], lx_dec_value(t, num[2], num[3])); + tot[2] = lx_add_sat(tot[2], lx_dec_value(t, num[4], num[5])); + } + at = e + lx_ubreak_len(t, e); + } +} + +// ---- reference_one: the verdict of one run of `t27c test-report --verbose` ---- + +/// Did the run say it ran out of threads or processes: that is the lab's limit, not the spec's. +pub fn lr_ref_resource(stderr : string) -> bool { + if (lab_has_lit(stderr, 0, stderr.len, "Resource temporarily unavailable")) { return true; } + return lab_has_lit(stderr, 0, stderr.len, "SystemResources"); +} + +/// reference_one after the process ended with exit code rc: T_LAB_ERROR when stderr names a resource +/// limit, T_BLOCKED when rc is not 0 (a negative rc is a signal), else what the report says. +pub fn lr_ref_verdict(rc : i32, stderr : string, stdout : string) -> u8 { + if (lr_ref_resource(stderr)) { return T_LAB_ERROR; } + if (rc != 0) { return T_BLOCKED; } + return lr_report_verdict(stdout); +} + +/// reference_one's detail, written at w: the resource sentence, `t27c test-report exited RC: ` and the first +/// line of the stripped stderr, all cut at 300 characters, or the report's own detail. +pub fn lr_ref_detail(rc : i32, stderr : string, stdout : string, out : []u8, cap : usize, w : usize) -> usize { + if (lr_ref_resource(stderr)) { return lab_put_lit(out, cap, w, "zig ran out of threads/processes in the container"); } + if (rc == 0) { return lr_report_detail(stdout, out, cap, w); } + var x : usize = lab_put_lit(out, cap, w, "t27c test-report exited "); + x = lx_put_idec(out, cap, x, rc as i64); + x = lab_put_lit(out, cap, x, ": "); + const s0 : usize = lab_strip_from(stderr, 0, stderr.len); + const s1 : usize = lab_strip_to(stderr, s0, stderr.len); + var fe : usize = lab_line_end(stderr, s0); + if (fe > s1) { fe = s1; } + var room : usize = 0; + if (x - w < LR_DETAIL_MAX) { room = LR_DETAIL_MAX - (x - w); } + return lab_put_span(out, cap, x, stderr, s0, lab_cut_chars(stderr, s0, fe, room)); +} + +/// The detail of a reference run that outran its time: `over N s`. +pub fn lr_over_detail(secs : u64, out : []u8, cap : usize, w : usize) -> usize { + var x : usize = lab_put_lit(out, cap, w, "over "); + x = lab_put_count(out, cap, x, secs); + return lab_put_lit(out, cap, x, " s"); +} + +/// The detail of a reference run that could not start: `could not start t27c: ` and the error, cut at 300. +pub fn lr_spawn_detail(err : string, out : []u8, cap : usize, w : usize) -> usize { + const x : usize = lab_put_lit(out, cap, w, "could not start t27c: "); + return lab_put_span(out, cap, x, err, 0, lab_cut_chars(err, 0, err.len, LR_DETAIL_MAX - (x - w))); +} + +/// Are the per-test verdicts kept for a reference result: only a pass or a fail, and only when the table was read. +pub fn lr_keeps_tests(verdict : u8, table_read : bool) -> bool { + if (table_read == false) { return false; } + return verdict == T_PASS or verdict == T_FAIL; +} + +// ---- the summary of a run ---- +; One row per result of the corpus, five words: the t27b verdict code, the reference verdict code (LR_NONE +; when the lab has none for the file), 1 when the result carries `reference_disagree` (the per-test +; comparison was made), how many tests it lists, and 1 when the result was retried after a timeout. +; ref_nonempty says the lab's reference dict is not empty. + +pub const LR_SUMMARY_KEYS : [17]string = ["files", "reference_pass", "reference_lab_error", "t27b_pass", "t27b_pass_vacuous", "t27b_pass_where_reference_passes", "t27b_pass_vacuous_where_reference_passes", "t27b_pass_where_reference_does_not", "mismatch", "jit_interp_mismatch", "reference_compared", "reference_disagree", "reference_disagree_tests", "t27b_fail", "crash", "timeout", "timeout_retried"]; + +/// lab.py reads r["reference"] of every merged result before it builds the summary: a result with no +/// reference verdict raises KeyError there and the run is never published. True when that happens. +pub fn lr_summary_crash(rows : []const u32, n : usize) -> bool { + var i : usize = 0; + while (i < n) { + if (rows[5 * i + 1] == LR_NONE) { return true; } + i = i + 1; + } + return false; +} + +/// Field k of the summary (LR_SUMMARY_KEYS), LR_NULL where lab.py writes null. +pub fn lr_summary_field(rows : []const u32, n : usize, ref_nonempty : bool, k : usize) -> u64 { + var ref_pass : u64 = 0; + var lab_err : u64 = 0; + var t_pass : u64 = 0; + var t_vac : u64 = 0; + var t_pass_rp : u64 = 0; + var t_vac_rp : u64 = 0; + var t_pass_rn : u64 = 0; + var mism : u64 = 0; + var compared : u64 = 0; + var dis : u64 = 0; + var dis_t : u64 = 0; + var t_fail : u64 = 0; + var crash : u64 = 0; + var tmo : u64 = 0; + var retried : u64 = 0; + var i : usize = 0; + while (i < n) { + const t : u32 = rows[5 * i]; + const r : u32 = rows[5 * i + 1]; + if (r == T_PASS as u32) { + ref_pass = ref_pass + 1; + if (t == T_PASS as u32) { t_pass_rp = t_pass_rp + 1; } + if (t == T_PASS_VACUOUS as u32) { t_vac_rp = t_vac_rp + 1; } + } + if (r == T_LAB_ERROR as u32) { lab_err = lab_err + 1; } + if (t == T_PASS as u32) { + t_pass = t_pass + 1; + if (r != T_PASS as u32) { t_pass_rn = t_pass_rn + 1; } + } + if (t == T_PASS_VACUOUS as u32) { t_vac = t_vac + 1; } + if (t == T_MISMATCH as u32) { mism = mism + 1; } + if (t == T_FAIL as u32) { t_fail = t_fail + 1; } + if (t == T_CRASH as u32) { crash = crash + 1; } + if (t == T_TIMEOUT as u32) { tmo = tmo + 1; } + if (rows[5 * i + 2] == 1) { + compared = compared + 1; + if (rows[5 * i + 3] > 0) { dis = dis + 1; } + dis_t = dis_t + (rows[5 * i + 3] as u64); + } + if (rows[5 * i + 4] == 1) { retried = retried + 1; } + i = i + 1; + } + if (k == 0) { return n as u64; } + if (k == 1) { if (ref_nonempty) { return ref_pass; } return LR_NULL; } + if (k == 2) { if (ref_nonempty) { return lab_err; } return LR_NULL; } + if (k == 3) { return t_pass; } + if (k == 4) { return t_vac; } + if (k == 5) { if (ref_nonempty) { return t_pass_rp; } return LR_NULL; } + if (k == 6) { if (ref_nonempty) { return t_vac_rp; } return LR_NULL; } + if (k == 7) { if (ref_nonempty) { return t_pass_rn; } return LR_NULL; } + if (k == 8 or k == 9) { return mism; } + if (k == 10) { return compared; } + if (k == 11) { if (compared > 0) { return dis; } return LR_NULL; } + if (k == 12) { if (compared > 0) { return dis_t; } return LR_NULL; } + if (k == 13) { return t_fail; } + if (k == 14) { return crash; } + if (k == 15) { return tmo; } + if (k == 16) { return retried; } + return LR_NULL; +} + +/// The summary block as the run document holds it (json.dumps(doc, indent=1), a key that is followed by +/// another): ` "summary": {`, one ` "key": value` line per field, ` },`. +pub fn lr_put_summary(rows : []const u32, n : usize, ref_nonempty : bool, out : []u8, cap : usize, w : usize) -> usize { + var x : usize = lab_put_lit(out, cap, w, " \"summary\": {\n"); + var k : usize = 0; + while (k < 17) { + x = lab_put_lit(out, cap, x, " \""); + x = lab_put_lit(out, cap, x, LR_SUMMARY_KEYS[k]); + x = lab_put_lit(out, cap, x, "\": "); + const v : u64 = lr_summary_field(rows, n, ref_nonempty, k); + if (v == LR_NULL) { + x = lab_put_lit(out, cap, x, "null"); + } else { + x = lab_put_count(out, cap, x, v); + } + if (k < 16) { x = lab_put_lit(out, cap, x, ","); } + x = lab_put_lit(out, cap, x, "\n"); + k = k + 1; + } + return lab_put_lit(out, cap, x, " },\n"); +} + +/// The summary of a run where only the reference ran (t27b produced no result): files, reference_pass and a null t27b_pass. +pub fn lr_put_reference_summary(files : u64, ref_pass : u64, out : []u8, cap : usize, w : usize) -> usize { + var x : usize = lab_put_lit(out, cap, w, " \"summary\": {\n \"files\": "); + x = lab_put_count(out, cap, x, files); + x = lab_put_lit(out, cap, x, ",\n \"reference_pass\": "); + x = lab_put_count(out, cap, x, ref_pass); + return lab_put_lit(out, cap, x, ",\n \"t27b_pass\": null\n },\n"); +} + +/// A table as text, one `name TAB P|F` line per test, in table order: what a test compares a read table with. +pub fn lr_table_text(t : string, tab : []const u32, n : usize, out : []u8, cap : usize, w : usize) -> usize { + var x : usize = w; + var i : usize = 0; + while (i < n) { + x = lab_put_span(out, cap, x, t, tab[3 * i] as usize, tab[3 * i + 1] as usize); + x = lab_put_lit(out, cap, x, "\t"); + if (tab[3 * i + 2] == 1) { + x = lab_put_lit(out, cap, x, "P\n"); + } else { + x = lab_put_lit(out, cap, x, "F\n"); + } + i = i + 1; + } + return x; +} + +/// A buffer for the details and tables a test writes. +pub const LR_OUT : usize = 4096; +/// The widest table a test reads. +pub const LR_TABLE : usize = 64; + +// ---- tests ---- + +test the_verdict_words_and_their_codes_are_stewards { + var k : usize = 0; + while (k < 12) { + assert lr_word_code(LR_WORDS[k], 0, LR_WORDS[k].len) == (k as u8); + assert lr_word(k as u8) == LR_WORDS[k]; + k = k + 1; + } + assert lr_word_code("pass", 0, 4) == T_PASS; + assert lr_word_code("pass_vacuous", 0, 12) == T_PASS_VACUOUS; + assert lr_word_code("blocked", 0, 7) == T_BLOCKED; + assert lr_word_code("frontend", 0, 8) == T_FRONTEND; + assert lr_word_code("codegen", 0, 7) == T_CODEGEN; + assert lr_word_code("fail", 0, 4) == T_FAIL; + assert lr_word_code("mismatch", 0, 8) == T_MISMATCH; + assert lr_word_code("crash", 0, 5) == T_CRASH; + assert lr_word_code("timeout", 0, 7) == T_TIMEOUT; + assert lr_word_code("not run", 0, 7) == T_NOT_RUN; + assert lr_word_code("missing", 0, 7) == T_MISSING; + assert lr_word_code("lab_error", 0, 9) == T_LAB_ERROR; +} + +test a_word_that_is_none_of_the_twelve_is_unknown_and_never_a_guess { + assert lr_word_code("Pass", 0, 4) == LR_UNKNOWN; + assert lr_word_code("pass ", 0, 5) == LR_UNKNOWN; + assert lr_word_code("", 0, 0) == LR_UNKNOWN; + assert lr_word_code("not_run", 0, 7) == LR_UNKNOWN; + assert lr_word_code("lab-error", 0, 9) == LR_UNKNOWN; + assert lr_word_code("pas", 0, 3) == LR_UNKNOWN; + assert lr_word_code("xpassx", 1, 5) == T_PASS; + assert lr_word_code("xpassx", 0, 6) == LR_UNKNOWN; + assert lr_word(12) == ""; + assert lr_word(255) == ""; +} + +test the_scan_of_a_real_report_reads_its_two_counts_and_no_blocked_line { + const t : string = "--- test report: specs/lab/example.t27 ---\n pass adds_small\n FAIL adds_wrong\n pass adds_vacuous\n\n tests 3\n pass 2\n FAIL 1\n rate 66.7%\n"; + var st : [6]u64 = undefined; + lr_scan(t, &st); + assert st[0] == LX_BIG; + assert st[2] == 1; + assert st[3] == 3; + assert st[4] == 1; + assert st[5] == 1; +} + +test a_count_line_is_the_whole_line_and_nothing_else { + assert lr_count_from("tests 12", 0, 8, "tests") == 6; + assert lr_count_from(" tests 12 ", 0, 15, "tests") == 11; + assert lr_count_from("tests 12x", 0, 9, "tests") == 10; + assert lr_count_from("tests12", 0, 7, "tests") == 8; + assert lr_count_from("tests", 0, 5, "tests") == 6; + assert lr_count_from("tests ", 0, 6, "tests") == 7; + assert lr_count_from("xtests 1", 0, 8, "tests") == 9; + assert lr_count_from("tests 1 2", 0, 9, "tests") == 10; + assert lr_count_from("FAIL 0", 0, 6, "FAIL") == 5; + assert lr_count_from("FAIL 0", 0, 6, "tests") == 7; + assert lr_count_from("ab tests 4", 3, 10, "tests") == 9; +} + +test the_detail_of_a_blocked_report_is_the_rest_of_its_line_stripped { + var out : [4096]u8 = undefined; + const t : string = " BLOCKED does not compile: spec.zig:20:16: error: x \n"; + const w : usize = lr_report_detail(t, &out, 4096, 0); + assert lx_out_is(&out, w, "does not compile: spec.zig:20:16: error: x") == true; + assert lr_report_verdict(t) == T_BLOCKED; +} + +test a_detail_that_does_not_fit_the_buffer_still_advances_the_cursor { + var out : [8]u8 = undefined; + var k : usize = 0; + while (k < 8) { + out[k] = 0; + k = k + 1; + } + const t : string = " tests 9\n FAIL 4\n"; + assert lr_report_detail(t, &out, 4, 0) == 17; + assert out[3] == 102; + assert out[4] == 0; + assert lr_report_detail("BLOCKED abcdef", &out, 3, 0) == 6; + assert out[3] == 102; + assert lr_report_detail("", &out, 8, 5) == 34; +} + +test the_table_of_a_real_verbose_report_is_in_the_reports_order { + const t : string = "--- test report: specs/lab/example.t27 ---\n pass adds_small\n FAIL adds_wrong\n pass adds_vacuous\n\n tests 3\n pass 2\n FAIL 1\n"; + var tab : [192]u32 = undefined; + var out : [4096]u8 = undefined; + const n : u32 = lr_verdicts(t, &tab, LR_TABLE); + assert n == 3; + const w : usize = lr_table_text(t, &tab, 3, &out, 4096, 0); + assert lx_out_is(&out, w, "adds_small\tP\nadds_wrong\tF\nadds_vacuous\tP\n") == true; +} + +test a_table_wider_than_the_buffer_is_no_table_and_one_that_fits_exactly_is { + const t : string = "--- test report: x ---\n pass a\n FAIL b\n pass c\n\n tests 3\n"; + var tab : [9]u32 = undefined; + assert lr_verdicts(t, &tab, 3) == 3; + assert lr_verdicts(t, &tab, 2) == LR_NONE; + assert lr_verdicts(t, &tab, 0) == LR_NONE; + const d : string = "--- test report: x ---\n pass a\n FAIL a\n pass a\n\n tests 1\n"; + assert lr_verdicts(d, &tab, 1) == 1; +} + +test a_repeated_name_keeps_its_place_and_takes_its_last_verdict { + const t : string = "--- test report: x ---\n pass a\n pass b\n FAIL a\n pass c\n FAIL b\n\n tests 3\n"; + var tab : [192]u32 = undefined; + var out : [4096]u8 = undefined; + assert lr_verdicts(t, &tab, LR_TABLE) == 3; + const w : usize = lr_table_text(t, &tab, 3, &out, 4096, 0); + assert lx_out_is(&out, w, "a\tF\nb\tF\nc\tP\n") == true; +} + +test two_tables_that_agree_disagree_nowhere { + const t : string = "--- test report: x ---\n pass a\n FAIL b\n\n tests 2\n"; + var ta : [192]u32 = undefined; + var tb : [192]u32 = undefined; + var out : [4096]u8 = undefined; + assert lr_verdicts(t, &ta, LR_TABLE) == 2; + assert lr_verdicts(t, &tb, LR_TABLE) == 2; + assert lr_disagreements(t, &ta, 2, t, &tb, 2, &out, 4096) == 0; + assert lr_disagreements(t, &ta, 0, t, &tb, 0, &out, 4096) == 0; +} + +test a_missing_test_on_either_side_is_named_with_its_name_order { + const a : string = "--- test report: x ---\n pass b\n FAIL c\n\n tests 2\n"; + const b : string = "--- test report: x ---\n pass a\n pass b\n\n tests 2\n"; + var ta : [192]u32 = undefined; + var tb : [192]u32 = undefined; + var out : [4096]u8 = undefined; + assert lr_verdicts(a, &ta, LR_TABLE) == 2; + assert lr_verdicts(b, &tb, LR_TABLE) == 2; + const w : usize = lr_disagreements(a, &ta, 2, b, &tb, 2, &out, 4096); + assert lx_out_is(&out, w, "a: t27b has no such test, reference pass\nc: t27b FAIL, reference has no such test\n") == true; +} + +test a_differing_verdict_is_named_with_both_words { + const a : string = "--- test report: x ---\n pass t\n\n tests 1\n"; + const b : string = "--- test report: x ---\n FAIL t\n\n tests 1\n"; + var ta : [192]u32 = undefined; + var tb : [192]u32 = undefined; + var out : [4096]u8 = undefined; + assert lr_verdicts(a, &ta, LR_TABLE) == 1; + assert lr_verdicts(b, &tb, LR_TABLE) == 1; + var w : usize = lr_disagreements(a, &ta, 1, b, &tb, 1, &out, 4096); + assert lx_out_is(&out, w, "t: t27b pass, reference FAIL\n") == true; + w = lr_disagreements(b, &tb, 1, a, &ta, 1, &out, 4096); + assert lx_out_is(&out, w, "t: t27b FAIL, reference pass\n") == true; +} + +test the_names_sort_as_python_sorts_them_by_code_point { + const a : string = "--- test report: x ---\n pass b\n pass a_b\n pass a-b\n pass B\n\n tests 4\n"; + const b : string = "--- test report: x ---\n FAIL b\n FAIL a_b\n FAIL a-b\n FAIL B\n\n tests 4\n"; + var ta : [192]u32 = undefined; + var tb : [192]u32 = undefined; + var out : [4096]u8 = undefined; + assert lr_verdicts(a, &ta, LR_TABLE) == 4; + assert lr_verdicts(b, &tb, LR_TABLE) == 4; + const w : usize = lr_disagreements(a, &ta, 4, b, &tb, 4, &out, 4096); + assert lx_out_is(&out, w, "B: t27b pass, reference FAIL\na-b: t27b pass, reference FAIL\na_b: t27b pass, reference FAIL\nb: t27b pass, reference FAIL\n") == true; +} + +test the_cargo_totals_sum_every_suite_and_count_each_once { + var tot : [4]u64 = undefined; + lr_cargo_totals("running 2 tests\ntest result: ok. 3 passed; 1 failed; 2 ignored; 0 measured\n\ntest result: FAILED. 10 passed; 2 failed; 1 ignored; 0 measured\n", &tot); + assert tot[0] == 13; + assert tot[1] == 3; + assert tot[2] == 3; + assert tot[3] == 2; + lr_cargo_totals("", &tot); + assert tot[0] == 0; + assert tot[3] == 0; +} + +test a_reference_run_that_exits_nonzero_is_blocked_with_its_first_stderr_line { + var out : [4096]u8 = undefined; + const w : usize = lr_ref_detail(101, "\n thread panicked at x\nmore\n", "", &out, 4096, 0); + assert lx_out_is(&out, w, "t27c test-report exited 101: thread panicked at x") == true; + assert lr_ref_verdict(101, "x", "") == T_BLOCKED; + const s : usize = lr_ref_detail(-9, "", "", &out, 4096, 0); + assert lx_out_is(&out, s, "t27c test-report exited -9: ") == true; +} + +test a_resource_limit_in_stderr_is_the_labs_error_never_the_specs { + var out : [4096]u8 = undefined; + assert lr_ref_verdict(0, "SystemResources", " tests 1\n FAIL 0\n") == T_LAB_ERROR; + assert lr_ref_verdict(1, "x Resource temporarily unavailable y", "") == T_LAB_ERROR; + assert lr_ref_verdict(0, "resource temporarily unavailable", " tests 1\n FAIL 0\n") == T_PASS; + const w : usize = lr_ref_detail(0, "SystemResources", "", &out, 4096, 0); + assert lx_out_is(&out, w, "zig ran out of threads/processes in the container") == true; +} + +test a_timeout_and_a_spawn_error_have_their_words { + var out : [4096]u8 = undefined; + assert lx_out_is(&out, lr_over_detail(300, &out, 4096, 0), "over 300 s") == true; + assert lx_out_is(&out, lr_over_detail(0, &out, 4096, 0), "over 0 s") == true; + assert lx_out_is(&out, lr_spawn_detail("[Errno 11] x", &out, 4096, 0), "could not start t27c: [Errno 11] x") == true; + assert lr_keeps_tests(T_PASS, true) == true; + assert lr_keeps_tests(T_FAIL, true) == true; + assert lr_keeps_tests(T_BLOCKED, true) == false; + assert lr_keeps_tests(T_TIMEOUT, true) == false; + assert lr_keeps_tests(T_LAB_ERROR, true) == false; + assert lr_keeps_tests(T_PASS, false) == false; + assert lr_keeps_tests(T_FAIL, false) == false; +} + +test a_count_above_u64_is_read_as_the_largest_u64_and_that_is_the_one_place_the_port_differs { + // Python's int has no ceiling and would print the whole number; the verdict is the same either way. + var out : [4096]u8 = undefined; + const t : string = "tests 5\nFAIL 99999999999999999999999\n"; + assert lr_report_verdict(t) == T_FAIL; + const w : usize = lr_report_detail(t, &out, 4096, 0); + assert lx_out_is(&out, w, "18446744073709551615 of 5 tests fail") == true; + assert lr_report_verdict("tests 99999999999999999999999\nFAIL 0\n") == T_PASS; + assert lr_report_verdict("tests 3\nFAIL 000000000000000000000000000\n") == T_PASS; + var tot : [4]u64 = undefined; + lr_cargo_totals("test result: ok. 99999999999999999999 passed; 1 failed; 0 ignored\ntest result: ok. 1 passed; 0 failed; 0 ignored\n", &tot); + assert tot[0] == LX_BIG; + assert tot[1] == 1; + assert tot[3] == 2; +} + +test the_unicode_digits_and_letters_the_regexes_would_match_are_not_matched_here { + // Python reads an Arabic-Indic digit as a \\d and an accented letter as a \\w: tests 3 passes there (pass) and the + // cargo line counts as a suite. t27c and cargo print neither, so the port reads ASCII only: a refusal, never a guess. + var tot : [4]u64 = undefined; + lr_cargo_totals("test result: ok\xc3\xa9. 1 passed; 0 failed; 0 ignored", &tot); + assert tot[3] == 0; + assert lr_report_verdict("tests \xd9\xa3\nFAIL 0\n") == T_BLOCKED; + assert lr_report_verdict("tests 3\nFAIL \xd9\xa0\n") == T_BLOCKED; +} + +/// Test helper: writes unit `times` times at `at`; the cursor after. +fn lr_test_repeat(out : []u8, at : usize, unit : string, times : usize) -> usize { + var x : usize = at; + var k : usize = 0; + while (k < times) { + x = lab_put_lit(out, 4096, x, unit); + k = k + 1; + } + return x; +} + +test a_detail_is_cut_at_300_characters_never_in_the_middle_of_one { + var b : [4096]u8 = undefined; + var out : [4096]u8 = undefined; + // two-byte characters: 301 of them are cut to 300, 600 bytes, the last byte a continuation byte + var n : usize = lab_put_lit(&b, 4096, 0, "BLOCKED "); + n = lr_test_repeat(&b, n, "\xc3\xa9", 301); + var w : usize = lr_report_detail(b[0..n], &out, 4096, 0); + assert w == 600; + assert out[598] == 195; + assert out[599] == 169; + // three-byte characters + n = lab_put_lit(&b, 4096, 0, "BLOCKED "); + n = lr_test_repeat(&b, n, "\xe3\x81\x82", 301); + w = lr_report_detail(b[0..n], &out, 4096, 0); + assert w == 900; + assert out[897] == 227; + // 299 characters are kept whole, and ascii is counted by the byte + n = lab_put_lit(&b, 4096, 0, "BLOCKED "); + n = lr_test_repeat(&b, n, "\xc3\xa9", 299); + assert lr_report_detail(b[0..n], &out, 4096, 0) == 598; + n = lab_put_lit(&b, 4096, 0, "BLOCKED "); + n = lr_test_repeat(&b, n, "a", 301); + assert lr_report_detail(b[0..n], &out, 4096, 0) == 300; +} + +test the_cut_of_the_reference_and_spawn_details_counts_the_words_before_it { + var b : [4096]u8 = undefined; + var out : [4096]u8 = undefined; + // `t27c test-report exited 1: ` is 27 characters, so 273 of the 400 two-byte characters stay + var n : usize = lr_test_repeat(&b, 0, "\xc3\xa9", 400); + var w : usize = lr_ref_detail(1, b[0..n], "", &out, 4096, 0); + assert w == 27 + 546; + assert out[w - 1] == 169; + // a negative exit code is longer by its sign: `t27c test-report exited -9: ` is 28 characters + w = lr_ref_detail(-9, b[0..n], "", &out, 4096, 0); + assert w == 28 + 544; + // `could not start t27c: ` is 22 characters + n = lr_test_repeat(&b, 0, "\xc3\xa9", 300); + w = lr_spawn_detail(b[0..n], &out, 4096, 0); + assert w == 22 + 556; + assert out[w - 1] == 169; +} + +// BEGIN GENERATED +// The tables below were computed by running contrib/railway/t27b-lab/lab.py's own functions on the +// inputs (python3, lab.py imported unedited; the summary is the block of lab_run run on the same results). +// Every input is a small text written for the table: the real shapes of `t27c test-report` (a pass, a +// fail with a vacuous pass, a spec that does not compile, a machine with no zig), then cases that +// break each rule on its edge. The tests that read them are at the end of the file. + +// T1: parse_test_report -- 99 inputs, the verdict word as steward's code, and the detail +pub const RT_N : usize = 99; +pub const RT_IN : [99]string = [ + "--- test report: specs/lab/pass3.t27 ---\n pass adds_small\n pass adds_zero\n pass adds_big\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n\n runtime asserts executed, per test (#6509; a pass with 0 is vacuous, T730):\n 1 adds_small\n 2 adds_zero\n 1 adds_big\n vacuous passes 0 of 3 (passed with 0 runtime asserts executed)\n", + "--- test report: specs/lab/fail1.t27 ---\n pass adds_small\n FAIL adds_wrong\n pass adds_vacuous\n\n tests 3\n pass 2\n FAIL 1\n rate 66.7%\n\n runtime asserts executed, per test (#6509; a pass with 0 is vacuous, T730):\n 1 adds_small\n - adds_wrong (failed, not counted)\n 0 adds_vacuous VACUOUS\n vacuous passes 1 of 2 (passed with 0 runtime asserts executed)\n", + "--- test report: specs/lab/blocked1.t27 ---\n BLOCKED does not compile: spec.zig:20:16: error: use of undeclared identifier 'undeclared_name'\n\n A blocked spec is not a failing one. It never produced a\n binary, so it has no per-test result to report.\n", + "--- test report: specs/lab/pass3.t27 ---\n BLOCKED zig not on PATH\n\n A blocked spec is not a failing one. It never produced a\n binary, so it has no per-test result to report.\n", + "t27c: BLOCKED: zig not on PATH\n", + "", + "\n", + " \n \n", + "--- test report: x ---\n", + "--- test report: specs/a/b.t27 ---\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n\n tests 2\n pass 1\n FAIL 1\n rate 50.0%\n", + "--- test report: specs/a/b.t27 ---\n FAIL t1\n FAIL t2\n FAIL t3\n\n tests 3\n pass 0\n FAIL 3\n rate 0.0%\n", + "--- test report: specs/a/b.t27 ---\n\n tests 0\n pass 0\n FAIL 0\n rate 0.0%\n", + "--- test report: specs/a/b.t27 ---\n pass only\n\n tests 1\n pass 1\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass adds_small\n pass adds_zero\n pass adds_big\n pass the_walk_finds_each_result_once\n pass a_row_reads_its_own_keys\n pass negative_control_a_test_named_tests_in_the_table\n pass nine_digits_read_and_ten_are_refused\n pass Upper_case_first\n pass a-b\n pass a_b\n pass a.b\n pass ab\n\n tests 12\n pass 12\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n FAIL adds_small\n pass adds_zero\n pass adds_big\n pass the_walk_finds_each_result_once\n FAIL a_row_reads_its_own_keys\n pass negative_control_a_test_named_tests_in_the_table\n pass nine_digits_read_and_ten_are_refused\n pass Upper_case_first\n FAIL a-b\n pass a_b\n pass a.b\n pass ab\n FAIL abc\n pass name with spaces\n pass tests_5\n pass pass_x\n FAIL xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass z\n pass caf\xc3\xa9_name\n pass tail_space \n FAIL dup__dup1\n pass dup__dup2\n\n tests 22\n pass 16\n FAIL 6\n rate 72.7%\n", + " tests 3\n", + " FAIL 0\n", + " tests 3\n FAIL 0\n", + " FAIL 0\n tests 3\n", + " tests 3\n FAIL 2\n", + " FAIL 2\n tests 3\n", + " tests 3\n FAIL 0\n tests 5\n", + " tests 3\n tests 5\n FAIL 0\n", + " tests 3\n FAIL 0\n FAIL 2\n", + " tests 3\n FAIL 2\n FAIL 0\n", + " tests 0\n FAIL 0\n", + " tests 0\n FAIL 1\n", + "tests 7\nFAIL 0", + "tests\t7\nFAIL\t0\n", + "\t tests \t 7 \t\nFAIL 0 \n", + "tests7\nFAIL 0\n", + "tests 7\nFAIL0\n", + "tests 7 x\nFAIL 0\n", + "tests 7\nFAIL 0 x\n", + "tests -7\nFAIL 0\n", + "tests 7.0\nFAIL 0\n", + "tests 7\nFAIL -1\n", + "tests 007\nFAIL 00\n", + "tests 007\nFAIL 010\n", + "TESTS 7\nFAIL 0\n", + "tests 7\nfail 0\n", + "tests 99999999999999999999999\nFAIL 0\n", + "tests 18446744073709551615\nFAIL 18446744073709551615\n", + "tests 18446744073709551616\nFAIL 0\n", + "tests 3\nFAIL 000000000000000000000000000\n", + "xtests 3\nFAIL 0\n", + "tests 3\x0d\nFAIL 0\x0d\n", + "tests 3\x0dFAIL 0\x0d", + "--- test report: x ---\n tests 3\n\x0b FAIL 0\n", + "tests 3\x0cFAIL 0\n", + "tests 3\x1cFAIL 0", + "tests 3\x1fFAIL 0", + "tests\x1f3\nFAIL\x1f0\n", + "tests 3\n\xc2\xa0FAIL 0\n", + "tests\xc2\xa03\nFAIL 0\n", + "tests 3\xc2\xa0\nFAIL 0\n", + "tests 3\xc2\x85FAIL 0\n", + "BLOCKED", + "BLOCKED\n", + "BLOCKED does not compile: spec.zig:3:1: error: x\n", + " BLOCKED x \n", + "BLOCKEDx y\n", + "BLOCKED\tzig not on PATH\n", + "\tBLOCKED \t zig \t\n", + "blocked x\n", + "xBLOCKED y\n", + "unBLOCKED y\n", + "[BLOCKED] y\n", + "tests 3\nFAIL 0\nBLOCKED late\n", + "BLOCKED first\nBLOCKED second\n", + "BLOCKED \nBLOCKED second\n", + "tests 3\nFAIL 2\nBLOCKED x\n", + "BLOCKED aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", + "BLOCKED aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", + "BLOCKED aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n", + "BLOCKED aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa tail\n", + "BLOCKED bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb \n", + "BLOCKED caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9\n", + "BLOCKED \xc2\xa0x\xc2\xa0\n", + "BLOCKED x\xc2\x85y\n", + "x\xc2\x85BLOCKED y\n", + "BLOCKED \x0bx\x0b\n", + "line one\nBLOCKED x\nline three\n", + " BLOCKED does not compile\n second\n", + "tests 3\xe2\x80\xa8FAIL 0\n", + "tests 3\n\xe3\x80\x80FAIL 0\xe3\x80\x80\n", + "tests\xe2\x80\x833\nFAIL 0\n", + "x\xe2\x80\xa9BLOCKED y\n", + "BLOCKED \xe3\x80\x80x\xe3\x80\x80y\xe2\x80\xa8z\n", + "BLOCKED \xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\n", + "--- test report: specs/gen/s2.t27 ---\n FAIL dup__dup1\n FAIL pass_x\n\n tests 2\n pass 0\n FAIL 2\n rate 0.0%\n", + "--- test report: specs/gen/s2.t27 ---\n\n tests 2\n pass 1\n FAIL 1\n rate 50.0%\n", + "--- test report: specs/gen/s5.t27 ---\n pass a.b\n pass a-b\n FAIL ab\n FAIL abc\n pass negative_control_a_test_named_tests_in_the_table\n\n tests 5\n pass 3\n FAIL 2\n rate 60.0%\n", + "--- test report: specs/gen/s5.t27 ---\n\n tests 5\n pass 3\n FAIL 2\n rate 60.0%\n", + "--- test report: specs/gen/s9.t27 ---\n FAIL a-b\n FAIL a_row_reads_its_own_keys\n FAIL tail_space \n pass a.b\n pass Upper_case_first\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass dup__dup1\n pass adds_zero\n pass nine_digits_read_and_ten_are_refused\n\n tests 9\n pass 6\n FAIL 3\n rate 66.7%\n", + "--- test report: specs/gen/s9.t27 ---\n\n tests 9\n pass 6\n FAIL 3\n rate 66.7%\n", + "--- test report: specs/gen/s14.t27 ---\n pass Upper_case_first\n pass negative_control_a_test_named_tests_in_the_table\n pass nine_digits_read_and_ten_are_refused\n pass pass_x\n pass z\n pass adds_big\n pass a.b\n FAIL dup__dup1\n pass abc\n FAIL adds_small\n pass tail_space \n FAIL tests_5\n pass adds_zero\n pass a_row_reads_its_own_keys\n\n tests 14\n pass 11\n FAIL 3\n rate 78.6%\n", + "--- test report: specs/gen/s14.t27 ---\n\n tests 14\n pass 9\n FAIL 5\n rate 64.3%\n" +]; + +pub const RT_V : [99]u8 = [ + 0, 5, 2, 2, 2, 2, 2, 2, 2, 0, 5, 5, 0, 0, 0, 5, 2, 2, 0, 0, 5, 5, 0, 0, 5, 0, 0, 5, 0, 0, 0, 2, + 2, 2, 2, 2, 2, 2, 0, 5, 2, 2, 0, 5, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 5, 5, 5, 5, 5, + 5, 5, 5 +]; + +pub const RT_D : [99]string = [ + "", + "1 of 3 tests fail", + "does not compile: spec.zig:20:16: error: use of undeclared identifier 'undeclared_name'", + "zig not on PATH", + "unreadable test-report output", + "unreadable test-report output", + "unreadable test-report output", + "unreadable test-report output", + "unreadable test-report output", + "", + "1 of 2 tests fail", + "3 of 3 tests fail", + "", + "", + "", + "6 of 22 tests fail", + "unreadable test-report output", + "unreadable test-report output", + "", + "", + "2 of 3 tests fail", + "2 of 3 tests fail", + "", + "", + "2 of 3 tests fail", + "", + "", + "1 of 0 tests fail", + "", + "", + "", + "unreadable test-report output", + "unreadable test-report output", + "unreadable test-report output", + "unreadable test-report output", + "unreadable test-report output", + "unreadable test-report output", + "unreadable test-report output", + "", + "10 of 7 tests fail", + "unreadable test-report output", + "unreadable test-report output", + "", + "18446744073709551615 of 18446744073709551615 tests fail", + "", + "", + "unreadable test-report output", + "", + "", + "", + "", + "", + "unreadable test-report output", + "", + "", + "", + "", + "", + "", + "", + "does not compile: spec.zig:3:1: error: x", + "x", + "x y", + "zig not on PATH", + "zig", + "unreadable test-report output", + "unreadable test-report output", + "unreadable test-report output", + "unreadable test-report output", + "late", + "first", + "", + "x", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9", + "x", + "x", + "y", + "", + "x", + "does not compile", + "", + "", + "", + "y", + "x\xe3\x80\x80y", + "\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82\xe3\x81\x82", + "2 of 2 tests fail", + "1 of 2 tests fail", + "2 of 5 tests fail", + "2 of 5 tests fail", + "3 of 9 tests fail", + "3 of 9 tests fail", + "3 of 14 tests fail", + "5 of 14 tests fail" +]; + +// T2: parse_test_verdicts -- 70 inputs; the number of tests (LR_NONE for None) and the table as text +pub const TV_N : usize = 70; +pub const TV_IN : [70]string = [ + "--- test report: specs/lab/pass3.t27 ---\n pass adds_small\n pass adds_zero\n pass adds_big\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n\n runtime asserts executed, per test (#6509; a pass with 0 is vacuous, T730):\n 1 adds_small\n 2 adds_zero\n 1 adds_big\n vacuous passes 0 of 3 (passed with 0 runtime asserts executed)\n", + "--- test report: specs/lab/fail1.t27 ---\n pass adds_small\n FAIL adds_wrong\n pass adds_vacuous\n\n tests 3\n pass 2\n FAIL 1\n rate 66.7%\n\n runtime asserts executed, per test (#6509; a pass with 0 is vacuous, T730):\n 1 adds_small\n - adds_wrong (failed, not counted)\n 0 adds_vacuous VACUOUS\n vacuous passes 1 of 2 (passed with 0 runtime asserts executed)\n", + "--- test report: specs/lab/blocked1.t27 ---\n BLOCKED does not compile: spec.zig:20:16: error: use of undeclared identifier 'undeclared_name'\n\n A blocked spec is not a failing one. It never produced a\n binary, so it has no per-test result to report.\n", + "--- test report: specs/lab/pass3.t27 ---\n BLOCKED zig not on PATH\n\n A blocked spec is not a failing one. It never produced a\n binary, so it has no per-test result to report.\n", + "--- test report: specs/lab/pass3.t27 ---\n pass adds_small\n pass adds_zero\n pass adds_big\n pass adds_big\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n\n runtime asserts executed, per test (#6509; a pass with 0 is vacuous, T730):\n 1 adds_small\n 2 adds_zero\n 1 adds_big\n vacuous passes 0 of 3 (passed with 0 runtime asserts executed)\n", + "--- test report: s.t27 ---\n pass a\n FAIL b\n\n tests 2\n pass 1\n FAIL 1\n rate 50.0%\n", + "--- test report: s.t27 ---\n\n tests 0\n pass 0\n FAIL 0\n rate 0.0%\n", + "--- test report: s.t27 ---\n\n tests 2\n pass 1\n FAIL 1\n rate 50.0%\n", + "", + "\n", + "--- test report: x ---\n", + "--- test report: x ---\n\n tests 0\n", + " tests 0\n--- test report: x ---\n", + " tests 2\n--- test report: x ---\n pass a\n FAIL b\n", + "--- test report: x ---\n pass a\n FAIL b\n\n tests 2\n", + "--- test report: x ---\n pass a\n FAIL b\n\n tests 3\n", + "--- test report: x ---\n pass a\n FAIL b\n\n tests 1\n", + "--- test report: x ---\n pass a\n FAIL b\n\n", + "--- test report: x ---\n pass a\n FAIL b\n tests 2\n", + "--- test report: x ---\n pass a\n oops\n\n tests 1\n", + "--- test report: x ---\n pass a\n pass b\n\n tests 2\n", + "--- test report: x ---\n pass a\n\n tests 1\n", + "--- test report: x ---\n pass a\n PASS b\n\n tests 2\n", + "--- test report: x ---\n Pass a\n\n tests 1\n", + "--- test report: x ---\n fail a\n\n tests 1\n", + "--- test report: x ---\n pass\n\n tests 1\n", + "--- test report: x ---\n pass \n\n tests 1\n", + "--- test report: x ---\n pass a\n\n tests 1\n", + "--- test report: x ---\n pass a \n FAIL b\t\n\n tests 2\n", + "--- test report: x ---\n\t pass a\n FAIL b\n\n tests 2\n", + "--- test report: x ---\n pass a\n pass a\n\n tests 1\n", + "--- test report: x ---\n pass a\n pass a\n\n tests 2\n", + "--- test report: x ---\n pass a\n FAIL a\n\n tests 1\n", + "--- test report: x ---\n FAIL a\n pass a\n\n tests 1\n", + "--- test report: x ---\n pass a\n pass b\n FAIL a\n pass c\n FAIL b\n\n tests 3\n", + "--- test report: x ---\n pass a\n pass b\n FAIL a\n pass c\n FAIL b\n\n tests 5\n", + "--- test report: x ---\n pass a\n \n pass b\n\n tests 2\n", + "--- test report: x ---\n pass a\n\x0b\n pass b\n\n tests 2\n", + "--- test report: x ---\n pass a\n\x1f\n pass b\n\n tests 1\n", + "--- test report: x ---\n pass a\x0b pass b\n\n tests 1\n", + "--- test report: x ---\x0d\n pass a\x0d\n FAIL b\x0d\n\x0d\n tests 2\x0d\n", + "--- test report: x ---\x0d pass a\x0d\x0d tests 1\x0d", + " --- test report: x ---\n pass a\n\n tests 1\n", + "x --- test report: x ---\n pass a\n\n tests 1\n", + "--- test report x ---\n pass a\n\n tests 1\n", + "--- test report:\n pass a\n\n tests 1\n", + "--- test report: x ---\n pass a\n\n tests 1\n--- test report: y ---\n pass b\n pass c\n\n tests 2\n", + " tests 1\n--- test report: x ---\n pass a\n\n tests 9\n", + " tests 9\n--- test report: x ---\n pass a\n\n tests 1\n", + "--- test report: x ---\n pass a\n\n tests 1\n tests 7\n", + "--- test report: x ---\n pass a\n\n tests x\n tests 1\n", + "--- test report: x ---\n pass a\n\n tests\t1\n", + "--- test report: x ---\n pass a\n\n tests1\n", + "--- test report: x ---\n pass a\n\n tests 1 x\n", + "--- test report: x ---\n pass a\n\n tests 01\n", + "--- test report: x ---\n pass a\n\n tests 99999999999999999999\n", + "--- test report: x ---\n pass caf\xc3\xa9\n FAIL \xc3\xa9\xc3\xa9\n\n tests 2\n", + "--- test report: x ---\n pass \xc2\xa0\n\n tests 1\n", + "--- test report: x ---\n pass a\xc2\x85 pass b\n\n tests 2\n", + "--- test report: x ---\n pass a b c\n FAIL d\\e \"q\"\n\n tests 2\n", + "--- test report: x ---\n pass \t\n\n tests 1\n", + "--- test report: x ---\n\n pass a\n tests 1\n", + "--- test report: x ---\n FAIL a\n FAIL b\n FAIL c\n\n tests 3\n", + "--- test report: specs/gen/s1.t27 ---\n pass tests_5\n\n tests 1\n pass 1\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/gen/s2.t27 ---\n pass pass_x\n pass the_walk_finds_each_result_once\n\n tests 2\n pass 2\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/gen/s5.t27 ---\n pass a-b\n pass adds_small\n FAIL dup__dup2\n pass pass_x\n pass negative_control_a_test_named_tests_in_the_table\n\n tests 5\n pass 4\n FAIL 1\n rate 80.0%\n", + "--- test report: specs/gen/s9.t27 ---\n pass nine_digits_read_and_ten_are_refused\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass a_row_reads_its_own_keys\n pass a.b\n pass adds_zero\n pass Upper_case_first\n FAIL the_walk_finds_each_result_once\n pass dup__dup1\n pass a_b\n\n tests 9\n pass 8\n FAIL 1\n rate 88.9%\n", + "--- test report: specs/gen/s14.t27 ---\n pass z\n pass adds_small\n FAIL negative_control_a_test_named_tests_in_the_table\n pass tests_5\n pass adds_zero\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass caf\xc3\xa9_name\n pass a_b\n pass dup__dup1\n pass the_walk_finds_each_result_once\n FAIL a_row_reads_its_own_keys\n FAIL a-b\n FAIL abc\n pass dup__dup2\n\n tests 14\n pass 10\n FAIL 4\n rate 71.4%\n", + "--- test report: specs/gen/s20.t27 ---\n pass adds_big\n pass Upper_case_first\n pass tail_space \n FAIL dup__dup2\n pass adds_zero\n FAIL a_row_reads_its_own_keys\n pass z\n pass name with spaces\n pass a_b\n pass dup__dup1\n pass a-b\n pass pass_x\n pass abc\n FAIL a.b\n FAIL caf\xc3\xa9_name\n pass tests_5\n pass negative_control_a_test_named_tests_in_the_table\n FAIL xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass the_walk_finds_each_result_once\n pass nine_digits_read_and_ten_are_refused\n\n tests 20\n pass 15\n FAIL 5\n rate 75.0%\n", + "--- test report: specs/gen/dup.t27 ---\n pass a\n FAIL b\n pass c\n FAIL a\n\n tests 3\n pass 2\n FAIL 1\n rate 66.7%\n" +]; + +pub const TV_COUNT : [70]u32 = [ + 3, 3, 4294967295, 4294967295, 3, 2, 0, 4294967295, 4294967295, 4294967295, 4294967295, 0, 0, 2, + 2, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, 4294967295, + 4294967295, 4294967295, 4294967295, 4294967295, 1, 1, 2, 2, 1, 4294967295, 1, 1, 3, 4294967295, + 4294967295, 4294967295, 1, 4294967295, 2, 1, 4294967295, 4294967295, 4294967295, 1, 1, 1, + 4294967295, 1, 1, 1, 4294967295, 4294967295, 1, 4294967295, 2, 1, 2, 2, 1, 4294967295, 3, 1, 2, + 5, 9, 14, 20, 3 +]; + +pub const TV_TXT : [70]string = [ + "adds_small\tP\nadds_zero\tP\nadds_big\tP\n", + "adds_small\tP\nadds_wrong\tF\nadds_vacuous\tP\n", + "", + "", + "adds_small\tP\nadds_zero\tP\nadds_big\tP\n", + "a\tP\nb\tF\n", + "", + "", + "", + "", + "", + "", + "", + "a\tP\nb\tF\n", + "a\tP\nb\tF\n", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "\tP\n", + " a\tP\n", + "a \tP\nb\t\tF\n", + "a\tP\nb\tF\n", + "a\tP\n", + "", + "a\tF\n", + "a\tP\n", + "a\tF\nb\tF\nc\tP\n", + "", + "", + "", + "a\tP\n", + "", + "a\tP\nb\tF\n", + "a\tP\n", + "", + "", + "", + "a\tP\n", + "a\tP\n", + "a\tP\n", + "", + "a\tP\n", + "a\tP\n", + "a\tP\n", + "", + "", + "a\tP\n", + "", + "caf\xc3\xa9\tP\n\xc3\xa9\xc3\xa9\tF\n", + "\xc2\xa0\tP\n", + "a\tP\nb\tP\n", + "a b c\tP\nd\\e \"q\"\tF\n", + "\t\tP\n", + "", + "a\tF\nb\tF\nc\tF\n", + "tests_5\tP\n", + "pass_x\tP\nthe_walk_finds_each_result_once\tP\n", + "a-b\tP\nadds_small\tP\ndup__dup2\tF\npass_x\tP\nnegative_control_a_test_named_tests_in_the_table\tP\n", + "nine_digits_read_and_ten_are_refused\tP\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\tP\na_row_reads_its_own_keys\tP\na.b\tP\nadds_zero\tP\nUpper_case_first\tP\nthe_walk_finds_each_result_once\tF\ndup__dup1\tP\na_b\tP\n", + "z\tP\nadds_small\tP\nnegative_control_a_test_named_tests_in_the_table\tF\ntests_5\tP\nadds_zero\tP\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\tP\ncaf\xc3\xa9_name\tP\na_b\tP\ndup__dup1\tP\nthe_walk_finds_each_result_once\tP\na_row_reads_its_own_keys\tF\na-b\tF\nabc\tF\ndup__dup2\tP\n", + "adds_big\tP\nUpper_case_first\tP\ntail_space \tP\ndup__dup2\tF\nadds_zero\tP\na_row_reads_its_own_keys\tF\nz\tP\nname with spaces\tP\na_b\tP\ndup__dup1\tP\na-b\tP\npass_x\tP\nabc\tP\na.b\tF\ncaf\xc3\xa9_name\tF\ntests_5\tP\nnegative_control_a_test_named_tests_in_the_table\tP\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\tF\nthe_walk_finds_each_result_once\tP\nnine_digits_read_and_ten_are_refused\tP\n", + "a\tF\nb\tF\nc\tP\n" +]; + +// T3: disagreements -- 63 pairs of tables (as reports), and the lines the oracle returns, one per line +pub const TD_N : usize = 63; +pub const TD_A : [63]string = [ + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n pass name with spaces\n\n tests 1\n", + "--- test report: s ---\n pass Upper\n\n tests 1\n", + "--- test report: s ---\n pass adds_zero\n\n tests 1\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n pass dup__dup2\n pass ab\n\n tests 2\n", + "--- test report: s ---\n FAIL a\n pass a\n\n tests 2\n", + "--- test report: s ---\n FAIL a\n pass adds_small\n\n tests 2\n", + "--- test report: s ---\n pass a\n pass adds_small\n pass caf\xc3\xa9\n\n tests 3\n", + "--- test report: s ---\n pass a/b\n pass t_1\n pass adds_zero\n\n tests 3\n", + "--- test report: s ---\n pass dup__dup1\n pass b\n pass ab\n\n tests 3\n", + "--- test report: s ---\n pass b\n FAIL name with spaces\n pass a_b\n pass adds_big\n\n tests 4\n", + "--- test report: s ---\n pass adds_big\n pass a/b\n pass a_b\n FAIL name with spaces\n\n tests 4\n", + "--- test report: s ---\n FAIL abc\n pass t_10\n pass a/b\n pass Upper\n\n tests 4\n", + "--- test report: s ---\n pass adds_small\n pass t_10\n pass dup__dup2\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n\n tests 4\n", + "--- test report: s ---\n pass a.b\n FAIL dup__dup2\n FAIL a-b\n pass t_1\n\n tests 4\n", + "--- test report: s ---\n pass a\n pass abc\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n FAIL dup__dup2\n\n tests 4\n", + "--- test report: s ---\n pass Upper\n pass t_2\n pass caf\xc3\xa9\n FAIL xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass name with spaces\n\n tests 5\n", + "--- test report: s ---\n pass a\n FAIL a/b\n FAIL adds_small\n FAIL t_10\n pass adds_big\n\n tests 5\n", + "--- test report: s ---\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n FAIL t_1\n pass a\n FAIL a/b\n FAIL adds_small\n\n tests 5\n", + "--- test report: s ---\n pass a\n FAIL name with spaces\n FAIL Upper\n pass caf\xc3\xa9\n pass a.b\n pass dup__dup1\n\n tests 6\n", + "--- test report: s ---\n FAIL t_10\n FAIL t_1\n pass a\n pass adds_small\n pass ab \n FAIL z\n\n tests 6\n", + "--- test report: s ---\n FAIL a.b\n FAIL a_b\n pass a-b\n pass adds_big\n FAIL a\n pass a\n\n tests 6\n", + "--- test report: s ---\n FAIL b\n pass adds_big\n pass a_b\n FAIL Upper\n pass adds_small\n pass a\n pass t_1\n pass a\n\n tests 8\n", + "--- test report: s ---\n FAIL dup__dup2\n FAIL a-b\n FAIL a_b\n FAIL dup__dup1\n pass Upper\n FAIL a/b\n pass t_1\n pass adds_big\n\n tests 8\n", + "--- test report: s ---\n FAIL ab \n FAIL t_2\n pass t_10\n pass a-b\n pass a\n FAIL xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass a_b\n pass dup__dup2\n\n tests 8\n", + "--- test report: s ---\n FAIL dup__dup2\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass t_10\n FAIL Upper\n pass t_1\n\n tests 5\n", + "--- test report: s ---\n pass a_b\n FAIL a/b\n pass z\n pass a\n pass t_2\n\n tests 5\n", + "--- test report: s ---\n pass dup__dup1\n pass a.b\n pass b\n pass a\n pass dup__dup2\n\n tests 5\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n FAIL a.b\n pass a/b\n pass adds_big\n pass z\n FAIL ab \n FAIL name with spaces\n pass b\n pass Upper\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n\n tests 9\n", + "--- test report: s ---\n FAIL ab \n pass dup__dup1\n pass b\n pass name with spaces\n pass Upper\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass adds_zero\n pass a-b\n pass a\n\n tests 9\n", + "--- test report: s ---\n FAIL dup__dup2\n pass adds_big\n FAIL a\n pass a\n FAIL ab \n FAIL adds_zero\n FAIL t_1\n FAIL adds_small\n pass Upper\n\n tests 9\n", + "--- test report: s ---\n pass a\n\n tests 1\n", + "--- test report: s ---\n pass a\n\n tests 1\n", + "--- test report: s ---\n FAIL a\n\n tests 1\n", + "--- test report: s ---\n FAIL a\n\n tests 1\n", + "--- test report: s ---\n pass a\n pass b\n\n tests 2\n", + "--- test report: s ---\n FAIL b\n pass a\n\n tests 2\n", + "--- test report: s ---\n pass abc\n\n tests 1\n", + "--- test report: s ---\n pass ab\n\n tests 1\n", + "--- test report: s ---\n pass B\n\n tests 1\n", + "--- test report: s ---\n pass a-b\n\n tests 1\n", + "--- test report: s ---\n pass a.b\n FAIL a/b\n\n tests 2\n", + "--- test report: s ---\n pass \n\n tests 1\n", + "--- test report: s ---\n pass \n\n tests 1\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n pass caf\xc3\xa9\n\n tests 1\n", + "--- test report: s ---\n pass x y\n\n tests 1\n", + "--- test report: s ---\n pass t_10\n pass t_2\n\n tests 2\n", + "--- test report: s ---\n pass a\n\n tests 1\n", + "--- test report: s ---\n pass b\n\n tests 1\n", + "--- test report: s ---\n pass a\n FAIL b\n pass c\n\n tests 3\n", + "--- test report: s ---\n pass x\n\n tests 1\n", + "--- test report: s ---\n FAIL a\n FAIL b\n\n tests 2\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n pass a\n pass A\n\n tests 2\n" +]; + +pub const TD_B : [63]string = [ + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n FAIL ab\n\n tests 1\n", + "--- test report: s ---\n FAIL a-b\n\n tests 1\n", + "--- test report: s ---\n FAIL a\n\n tests 1\n", + "--- test report: s ---\n pass dup__dup2\n FAIL ab\n\n tests 2\n", + "--- test report: s ---\n FAIL a\n pass a\n\n tests 2\n", + "--- test report: s ---\n FAIL a\n pass adds_small\n\n tests 2\n", + "--- test report: s ---\n pass a\n pass adds_small\n pass caf\xc3\xa9\n\n tests 3\n", + "--- test report: s ---\n pass a/b\n pass t_1\n pass adds_zero\n\n tests 3\n", + "--- test report: s ---\n pass dup__dup1\n pass b\n pass ab\n\n tests 3\n", + "--- test report: s ---\n FAIL b\n pass name with spaces\n pass a_b\n pass adds_big\n\n tests 4\n", + "--- test report: s ---\n pass adds_big\n pass a/b\n pass a_b\n FAIL name with spaces\n\n tests 4\n", + "--- test report: s ---\n FAIL abc\n pass t_10\n pass a/b\n pass Upper\n\n tests 4\n", + "--- test report: s ---\n pass dup__dup2\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass t_2\n pass name with spaces\n\n tests 4\n", + "--- test report: s ---\n pass a-b\n pass t_1\n pass ab \n FAIL a/b\n\n tests 4\n", + "--- test report: s ---\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n FAIL dup__dup2\n FAIL ab \n pass name with spaces\n\n tests 4\n", + "--- test report: s ---\n FAIL xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass name with spaces\n pass a\n FAIL a/b\n pass z\n\n tests 5\n", + "--- test report: s ---\n FAIL t_10\n pass adds_big\n pass ab\n FAIL a_b\n FAIL ab \n\n tests 5\n", + "--- test report: s ---\n FAIL a/b\n FAIL adds_small\n FAIL name with spaces\n pass a.b\n FAIL adds_zero\n\n tests 5\n", + "--- test report: s ---\n pass a.b\n pass dup__dup1\n FAIL z\n pass a_b\n pass adds_zero\n pass t_2\n\n tests 6\n", + "--- test report: s ---\n pass ab \n pass z\n FAIL Upper\n pass abc\n pass b\n FAIL name with spaces\n\n tests 6\n", + "--- test report: s ---\n pass a\n pass a\n pass adds_small\n pass t_1\n pass abc\n pass Upper\n\n tests 6\n", + "--- test report: s ---\n pass adds_small\n pass a\n pass t_1\n pass a\n FAIL dup__dup1\n FAIL a-b\n FAIL xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass adds_zero\n\n tests 8\n", + "--- test report: s ---\n pass Upper\n FAIL a/b\n pass t_1\n pass adds_big\n FAIL ab \n pass z\n FAIL b\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n\n tests 8\n", + "--- test report: s ---\n pass a\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n FAIL a_b\n FAIL dup__dup2\n pass abc\n pass adds_zero\n pass a.b\n FAIL a\n\n tests 8\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n pass t_2\n pass adds_zero\n FAIL b\n pass a/b\n FAIL a\n\n tests 5\n", + "--- test report: s ---\n pass a-b\n FAIL adds_zero\n pass ab \n pass t_10\n pass name with spaces\n\n tests 5\n", + "--- test report: s ---\n pass a\n pass dup__dup1\n FAIL a-b\n pass t_1\n pass a/b\n\n tests 5\n", + "--- test report: s ---\n FAIL a.b\n pass a/b\n pass adds_big\n pass z\n FAIL ab \n FAIL name with spaces\n pass b\n pass Upper\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n\n tests 9\n", + "--- test report: s ---\n FAIL ab \n pass dup__dup1\n pass b\n pass name with spaces\n pass Upper\n pass xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n pass adds_zero\n pass a-b\n pass a\n\n tests 9\n", + "--- test report: s ---\n FAIL dup__dup2\n pass adds_big\n FAIL a\n pass a\n FAIL ab \n FAIL adds_zero\n FAIL t_1\n FAIL adds_small\n pass Upper\n\n tests 9\n", + "--- test report: s ---\n pass a\n\n tests 1\n", + "--- test report: s ---\n FAIL a\n\n tests 1\n", + "--- test report: s ---\n pass a\n\n tests 1\n", + "--- test report: s ---\n FAIL a\n\n tests 1\n", + "--- test report: s ---\n pass b\n pass a\n\n tests 2\n", + "--- test report: s ---\n pass a\n FAIL b\n\n tests 2\n", + "--- test report: s ---\n pass ab\n\n tests 1\n", + "--- test report: s ---\n pass abc\n\n tests 1\n", + "--- test report: s ---\n pass a\n\n tests 1\n", + "--- test report: s ---\n pass a_b\n\n tests 1\n", + "--- test report: s ---\n FAIL a/b\n\n tests 1\n", + "--- test report: s ---\n FAIL \n\n tests 1\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n FAIL \n\n tests 1\n", + "--- test report: s ---\n pass cafe\n\n tests 1\n", + "--- test report: s ---\n pass x y\n\n tests 1\n", + "--- test report: s ---\n pass t_1\n\n tests 1\n", + "--- test report: s ---\n FAIL b\n\n tests 1\n", + "--- test report: s ---\n FAIL a\n\n tests 1\n", + "--- test report: s ---\n pass a\n pass b\n FAIL c\n\n tests 3\n", + "--- test report: s ---\n pass y\n FAIL z\n\n tests 2\n", + "--- test report: s ---\n\n tests 0\n", + "--- test report: s ---\n pass a\n FAIL b\n\n tests 2\n", + "--- test report: s ---\n FAIL A\n pass a\n\n tests 2\n" +]; + +pub const TD_OUT : [63]string = [ + "", + "", + "", + "name with spaces: t27b pass, reference has no such test\n", + "Upper: t27b pass, reference has no such test\n", + "adds_zero: t27b pass, reference has no such test\n", + "ab: t27b has no such test, reference FAIL\n", + "a-b: t27b has no such test, reference FAIL\n", + " a: t27b has no such test, reference FAIL\n", + "ab: t27b pass, reference FAIL\n", + "", + "", + "", + "", + "", + "b: t27b pass, reference FAIL\nname with spaces: t27b FAIL, reference pass\n", + "", + "", + "adds_small: t27b pass, reference has no such test\nname with spaces: t27b has no such test, reference pass\nt_10: t27b pass, reference has no such test\nt_2: t27b has no such test, reference pass\n", + "a-b: t27b FAIL, reference pass\na.b: t27b pass, reference has no such test\na/b: t27b has no such test, reference FAIL\nab : t27b has no such test, reference pass\ndup__dup2: t27b FAIL, reference has no such test\n", + "a: t27b pass, reference has no such test\nab : t27b has no such test, reference FAIL\nabc: t27b pass, reference has no such test\nname with spaces: t27b has no such test, reference pass\n", + " a: t27b has no such test, reference pass\nUpper: t27b pass, reference has no such test\na/b: t27b has no such test, reference FAIL\ncaf\xc3\xa9: t27b pass, reference has no such test\nt_2: t27b pass, reference has no such test\nz: t27b has no such test, reference pass\n", + " a: t27b pass, reference has no such test\na/b: t27b FAIL, reference has no such test\na_b: t27b has no such test, reference FAIL\nab: t27b has no such test, reference pass\nab : t27b has no such test, reference FAIL\nadds_small: t27b FAIL, reference has no such test\n", + "a: t27b pass, reference has no such test\na.b: t27b has no such test, reference pass\nadds_zero: t27b has no such test, reference FAIL\nname with spaces: t27b has no such test, reference FAIL\nt_1: t27b FAIL, reference has no such test\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: t27b pass, reference has no such test\n", + "Upper: t27b FAIL, reference has no such test\na: t27b pass, reference has no such test\na_b: t27b has no such test, reference pass\nadds_zero: t27b has no such test, reference pass\ncaf\xc3\xa9: t27b pass, reference has no such test\nname with spaces: t27b FAIL, reference has no such test\nt_2: t27b has no such test, reference pass\nz: t27b has no such test, reference FAIL\n", + " a: t27b pass, reference has no such test\nUpper: t27b has no such test, reference FAIL\nabc: t27b has no such test, reference pass\nadds_small: t27b pass, reference has no such test\nb: t27b has no such test, reference pass\nname with spaces: t27b has no such test, reference FAIL\nt_1: t27b FAIL, reference has no such test\nt_10: t27b FAIL, reference has no such test\nz: t27b FAIL, reference pass\n", + " a: t27b FAIL, reference pass\nUpper: t27b has no such test, reference pass\na-b: t27b pass, reference has no such test\na.b: t27b FAIL, reference has no such test\na_b: t27b FAIL, reference has no such test\nabc: t27b has no such test, reference pass\nadds_big: t27b pass, reference has no such test\nadds_small: t27b has no such test, reference pass\nt_1: t27b has no such test, reference pass\n", + "Upper: t27b FAIL, reference has no such test\na-b: t27b has no such test, reference FAIL\na_b: t27b pass, reference has no such test\nadds_big: t27b pass, reference has no such test\nadds_zero: t27b has no such test, reference pass\nb: t27b FAIL, reference has no such test\ndup__dup1: t27b has no such test, reference FAIL\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: t27b has no such test, reference FAIL\n", + "a-b: t27b FAIL, reference has no such test\na_b: t27b FAIL, reference has no such test\nab : t27b has no such test, reference FAIL\nb: t27b has no such test, reference FAIL\ndup__dup1: t27b FAIL, reference has no such test\ndup__dup2: t27b FAIL, reference has no such test\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: t27b has no such test, reference pass\nz: t27b has no such test, reference pass\n", + " a: t27b has no such test, reference FAIL\na-b: t27b pass, reference has no such test\na.b: t27b has no such test, reference pass\na_b: t27b pass, reference FAIL\nab : t27b FAIL, reference has no such test\nabc: t27b has no such test, reference pass\nadds_zero: t27b has no such test, reference pass\ndup__dup2: t27b pass, reference FAIL\nt_10: t27b pass, reference has no such test\nt_2: t27b FAIL, reference has no such test\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: t27b FAIL, reference pass\n", + "Upper: t27b FAIL, reference has no such test\ndup__dup2: t27b FAIL, reference has no such test\nt_1: t27b pass, reference has no such test\nt_10: t27b pass, reference has no such test\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx: t27b pass, reference has no such test\n", + " a: t27b pass, reference has no such test\na/b: t27b FAIL, reference has no such test\na_b: t27b pass, reference has no such test\nt_2: t27b pass, reference has no such test\nz: t27b pass, reference has no such test\n", + "a: t27b pass, reference has no such test\na.b: t27b pass, reference has no such test\nb: t27b pass, reference has no such test\ndup__dup1: t27b pass, reference has no such test\ndup__dup2: t27b pass, reference has no such test\n", + " a: t27b has no such test, reference FAIL\na/b: t27b has no such test, reference pass\nadds_zero: t27b has no such test, reference pass\nb: t27b has no such test, reference FAIL\nt_2: t27b has no such test, reference pass\n", + "a-b: t27b has no such test, reference pass\nab : t27b has no such test, reference pass\nadds_zero: t27b has no such test, reference FAIL\nname with spaces: t27b has no such test, reference pass\nt_10: t27b has no such test, reference pass\n", + " a: t27b has no such test, reference pass\na-b: t27b has no such test, reference FAIL\na/b: t27b has no such test, reference pass\ndup__dup1: t27b has no such test, reference pass\nt_1: t27b has no such test, reference pass\n", + "", + "", + "", + "", + "a: t27b pass, reference FAIL\n", + "a: t27b FAIL, reference pass\n", + "", + "", + "", + "ab: t27b has no such test, reference pass\nabc: t27b pass, reference has no such test\n", + "ab: t27b pass, reference has no such test\nabc: t27b has no such test, reference pass\n", + "B: t27b pass, reference has no such test\na: t27b has no such test, reference pass\n", + "a-b: t27b pass, reference has no such test\na_b: t27b has no such test, reference pass\n", + "a.b: t27b pass, reference has no such test\n", + ": t27b pass, reference FAIL\n", + ": t27b pass, reference has no such test\n", + ": t27b has no such test, reference FAIL\n", + "cafe: t27b has no such test, reference pass\ncaf\xc3\xa9: t27b pass, reference has no such test\n", + "x y: t27b has no such test, reference pass\nx y: t27b pass, reference has no such test\n", + "t_1: t27b has no such test, reference pass\nt_10: t27b pass, reference has no such test\nt_2: t27b pass, reference has no such test\n", + "a: t27b pass, reference has no such test\nb: t27b has no such test, reference FAIL\n", + "a: t27b has no such test, reference FAIL\nb: t27b pass, reference has no such test\n", + "b: t27b FAIL, reference pass\nc: t27b pass, reference FAIL\n", + "x: t27b pass, reference has no such test\ny: t27b has no such test, reference pass\nz: t27b has no such test, reference FAIL\n", + "a: t27b FAIL, reference has no such test\nb: t27b FAIL, reference has no such test\n", + "a: t27b has no such test, reference pass\nb: t27b has no such test, reference FAIL\n", + "A: t27b pass, reference FAIL\n" +]; + +// T4: parse_cargo_test -- 62 outputs (lines joined by a newline), passed, failed, ignored, suites +pub const TC_N : usize = 62; +pub const TC_IN : [62]string = [ + "", + "", + "running 3 tests", + "test result: ok. 3 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.01s", + "test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: FAILED. 10 passed; 2 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.50s", + "test result: ok. 123456 passed; 7 failed; 99 ignored; 0 measured", + "test result: ok. 3 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.01s\ntest result: FAILED. 10 passed; 2 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.50s", + "test result: ok. 3 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.01s\nx\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\ny\ntest result: FAILED. 10 passed; 2 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.50s", + "x test result: ok. 3 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.01s", + "test result: ok. 3 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.01s tail", + " test result: ok. 3 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.01s", + "a test result: ok. 1 passed; 0 failed; 0 ignored", + "test result: ok. 1 passed; 0 failed; 0 ignored", + "test result: ok. 1 passed; 0 failed; 0 ignore", + "test result: ok. 1 passed; 0 failed; ignored", + "test result: ok. 1 passed; 0 failed; 0 ignored", + "test result: ok.1 passed; 0 failed; 0 ignored", + "test result: ok. 1 passed; 0 failed; 0 ignored", + "test result: ok. 1 passed; 0 failed;0 ignored", + "test result: . 1 passed; 0 failed; 0 ignored", + "test result: ok 1 passed; 0 failed; 0 ignored", + "test result: ok. 1 passed 0 failed; 0 ignored", + "test result ok. 1 passed; 0 failed; 0 ignored", + "Test result: ok. 1 passed; 0 failed; 0 ignored", + "test result: ok. 1 passed; 0 failed; 0 ignored", + "test result:ok. 1 passed; 0 failed; 0 ignored", + "test result: ok_2. 4 passed; 5 failed; 6 ignored", + "test result: o-k. 1 passed; 0 failed; 0 ignored", + "test result: ok. x passed; 0 failed; 0 ignored", + "test result: ok. -1 passed; 0 failed; 0 ignored", + "test result: ok. 1.5 passed; 0 failed; 0 ignored", + "test result: ok. 007 passed; 000 failed; 010 ignored", + "test result: test result: ok. 1 passed; 0 failed; 0 ignored", + "test result: ok. test result: ok. 2 passed; 0 failed; 0 ignored", + "test result: ok. 1 passed; 0 failed; 0 ignored test result: ok. 8 passed; 8 failed; 8 ignored", + "x test result: ok. 1 passed; 0 failed; 0 ignored; test result: FAILED. 2 passed; 3 failed; 4 ignored", + "test result: ok. 1 passed; 0 failed; 0 ignored\n\ntest result: ok. 2 passed; 0 failed; 0 ignored\n", + " Doc-tests t27b\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out", + "test result: ok. 1 passed; 0 failed; 0 ignored\x0b", + "test result: ok. 1 passed;\x0b0 failed; 0 ignored", + "test result: ok. 1 passed; 0 failed; 0 ignored\xc2\x85", + "\xc2\xa0test result: ok. 1 passed; 0 failed; 0 ignored", + "test result: ok. 5 passed; 1 failed; 2 ignored\ntest result: FAILED. 0 passed; 3 failed; 0 ignored", + "test result: ok. 0 passed; 0 failed; 1 ignored", + "running 0 tests\ntest result: ok. 0 passed; 0 failed; 0 ignored", + "test result: ok. 12 passed; 0 failed; 0 ignored\ntest result: ok. 3 passed; 0 failed; 3 ignored\ntest result: ok. 1 passed; 1 failed; 1 ignored", + "test result: ok. 1 passed; 0 failed; 0 ignored\xc3\xa9", + "test result: ok. 1 passed; 0 failed; 0 ignored\xe2\x80\xa8", + "running 5 tests\ntest a ... ok\ntest b ... FAILED\n\nfailures:\ntest result: FAILED. 3 passed; 2 failed; 0 ignored", + "test result: ok. 123456 passed; 7 failed; 99 ignored; 0 measured", + "noise 92\nnoise 0", + "test result: ok. 3 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.01s\ntest result: ok. 123456 passed; 7 failed; 99 ignored; 0 measured\nnoise 46", + "noise 93\nnoise 7\nnoise 47\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\nnoise 15\nnoise 13\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "noise 37\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\nnoise 98\nnoise 14\ntest result: ok. 123456 passed; 7 failed; 99 ignored; 0 measured\ntest result: ok. 123456 passed; 7 failed; 99 ignored; 0 measured", + "test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\nnoise 10\ntest result: FAILED. 10 passed; 2 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.50s\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\ntest result: ok. 3 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.01s\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\nnoise 8", + "noise 8\ntest result: ok. 3 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.01s\nnoise 4\nnoise 67\nnoise 15\ntest result: FAILED. 10 passed; 2 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.50s\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\nnoise 49", + "noise 48\nnoise 94\nnoise 47", + "test result: ok. 3 passed; 1 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.01s\ntest result: ok. 123456 passed; 7 failed; 99 ignored; 0 measured\ntest result: FAILED. 10 passed; 2 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.50s\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "noise 64\ntest result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s\ntest result: ok. 123456 passed; 7 failed; 99 ignored; 0 measured\nnoise 53\ntest result: FAILED. 10 passed; 2 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.50s", + "test result: FAILED. 10 passed; 2 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.50s\nnoise 51\ntest result: ok. 123456 passed; 7 failed; 99 ignored; 0 measured\ntest result: FAILED. 10 passed; 2 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.50s\nnoise 10\nnoise 87" +]; + +pub const TC_P : [62]u64 = [ + 0, 0, 0, 3, 0, 10, 123456, 13, 13, 3, 3, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, + 0, 0, 0, 7, 1, 2, 1, 1, 3, 0, 1, 0, 1, 1, 5, 0, 0, 16, 1, 1, 3, 123456, 0, 123459, 0, 0, 246912, + 13, 13, 0, 123469, 123466, 123476 +]; + +pub const TC_F : [62]u64 = [ + 0, 0, 0, 1, 0, 2, 7, 3, 3, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 0, 0, 2, 7, 0, 8, 0, 0, 14, 3, 3, 0, 10, 9, 11 +]; + +pub const TC_I : [62]u64 = [ + 0, 0, 0, 2, 0, 1, 99, 3, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 4, 0, 0, 0, 99, 0, 101, 0, 0, 198, 3, 3, 0, 102, 100, + 101 +]; + +pub const TC_S : [62]u64 = [ + 0, 0, 0, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 2, 1, 1, 0, 1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 0, 2, 1, 3, 3, 5, 3, 0, 4, 3, 3 +]; + +// T5: reference_one after the process ended -- 61 runs (exit code, stderr, stdout), the verdict and the detail +pub const TR_N : usize = 61; +pub const TR_RC : [61]i32 = [ + 0, 0, 0, 0, 1, 1, 2, -9, -9, 101, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 1, -9, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 1, 101, 0, 0, 101, -9, 0, 1 +]; + +pub const TR_ERR : [61]string = [ + "", + "", + "", + "", + "", + "boom\n", + "t27c: error: x\nmore\n", + "", + "killed\n", + "thread 'main' panicked at src/x.rs:1:1:\nmsg\n", + " \n \n\n", + "\n\n first\nsecond\n", + "first \nsecond\n", + " first \n", + "a\x0bb\nc", + "a\x0cb", + "a\x1cb", + "a\xc2\x85b", + "\xc2\x85a", + "a\xc2\xa0\n", + "\xc2\xa0\xc2\xa0a\xc2\xa0", + "a\xe2\x80\xa8b", + "\xe3\x80\x80a\xe3\x80\x80", + "\xe2\x80\xa9", + "a\xe2\x80\xa9b\xe2\x80\xa8c", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9", + " qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + "Resource temporarily unavailable", + "fork: Resource temporarily unavailable\n", + "error: SystemResources\n", + "x SystemResources y", + "SystemResources", + "systemresources", + "resource temporarily unavailable", + "Resource temporarily unavailable", + "SystemResource", + "Resource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\nResource temporarily unavailable\n", + "warning: unused\n", + "warning: unused\n", + "", + "", + "", + "", + "", + "", + "error: no such spec\n", + "", + "err 1\n", + " e2 \nmore", + "err 3\n", + " e4 \nmore", + "err 5\n", + "", + "", + "", + "err 9\n" +]; + +pub const TR_OUT : [61]string = [ + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n FAIL t2\n\n tests 2\n pass 1\n FAIL 1\n rate 50.0%\n", + " BLOCKED does not compile: spec.zig:20:16: error: use of undeclared identifier 'x'\n\n A blocked spec is not a failing one.\n", + "", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "", + "", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n FAIL t2\n\n tests 2\n pass 1\n FAIL 1\n rate 50.0%\n", + "--- test report: specs/lab/pass3.t27 ---\n BLOCKED zig not on PATH\n\n A blocked spec is not a failing one. It never produced a\n binary, so it has no per-test result to report.\n", + "t27c: BLOCKED: zig not on PATH\n", + " tests 3\n FAIL 0\n", + " tests 3\n FAIL 1\n", + "BLOCKED zig\n", + "--- test report: specs/lab/pass3.t27 ---\n BLOCKED zig not on PATH\n\n A blocked spec is not a failing one. It never produced a\n binary, so it has no per-test result to report.\n", + "", + " BLOCKED does not compile: spec.zig:20:16: error: use of undeclared identifier 'x'\n\n A blocked spec is not a failing one.\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n FAIL t2\n\n tests 2\n pass 1\n FAIL 1\n rate 50.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n FAIL t2\n\n tests 2\n pass 1\n FAIL 1\n rate 50.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "", + "--- test report: specs/a/b.t27 ---\n pass t1\n FAIL t2\n\n tests 2\n pass 1\n FAIL 1\n rate 50.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n", + "--- test report: specs/a/b.t27 ---\n pass t1\n FAIL t2\n\n tests 2\n pass 1\n FAIL 1\n rate 50.0%\n", + "", + "--- test report: specs/a/b.t27 ---\n pass t1\n pass t2\n pass t3\n\n tests 3\n pass 3\n FAIL 0\n rate 100.0%\n" +]; + +pub const TR_V : [61]u8 = [ + 0, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 11, 11, 11, 11, 11, 0, 0, 0, 0, 11, 0, 5, 2, 2, 0, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2 +]; + +pub const TR_D : [61]string = [ + "", + "1 of 2 tests fail", + "does not compile: spec.zig:20:16: error: use of undeclared identifier 'x'", + "unreadable test-report output", + "t27c test-report exited 1: ", + "t27c test-report exited 1: boom", + "t27c test-report exited 2: t27c: error: x", + "t27c test-report exited -9: ", + "t27c test-report exited -9: killed", + "t27c test-report exited 101: thread 'main' panicked at src/x.rs:1:1:", + "t27c test-report exited 1: ", + "t27c test-report exited 1: first", + "t27c test-report exited 1: first ", + "t27c test-report exited 1: first", + "t27c test-report exited 1: a", + "t27c test-report exited 1: a", + "t27c test-report exited 1: a", + "t27c test-report exited 1: a", + "t27c test-report exited 1: a", + "t27c test-report exited 1: a", + "t27c test-report exited 1: a", + "t27c test-report exited 1: a", + "t27c test-report exited 1: a", + "t27c test-report exited 1: ", + "t27c test-report exited 1: a", + "t27c test-report exited 1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "t27c test-report exited 1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "t27c test-report exited 1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "t27c test-report exited 1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "t27c test-report exited 1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "t27c test-report exited 1: caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9", + "t27c test-report exited 1: qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq", + "zig ran out of threads/processes in the container", + "zig ran out of threads/processes in the container", + "zig ran out of threads/processes in the container", + "zig ran out of threads/processes in the container", + "zig ran out of threads/processes in the container", + "", + "", + "", + "", + "zig ran out of threads/processes in the container", + "", + "1 of 2 tests fail", + "zig not on PATH", + "unreadable test-report output", + "", + "1 of 3 tests fail", + "zig", + "t27c test-report exited 2: ", + "t27c test-report exited 2: error: no such spec", + "does not compile: spec.zig:20:16: error: use of undeclared identifier 'x'", + "t27c test-report exited 1: err 1", + "t27c test-report exited 1: e2 ", + "t27c test-report exited 101: err 3", + "unreadable test-report output", + "1 of 2 tests fail", + "t27c test-report exited 101: ", + "t27c test-report exited -9: ", + "unreadable test-report output", + "t27c test-report exited 1: err 9" +]; + +// T5b: a run that could not start (the error text) and a run that outran its time (the seconds) +pub const SP_N : usize = 10; +pub const SP_ERR : [10]string = [ + "", + "[Errno 11] Resource temporarily unavailable", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9", + "[Errno 2] No such file or directory: '/work/target/release/t27c'", + "e\n", + " padded " +]; + +pub const SP_D : [10]string = [ + "could not start t27c: ", + "could not start t27c: [Errno 11] Resource temporarily unavailable", + "could not start t27c: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "could not start t27c: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "could not start t27c: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "could not start t27c: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "could not start t27c: caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9caf\xc3\xa9", + "could not start t27c: [Errno 2] No such file or directory: '/work/target/release/t27c'", + "could not start t27c: e\n", + "could not start t27c: padded " +]; + +pub const OV_N : usize = 6; +pub const OV_SECS : [6]u64 = [ + 0, 1, 30, 300, 301, 100000 +]; + +pub const OV_D : [6]string = [ + "over 0 s", + "over 1 s", + "over 30 s", + "over 300 s", + "over 301 s", + "over 100000 s" +]; + +// T6: the summary of a run -- 62 result sets (rows of five words: t27b code, reference code, compared, tests listed, +// retried), whether the reference dict is not empty, whether lab.py raises KeyError on them, the 17 summary +// fields (LR_NULL where the summary says null), and the summary block of the run document for the first LAYOUT of them +pub const TS_N : usize = 62; +pub const TS_LAYOUT : usize = 12; +pub const TS_ROWS : [1320]u32 = [ + 2, 0, 1, 0, 0, 7, 5, 1, 1, 1, 4, 5, 0, 0, 1, 7, 11, 0, 0, 0, 7, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 3, 2, 0, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 0, 0, 5, 5, 1, 0, + 1, 9, 4294967295, 0, 0, 0, 9, 2, 0, 0, 0, 6, 0, 0, 0, 0, 6, 4294967295, 0, 0, 0, 1, 11, 0, 0, 1, + 7, 4294967295, 0, 0, 0, 1, 4294967295, 0, 0, 0, 0, 4294967295, 0, 0, 1, 4, 4294967295, 0, 0, 0, + 1, 4294967295, 0, 0, 0, 9, 4294967295, 0, 0, 0, 2, 4294967295, 0, 0, 0, 8, 4294967295, 0, 0, 0, + 7, 4294967295, 0, 0, 0, 0, 4294967295, 0, 0, 1, 8, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 9, + 11, 0, 0, 0, 2, 0, 1, 1, 0, 3, 0, 1, 2, 0, 0, 11, 0, 0, 0, 0, 0, 1, 1, 0, 7, 0, 0, 0, 0, 9, 8, + 0, 0, 0, 1, 11, 0, 0, 0, 4, 0, 0, 0, 0, 7, 0, 0, 0, 0, 2, 8, 0, 0, 1, 8, 0, 0, 0, 0, 8, 0, 0, 0, + 1, 6, 5, 1, 1, 1, 5, 5, 0, 0, 1, 8, 5, 1, 0, 1, 4, 0, 1, 2, 0, 0, 0, 1, 0, 0, 7, 8, 0, 0, 0, 6, + 0, 0, 0, 0, 5, 8, 0, 0, 0, 1, 8, 0, 0, 0, 6, 8, 0, 0, 0, 0, 11, 0, 0, 0, 3, 5, 1, 1, 0, 0, 0, 1, + 1, 1, 6, 8, 0, 0, 0, 1, 8, 0, 0, 0, 5, 5, 1, 0, 0, 3, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 11, 0, 0, 0, + 3, 0, 1, 3, 0, 4, 8, 0, 0, 0, 8, 4294967295, 0, 0, 0, 2, 0, 0, 0, 0, 6, 4294967295, 0, 0, 0, 0, + 11, 0, 0, 0, 6, 5, 1, 2, 0, 7, 11, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 0, 1, 6, 4294967295, 0, 0, + 0, 2, 4294967295, 0, 0, 0, 6, 4294967295, 0, 0, 0, 0, 4294967295, 0, 0, 0, 1, 8, 0, 0, 0, 3, 8, + 0, 0, 0, 9, 0, 1, 3, 1, 9, 2, 0, 0, 0, 0, 0, 1, 2, 1, 0, 5, 1, 3, 0, 8, 8, 0, 0, 0, 9, 11, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 0, 0, 9, 0, 1, 2, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 1, 4294967295, 0, 0, 1, 9, 11, 0, 0, 0, 8, 2, 0, 0, 0, 7, 11, 0, 0, 0, 2, 8, 0, 0, + 0, 8, 8, 0, 0, 0, 6, 5, 1, 0, 0, 1, 2, 0, 0, 0, 2, 0, 1, 1, 0, 0, 8, 0, 0, 0, 0, 4294967295, 0, + 0, 0, 4, 8, 0, 0, 0, 9, 2, 0, 0, 0, 6, 0, 0, 0, 0, 7, 5, 1, 2, 0, 5, 8, 0, 0, 0, 1, 2, 0, 0, 0, + 5, 5, 0, 0, 0, 8, 4294967295, 0, 0, 0, 9, 4294967295, 0, 0, 0, 1, 4294967295, 0, 0, 1, 1, + 4294967295, 0, 0, 1, 1, 4294967295, 0, 0, 0, 1, 4294967295, 0, 0, 0, 2, 2, 0, 0, 0, 4, 11, 0, 0, + 0, 3, 8, 0, 0, 0, 0, 8, 0, 0, 0, 0, 2, 0, 0, 0, 4, 5, 0, 0, 0, 3, 0, 1, 2, 0, 9, 8, 0, 0, 0, 0, + 11, 0, 0, 0, 4, 0, 1, 1, 0, 9, 8, 0, 0, 0, 8, 0, 0, 0, 0, 6, 2, 0, 0, 0, 2, 0, 0, 0, 0, 6, 0, 1, + 0, 1, 4, 0, 1, 1, 1, 6, 0, 1, 2, 0, 9, 2, 0, 0, 0, 8, 0, 1, 1, 0, 7, 0, 1, 0, 0, 1, 8, 0, 0, 0, + 6, 11, 0, 0, 0, 0, 4294967295, 0, 0, 0, 5, 8, 0, 0, 1, 8, 5, 1, 1, 0, 6, 0, 1, 1, 0, 3, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 1, 9, 8, 0, 0, 0, 5, 8, 0, 0, 0, 8, 4294967295, 0, 0, 1, 6, 5, + 0, 0, 0, 1, 2, 0, 0, 0, 5, 8, 0, 0, 1, 0, 2, 0, 0, 0, 4, 0, 1, 2, 1, 0, 0, 1, 1, 0, 9, 0, 1, 2, + 0, 0, 0, 1, 3, 1, 6, 5, 1, 0, 0, 0, 8, 0, 0, 0, 1, 0, 1, 1, 0, 0, 5, 1, 2, 0, 4, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 4, 11, 0, 0, 1, 1, 0, 1, 1, 0, 7, 2, 0, 0, 0, 1, 4294967295, 0, 0, 1, 7, 4294967295, + 0, 0, 0, 0, 4294967295, 0, 0, 0, 7, 4294967295, 0, 0, 0, 0, 0, 1, 3, 0, 9, 5, 1, 2, 0, 9, 0, 1, + 0, 0, 5, 2, 0, 0, 0, 9, 8, 0, 0, 0, 0, 8, 0, 0, 0, 7, 11, 0, 0, 0, 2, 11, 0, 0, 1, 2, 0, 0, 0, + 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 4, 11, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 4294967295, 0, 0, 0, 8, 11, 0, 0, 0, 3, 11, 0, 0, + 0, 5, 8, 0, 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 8, 8, 0, 0, 0, 2, 0, 0, 0, 0, 6, 8, 0, 0, 0, 0, + 0, 1, 0, 0, 4, 2, 0, 0, 0, 0, 0, 1, 2, 1, 4, 11, 0, 0, 0, 0, 0, 1, 2, 0, 2, 5, 0, 0, 0, 5, 0, 1, + 0, 0, 1, 0, 1, 1, 0, 8, 0, 1, 0, 0, 6, 8, 0, 0, 0, 2, 0, 1, 1, 0, 8, 0, 1, 1, 0, 4, 8, 0, 0, 0, + 9, 0, 1, 2, 0, 7, 5, 0, 0, 1, 8, 5, 1, 0, 0, 5, 0, 1, 1, 0, 0, 0, 1, 4, 0, 6, 0, 1, 0, 0, 1, + 4294967295, 0, 0, 0, 7, 4294967295, 0, 0, 1, 6, 4294967295, 0, 0, 0, 9, 4294967295, 0, 0, 1, 4, + 4294967295, 0, 0, 0, 9, 4294967295, 0, 0, 0, 2, 4294967295, 0, 0, 0, 6, 4294967295, 0, 0, 1, 9, + 5, 1, 3, 0, 1, 0, 1, 1, 0, 5, 8, 0, 0, 0, 0, 0, 1, 1, 0, 7, 5, 1, 1, 0, 5, 8, 0, 0, 0, 1, 5, 0, + 0, 0, 2, 5, 1, 0, 0, 0, 2, 0, 0, 1, 8, 8, 0, 0, 0, 2, 0, 1, 0, 0, 9, 8, 0, 0, 0, 0, 0, 1, 1, 0, + 5, 0, 1, 0, 0, 8, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 3, 0, 1, 2, 0, 0, 0, 3, 5, 0, 0, 0, 7, 0, + 0, 0, 0, 4, 0, 1, 0, 0, 6, 0, 1, 1, 0, 0, 5, 1, 1, 1, 0, 5, 1, 0, 0, 2, 0, 1, 2, 0, 1, 0, 1, 3, + 0, 0, 0, 1, 1, 0, 5, 0, 0, 0, 0, 8, 5, 1, 1, 0, 4, 5, 1, 1, 0, 3, 8, 0, 0, 0, 0, 8, 0, 0, 0, 1, + 11, 0, 0, 1, 0, 0, 1, 2, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 7, 5, 0, 0, 0, 6, 0, 1, + 1, 0, 0, 11, 0, 0, 0, 7, 2, 0, 0, 0 +]; + +pub const TS_OFF : [63]usize = [ + 0, 2, 12, 13, 17, 18, 28, 31, 36, 44, 48, 49, 51, 56, 64, 68, 71, 73, 77, 79, 83, 86, 88, 89, + 93, 101, 106, 109, 110, 116, 122, 126, 130, 138, 140, 141, 142, 150, 156, 157, 163, 165, 169, + 175, 183, 188, 192, 195, 196, 200, 201, 204, 208, 209, 215, 223, 227, 237, 242, 247, 257, 262, + 264 +]; + +pub const TS_REF : [62]u8 = [ + 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 +]; + +pub const TS_CRASH : [62]u8 = [ + 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 +]; + +pub const TS_FIELDS : [1054]u64 = [ + 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 0, 1, 0, 1, 10, 3, 1, 5, 0, 1, 0, 4, 0, 0, 0, LR_NULL, + LR_NULL, 0, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, LR_NULL, LR_NULL, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, LR_NULL, LR_NULL, + 0, 0, 1, 0, 5, 3, 2, 2, 0, 1, 0, 1, 0, 0, 3, 3, 4, 0, 0, 0, 0, 8, 5, 1, 0, 1, 0, 0, 0, 0, 0, 0, + LR_NULL, LR_NULL, 0, 2, 2, 2, 4, 1, 0, 0, 0, 0, 0, 0, 1, 1, 3, 2, 3, 1, 0, 1, 3, 1, 1, 0, 1, 0, + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, LR_NULL, LR_NULL, 0, 1, 0, + 0, 5, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 8, 3, 1, 2, 1, 1, 0, 1, 1, 1, 3, 2, 4, 1, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 1, 0, 0, 0, 1, 1, 1, 1, 1, + 2, 0, 1, 0, 0, 2, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, LR_NULL, LR_NULL, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, LR_NULL, LR_NULL, 0, 0, 0, 0, + 4, 2, 0, 2, 0, 1, 0, 1, 0, 0, 3, 3, 8, 0, 0, 0, 2, 3, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, LR_NULL, + LR_NULL, 0, 0, 1, 0, 2, 2, 0, 2, 0, 2, 0, 0, 0, 0, 2, 1, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 1, 2, 0, 1, 0, + 0, 0, 1, 1, 2, 1, 1, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 1, 1, 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, LR_NULL, LR_NULL, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 1, 2, 0, 0, 0, 2, 0, 0, 0, + LR_NULL, LR_NULL, 0, 0, 0, 0, 4, 2, 1, 1, 0, 0, 0, 1, 0, 0, 2, 2, 3, 0, 0, 0, 0, 4, 2, 0, 0, 0, + 0, 0, 0, 1, 1, 0, LR_NULL, LR_NULL, 0, 0, 1, 0, 8, 5, 1, 0, 1, 0, 0, 0, 3, 3, 5, 3, 4, 0, 1, 1, + 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 6, 4, 0, 3, 0, 2, 0, 1, 0, 0, 4, 4, 8, 1, 0, 0, 3, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 6, 2, 1, 3, 1, 0, 1, 3, 0, 0, 2, 2, 3, 0, 0, 0, 1, 2, 1, 0, 0, 1, 0, 1, 0, + 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 2, 0, 2, 0, 1, + 0, 1, 0, 0, 3, 2, 5, 1, 0, 0, 0, 8, 4, 3, 4, 0, 3, 0, 1, 0, 0, 0, LR_NULL, LR_NULL, 0, 1, 0, 2, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 2, 1, 0, 0, 0, 1, 0, 0, 0, LR_NULL, + LR_NULL, 1, 0, 1, 0, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, LR_NULL, LR_NULL, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, LR_NULL, LR_NULL, 0, 0, 0, 0, 4, 2, 1, 2, 0, 2, 0, 0, 0, 0, 2, 1, 2, 0, 0, + 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 0, 0, 0, 3, 2, 0, 0, 1, 0, 1, 0, 0, 0, 2, 1, 1, + 1, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 0, 1, 1, 3, 2, 2, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + LR_NULL, LR_NULL, 0, 0, 0, 0, 6, 4, 0, 1, 0, 1, 0, 0, 1, 1, 5, 3, 7, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 2, 0, 1, 1, 1, 1, 0, 0, 0, 3, 3, 5, 1, 0, 0, 0, 10, 3, 0, + 2, 1, 1, 0, 1, 0, 0, 5, 2, 2, 2, 1, 1, 1, 5, 3, 0, 2, 1, 2, 0, 0, 0, 0, 3, 3, 5, 0, 0, 1, 0, 5, + 3, 0, 2, 0, 0, 0, 2, 1, 1, 4, 2, 2, 0, 1, 0, 1, 10, 5, 1, 3, 2, 2, 1, 1, 0, 0, 6, 6, 10, 1, 0, + 1, 1, 5, 3, 0, 2, 0, 2, 0, 0, 1, 1, 2, 2, 2, 0, 1, 1, 1, 2, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, + LR_NULL, LR_NULL, 0, 1, 0, 0 +]; + +pub const TS_TXT : [12]string = [ + " \"summary\": {\n \"files\": 2,\n \"reference_pass\": 1,\n \"reference_lab_error\": 0,\n \"t27b_pass\": 0,\n \"t27b_pass_vacuous\": 0,\n \"t27b_pass_where_reference_passes\": 0,\n \"t27b_pass_vacuous_where_reference_passes\": 0,\n \"t27b_pass_where_reference_does_not\": 0,\n \"mismatch\": 0,\n \"jit_interp_mismatch\": 0,\n \"reference_compared\": 2,\n \"reference_disagree\": 1,\n \"reference_disagree_tests\": 1,\n \"t27b_fail\": 0,\n \"crash\": 1,\n \"timeout\": 0,\n \"timeout_retried\": 1\n },\n", + " \"summary\": {\n \"files\": 10,\n \"reference_pass\": 3,\n \"reference_lab_error\": 1,\n \"t27b_pass\": 5,\n \"t27b_pass_vacuous\": 0,\n \"t27b_pass_where_reference_passes\": 1,\n \"t27b_pass_vacuous_where_reference_passes\": 0,\n \"t27b_pass_where_reference_does_not\": 4,\n \"mismatch\": 0,\n \"jit_interp_mismatch\": 0,\n \"reference_compared\": 0,\n \"reference_disagree\": null,\n \"reference_disagree_tests\": null,\n \"t27b_fail\": 0,\n \"crash\": 2,\n \"timeout\": 1,\n \"timeout_retried\": 1\n },\n", + " \"summary\": {\n \"files\": 1,\n \"reference_pass\": 0,\n \"reference_lab_error\": 0,\n \"t27b_pass\": 0,\n \"t27b_pass_vacuous\": 0,\n \"t27b_pass_where_reference_passes\": 0,\n \"t27b_pass_vacuous_where_reference_passes\": 0,\n \"t27b_pass_where_reference_does_not\": 0,\n \"mismatch\": 0,\n \"jit_interp_mismatch\": 0,\n \"reference_compared\": 1,\n \"reference_disagree\": 0,\n \"reference_disagree_tests\": 0,\n \"t27b_fail\": 1,\n \"crash\": 0,\n \"timeout\": 0,\n \"timeout_retried\": 1\n },\n", + "", + " \"summary\": {\n \"files\": 1,\n \"reference_pass\": 0,\n \"reference_lab_error\": 1,\n \"t27b_pass\": 0,\n \"t27b_pass_vacuous\": 1,\n \"t27b_pass_where_reference_passes\": 0,\n \"t27b_pass_vacuous_where_reference_passes\": 0,\n \"t27b_pass_where_reference_does_not\": 0,\n \"mismatch\": 0,\n \"jit_interp_mismatch\": 0,\n \"reference_compared\": 0,\n \"reference_disagree\": null,\n \"reference_disagree_tests\": null,\n \"t27b_fail\": 0,\n \"crash\": 0,\n \"timeout\": 0,\n \"timeout_retried\": 1\n },\n", + "", + " \"summary\": {\n \"files\": 3,\n \"reference_pass\": 2,\n \"reference_lab_error\": 0,\n \"t27b_pass\": 1,\n \"t27b_pass_vacuous\": 1,\n \"t27b_pass_where_reference_passes\": 1,\n \"t27b_pass_vacuous_where_reference_passes\": 1,\n \"t27b_pass_where_reference_does_not\": 0,\n \"mismatch\": 0,\n \"jit_interp_mismatch\": 0,\n \"reference_compared\": 0,\n \"reference_disagree\": null,\n \"reference_disagree_tests\": null,\n \"t27b_fail\": 0,\n \"crash\": 0,\n \"timeout\": 1,\n \"timeout_retried\": 0\n },\n", + " \"summary\": {\n \"files\": 5,\n \"reference_pass\": 3,\n \"reference_lab_error\": 2,\n \"t27b_pass\": 2,\n \"t27b_pass_vacuous\": 0,\n \"t27b_pass_where_reference_passes\": 1,\n \"t27b_pass_vacuous_where_reference_passes\": 0,\n \"t27b_pass_where_reference_does_not\": 1,\n \"mismatch\": 0,\n \"jit_interp_mismatch\": 0,\n \"reference_compared\": 3,\n \"reference_disagree\": 3,\n \"reference_disagree_tests\": 4,\n \"t27b_fail\": 0,\n \"crash\": 0,\n \"timeout\": 0,\n \"timeout_retried\": 0\n },\n", + " \"summary\": {\n \"files\": 8,\n \"reference_pass\": 5,\n \"reference_lab_error\": 1,\n \"t27b_pass\": 0,\n \"t27b_pass_vacuous\": 1,\n \"t27b_pass_where_reference_passes\": 0,\n \"t27b_pass_vacuous_where_reference_passes\": 0,\n \"t27b_pass_where_reference_does_not\": 0,\n \"mismatch\": 0,\n \"jit_interp_mismatch\": 0,\n \"reference_compared\": 0,\n \"reference_disagree\": null,\n \"reference_disagree_tests\": null,\n \"t27b_fail\": 0,\n \"crash\": 2,\n \"timeout\": 2,\n \"timeout_retried\": 2\n },\n", + " \"summary\": {\n \"files\": 4,\n \"reference_pass\": 1,\n \"reference_lab_error\": 0,\n \"t27b_pass\": 0,\n \"t27b_pass_vacuous\": 0,\n \"t27b_pass_where_reference_passes\": 0,\n \"t27b_pass_vacuous_where_reference_passes\": 0,\n \"t27b_pass_where_reference_does_not\": 0,\n \"mismatch\": 1,\n \"jit_interp_mismatch\": 1,\n \"reference_compared\": 3,\n \"reference_disagree\": 2,\n \"reference_disagree_tests\": 3,\n \"t27b_fail\": 1,\n \"crash\": 0,\n \"timeout\": 1,\n \"timeout_retried\": 3\n },\n", + " \"summary\": {\n \"files\": 1,\n \"reference_pass\": 1,\n \"reference_lab_error\": 0,\n \"t27b_pass\": 1,\n \"t27b_pass_vacuous\": 0,\n \"t27b_pass_where_reference_passes\": 1,\n \"t27b_pass_vacuous_where_reference_passes\": 0,\n \"t27b_pass_where_reference_does_not\": 0,\n \"mismatch\": 0,\n \"jit_interp_mismatch\": 0,\n \"reference_compared\": 1,\n \"reference_disagree\": 0,\n \"reference_disagree_tests\": 0,\n \"t27b_fail\": 0,\n \"crash\": 0,\n \"timeout\": 0,\n \"timeout_retried\": 0\n },\n", + " \"summary\": {\n \"files\": 2,\n \"reference_pass\": 1,\n \"reference_lab_error\": 0,\n \"t27b_pass\": 0,\n \"t27b_pass_vacuous\": 0,\n \"t27b_pass_where_reference_passes\": 0,\n \"t27b_pass_vacuous_where_reference_passes\": 0,\n \"t27b_pass_where_reference_does_not\": 0,\n \"mismatch\": 1,\n \"jit_interp_mismatch\": 1,\n \"reference_compared\": 0,\n \"reference_disagree\": null,\n \"reference_disagree_tests\": null,\n \"t27b_fail\": 0,\n \"crash\": 1,\n \"timeout\": 0,\n \"timeout_retried\": 0\n },\n" +]; + +// T6b: a run where only the reference ran: files, passes, the summary block +pub const RS_N : usize = 11; +pub const RS_FILES : [11]u64 = [ + 1, 1, 5, 10, 100, 2000, 3, 7, 12, 40, 999 +]; + +pub const RS_PASS : [11]u64 = [ + 1, 0, 3, 10, 7, 1752, 0, 7, 5, 39, 998 +]; + +pub const RS_TXT : [11]string = [ + " \"summary\": {\n \"files\": 1,\n \"reference_pass\": 1,\n \"t27b_pass\": null\n },\n", + " \"summary\": {\n \"files\": 1,\n \"reference_pass\": 0,\n \"t27b_pass\": null\n },\n", + " \"summary\": {\n \"files\": 5,\n \"reference_pass\": 3,\n \"t27b_pass\": null\n },\n", + " \"summary\": {\n \"files\": 10,\n \"reference_pass\": 10,\n \"t27b_pass\": null\n },\n", + " \"summary\": {\n \"files\": 100,\n \"reference_pass\": 7,\n \"t27b_pass\": null\n },\n", + " \"summary\": {\n \"files\": 2000,\n \"reference_pass\": 1752,\n \"t27b_pass\": null\n },\n", + " \"summary\": {\n \"files\": 3,\n \"reference_pass\": 0,\n \"t27b_pass\": null\n },\n", + " \"summary\": {\n \"files\": 7,\n \"reference_pass\": 7,\n \"t27b_pass\": null\n },\n", + " \"summary\": {\n \"files\": 12,\n \"reference_pass\": 5,\n \"t27b_pass\": null\n },\n", + " \"summary\": {\n \"files\": 40,\n \"reference_pass\": 39,\n \"t27b_pass\": null\n },\n", + " \"summary\": {\n \"files\": 999,\n \"reference_pass\": 998,\n \"t27b_pass\": null\n },\n" +]; + + +test the_report_verdict_and_detail_equal_the_pythons_on_every_input { + var out : [4096]u8 = undefined; + var i : usize = 0; + while (i < RT_N) { + assert lr_report_verdict(RT_IN[i]) == RT_V[i]; + const w : usize = lr_report_detail(RT_IN[i], &out, 4096, 0); + assert lx_out_is(&out, w, RT_D[i]) == true; + i = i + 1; + } +} + +test the_per_test_tables_equal_the_pythons_on_every_input { + var tab : [192]u32 = undefined; + var out : [4096]u8 = undefined; + var i : usize = 0; + while (i < TV_N) { + const n : u32 = lr_verdicts(TV_IN[i], &tab, LR_TABLE); + assert n == TV_COUNT[i]; + if (n != LR_NONE) { + const w : usize = lr_table_text(TV_IN[i], &tab, n as usize, &out, 4096, 0); + assert lx_out_is(&out, w, TV_TXT[i]) == true; + } + i = i + 1; + } +} + +test the_disagreement_lines_equal_the_pythons_on_every_pair { + var ta : [192]u32 = undefined; + var tb : [192]u32 = undefined; + var out : [4096]u8 = undefined; + var i : usize = 0; + while (i < TD_N) { + const na : u32 = lr_verdicts(TD_A[i], &ta, LR_TABLE); + const nb : u32 = lr_verdicts(TD_B[i], &tb, LR_TABLE); + assert na != LR_NONE; + assert nb != LR_NONE; + const w : usize = lr_disagreements(TD_A[i], &ta, na as usize, TD_B[i], &tb, nb as usize, &out, 4096); + assert lx_out_is(&out, w, TD_OUT[i]) == true; + i = i + 1; + } +} + +test the_cargo_totals_equal_the_pythons_on_every_output { + var tot : [4]u64 = undefined; + var i : usize = 0; + while (i < TC_N) { + lr_cargo_totals(TC_IN[i], &tot); + assert tot[0] == TC_P[i]; + assert tot[1] == TC_F[i]; + assert tot[2] == TC_I[i]; + assert tot[3] == TC_S[i]; + i = i + 1; + } +} + +test the_reference_verdict_and_detail_equal_the_pythons_on_every_run { + var out : [4096]u8 = undefined; + var i : usize = 0; + while (i < TR_N) { + assert lr_ref_verdict(TR_RC[i], TR_ERR[i], TR_OUT[i]) == TR_V[i]; + const w : usize = lr_ref_detail(TR_RC[i], TR_ERR[i], TR_OUT[i], &out, 4096, 0); + assert lx_out_is(&out, w, TR_D[i]) == true; + i = i + 1; + } +} + +test the_spawn_and_timeout_details_equal_the_pythons { + var out : [4096]u8 = undefined; + var i : usize = 0; + while (i < SP_N) { + const w : usize = lr_spawn_detail(SP_ERR[i], &out, 4096, 0); + assert lx_out_is(&out, w, SP_D[i]) == true; + i = i + 1; + } + var j : usize = 0; + while (j < OV_N) { + const w : usize = lr_over_detail(OV_SECS[j], &out, 4096, 0); + assert lx_out_is(&out, w, OV_D[j]) == true; + j = j + 1; + } +} + +test the_summary_block_equals_the_pythons_and_a_result_without_a_reference_is_the_crash { + var out : [4096]u8 = undefined; + var i : usize = 0; + while (i < TS_N) { + const a : usize = TS_OFF[i] * 5; + const b : usize = TS_OFF[i + 1] * 5; + const n : usize = TS_OFF[i + 1] - TS_OFF[i]; + const crash : bool = lr_summary_crash(TS_ROWS[a..b], n); + assert crash == (TS_CRASH[i] == 1); + if (crash == false) { + var k : usize = 0; + while (k < 17) { + assert lr_summary_field(TS_ROWS[a..b], n, TS_REF[i] == 1, k) == TS_FIELDS[17 * i + k]; + k = k + 1; + } + if (i < TS_LAYOUT) { + const w : usize = lr_put_summary(TS_ROWS[a..b], n, TS_REF[i] == 1, &out, 4096, 0); + assert lx_out_is(&out, w, TS_TXT[i]) == true; + } + } + i = i + 1; + } +} + +test the_reference_only_summary_equals_the_pythons { + var out : [4096]u8 = undefined; + var i : usize = 0; + while (i < RS_N) { + const w : usize = lr_put_reference_summary(RS_FILES[i], RS_PASS[i], &out, 4096, 0); + assert lx_out_is(&out, w, RS_TXT[i]) == true; + i = i + 1; + } +} +// END GENERATED diff --git a/specs/lab/lab_t27b_run.t27 b/specs/lab/lab_t27b_run.t27 new file mode 100644 index 0000000000..888dd4883f --- /dev/null +++ b/specs/lab/lab_t27b_run.t27 @@ -0,0 +1,1791 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/lab/lab_t27b_run.t27 -- the decisions of one t27b lab run and of its loop that are not about a spec: whether a +; run settles its commit, which lane requests run, what the loop asks the judge, how the ratchet process is read, and +; what the index of runs says after a publish (issue #11042, epic #11040). +; -- +; The oracle is contrib/railway/t27b-lab/lab.py, imported unedited: run_done, admitted (run with master's real judge, +; `t27c corpus-receipt admit`, and with git's answers replaced by the text in the case), the two statements of main() +; that ask the judge for the next step and read its answer (taken out of lab.py's own source and run), ratchet (with the +; checker's process replaced by the case's exit code, stderr and stdout) and publish (its files in a scratch directory, +; a series of runs for two commits). The tables at the end hold every case and its answer; 0 differences. +; -- +; PORTED, lab.py name -> here: +; run_done lt_run_done +; admitted lt_admit (the judge is verified/corpus_receipt.t27's request_verdict and request_exit, +; called here instead of as a process), lt_facts, lt_has_word, lt_age_u32 +; main(), the judge's schedule lt_schedule_facts, lt_schedule_next +; ratchet(doc, log), the process lt_step_kind, lt_step_ok, lt_step_error (the checker's verdict is read in +; lab_t27b_ratchet.t27) +; publish lt_index_publish, lt_run_path +; LEFT OUT, and why: the HTTP server, the clone and the checkout, the build and run steps, the receipt and ddc steps and +; every `run()` (they start processes or serve files: the runtime, #11040 L3). Nothing here names a host: a lab that is a +; job run by any node (#11043) asks the same questions. +; -- +; admitted() asks each request in the order they were written. A request the judge drops (exit 1) is deleted and does +; not count among the waiting; every other one does, so the ninth request not dropped is refused as the queue is full. +; An age below zero (a clock that stepped back) reads as expired, as the judge does. +; WHERE THE SPEC DIFFERS FROM THE PYTHON: the output of the checker is taken to be json.dumps(indent=1)'s layout, which +; is what t27b.py writes; compact JSON is not read (lt_step_kind then says it is unparsable). The index is rewritten from +; the layout json.dumps(indent=1) wrote, and the sha is the hex text git gives, which needs no escape. +; ASCII only (L3). phi^2 + 1/phi^2 = 3 | TRINITY + +module LabT27bRun; + +use lab::text::{LAB_NO, lab_line_end, lab_line_next, lab_strip_from, lab_strip_to, lab_has_lit, lab_same_span, lab_cut_chars, lab_space_len, lab_put_span, lab_put_lit, lab_put_count}; +use lab::lab_t27b_text::{lx_put_idec, lx_out_is}; +use tri::lab::receipt::{span_is, line_is, key_at, value_from, value_to, results_at}; +use verified::corpus_receipt::request_verdict; +use verified::corpus_receipt::request_exit; + +// ---- run_done: does a published run settle its commit ---- + +/// Where the closing line of the object that opens at v (a `{` that ends its line) in indent `ind` starts; t.len when none does. +pub fn lt_close_at(t : string, v : usize, ind : usize) -> usize { + var k : usize = lab_line_end(t, v) + 1; + while (k < t.len) { + const e : usize = lab_line_end(t, k); + if (line_is(t, k, e, ind, "}")) { return k; } + k = lab_line_next(t, e); + } + return t.len; +} + +/// run_done(doc): a run whose checkout failed measured nothing, and the next poll tries its commit again. True +/// unless the run document says `"ok": false` for steps.checkout. A document with no steps, no checkout or no +/// text at all settles its commit (it is read as `{}`). +pub fn lt_run_done(doc : string) -> bool { + const sv : usize = key_at(doc, 0, results_at(doc), 1, "steps"); + if (sv >= doc.len) { return true; } + if (doc[sv] != 123) { return true; } + if (sv + 1 < doc.len and doc[sv + 1] == 125) { return true; } + const from : usize = lab_line_end(doc, sv) + 1; + const cv : usize = key_at(doc, from, lt_close_at(doc, sv, 1), 2, "checkout"); + if (cv >= doc.len) { return true; } + if (doc[cv] != 123) { return true; } + if (cv + 1 < doc.len and doc[cv + 1] == 125) { return true; } + const ov : usize = key_at(doc, lab_line_end(doc, cv) + 1, lt_close_at(doc, cv, 2), 3, "ok"); + if (ov >= doc.len or doc[ov] == 34) { return true; } + return span_is(doc, value_from(doc, ov), value_to(doc, ov), "false") == false; +} + +// ---- admitted: which lane requests the lab runs ---- +; A request is a file in the lab's requests directory, named by a commit's sha. admitted() takes them oldest +; first, asks the judge (master's t27c, specs/verified/corpus_receipt.t27 request_verdict) about each with the +; facts `age,waiting,known` and keeps the answer: exit 1 drops the request (it is deleted), exit 0 admits it, any +; other exit leaves it waiting; every request not dropped counts in `waiting` for the ones after it. `known` is +; whether the name is one of the words of what git said (the heads of origin, the fetch, master's first-parent +; line). The judge is asked here as a function (request_verdict and request_exit), not as a process. + +/// `name in text.split()`: is name one of the words of text. +pub fn lt_has_word(text : string, name : string) -> bool { + var i : usize = 0; + while (i < text.len) { + const n : usize = lab_space_len(text, i, text.len); + if (n > 0) { + i = i + n; + } else { + var e : usize = i; + while (e < text.len and lab_space_len(text, e, text.len) == 0) { + e = e + 1; + } + if (lab_same_span(text, i, e, name, 0, name.len)) { return true; } + i = e; + } + } + return false; +} + +/// An age as the judge reads it: a request from the future (a clock that stepped back) or older than u32 is expired. +pub fn lt_age_u32(age : i64) -> u32 { + if (age < 0 or age > 4294967295) { return 4294967295; } + return age as u32; +} + +/// The facts line the judge is given: `age,waiting,known` with known as 0 or 1. +pub fn lt_facts(age : i64, waiting : usize, known : bool, out : []u8, cap : usize, w : usize) -> usize { + var x : usize = lx_put_idec(out, cap, w, age); + x = lab_put_lit(out, cap, x, ","); + x = lab_put_count(out, cap, x, waiting as u64); + if (known) { return lab_put_lit(out, cap, x, ",1"); } + return lab_put_lit(out, cap, x, ",0"); +} + +/// The start of line k of text (lines as splitlines gives them); t.len when there is no such line. +pub fn lt_line_start(t : string, k : usize) -> usize { + var at : usize = 0; + var n : usize = 0; + while (at < t.len) { + if (n == k) { return at; } + at = lab_line_next(t, lab_line_end(t, at)); + n = n + 1; + } + return t.len; +} + +/// What admitted() does with n requests whose names are the lines of names (in the order the directory lists +/// them): keys[i] is when request i was written (its order), ages[i] how many seconds ago it was, known the text +/// git printed. act[i] gets 0 for a request that runs, 1 for one that is dropped, 2 for one that waits; +/// adm gets the indexes of the requests that run, oldest first; ord is room for n words. The judge's facts +/// lines are written at facts[cur[0]..] (cur[0] moves on), one per request asked about, oldest first. Returns +/// how many requests run. +pub fn lt_admit(names : string, keys : []const u64, ages : []const i64, n : usize, known : string, ord : []u32, act : []u8, adm : []u32, facts : []u8, fcap : usize, cur : []usize) -> usize { + var m : usize = 0; + var i : usize = 0; + while (i < n) { + var j : usize = m; + while (j > 0 and keys[ord[j - 1] as usize] > keys[i]) { + ord[j] = ord[j - 1]; + j = j - 1; + } + ord[j] = i as u32; + m = m + 1; + i = i + 1; + } + var waiting : usize = 0; + var run : usize = 0; + var k : usize = 0; + while (k < n) { + const q : usize = ord[k] as usize; + const s : usize = lt_line_start(names, q); + const e : usize = lab_line_end(names, s); + const on_origin : bool = lt_has_word(known, names[s..e]); + cur[0] = lt_facts(ages[q], waiting, on_origin, facts, fcap, cur[0]); + cur[0] = lab_put_lit(facts, fcap, cur[0], "\n"); + const code : u8 = request_exit(request_verdict(names[s..e], lt_age_u32(ages[q]), waiting as u32, on_origin)); + if (code == 1) { + act[q] = 1; + } else { + waiting = waiting + 1; + if (code == 0) { + act[q] = 0; + adm[run] = q as u32; + run = run + 1; + } else { + act[q] = 2; + } + } + k = k + 1; + } + return run; +} + +// ---- the loop's two lines about the judge ---- + +/// The facts the lab hands the judge's `schedule`: `moved,ready,count` with moved as 0 or 1 and count the word the judge gave last time. +pub fn lt_schedule_facts(moved : bool, ready : u64, count : string, out : []u8, cap : usize, w : usize) -> usize { + var x : usize = w; + if (moved) { + x = lab_put_lit(out, cap, x, "1,"); + } else { + x = lab_put_lit(out, cap, x, "0,"); + } + x = lab_put_count(out, cap, x, ready); + x = lab_put_lit(out, cap, x, ","); + return lab_put_lit(out, cap, x, count); +} + +pub const LT_NEXT_MASTER : u8 = 0; +pub const LT_NEXT_REQUEST : u8 = 1; +pub const LT_NEXT_IDLE : u8 = 2; +pub const LT_NEXT_OTHER : u8 = 3; +pub const LT_NEXT_ERROR : u8 = 4; + +/// `nxt, count = (judge's words if there is a judge else []) or ("MASTER", "0")`: the step the judge names, and +/// in sp[0], sp[1] where its count word is in stdout (LAB_NO for the default "0"). LT_NEXT_ERROR when the judge +/// printed one word or more than two (the unpacking raises and the loop reports an error); LT_NEXT_OTHER for a +/// first word that is none of MASTER, REQUEST and IDLE (the loop then runs nothing and does not sleep). +pub fn lt_schedule_next(stdout : string, judge_exists : bool, sp : []usize) -> u8 { + sp[0] = LAB_NO; + sp[1] = LAB_NO; + if (judge_exists == false) { return LT_NEXT_MASTER; } + var words : usize = 0; + var wf : [2]usize = [0, 0]; + var we : [2]usize = [0, 0]; + var i : usize = 0; + while (i < stdout.len) { + const n : usize = lab_space_len(stdout, i, stdout.len); + if (n > 0) { + i = i + n; + } else { + var e : usize = i; + while (e < stdout.len and lab_space_len(stdout, e, stdout.len) == 0) { + e = e + 1; + } + if (words < 2) { + wf[words] = i; + we[words] = e; + } + words = words + 1; + i = e; + } + } + if (words == 0) { return LT_NEXT_MASTER; } + if (words != 2) { return LT_NEXT_ERROR; } + sp[0] = wf[1]; + sp[1] = we[1]; + if (lab_same_span(stdout, wf[0], we[0], "MASTER", 0, 6)) { return LT_NEXT_MASTER; } + if (lab_same_span(stdout, wf[0], we[0], "REQUEST", 0, 7)) { return LT_NEXT_REQUEST; } + if (lab_same_span(stdout, wf[0], we[0], "IDLE", 0, 4)) { return LT_NEXT_IDLE; } + return LT_NEXT_OTHER; +} + +// ---- the ratchet step of a run ---- +; lab.py's ratchet(doc, log) runs the commit's own checker (`scripts/tri_loop/t27b.py ratchet --json`) and +; records what happened. The checker's verdict is read in lab_t27b_ratchet.t27; what is decided here is how the +; lab reads the process. + +pub const LT_STEP_NO_FILES : u8 = 0; +pub const LT_STEP_NOT_RUN : u8 = 1; +pub const LT_STEP_NO_RATCHET : u8 = 2; +pub const LT_STEP_UNPARSABLE : u8 = 3; +pub const LT_STEP_JUDGED : u8 = 4; + +/// What `ok` is in the step's record: false, true, or null. +pub const LT_OK_FALSE : u8 = 0; +pub const LT_OK_TRUE : u8 = 1; +pub const LT_OK_NULL : u8 = 2; + +/// Is stdout the checker's JSON: an object in json.dumps(indent=1)'s layout with a `verdict` at the top. +pub fn lt_checker_json(stdout : string) -> bool { + var at : usize = 0; + while (at < stdout.len and (stdout[at] == 32 or stdout[at] == 10 or stdout[at] == 9 or stdout[at] == 13)) { + at = at + 1; + } + if (at >= stdout.len or stdout[at] != 123) { return false; } + return key_at(stdout, 0, stdout.len, 1, "verdict") <= stdout.len; +} + +/// The verdict word of the checker's JSON: where it starts and ends in sp; false when there is none that is text. +pub fn lt_checker_verdict(stdout : string, sp : []usize) -> bool { + const v : usize = key_at(stdout, 0, stdout.len, 1, "verdict"); + if (v >= stdout.len or stdout[v] != 34) { return false; } + sp[0] = value_from(stdout, v); + sp[1] = value_to(stdout, v); + return true; +} + +/// How the lab reads the process: files_ok is that the commit has the checker and the ledger, ran that the process +/// started and ended, rc its exit code. +pub fn lt_step_kind(files_ok : bool, ran : bool, rc : i32, stderr : string, stdout : string) -> u8 { + if (files_ok == false) { return LT_STEP_NO_FILES; } + if (ran == false) { return LT_STEP_NOT_RUN; } + if (rc == 2 and lab_has_lit(stderr, 0, stderr.len, "invalid choice")) { return LT_STEP_NO_RATCHET; } + if (lt_checker_json(stdout) == false) { return LT_STEP_UNPARSABLE; } + return LT_STEP_JUDGED; +} + +/// The step's `ok`: null when the commit has no checker or ledger or its checker has no ratchet (never green), +/// false when the process did not run or said nothing readable, and for a judged run true only for exit 0 and the +/// verdict green. +pub fn lt_step_ok(kind : u8, rc : i32, stdout : string) -> u8 { + if (kind == LT_STEP_NO_FILES or kind == LT_STEP_NO_RATCHET) { return LT_OK_NULL; } + if (kind != LT_STEP_JUDGED) { return LT_OK_FALSE; } + var sp : [2]usize = undefined; + if (rc == 0 and lt_checker_verdict(stdout, &sp)) { + if (span_is(stdout, sp[0], sp[1], "green")) { return LT_OK_TRUE; } + } + return LT_OK_FALSE; +} + +/// The step's `error` for output that is not the checker's JSON: stderr stripped, or stdout stripped when stderr is +/// empty after it, cut at 300 characters. +pub fn lt_step_error(stderr : string, stdout : string, out : []u8, cap : usize, w : usize) -> usize { + var t : string = stderr; + if (lab_strip_from(stderr, 0, stderr.len) == stderr.len) { t = stdout; } + const a : usize = lab_strip_from(t, 0, t.len); + const b : usize = lab_strip_to(t, a, t.len); + return lab_put_span(out, cap, w, t, a, lab_cut_chars(t, a, b, 300)); +} + +// ---- where a run is published ---- + +/// The path of a run's files: /runs/SHA + .json (0), .log (1) or .receipt.json (2). +pub fn lt_run_path(sha : string, kind : u8, out : []u8, cap : usize, w : usize) -> usize { + var x : usize = lab_put_lit(out, cap, w, "/runs/"); + x = lab_put_lit(out, cap, x, sha); + if (kind == 1) { return lab_put_lit(out, cap, x, ".log"); } + if (kind == 2) { return lab_put_lit(out, cap, x, ".receipt.json"); } + return lab_put_lit(out, cap, x, ".json"); +} + +// ---- publish: the index of the runs ---- +; publish() writes the run, then reads runs/index.json, drops the entries of the same commit, puts a new entry first +; and writes the list back with json.dumps(indent=1). The entry is the commit, the run's ref, started, finished, +; its summary and the paths of its two files. The old index is read in the layout it was written in (one object a +; line group at indent 1, its keys at indent 2); the sha is taken as the hex text git gives, which needs no escape. + +/// The value of a top-level key of the run document as written, without its trailing comma: sp[0], sp[1]. +pub fn lt_doc_raw(doc : string, key : string, sp : []usize) -> bool { + const v : usize = key_at(doc, 0, results_at(doc), 1, key); + if (v >= doc.len) { return false; } + var e : usize = lab_line_end(doc, v); + if (e > v and doc[e - 1] == 44) { e = e - 1; } + sp[0] = v; + sp[1] = e; + return true; +} + +/// publish's index after it, written at w: the new entry of run document doc for commit sha, then the entries of +/// old that are not of sha, in their order. LAB_NO when the document has no ref, started or finished. +pub fn lt_index_publish(old : string, doc : string, sha : string, out : []u8, cap : usize, w : usize) -> usize { + var rf : [2]usize = undefined; + var st : [2]usize = undefined; + var fi : [2]usize = undefined; + if (lt_doc_raw(doc, "ref", &rf) == false or lt_doc_raw(doc, "started", &st) == false or lt_doc_raw(doc, "finished", &fi) == false) { return LAB_NO; } + var x : usize = lab_put_lit(out, cap, w, "[\n {\n \"commit\": \""); + x = lab_put_lit(out, cap, x, sha); + x = lab_put_lit(out, cap, x, "\",\n \"ref\": "); + x = lab_put_span(out, cap, x, doc, rf[0], rf[1]); + x = lab_put_lit(out, cap, x, ",\n \"started\": "); + x = lab_put_span(out, cap, x, doc, st[0], st[1]); + x = lab_put_lit(out, cap, x, ",\n \"finished\": "); + x = lab_put_span(out, cap, x, doc, fi[0], fi[1]); + x = lab_put_lit(out, cap, x, ",\n \"summary\": "); + const sv : usize = key_at(doc, 0, results_at(doc), 1, "summary"); + if (sv >= doc.len) { + x = lab_put_lit(out, cap, x, "null"); + } else { + if (doc[sv] == 123 and sv + 1 < doc.len and doc[sv + 1] != 125) { + x = lab_put_lit(out, cap, x, "{\n"); + var k : usize = lab_line_end(doc, sv) + 1; + const stop : usize = lt_close_at(doc, sv, 1); + while (k < stop) { + const e : usize = lab_line_end(doc, k); + x = lab_put_lit(out, cap, x, " "); + x = lab_put_span(out, cap, x, doc, k, e); + x = lab_put_lit(out, cap, x, "\n"); + k = lab_line_next(doc, e); + } + x = lab_put_lit(out, cap, x, " }"); + } else { + var sp : [2]usize = undefined; + lt_doc_raw(doc, "summary", &sp); + x = lab_put_span(out, cap, x, doc, sp[0], sp[1]); + } + } + x = lab_put_lit(out, cap, x, ",\n \"json\": \"/runs/"); + x = lab_put_lit(out, cap, x, sha); + x = lab_put_lit(out, cap, x, ".json\",\n \"log\": \"/runs/"); + x = lab_put_lit(out, cap, x, sha); + x = lab_put_lit(out, cap, x, ".log\"\n }"); + var at : usize = 0; + while (at < old.len) { + const e : usize = lab_line_end(old, at); + if (line_is(old, at, e, 1, "{")) { + const close : usize = lt_close_at(old, at, 1); + const cv : usize = key_at(old, at, close, 2, "commit"); + var same : bool = false; + if (cv < old.len and old[cv] == 34) { same = lab_same_span(old, value_from(old, cv), value_to(old, cv), sha, 0, sha.len); } + if (same == false and close < old.len) { + x = lab_put_lit(out, cap, x, ",\n"); + x = lab_put_span(out, cap, x, old, at, close + 2); + } + at = lab_line_next(old, lab_line_end(old, close)); + } else { + at = lab_line_next(old, e); + } + } + return lab_put_lit(out, cap, x, "\n]\n"); +} + +// ---- tests ---- + +pub const LT_SHA_A : string = "5f308712519557028d680357280bcc941e0ec222"; +pub const LT_SHA_B : string = "6a7b774d1f5685088d70cc8f1e3ba7d902921751"; + +test a_failed_checkout_is_the_only_run_that_asks_for_another_try { + assert lt_run_done("") == true; + assert lt_run_done("{\n \"commit\": \"c\"\n}\n") == true; + assert lt_run_done("{\n \"steps\": {}\n}\n") == true; + assert lt_run_done("{\n \"steps\": {\n \"checkout\": {}\n }\n}\n") == true; + assert lt_run_done("{\n \"steps\": {\n \"checkout\": {\n \"ok\": true\n }\n }\n}\n") == true; + assert lt_run_done("{\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n }\n }\n}\n") == false; + assert lt_run_done("{\n \"steps\": {\n \"checkout\": {\n \"error\": \"git fetch failed\",\n \"ok\": false,\n \"seconds\": 3.0\n }\n }\n}\n") == false; + assert lt_run_done("{\n \"steps\": {\n \"build_t27c\": {\n \"ok\": false\n },\n \"checkout\": {\n \"ok\": true\n }\n }\n}\n") == true; + assert lt_run_done("{\n \"steps\": {\n \"build_t27c\": {\n \"ok\": true\n },\n \"checkout\": {\n \"ok\": false\n }\n }\n}\n") == false; +} + +test only_the_json_false_of_the_checkout_counts_not_a_word_a_null_or_another_key { + assert lt_run_done("{\n \"steps\": {\n \"checkout\": {\n \"ok\": null\n }\n }\n}\n") == true; + assert lt_run_done("{\n \"steps\": {\n \"checkout\": {\n \"ok\": \"false\"\n }\n }\n}\n") == true; + assert lt_run_done("{\n \"steps\": {\n \"checkout\": {\n \"ok\": 0\n }\n }\n}\n") == true; + assert lt_run_done("{\n \"steps\": {\n \"checkout\": {\n \"okay\": false\n }\n }\n}\n") == true; + assert lt_run_done("{\n \"ok\": false,\n \"steps\": {\n \"checkout\": {\n \"ok\": true\n }\n }\n}\n") == true; + assert lt_run_done("{\n \"steps\": {\n \"checkout\": {\n \"detail\": {\n \"ok\": false\n },\n \"ok\": true\n }\n }\n}\n") == true; + assert lt_run_done("{\n \"steps\": {\n \"x\": {\n \"checkout\": {\n \"ok\": false\n }\n }\n }\n}\n") == true; + assert lt_run_done("{\n \"image\": {\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n }\n }\n },\n \"steps\": {}\n}\n") == true; +} + +test the_words_of_what_git_said_are_the_words_split_on_any_space { + assert lt_has_word("a b c", "b") == true; + assert lt_has_word("a b c", "d") == false; + assert lt_has_word("a\tb\nc", "c") == true; + assert lt_has_word("sha\trefs/heads/x\n", "sha") == true; + assert lt_has_word("sha\trefs/heads/x\n", "refs/heads/x") == true; + assert lt_has_word("abc", "ab") == false; + assert lt_has_word("ab", "abc") == false; + assert lt_has_word("", "a") == false; + assert lt_has_word("a", "") == false; + assert lt_has_word("a\xc2\xa0b", "b") == true; + assert lt_has_word("a\xc2\xa0b", "a\xc2\xa0b") == false; + assert lt_has_word("a\x0bb", "b") == true; +} + +test an_age_from_the_future_or_beyond_u32_is_expired { + assert lt_age_u32(0) == 0; + assert lt_age_u32(7200) == 7200; + assert lt_age_u32(4294967295) == 4294967295; + assert lt_age_u32(4294967296) == 4294967295; + assert lt_age_u32(-1) == 4294967295; + assert lt_age_u32(-100000) == 4294967295; + var out : [64]u8 = undefined; + assert lx_out_is(&out, lt_facts(5, 0, true, &out, 64, 0), "5,0,1") == true; + assert lx_out_is(&out, lt_facts(-5, 3, false, &out, 64, 0), "-5,3,0") == true; + assert lx_out_is(&out, lt_facts(0, 12, true, &out, 64, 0), "0,12,1") == true; +} + +test requests_run_oldest_first_and_a_dropped_one_does_not_count_as_waiting { + var keys : [3]u64 = [30, 10, 20]; + var ages : [3]i64 = [100, 300, 200]; + var ord : [3]u32 = undefined; + var act : [3]u8 = undefined; + var adm : [3]u32 = undefined; + var facts : [256]u8 = undefined; + var cur : [1]usize = [0]; + const names : string = "5f308712519557028d680357280bcc941e0ec222\nHEAD\n6a7b774d1f5685088d70cc8f1e3ba7d902921751"; + const known : string = "5f308712519557028d680357280bcc941e0ec222\n6a7b774d1f5685088d70cc8f1e3ba7d902921751\n"; + const n : usize = lt_admit(names, &keys, &ages, 3, known, &ord, &act, &adm, &facts, 256, &cur); + assert n == 2; + assert act[0] == 0; + assert act[1] == 1; + assert act[2] == 0; + assert adm[0] == 2; + assert adm[1] == 0; + assert lx_out_is(&facts, cur[0], "300,0,0\n200,0,1\n100,1,1\n") == true; +} + +test a_request_not_yet_on_origin_waits_and_one_in_the_future_is_dropped { + var keys : [3]u64 = [3, 2, 1]; + var ages : [3]i64 = [10, 20, -5]; + var ord : [3]u32 = undefined; + var act : [3]u8 = undefined; + var adm : [3]u32 = undefined; + var facts : [256]u8 = undefined; + var cur : [1]usize = [0]; + const names : string = "5f308712519557028d680357280bcc941e0ec222\n6a7b774d1f5685088d70cc8f1e3ba7d902921751\n0123456789012345678901234567890123456789"; + const n : usize = lt_admit(names, &keys, &ages, 3, "", &ord, &act, &adm, &facts, 256, &cur); + assert n == 0; + assert act[0] == 2; + assert act[1] == 2; + assert act[2] == 1; + assert lx_out_is(&facts, cur[0], "-5,0,0\n20,0,0\n10,1,0\n") == true; +} + +test the_ninth_waiting_request_is_refused_as_the_queue_is_full { + var keys : [10]u64 = undefined; + var ages : [10]i64 = undefined; + var ord : [10]u32 = undefined; + var act : [10]u8 = undefined; + var adm : [10]u32 = undefined; + var facts : [1024]u8 = undefined; + var cur : [1]usize = [0]; + var names : [410]u8 = undefined; + var w : usize = 0; + var k : usize = 0; + while (k < 10) { + keys[k] = (100 - k) as u64; + ages[k] = k as i64; + w = lab_put_lit(&names, 410, w, "000000000000000000000000000000000000000"); + w = lab_put_count(&names, 410, w, k as u64); + if (k < 9) { w = lab_put_lit(&names, 410, w, "\n"); } + k = k + 1; + } + assert w == 409; + const n : usize = lt_admit(names[0..w], &keys, &ages, 10, names[0..w], &ord, &act, &adm, &facts, 1024, &cur); + assert n == 8; + assert act[0] == 1; + assert act[1] == 1; + k = 2; + while (k < 10) { + assert act[k] == 0; + k = k + 1; + } + assert adm[0] == 9; + assert adm[7] == 2; +} + +test requests_written_at_the_same_moment_are_asked_in_the_order_they_are_listed { + var keys : [2]u64 = [7, 7]; + var ages : [2]i64 = [50, 50]; + var ord : [2]u32 = undefined; + var act : [2]u8 = undefined; + var adm : [2]u32 = undefined; + var facts : [128]u8 = undefined; + var cur : [1]usize = [0]; + const names : string = "5f308712519557028d680357280bcc941e0ec222\n6a7b774d1f5685088d70cc8f1e3ba7d902921751"; + const known : string = "6a7b774d1f5685088d70cc8f1e3ba7d902921751"; + assert lt_admit(names, &keys, &ages, 2, known, &ord, &act, &adm, &facts, 128, &cur) == 1; + assert ord[0] == 0; + assert ord[1] == 1; + assert act[0] == 2; + assert act[1] == 0; + assert adm[0] == 1; + assert lx_out_is(&facts, cur[0], "50,0,0\n50,1,1\n") == true; +} + +test the_schedule_texts_are_the_loops { + var out : [64]u8 = undefined; + var sp : [2]usize = undefined; + assert lx_out_is(&out, lt_schedule_facts(true, 2, "-", &out, 64, 0), "1,2,-") == true; + assert lx_out_is(&out, lt_schedule_facts(false, 0, "COUNT", &out, 64, 0), "0,0,COUNT") == true; + assert lt_schedule_next("MASTER 0\n", true, &sp) == LT_NEXT_MASTER; + assert lt_schedule_next("REQUEST 3\n", true, &sp) == LT_NEXT_REQUEST; + assert sp[1] - sp[0] == 1; + assert lt_schedule_next("IDLE 0", true, &sp) == LT_NEXT_IDLE; + assert lt_schedule_next("OTHER 0", true, &sp) == LT_NEXT_OTHER; + assert lt_schedule_next("", true, &sp) == LT_NEXT_MASTER; + assert sp[0] == LAB_NO; + assert lt_schedule_next("REQUEST 3", false, &sp) == LT_NEXT_MASTER; + assert sp[0] == LAB_NO; + assert lt_schedule_next("ONE", true, &sp) == LT_NEXT_ERROR; + assert lt_schedule_next("A B C", true, &sp) == LT_NEXT_ERROR; + assert lt_schedule_next("master 1", true, &sp) == LT_NEXT_OTHER; +} + +test the_ratchet_step_is_skipped_when_the_commit_has_no_ratchet_and_never_green_then { + const green : string = "{\n \"verdict\": \"green\",\n \"counts\": {}\n}"; + const red : string = "{\n \"verdict\": \"red\"\n}"; + assert lt_step_kind(false, true, 0, "", green) == LT_STEP_NO_FILES; + assert lt_step_kind(true, false, 0, "", green) == LT_STEP_NOT_RUN; + assert lt_step_kind(true, true, 2, "error: invalid choice: 'ratchet'", "") == LT_STEP_NO_RATCHET; + assert lt_step_kind(true, true, 1, "error: invalid choice: 'ratchet'", "") == LT_STEP_UNPARSABLE; + assert lt_step_kind(true, true, 2, "something else", "") == LT_STEP_UNPARSABLE; + assert lt_step_kind(true, true, 0, "", green) == LT_STEP_JUDGED; + assert lt_step_kind(true, true, 1, "", red) == LT_STEP_JUDGED; + assert lt_step_kind(true, true, 0, "", "{broken") == LT_STEP_UNPARSABLE; + assert lt_step_ok(LT_STEP_NO_FILES, 0, green) == LT_OK_NULL; + assert lt_step_ok(LT_STEP_NO_RATCHET, 2, "") == LT_OK_NULL; + assert lt_step_ok(LT_STEP_NOT_RUN, 0, "") == LT_OK_FALSE; + assert lt_step_ok(LT_STEP_UNPARSABLE, 0, "") == LT_OK_FALSE; + assert lt_step_ok(LT_STEP_JUDGED, 0, green) == LT_OK_TRUE; + assert lt_step_ok(LT_STEP_JUDGED, 1, green) == LT_OK_FALSE; + assert lt_step_ok(LT_STEP_JUDGED, 0, red) == LT_OK_FALSE; + assert lt_step_ok(LT_STEP_JUDGED, 1, red) == LT_OK_FALSE; +} + +test the_step_error_is_stderr_or_else_stdout_stripped_and_cut_at_300 { + var out : [2048]u8 = undefined; + var b : [1024]u8 = undefined; + assert lx_out_is(&out, lt_step_error(" boom \n", "ignored", &out, 2048, 0), "boom") == true; + assert lx_out_is(&out, lt_step_error(" \n", " from stdout \n", &out, 2048, 0), "from stdout") == true; + assert lx_out_is(&out, lt_step_error("", "", &out, 2048, 0), "") == true; + var n : usize = 0; + var k : usize = 0; + while (k < 400) { + n = lab_put_lit(&b, 1024, n, "\xc3\xa9"); + k = k + 1; + } + assert lt_step_error(b[0..n], "", &out, 2048, 0) == 600; + assert out[599] == 169; +} + +test a_run_is_published_under_its_sha_and_the_index_keeps_one_entry_per_commit { + var out : [2048]u8 = undefined; + var p : [64]u8 = undefined; + assert lx_out_is(&p, lt_run_path("abc", 0, &p, 64, 0), "/runs/abc.json") == true; + assert lx_out_is(&p, lt_run_path("abc", 1, &p, 64, 0), "/runs/abc.log") == true; + assert lx_out_is(&p, lt_run_path("abc", 2, &p, 64, 0), "/runs/abc.receipt.json") == true; + const doc : string = "{\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"t2\",\n \"summary\": null,\n \"results\": []\n}\n"; + const first : string = "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"t2\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n"; + var w : usize = lt_index_publish("", doc, "a1", &out, 2048, 0); + assert lx_out_is(&out, w, first) == true; + const doc2 : string = "{\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"t4\",\n \"summary\": {\n \"files\": 3\n },\n \"results\": []\n}\n"; + const second : string = "[\n {\n \"commit\": \"b2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"t4\",\n \"summary\": {\n \"files\": 3\n },\n \"json\": \"/runs/b2.json\",\n \"log\": \"/runs/b2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"t2\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n"; + w = lt_index_publish(first, doc2, "b2", &out, 2048, 0); + assert lx_out_is(&out, w, second) == true; + const third : string = "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"t2\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"b2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"t4\",\n \"summary\": {\n \"files\": 3\n },\n \"json\": \"/runs/b2.json\",\n \"log\": \"/runs/b2.log\"\n }\n]\n"; + w = lt_index_publish(second, doc, "a1", &out, 2048, 0); + assert lx_out_is(&out, w, third) == true; + assert lt_index_publish(second, "{\n \"ref\": \"x\"\n}\n", "c", &out, 2048, 0) == LAB_NO; + assert lt_index_publish("", "", "c", &out, 2048, 0) == LAB_NO; +} + +// BEGIN GENERATED +// The tables below were computed by running contrib/railway/t27b-lab/lab.py's own code: run_done, admitted (with the +// real judge, t27c corpus-receipt admit, and git's answers replaced by the text in the case), the two statements of +// main() that ask the judge and read its answer, ratchet (with the checker's process replaced by the case's exit +// code, stderr and stdout) and publish (its files in a scratch directory, a series of runs for a few commits). + +// RD: run_done -- 66 run documents (the empty text is None), the answer +pub const RD_N : usize = 66; +pub const RD_DOC : [66]string = [ + "", + "{}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\"\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {}\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": null\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": []\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {}\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"clone\": \"kept\",\n \"ok\": true,\n \"seconds\": 1.5\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false,\n \"error\": \"git fetch failed: ['fatal: x']\",\n \"seconds\": 3.0\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": true\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": null\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": 0\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": \"false\"\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": \"False\"\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": 1\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": []\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"seconds\": 1.0\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"build_t27c\": {\n \"ok\": false\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"build_t27c\": {\n \"ok\": false\n },\n \"checkout\": {\n \"clone\": \"kept\",\n \"ok\": true,\n \"seconds\": 1.5\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false,\n \"error\": \"git fetch failed: ['fatal: x']\",\n \"seconds\": 3.0\n },\n \"build_t27c\": {\n \"ok\": true\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"build_t27c\": {\n \"ok\": true\n },\n \"checkout\": {\n \"ok\": false,\n \"error\": \"git fetch failed: ['fatal: x']\",\n \"seconds\": 3.0\n },\n \"reference\": {\n \"ok\": true\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"clone\": \"recloned\",\n \"first_error\": \"x\",\n \"ok\": true,\n \"seconds\": 9.0\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"detail\": {\n \"ok\": false\n },\n \"ok\": true\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": true,\n \"detail\": {\n \"ok\": false\n }\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"detail\": {\n \"ok\": false\n }\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"build\": {\n \"checkout\": {\n \"ok\": false\n }\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": true\n }\n },\n \"ok\": false\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"ok\": false\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"checkout\": {\n \"ok\": false\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"CHECKOUT\": {\n \"ok\": false\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"OK\": false\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout \": {\n \"ok\": false\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok \": false\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false,\n \"ok2\": true\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok2\": false\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": true,\n \"n\": {\n \"ok\": false\n }\n },\n \"x\": {\n \"ok\": false\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"x\": {\n \"ok\": false\n },\n \"checkout\": {\n \"ok\": true\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"error\": \"false\",\n \"ok\": true\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"error\": \"say \\\"ok\\\": false\",\n \"ok\": true\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"error\": \"\\\"ok\\\": false\",\n \"ok\": false\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n }\n },\n \"results\": [\n {\n \"file\": \"a\",\n \"t27b\": \"pass\"\n }\n ]\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": true\n }\n },\n \"results\": [\n {\n \"file\": \"a\",\n \"t27b\": \"pass\"\n }\n ],\n \"summary\": {\n \"files\": 1\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"results\": [\n {\n \"file\": \"a\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n }\n }\n }\n ]\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"clone\": \"kept\",\n \"ok\": true,\n \"seconds\": 1.5\n },\n \"build_t27c\": {\n \"ok\": true,\n \"binary\": \"/work/t27c\",\n \"version\": \"t27c 0.5.0\"\n },\n \"build_t27b\": {\n \"ok\": true\n },\n \"t27b_corpus\": {\n \"ok\": true,\n \"exit\": 0,\n \"summary\": [\n \"a\",\n \"b\"\n ],\n \"totals\": {\n \"pass\": 1\n }\n },\n \"reference\": {\n \"ok\": true,\n \"totals\": {\n \"pass\": 1\n },\n \"cache\": {\n \"hits\": 1,\n \"misses\": 0,\n \"not_cached\": 0\n }\n },\n \"ratchet\": {\n \"ok\": false,\n \"verdict\": \"red\"\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false,\n \"error\": \"git fetch failed: ['fatal: x']\",\n \"seconds\": 3.0\n }\n },\n \"image\": {\n \"lab_py_sha\": \"x\"\n },\n \"toolchain\": {\n \"rustc\": \"r\"\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"image\": {\n \"checkout\": {\n \"ok\": false\n }\n },\n \"steps\": {\n \"checkout\": {\n \"ok\": true\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"toolchain\": {\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n }\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n },\n \"again\": {}\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": true,\n \"seconds\": 0.1\n },\n \"ratchet\": {\n \"ok\": null\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n }\n },\n \"finished\": null\n}\n", + "{\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n }\n }\n}\n", + "{\n \"steps\": {\n \"checkout\": {\n \"ok\": true\n }\n }\n}\n", + "{\n \"steps\": {\n \"checkout\": {}\n }\n}\n", + "{\n \"steps\": {\n \"checkout\": {\n \"ok\": false,\n \"error\": \"e\"\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n }\n },\n \"summary\": {\n \"files\": 0\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {},\n \"summary\": {\n \"files\": 0\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"error\": \"x\",\n \"seconds\": 1.0,\n \"ok\": false\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"seconds\": 1.0,\n \"ok\": true,\n \"error\": \"no\"\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": false\n }\n },\n \"fuzz\": {\n \"cases\": 10\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": true\n }\n },\n \"fuzz\": {\n \"cases\": 10\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": 0.0\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": -1\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": {\n \"x\": 1\n }\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": [\n false\n ]\n }\n }\n}\n", + "{\n \"lab\": \"t27b-lab\",\n \"commit\": \"c1\",\n \"steps\": {\n \"checkout\": {\n \"ok\": \"\"\n }\n }\n}\n" +]; + +pub const RD_DONE : [66]u8 = [ + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, + 1, 1 +]; + +// AD: admitted -- 62 request directories: the names (one a line), their ages, what git said, and for each request what +// was done (0 runs, 1 dropped, 2 waits), the ones that run in order, and the facts lines the judge was given +pub const AD_N : usize = 62; +pub const AD_NOW : u64 = 1800000000; +pub const AD_NAMES : [62]string = [ + "0000000000000000000000000000000000000000\n59f823cdef7f73edd77b6c29163d00d68df6db75\nHEAD\nrefs.heads.x\ncca85f0f54f30445a3577e18a0a5abcca95bf8e2", + "4a36ee0987b3544242b30e58d656ec4f3378c19c\nd5840f1aec544ad77bf39768915e2ed4a2243774", + "289e0082c358452358902ff3177e7e8c92637e64", + "ef5aa370e2e30bdb0e7ab8d7e349effade2925fd\n81b34bf7e8df33809cd89bf6e31c021f6b75d271\nd8a28f7d134bb8831b5bd5a03d76e82f142f51d1", + "a131525fa27a6abde3911a95891fca76a9e28bec\nfeature.branch\n4193304885ee914f149f83b5ae08e9df0b3f1305\nabc\nrefs.heads.x\nb820372c310f04040699f0c60d9df89af707b1de", + "96cc3e2ecff4615441050c5bf87362df09a5d734\n652f2b23a015da2219027c30d5c984b859a94e7b", + "445038d18288ae22ce7cacb013b22d5f6388268a\n850c813fd521dd77cdcf02347c1f59ff479045dc\nHEAD", + "feature.branch\n61f0dcf92b2c5e0093e1a99d54f44d5eb7be5d17\n4f6e75bcc05bf159a7ed6853668b0aea41f5ceaa\nf8f53539f4911a52d1c6e746ac360d6eeeec4ab0\nHEAD\ncfd7a4ddd069b08c0947dacb0b8eb017c9212ab1\nd6d448e34e6ff404da55431a692ab5c0077eceda\n0000000000000000000000000000000000000000\n2d6a5397f597b9386c3f00a6b04de029675fe9d8\ne5a8fb0d54602bb8d7c925f47fae3463ab8de06e", + "0e918aa18ef38d56d69ff64084c99e01ee8cefe0\nba7041ae33aaff711271961e13e801d340acc2f0\ne5127ec1a099205574ad60ca8308f3a2d5b79d49\ndea2ee5503674e4931753791d269074d9451ccd1\n85df9b925437f3d08a74a6aabd1a338fe97f8b9f", + "8a24b8b858c6bf05b1ecd86ec75da34e62dfdce6\ne9588de867f5721089dda25505afa7352f22c283\nf0b0c32dcf501fb2b1d52a40d459d382fb947904\ndd1aa05a70944fe964c2716df752f8f68c018816", + "3338141b5e8fbd78d84c2cfff854acced15dc661\nrefs.heads.x\n74abfea158e501595234ac084a85c6badad19f7d\n8b2ddbb192036c13d9271ce2c668575063c94fd1\na2f869cd2d129fbc23acf74d12a2b6a51daa1ff8", + "0818b70200d0fce0a8d231af4b2533201be204ef", + "2e4789769fe774589f34b8760afa02aba08eba3b\n8a52b6119d5386822dafea9d69475fa02e28c7de\n7088cdcdb2dec748b560dc702602f55135780cac\nHEAD", + "4cde455eb960853ddf9cc633ba2a1927e47d614c\ne65a274de650525b473a96770fbe938c7928f2c4\n4b6bed22a860b917e27233f52bd53557255715be\nd2e670ff53df401e44b1a625c70e6cf3e7317aa9\n2171dd6ea5bdbb08f2197cd72b52d9e58d31d07c\n7597eb6d7def58cc4ae39094d0f9d38a83937ecd\nc468296d7f85f308078b7e217cf46fe2763f64fb\n83194d713ee87a3f275266ca17f93eab43ea5171\n71d1da14ddddb9f0575d8ea31062579639d33a98\n0000000000000000000000000000000000000000", + "feature.branch", + "f5c34a95b78199e5fb30c9b12ca7eba49231d5ee", + "bf642e2d1bc499b84688400c3a7d87ea117bae46\nfbc7518ff70ceaf646ce44e562df9a55f65beaf6\n685567279c1a79f29c59295743a75047199e36c4\n5850beefc9a42b25f738ec45a5a73f6f190136a1", + "8adbcdb341999a1ec795fde4ad53ffb1db4436b2", + "794282b5a7dfb590da3ce90ebaea755624025a4e\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\na0541ebd2f09af9551d403ed74a24791d7dac6ef\n2c8b27383bb10f807e4243cdbf9ef4a0f044fdc2\ndedab7d5719e6a5e2ab89126b48e462b7b6d9715\ne33e9073b1794e32f1d4ced3ba126b5f7f617a8d\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n9b80722fab5a938ae06e1b568d845b462b6d7efb\n194b27060591d5d9fca8e56186ab7381b88de9cf\nbc43d16c8ea63fb807f1d172bd63ea1d9481fa69", + "2e794ba17a5a8cdfb24cd9cc56bc63393dfb75cf\n775cc2d14eca4363380a578174d876d536c83c3b\nc0084266cec3c1a3e3dba7f42e4dcfe04d40ea4d\nda0302a0e4e697b7779966a18a05d3a0ab716888\n8a300529962d006715edc63635c7a030dbdc6bfc\nda5d3faf5637d9121d7df9fc23accaec240fe747\n2976052c781d9b01cb7b3870b696eae275dc254b\n14823380513dbf394106f1cb6f2e088013430ceb\nc2a8006114809d0dcf94cfacdc89a3932e225c43", + "555e1e9a4148f253b3383926644e4755d7f7b497\n1b83b4859770fbe579bc7dd0c76731ece1881d38\n02a90e1164d8e92c04fcb2bcb341e0b7749b4c6f\n8027e401880f180f2e5ed3c1b97921b6a7844a7c", + "ef2c0d3193c88ed0d84a2fa6e6202284976a8f36\n40752bc4952b146d60f5a452f0ffd48166d0280b\nb9a69954ff6cbe2631c85def90aebfead9c97674\n0be3cb8840d37449c9a5aed60c67f4b5e159bb93\n5af50dc9794a1095f5998d5f7e1d0c5edc552575\nabc", + "f0be7db25378b229e92c9331bc36ff5ca733a43e", + "", + "", + "7f91d56965fdc76f50bde521d3e4a9623cfa2fa4\n00d5df96c2c38da4deb7464aa6c2838444ecfc4c\na57a4c99609df70764efc563255cba3980a4b701\n122073ba08f9ab0b9f7d276d9aa51c4916fc0dcf\n6ccd5f4aefab124b8c5dff82a7247fa81903f3b4", + "6750bad14caa6321fe0aa6700ea8e1ee577bba87", + "1c7597d6008ebfba4f37717fb604d671cf595974\n671eea3b42f0d236e672b5af32c6419baa93039a\n085dd91b5ba6358e7c4734b6cf93b01d3e81da89\n1af925f77e0bb3f3ef088062aa60d2dd7cac0ad3\n2a60eab2615d2500e371ed1d4a2cdeb17c8c5882\nff6f8318a927c9019e1c6a76691bb4061ab3ae2f", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n7c1ae9ab217319b3133662c5767f343a19a8683a\nf1ed2d02a10e124bdd89d780f3611f44a2bad5fb\nda689f2095da5787adf271db4c04fb232de154c5\n1a265405e1ab6f6221a5f66d652a619348bea359\nc047da9983765b8fb6a401fe4958835919f17c56\n4fb600e4d8ea1557086b66350a04277c5f9a8430\nffff9519b04bba8172a5167a64b9a39ce23b2ee9\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "", + "a7b8d8fee38f248dff76d4ae4020067724ad4d0c\n93c0063696b841c83d2297dac52d387c2174302f\ne98fa3c85666a0f1a9fae465cb144162f9a89821\ndfab373ff69794a8b4b96006b75f328b3c60dc73\nd18b2fe330d5c0d661cf45317fd0585d174b061f\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n62c2b3f787a0dc09d86f2f713e88fbcf24731097\n9be4c8b079f63655990ea3799b1cf68e96cde50d\n6a5d7f4250a5238af5e1ef0dad3808facdb9d05c", + "313172f0fd96e19e3f75d92eb0e29ff7f946bde9", + "41c963a33e501e6c7262737ce02623bf0babacfa\n2dd0db37ee897e5852f5848dd8d8734f00d4582e", + "5e2863f6944fc45c8f74412a9080a0749cf9fa55", + "5711fb863d71677a5c48169a77067a5dcf0b5a36\n4e73c08ef71e02ff716e7f816add56ce66396b6d", + "abc\n0558a74e75934764bea4a6283b0d1a910b29f19f\na808f833433eac3b424a98724712664a57726615", + "289255a5106a5e869be4045b1e65eb504e760071", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nb5e8a9acba84406acb67286752cd8b79f7283c17\n3d0a98514ace0a9117fdc3b38093a5cb8463d22d\nabc\n383395bf541d7e53608439c6205f9e22cf6db8c6\nc48935016dab29706a8e5e3a84bc7c333bcb3147\n0000000000000000000000000000000000000000\n1f902bfb33b80cc542f33a1de8a403a0e13c7cc7\n619c78ed690b1edbd9ba1cfb70ee26b09225855f\nc83b9768784ff93de561aff5285fc16da84b1dde", + "800f3f8a31271d86fb3d990aec7f5e57aea5cc2e", + "227b5676a44329a1c0a1d0f733e2c2daf5ce1cec\nabc\n4131acdc3702eff34f4869b44b389e72cb63110f\n28b8952f9c2f7d22b9644e6f2cedd15b534243c2\n56ac2f8d5e1a256f480788a8e29143b4918fa277\n92bf65c5d341a650a061cfca7de294c086b8869a", + "aa76f6facd50d408db4c2dc1a250901e55d6572f\n23bff108dac01a51ffe3af21448eb434db25665d\nb7de463bad27549eb6a23ef8f07ba0a0643883f6\nae01ac7026d12d32356e58048781886bede7f11c", + "407b2c47ad437c3212bdbd5e4f33afcb8e731dc4\n5141d37be12a407288fe9f2e168eb4505d9196fd\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\ned5b1fe63fd3705d9480ed51c1dbbbb525229fdc\ndafdb2999fe3d8f498f648760a9b691ce56772eb", + "7cdf81c63a7ef180d4275c44502e2a3009dca0ed\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n969f1876198d0e6ebcc45b455c7bd0b67666d808\ndfedcfcd5ce66eec1792b05834356a37bbabe08c", + "354c4c933a2e21e2c898e5da13b3fd790a605479\nabc", + "abc\neb7a24379f67639672e386c1c1648672faec1f44\nc69c0dc8f451291b50e6d12729aa08c0a2546d54\n5f6ed6eb03ea5c401e8c23ae94880af18acde38f", + "166aa66a60e581ef9426651511be8489974df516\n90089b6e3b76f20faf7d34770cda8d5b6df3c7f4\nf3b52debf561bbdc7aee256758d1c382b78f7acc\n864cb19200b46ea1c09dc2d743a09c12efcd2dfb", + "81c01a98b045aa5c22e0301c747516ace5b5fc8c\n22673002d267fd4d29fc5662da968d1d32829296\n44713759e93129f81a386d52a555dd06bb6e7733", + "93e411bc81beb63bc6debffedb48a4a93a8cf264\n329262d1745dba65b84d1cacfb57d25b4b69a702\n2856932d19cba09a21cfebf08009e7c86bb2666a\n66ae75611d553a9a189c80801fd863960078d16d", + "fdc864d495c683bb2e08faaab80211dd0b70cbba\nf5629d044cf984334d4a9c8f5e613d69f1000753\n28a9781cf4042db2fa382bd1bf747f6bbc76d010\n9af0981fcd3f0e282b9afa99b45770a018f04079\nHEAD\n0b67a639bb505335fcc9d4be2ac6f20dec0be1d8\nrefs.heads.x\n597575e82497402fa9800724418d8b91293f9916\ne46e2aa551220a8f9b4ac4e52731df3b0869e855", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\na06966e7029ba2c26691d117df67f73688a062be\nabc\ndd48d1c6ace6cc33a7911ac044eb9e210413cd9d\n23fe6a72768ea4b2ae184202fdfb9f7193421e80\nca2bb44587896799fc243610f26c8fbd1c59d5fd\n35487895a1e1f7fd96cf9f2d6092f76771fe4936\n6cdde078ad4c71fe9cdde8899680241a9cc90342\n45471198bc83441e934554bf025b74b23519028c\nc40546f18c8bf109bab6aed928b0f18bbbd53c98", + "adab4a82cd7c272a437d90abac91fccef8e4f6f4\n372f467b8b07e6ed33af1a1752cc3d95b6acac89", + "832f4f9f1a777fc0f82f768d592f73d8b7cf4188", + "126cb3f1a4b4bde89e69bf3c2b74a159a9ab5824", + "b56be5fbf4d5ff61fe8fe4de3d01425aafcb329e\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\n1c82345815f04875a75677d56d9cf744934c1c7d\n1dec93caee5e8ed9778ea7fa2b1711cc6c946961\nbf98ebf32b1fd41c2f50c2d230cc6c1695ddded6", + "192167c61c76f30e122021dde51f78c1082629de\n0c33324ab6eb61d3d6cc71f9eb807ff78055548a\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "31803ce7df76b91f471e71821c155c87fc4337f6", + "", + "", + "c7625a77eed83c998a454197bf6e6a6e85472dd1\n9ebc82e22a19f222a5f72ef4745ec59bdc7ae8b7\n59b70039ce946bfef906da9a5ab688b850595234\n04392338f3070382dad7646322ef61846d93c95e\n24aeb4cd35367d94352923665c5a40a786bde5d3\n7fb76cf3c5e2de8f112f2602232fcc947cd751d2\n2c7b52afb495b2f837388fb9ad75a00b0c743c02\n20ece2cbb4e3bebd66f190573bc59182ca3bbc8d\n195e190d1486b0581f4566172ac3a517f477545d\nc3660fc87e953cf8bf44241bb5e9ef4097bbe751", + "89fd8cb9e512a649cc7cbdbc12ffa561d19f8658\nb7d6ff48b23fb221f5cb7e701dd2a8297e22e34b\nHEAD", + "", + "dade9ccec8a07bec21a6cefc39f3ae112d7bd055\ned369f85b39859516a9b26619c08277fe23ed2cc\n835e77ca87233ad3592106476f1cee96d33dc92f\n30265c5b67f4a7cea6bf8644f2695447d91c3548" +]; + +pub const AD_KNOWN : [62]string = [ + "cca85f0f54f30445a3577e18a0a5abcca95bf8e2\trefs/heads/b0\n0000000000000000000000000000000000000000\n59f823cdef7f73edd77b6c29163d00d68df6db75\n", + "0dc481ee214e69886dd9078d3fe0a0887bee1afb\n", + "From x\n * branch master -> FETCH_HEAD\n289e0082c358452358902ff3177e7e8c92637e64\n", + "From x\n * branch master -> FETCH_HEAD\nd8a28f7d134bb8831b5bd5a03d76e82f142f51d1\na83859dafc1eb03300183873de573ecad06b0974\n", + "4193304885ee914f149f83b5ae08e9df0b3f1305\trefs/heads/b0\nabc\trefs/heads/b1\na131525fa27a6abde3911a95891fca76a9e28bec\nrefs.heads.x\n", + "675c17bab6a01898f97ac27a8ebfff1c03bb48ea\n", + "1e44dd703db3280e59f722493741e69ec5cf4f96\ncdc308ead908dc5c7d5df063396f23e06356741a\n", + "d6d448e34e6ff404da55431a692ab5c0077eceda\trefs/heads/b0\ne5a8fb0d54602bb8d7c925f47fae3463ab8de06e\trefs/heads/b1\ncfd7a4ddd069b08c0947dacb0b8eb017c9212ab1\n61f0dcf92b2c5e0093e1a99d54f44d5eb7be5d17\n6e81f350a4bc457cbb47b8473f88bde538325c45\n", + "e5127ec1a099205574ad60ca8308f3a2d5b79d49\trefs/heads/b0\n85df9b925437f3d08a74a6aabd1a338fe97f8b9f\nba7041ae33aaff711271961e13e801d340acc2f0\n", + "f0b0c32dcf501fb2b1d52a40d459d382fb947904\trefs/heads/b0\ne9588de867f5721089dda25505afa7352f22c283\n4277eda4e10e35a7765bca964e1026440ef9d079\n67e0bb661a83014e878bd873358666e3fef450a2\n", + "8b2ddbb192036c13d9271ce2c668575063c94fd1\trefs/heads/b0\na2f869cd2d129fbc23acf74d12a2b6a51daa1ff8\trefs/heads/b1\nFrom x\n * branch master -> FETCH_HEAD\n74abfea158e501595234ac084a85c6badad19f7d\n3338141b5e8fbd78d84c2cfff854acced15dc661\n6ff430ae90a8dfc39a8b1a9fbe9d3169c4977e0f\n8445899f4a9e12db43d10ccdddeeab5d802f065b\n", + "e68d5590dbfffe905513d2c554df64d7b939ddf3\n", + "8a52b6119d5386822dafea9d69475fa02e28c7de\trefs/heads/b0\nFrom x\n * branch master -> FETCH_HEAD\n7088cdcdb2dec748b560dc702602f55135780cac\n", + "4cde455eb960853ddf9cc633ba2a1927e47d614c\trefs/heads/b0\n83194d713ee87a3f275266ca17f93eab43ea5171\trefs/heads/b1\nc468296d7f85f308078b7e217cf46fe2763f64fb\trefs/heads/b2\nd2e670ff53df401e44b1a625c70e6cf3e7317aa9\n7597eb6d7def58cc4ae39094d0f9d38a83937ecd\n71d1da14ddddb9f0575d8ea31062579639d33a98\n", + "From x\n * branch master -> FETCH_HEAD\nfeature.branch\n1bf5bbe8de00f8742e592dc5f7f810811b14815c\n", + "f5c34a95b78199e5fb30c9b12ca7eba49231d5ee\neca8b437e5e239a80674c048279f292ff48ebfbe\n", + "5850beefc9a42b25f738ec45a5a73f6f190136a1\trefs/heads/b0\nbf642e2d1bc499b84688400c3a7d87ea117bae46\n2b37f0a53a1ef99d89d1c541f9ff769a81e0b2f5\n1ae787448ea77efe9be4e2e2ffa2b361dfb99943\n", + "From x\n * branch master -> FETCH_HEAD\n", + "794282b5a7dfb590da3ce90ebaea755624025a4e\trefs/heads/b0\n9b80722fab5a938ae06e1b568d845b462b6d7efb\trefs/heads/b1\n2c8b27383bb10f807e4243cdbf9ef4a0f044fdc2\trefs/heads/b2\nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\trefs/heads/b3\na0541ebd2f09af9551d403ed74a24791d7dac6ef\ne33e9073b1794e32f1d4ced3ba126b5f7f617a8d\n194b27060591d5d9fca8e56186ab7381b88de9cf\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n4d8489eeed9d86eb4774cd4a08c3c5bcbd9ce62d\n", + "c2a8006114809d0dcf94cfacdc89a3932e225c43\trefs/heads/b0\n2976052c781d9b01cb7b3870b696eae275dc254b\trefs/heads/b1\nFrom x\n * branch master -> FETCH_HEAD\nda0302a0e4e697b7779966a18a05d3a0ab716888\nda5d3faf5637d9121d7df9fc23accaec240fe747\n2e794ba17a5a8cdfb24cd9cc56bc63393dfb75cf\n64d6845d4e340eb2571f7b62f57651f00c26eb25\n7d15409130f8298f79616c33c60a2d446e52ff5e\n", + "8027e401880f180f2e5ed3c1b97921b6a7844a7c\trefs/heads/b0\n1b83b4859770fbe579bc7dd0c76731ece1881d38\n555e1e9a4148f253b3383926644e4755d7f7b497\n453a0927e87576886900841d4d83843683e1b90f\n", + "abc\trefs/heads/b0\n5af50dc9794a1095f5998d5f7e1d0c5edc552575\nbc8766f90d08c79dd3fe9ad06b7744a5ad75c5b9\n7b2900b9ccaa2f9e6b4507c0c579c2b147bd27bd\n", + "f0be7db25378b229e92c9331bc36ff5ca733a43e\n1533f1ebdd04a1b9c836db013f35476591cc503c\n4d984ac5305968f73266647fe2fffbb11f48ed59\n", + "From x\n * branch master -> FETCH_HEAD\n", + "", + "00d5df96c2c38da4deb7464aa6c2838444ecfc4c\trefs/heads/b0\n6ccd5f4aefab124b8c5dff82a7247fa81903f3b4\na57a4c99609df70764efc563255cba3980a4b701\ne021e53ce89d0bbc9bb719660911333a170382e6\n6e8b826433d3b066217694412270c53db39ccbcc\n", + "From x\n * branch master -> FETCH_HEAD\n8697f5fc5c8fd7f73cec62d0d3c157ac4149e27e\n59fab42c62655475202409d9d5c70835a4fafad7\n", + "671eea3b42f0d236e672b5af32c6419baa93039a\trefs/heads/b0\n1af925f77e0bb3f3ef088062aa60d2dd7cac0ad3\trefs/heads/b1\n2a60eab2615d2500e371ed1d4a2cdeb17c8c5882\n085dd91b5ba6358e7c4734b6cf93b01d3e81da89\n1c7597d6008ebfba4f37717fb604d671cf595974\nbfd6512ad4d367515bf3119f38e197a9fd3d1592\n", + "f1ed2d02a10e124bdd89d780f3611f44a2bad5fb\trefs/heads/b0\n4fb600e4d8ea1557086b66350a04277c5f9a8430\trefs/heads/b1\nFrom x\n * branch master -> FETCH_HEAD\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\nffff9519b04bba8172a5167a64b9a39ce23b2ee9\nda689f2095da5787adf271db4c04fb232de154c5\n", + "1b6fb686b48157ba5603ca856fd8952bb291b229\n", + "a7b8d8fee38f248dff76d4ae4020067724ad4d0c\trefs/heads/b0\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\trefs/heads/b1\ndfab373ff69794a8b4b96006b75f328b3c60dc73\ne98fa3c85666a0f1a9fae465cb144162f9a89821\n", + "", + "2dd0db37ee897e5852f5848dd8d8734f00d4582e\n1757eb7c2d80bd3b0f0c5af544d2b1273e38bfed\nb2c683f2b05322b0aff4127af35b0199db0bf57a\n", + "5e2863f6944fc45c8f74412a9080a0749cf9fa55\n", + "4e73c08ef71e02ff716e7f816add56ce66396b6d\trefs/heads/b0\nFrom x\n * branch master -> FETCH_HEAD\n5711fb863d71677a5c48169a77067a5dcf0b5a36\n01cf62fc8b64a36c4d84f9a669a9b93b674f1783\n", + "a808f833433eac3b424a98724712664a57726615\nbcf8bb2ad1122c52481d4224e904e9048d999ae9\nb995b5f63fae8d03b8a967e76166df9a6eed0dfc\n", + "", + "619c78ed690b1edbd9ba1cfb70ee26b09225855f\trefs/heads/b0\nabc\trefs/heads/b1\n1f902bfb33b80cc542f33a1de8a403a0e13c7cc7\trefs/heads/b2\nFrom x\n * branch master -> FETCH_HEAD\n383395bf541d7e53608439c6205f9e22cf6db8c6\nb5e8a9acba84406acb67286752cd8b79f7283c17\nc83b9768784ff93de561aff5285fc16da84b1dde\n0ad9239c068b3caf59b5335603f40c5ebc98cf86\n", + "From x\n * branch master -> FETCH_HEAD\n800f3f8a31271d86fb3d990aec7f5e57aea5cc2e\nc4492e7747d137e5679e45c1a725892d0655d85b\n", + "28b8952f9c2f7d22b9644e6f2cedd15b534243c2\trefs/heads/b0\nFrom x\n * branch master -> FETCH_HEAD\n4131acdc3702eff34f4869b44b389e72cb63110f\n227b5676a44329a1c0a1d0f733e2c2daf5ce1cec\n", + "b7de463bad27549eb6a23ef8f07ba0a0643883f6\n", + "From x\n * branch master -> FETCH_HEAD\n407b2c47ad437c3212bdbd5e4f33afcb8e731dc4\n", + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\trefs/heads/b0\nFrom x\n * branch master -> FETCH_HEAD\ndfedcfcd5ce66eec1792b05834356a37bbabe08c\n969f1876198d0e6ebcc45b455c7bd0b67666d808\n", + "From x\n * branch master -> FETCH_HEAD\n7035fba9a2f905975269b2ff4ec0008a27e350a0\n7bbebb3b4cf57f26ada812d81a261c51a5e36ec6\n", + "eb7a24379f67639672e386c1c1648672faec1f44\trefs/heads/b0\n5f6ed6eb03ea5c401e8c23ae94880af18acde38f\n", + "90089b6e3b76f20faf7d34770cda8d5b6df3c7f4\trefs/heads/b0\nf3b52debf561bbdc7aee256758d1c382b78f7acc\nfb1424725d7a911f85a8eca81136919fb197b63d\nf1ffc1d0c4ab3e96a63084bc512f2924b057dda7\n", + "81c01a98b045aa5c22e0301c747516ace5b5fc8c\trefs/heads/b0\n22673002d267fd4d29fc5662da968d1d32829296\n44713759e93129f81a386d52a555dd06bb6e7733\n27431f160d5982c59d73d79187d72351e05a0f0e\ne4ee172c1943b530246dd4c5dcb356b3ec6f3531\n", + "66ae75611d553a9a189c80801fd863960078d16d\trefs/heads/b0\n2856932d19cba09a21cfebf08009e7c86bb2666a\n63b0343bfea8e2cbda75facbb5c972845f9d6506\n7e1242de3e04710b65723cb5dd721028f24cd1de\n", + "refs.heads.x\trefs/heads/b0\nFrom x\n * branch master -> FETCH_HEAD\n28a9781cf4042db2fa382bd1bf747f6bbc76d010\n9af0981fcd3f0e282b9afa99b45770a018f04079\n", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\trefs/heads/b0\n45471198bc83441e934554bf025b74b23519028c\n", + "adab4a82cd7c272a437d90abac91fccef8e4f6f4\trefs/heads/b0\n372f467b8b07e6ed33af1a1752cc3d95b6acac89\nefb4816da494d4627b488e6ed4e4e0a638aeb819\n93b552a10a8e32a8aeffcf4b9b61b1a2618c7ec6\n", + "0830970f9b73d86030a003d24dbda20b39a59d3d\n6754a5599dac90d34289707ef85cd56012b647d7\n", + "From x\n * branch master -> FETCH_HEAD\n126cb3f1a4b4bde89e69bf3c2b74a159a9ab5824\n2fd9619847882477476e684177cf512dc1859e67\n", + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\trefs/heads/b0\n1c82345815f04875a75677d56d9cf744934c1c7d\nf913de542619bbab155dcb2cc28e937a1906aa33\n", + "192167c61c76f30e122021dde51f78c1082629de\trefs/heads/b0\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n5c53d343e55cf36b61cbc0899225edb7fdaf3514\n4cae3c1fa1714851537613b9274557b20854ccdc\n", + "31803ce7df76b91f471e71821c155c87fc4337f6\ncee42019011a36b59997f917b0a0debbba1990fa\nacca2588190aa01cf8bd993c5648f59ee6f7cb15\n", + "7a66015c8bed7b8a99718b13a07ece6ceff81bed\ne67d22d09dbd6294fb9bd33003f0587a813ecb15\n", + "From x\n * branch master -> FETCH_HEAD\nabe2ff73fa36c8c6838df96c5b20d5216d2abe69\n", + "c3660fc87e953cf8bf44241bb5e9ef4097bbe751\trefs/heads/b0\n2c7b52afb495b2f837388fb9ad75a00b0c743c02\trefs/heads/b1\n7fb76cf3c5e2de8f112f2602232fcc947cd751d2\trefs/heads/b2\n195e190d1486b0581f4566172ac3a517f477545d\nc7625a77eed83c998a454197bf6e6a6e85472dd1\n59b70039ce946bfef906da9a5ab688b850595234\n6321d91c27259befaf8f13ebf71865842ab1f555\n04aa82af6a1fe2c39c98f19e5b1f542a3b144cba\n", + "HEAD\nb1d208f2e94e72df46efe3caac950ff3f2b477e2\n41754560a268b398a6c233085564a9ad07cba585\n", + "dd2cccfb6f6af1c7a8916c84b2149ff2b498909e\n42145c2145d70d2261973ae09c70c779b0552a85\n", + "ed369f85b39859516a9b26619c08277fe23ed2cc\trefs/heads/b0\n835e77ca87233ad3592106476f1cee96d33dc92f\ndade9ccec8a07bec21a6cefc39f3ae112d7bd055\n6230f218c3fafcae4a38304d03b8894234babed3\n" +]; + +pub const AD_OFF : [63]usize = [ + 0, 5, 7, 8, 11, 17, 19, 22, 32, 37, 41, 46, 47, 51, 61, 62, 63, 67, 68, 78, 87, 91, 97, 98, 98, + 98, 103, 104, 110, 119, 119, 128, 129, 131, 132, 134, 137, 138, 148, 149, 155, 159, 164, 168, + 170, 174, 178, 181, 185, 194, 204, 206, 207, 208, 213, 216, 217, 217, 217, 227, 230, 230, 234 +]; + +pub const AD_AGES : [234]i64 = [ + 7298, 31750, 30538, 14588, 24836, 0, 7199, 60, 38842, 26371, 8000, 31254, 9391, 31112, 2550, + 37000, 16148, 21740, 34314, 15887, 8117, 39722, 2549, 3805, 16884, 22807, 8215, 39000, 16294, + 9702, 3143, 38327, 4885, 25695, 30672, 15898, 504, 5041, 19463, 8615, 23120, 3765, 20042, 31938, + 33711, 26352, 1185, 7201, 30000, 59, 1, 38756, 3293, 31161, 5684, 19798, 15457, 1739, 37357, + 7040, 15609, 16736, 18166, 39020, 26423, 22162, 26345, 17019, 3280, 7508, 28886, 38311, 30858, + 4777, 2120, 10871, 10712, 5941, 2152, 36617, 21030, 36907, 18291, 39458, 33495, 23931, 10899, + 2621, 4811, 23943, 7206, 26275, 12426, 18275, 23298, 15649, 5816, 99999, 7200, 0, 7201, 59, + 21599, 26083, 35291, 5963, 12932, 33216, 30446, 9006, 20638, 13440, 27290, 8803, 3195, 17841, + 30400, 35607, 2876, 32849, 38035, 27002, 1871, 6560, 5055, 9040, 35578, 15586, 19247, 18166, + 182, 13944, 60, 7199, 3163, 2971, 39093, 32800, 21600, 1, 99999, 60, 7200, 7201, 7199, 21599, 0, + 21601, 7199, 32731, 36014, 22291, 8532, 9794, 9429, 7948, 13620, 6576, 29383, 3600, 21601, + 99999, 7201, 21600, 21600, 7200, 21601, 59, 3600, 7199, 2708, 20810, 16091, 30956, 60, 21601, + 7200, 7199, 21600, 0, 7199, 21599, 1, 30000, 60, 14761, 36241, 27760, 14221, 24452, 21195, 8168, + 26763, 33325, 37493, 38581, 15972, 4869, 34971, 25988, 4654, 33698, 5398, 481, 38692, 13995, + 35558, 16165, 39121, 5293, 5486, 39352, 38558, 18867, 35595, 39843, 21601, 26878, 14640, 3567, + 29304, 24588, 24626, 35207, 139, 290, 4921, 15139, 36766, 11172, 59, 30000, 60, 7200 +]; + +pub const AD_ACT : [234]u8 = [ + 0, 1, 1, 1, 1, 2, 2, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 2, 1, + 2, 1, 1, 1, 0, 2, 0, 0, 1, 0, 1, 1, 1, 1, 2, 1, 1, 0, 1, 1, 2, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, + 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 2, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, + 1, 1, 2, 0, 0, 2, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 1, 2, 1, 1, 1, 0, 1, 1, 0, 1, 2, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 0, 1, 1, 2, 1, 0, 2, 0, 0, 0, 1, 2, 1, 0, 1, 1, 1, 0, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 0, 2, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, + 2, 0, 0, 1, 1, 1, 0, 1, 0, 2 +]; + +pub const AD_AOFF : [63]usize = [ + 0, 1, 1, 2, 3, 3, 3, 3, 5, 6, 8, 9, 9, 10, 14, 14, 15, 15, 15, 19, 21, 24, 25, 25, 25, 25, 28, + 28, 30, 31, 31, 32, 32, 33, 34, 36, 36, 36, 40, 41, 42, 43, 44, 45, 45, 46, 47, 50, 51, 52, 53, + 54, 54, 55, 56, 57, 57, 57, 57, 60, 60, 60, 62 +]; + +pub const AD_ADM : [62]u32 = [ + 0, 0, 2, 6, 1, 4, 1, 2, 0, 2, 5, 8, 3, 6, 0, 7, 8, 5, 0, 8, 0, 3, 1, 0, 4, 4, 2, 1, 2, 1, 3, 3, + 1, 0, 1, 0, 7, 4, 1, 8, 0, 3, 2, 0, 3, 1, 2, 0, 2, 1, 3, 3, 8, 1, 0, 2, 0, 9, 2, 8, 2, 0 +]; + +pub const AD_NADM : [62]usize = [ + 1, 0, 1, 1, 0, 0, 0, 2, 1, 2, 1, 0, 1, 4, 0, 1, 0, 0, 4, 2, 3, 1, 0, 0, 0, 3, 0, 2, 1, 0, 1, 0, + 1, 1, 2, 0, 0, 4, 1, 1, 1, 1, 1, 0, 1, 1, 3, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 3, 0, 0, 2 +]; + +pub const AD_FACTS : [62]string = [ + "31750,0,1\n30538,0,0\n24836,0,1\n14588,0,0\n7298,0,1\n", + "7199,0,0\n0,1,0\n", + "60,0,1\n", + "38842,0,0\n26371,0,0\n8000,0,1\n", + "37000,0,1\n31254,0,1\n31112,0,1\n16148,0,0\n9391,0,0\n2550,0,1\n", + "34314,0,0\n21740,0,0\n", + "39722,0,0\n15887,0,0\n8117,0,0\n", + "39000,0,1\n38327,0,1\n22807,0,0\n16884,0,0\n16294,0,1\n9702,1,0\n8215,1,0\n3805,1,1\n3143,2,0\n2549,3,0\n", + "30672,0,1\n25695,0,1\n15898,0,0\n4885,0,0\n504,1,1\n", + "23120,0,0\n19463,0,1\n8615,1,1\n5041,2,0\n", + "33711,0,1\n31938,0,1\n26352,0,1\n20042,0,0\n3765,0,1\n", + "1185,0,0\n", + "30000,0,1\n7201,0,0\n59,0,1\n1,1,0\n", + "38756,0,1\n37357,0,1\n31161,0,0\n19798,0,0\n15609,0,0\n15457,0,1\n7040,1,1\n5684,2,1\n3293,3,0\n1739,4,1\n", + "16736,0,1\n", + "18166,0,1\n", + "39020,0,1\n26423,0,0\n26345,0,1\n22162,0,0\n", + "17019,0,0\n", + "38311,0,1\n30858,0,0\n28886,0,1\n10871,0,1\n10712,1,1\n7508,2,1\n5941,2,0\n4777,3,1\n3280,4,1\n2120,5,1\n", + "39458,0,1\n36907,0,1\n36617,0,0\n33495,0,1\n23931,0,0\n21030,0,0\n18291,0,0\n10899,0,1\n2152,1,1\n", + "23943,0,0\n7206,0,1\n4811,1,1\n2621,2,1\n", + "26275,0,0\n23298,0,0\n18275,0,0\n15649,0,1\n12426,1,0\n5816,1,1\n", + "99999,0,1\n", + "", + "", + "21599,0,1\n7201,1,1\n7200,2,0\n59,3,0\n0,4,1\n", + "26083,0,0\n", + "35291,0,1\n33216,0,1\n30446,0,1\n12932,0,1\n9006,1,0\n5963,1,1\n", + "35607,0,1\n30400,0,1\n27290,0,1\n20638,0,0\n17841,0,0\n13440,0,0\n8803,0,1\n3195,1,0\n2876,2,1\n", + "", + "38035,0,0\n35578,0,0\n32849,0,1\n27002,0,1\n15586,0,0\n9040,0,0\n6560,0,0\n5055,1,1\n1871,1,1\n", + "19247,0,0\n", + "18166,0,0\n182,0,1\n", + "13944,0,1\n", + "7199,0,1\n60,1,1\n", + "39093,0,1\n3163,0,0\n2971,0,0\n", + "32800,0,0\n", + "99999,0,0\n21601,0,1\n21600,0,0\n21599,0,1\n7201,1,0\n7200,1,1\n7199,2,0\n60,3,1\n1,3,1\n0,4,1\n", + "7199,0,1\n", + "36014,0,0\n32731,0,1\n22291,0,1\n9794,0,0\n9429,0,0\n8532,0,1\n", + "29383,0,0\n13620,0,0\n7948,0,0\n6576,0,1\n", + "99999,0,0\n21601,0,0\n21600,0,0\n7201,0,0\n3600,0,1\n", + "21601,0,1\n21600,0,0\n7200,0,1\n59,0,1\n", + "7199,0,0\n3600,0,0\n", + "30956,0,1\n20810,0,1\n16091,1,0\n2708,1,0\n", + "21601,0,1\n7200,0,1\n7199,1,0\n60,2,0\n", + "21600,0,1\n7199,1,1\n0,2,1\n", + "30000,0,1\n21599,0,0\n60,0,1\n1,1,0\n", + "36241,0,0\n33325,0,0\n27760,0,1\n26763,0,0\n24452,0,0\n21195,0,0\n14761,0,0\n14221,0,1\n8168,1,1\n", + "38581,0,0\n37493,0,1\n34971,0,0\n33698,0,0\n25988,0,0\n15972,0,0\n5398,0,1\n4869,1,0\n4654,2,0\n481,3,0\n", + "38692,0,1\n13995,0,1\n", + "35558,0,0\n", + "16165,0,1\n", + "39352,0,0\n39121,0,0\n38558,0,0\n5486,0,1\n5293,1,1\n", + "39843,0,1\n35595,0,0\n18867,0,1\n", + "21601,0,1\n", + "", + "", + "35207,0,1\n29304,0,0\n26878,0,1\n24626,0,1\n24588,0,0\n14640,0,0\n4921,0,1\n3567,1,1\n290,2,1\n139,3,0\n", + "36766,0,0\n15139,0,0\n11172,0,1\n", + "", + "30000,0,1\n7200,0,0\n60,1,1\n59,2,1\n" +]; + +// SF: the facts the loop hands `schedule` -- moved, ready, count, and the text lab.py builds +pub const SF_N : usize = 50; +pub const SF_MOVED : [50]u8 = [ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +]; + +pub const SF_READY : [50]u64 = [ + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 9, 9, 9, 9, 9, 100, 100, 100, 100, 100, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 9, 9, 9, 9, 9, 100, 100, 100, 100, 100 +]; + +pub const SF_COUNT : [50]string = [ + "-", + "0", + "3", + "COUNT_UNKNOWN", + "", + "-", + "0", + "3", + "COUNT_UNKNOWN", + "", + "-", + "0", + "3", + "COUNT_UNKNOWN", + "", + "-", + "0", + "3", + "COUNT_UNKNOWN", + "", + "-", + "0", + "3", + "COUNT_UNKNOWN", + "", + "-", + "0", + "3", + "COUNT_UNKNOWN", + "", + "-", + "0", + "3", + "COUNT_UNKNOWN", + "", + "-", + "0", + "3", + "COUNT_UNKNOWN", + "", + "-", + "0", + "3", + "COUNT_UNKNOWN", + "", + "-", + "0", + "3", + "COUNT_UNKNOWN", + "" +]; + +pub const SF_TEXT : [50]string = [ + "1,0,-", + "1,0,0", + "1,0,3", + "1,0,COUNT_UNKNOWN", + "1,0,", + "1,1,-", + "1,1,0", + "1,1,3", + "1,1,COUNT_UNKNOWN", + "1,1,", + "1,2,-", + "1,2,0", + "1,2,3", + "1,2,COUNT_UNKNOWN", + "1,2,", + "1,9,-", + "1,9,0", + "1,9,3", + "1,9,COUNT_UNKNOWN", + "1,9,", + "1,100,-", + "1,100,0", + "1,100,3", + "1,100,COUNT_UNKNOWN", + "1,100,", + "0,0,-", + "0,0,0", + "0,0,3", + "0,0,COUNT_UNKNOWN", + "0,0,", + "0,1,-", + "0,1,0", + "0,1,3", + "0,1,COUNT_UNKNOWN", + "0,1,", + "0,2,-", + "0,2,0", + "0,2,3", + "0,2,COUNT_UNKNOWN", + "0,2,", + "0,9,-", + "0,9,0", + "0,9,3", + "0,9,COUNT_UNKNOWN", + "0,9,", + "0,100,-", + "0,100,0", + "0,100,3", + "0,100,COUNT_UNKNOWN", + "0,100," +]; + +// SN: what the loop reads from the judge's answer -- the answer, whether there is a judge, the step (0 MASTER, 1 REQUEST, +// 2 IDLE, 3 any other word, 4 the unpacking raises) and the count word +pub const SN_N : usize = 48; +pub const SN_OUT : [48]string = [ + "", + "", + "MASTER 0\n", + "MASTER 0\n", + "REQUEST 3\n", + "REQUEST 3\n", + "IDLE 0", + "IDLE 0", + "MASTER", + "MASTER", + "A B C", + "A B C", + "FOO 1", + "FOO 1", + " MASTER 2 \n", + " MASTER 2 \n", + "MASTER\xc2\xa04", + "MASTER\xc2\xa04", + "REQUEST\x0b5", + "REQUEST\x0b5", + "IDLE\x1c1", + "IDLE\x1c1", + "MASTER\xc2\x857", + "MASTER\xc2\x857", + "master 1", + "master 1", + "MASTER 1 2", + "MASTER 1 2", + "MASTER\nREQUEST", + "MASTER\nREQUEST", + "\n", + "\n", + " \t ", + " \t ", + "REQUEST", + "REQUEST", + "IDLE -", + "IDLE -", + "MASTER 18446744073709551615", + "MASTER 18446744073709551615", + "REQUEST \xe3\x80\x80 4", + "REQUEST \xe3\x80\x80 4", + "ONE\xe2\x80\xa8TWO", + "ONE\xe2\x80\xa8TWO", + "MASTER 0\nIDLE 1\n", + "MASTER 0\nIDLE 1\n", + "- -", + "- -" +]; + +pub const SN_JUDGE : [48]u8 = [ + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 +]; + +pub const SN_NEXT : [48]u8 = [ + 0, 0, 0, 0, 1, 0, 2, 0, 4, 0, 4, 0, 3, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 4, 0, 0, 0, 0, 0, + 0, 0, 4, 0, 2, 0, 0, 0, 1, 0, 3, 0, 4, 0, 3, 0 +]; + +pub const SN_COUNT : [48]string = [ + "0", + "0", + "0", + "0", + "3", + "0", + "0", + "0", + "", + "0", + "", + "0", + "1", + "0", + "2", + "0", + "4", + "0", + "5", + "0", + "1", + "0", + "7", + "0", + "1", + "0", + "", + "0", + "REQUEST", + "0", + "0", + "0", + "0", + "0", + "", + "0", + "-", + "0", + "18446744073709551615", + "0", + "4", + "0", + "TWO", + "0", + "", + "0", + "-", + "0" +]; + +// RT: the ratchet step -- whether the commit has the checker and the ledger, whether the process ran, its exit code, +// stderr and stdout; the kind of record (0 skipped: no files, 1 did not run, 2 skipped: no ratchet, 3 unparsable, 4 judged), +// its `ok` (0 false, 1 true, 2 null) and, for an unparsable one, its `error` text +pub const RT_N : usize = 92; +pub const RT_FILES : [92]u8 = [ + 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +]; + +pub const RT_RAN : [92]u8 = [ + 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +]; + +pub const RT_RC : [92]i32 = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, -9, + -9, -9, -9, -9, -9, 101, 101, 101, 101, 101, 101, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, + 2, 2, 2, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, + 1, 0, 1 +]; + +pub const RT_ERR : [92]string = [ + "", + "", + "", + "", + "", + "", + "", + " \n", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + " padded err \n second", + "", + " \n", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + " padded err \n second", + "", + " \n", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + " padded err \n second", + "", + " \n", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + " padded err \n second", + "", + " \n", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + " padded err \n second", + "", + " \n", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + " padded err \n second", + "", + " \n", + "invalid choice", + "", + "usage: x\nerror: invalid choice", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + " padded err \n second", + "", + "invalid choice", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "usage: x\nerror: invalid choice", + "", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "", + " padded err \n second", + "usage: x\nerror: invalid choice", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "usage: x\nerror: invalid choice", + " \n", + "invalid choice", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + "", + "", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + " padded err \n second", + "invalid choice", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + " padded err \n second", + "invalid choice", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + " padded err \n second", + "invalid choice", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" +]; + +pub const RT_OUT : [92]string = [ + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "", + "", + "{\n \"verdict\": null,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"GREEN\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": null,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": null,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"red\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"commit\": \"x\",\n \"verdict\": \"green\",\n \"findings\": [\n {\n \"kind\": \"A\",\n \"path\": \"p\",\n \"what\": \"w\"\n }\n ]\n}", + "{\n \"commit\": \"x\",\n \"verdict\": \"green\",\n \"findings\": [\n {\n \"kind\": \"A\",\n \"path\": \"p\",\n \"what\": \"w\"\n }\n ]\n}", + "{\n \"verdict\": null,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": 5,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"red\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": 5,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"commit\": \"x\",\n \"verdict\": \"green\",\n \"findings\": [\n {\n \"kind\": \"A\",\n \"path\": \"p\",\n \"what\": \"w\"\n }\n ]\n}", + "{\n \"verdict\": 5,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": null,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": 5,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"commit\": \"x\",\n \"verdict\": \"green\",\n \"findings\": [\n {\n \"kind\": \"A\",\n \"path\": \"p\",\n \"what\": \"w\"\n }\n ]\n}", + "{\n \"verdict\": 5,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"GREEN\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"red\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": null,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": null,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "", + " \n", + "not json", + "{broken", + "Traceback (most recent call last):\n File x\nValueError: y", + "tri t27b ratchet: UNREADABLE run x", + "", + " \n", + "not json", + "{broken", + "Traceback (most recent call last):\n File x\nValueError: y", + "tri t27b ratchet: UNREADABLE run x", + "", + " \n", + "not json", + "{broken", + "Traceback (most recent call last):\n File x\nValueError: y", + "tri t27b ratchet: UNREADABLE run x", + "", + " \n", + "not json", + "{broken", + "Traceback (most recent call last):\n File x\nValueError: y", + "tri t27b ratchet: UNREADABLE run x", + " \n", + "Traceback (most recent call last):\n File x\nValueError: y", + " \n", + "Traceback (most recent call last):\n File x\nValueError: y", + "not json", + "tri t27b ratchet: UNREADABLE run x", + "{broken", + "Traceback (most recent call last):\n File x\nValueError: y", + " \n", + "", + "{broken", + "tri t27b ratchet: UNREADABLE run x", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"green\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"red\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"red\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"other\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": null,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": null,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": 5,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": 5,\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"GREEN\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"verdict\": \"GREEN\",\n \"commit\": \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\",\n \"ledger_commit\": \"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\",\n \"counts\": {\n \"STALE\": 0,\n \"UNLISTED\": 1\n },\n \"findings\": []\n}", + "{\n \"commit\": \"x\",\n \"verdict\": \"green\",\n \"findings\": [\n {\n \"kind\": \"A\",\n \"path\": \"p\",\n \"what\": \"w\"\n }\n ]\n}", + "{\n \"commit\": \"x\",\n \"verdict\": \"green\",\n \"findings\": [\n {\n \"kind\": \"A\",\n \"path\": \"p\",\n \"what\": \"w\"\n }\n ]\n}" +]; + +pub const RT_KIND : [92]u8 = [ + 4, 0, 0, 0, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 2, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 +]; + +pub const RT_OK : [92]u8 = [ + 1, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0 +]; + +pub const RT_TEXT : [92]string = [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "invalid choice", + "{broken", + "usage: x\nerror: invalid choice", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "padded err \n second", + "", + "invalid choice", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "usage: x\nerror: invalid choice", + "tri t27b ratchet: UNREADABLE run x", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "", + "padded err \n second", + "", + "tri t27b ratchet: UNREADABLE run /w/ratchet-run.json: Expecting value", + "", + "", + "invalid choice", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + "Traceback (most recent call last):\n File x\nValueError: y", + "tri t27b ratchet: UNREADABLE run x", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + "padded err \n second", + "invalid choice", + "t27b.py: error: argument cmd: invalid choice: 'ratchet' (choose from 'a', 'b')", + "usage: x\nerror: invalid choice", + "padded err \n second", + "invalid choice", + "", + "", + "padded err \n second", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" +]; + +// PB: publish -- 60 runs in 12 series; each series starts from an empty index and the index after run k is the one +// the spec must make from the index after run k-1 (PB_FIRST says run k is the first of its series) and run k's document +pub const PB_N : usize = 60; +pub const PB_FIRST : [60]u8 = [ + 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0 +]; + +pub const PB_DOC : [60]string = [ + "{\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 1\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": null,\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": {\n \"files\": 3\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": null,\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": null,\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": {\n \"files\": 1\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"files\": 1\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": {\n \"files\": 3\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"files\": 1\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 1\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"files\": 3\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 3\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 3\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": null,\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {\n \"files\": 1\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": {\n \"files\": 1\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": 7,\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 1\n },\n \"results\": []\n}\n", + "{\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"results\": []\n}\n", + "{\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"results\": []\n}\n" +]; + +pub const PB_SHA : [60]string = [ + "a2", + "a2", + "a2", + "a2", + "a1", + "a1", + "a1", + "a1", + "a2", + "a1", + "a1", + "a1", + "a2", + "a1", + "a2", + "a2", + "a1", + "a1", + "a2", + "a1", + "a2", + "a2", + "a1", + "a2", + "a2", + "a2", + "a1", + "a1", + "a2", + "a2", + "a2", + "a2", + "a2", + "a2", + "a2", + "a2", + "a1", + "a2", + "a2", + "a2", + "a2", + "a2", + "a1", + "a2", + "a1", + "a1", + "a2", + "a2", + "a1", + "a1", + "a2", + "a1", + "a1", + "a1", + "a1", + "a2", + "a2", + "a2", + "a2", + "a2" +]; + +pub const PB_NEW : [60]string = [ + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {},\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": {\n \"files\": 3\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": {},\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": {},\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": {\n \"files\": 3\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": 7,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {},\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {},\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {},\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {},\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {},\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"files\": 3\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 3\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 3\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": 7,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": 7,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": {},\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": 7,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 3\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n },\n {\n \"commit\": \"a1\",\n \"ref\": \"request\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": 7,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {},\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 3\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 3\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": null,\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a1\",\n \"ref\": \"master\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a1.json\",\n \"log\": \"/runs/a1.log\"\n },\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": {\n \"a\": {\n \"b\": 1\n }\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t0\",\n \"finished\": \"u0\",\n \"summary\": 7,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t1\",\n \"finished\": \"u1\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t2\",\n \"finished\": \"u2\",\n \"summary\": {\n \"files\": 1\n },\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"master\",\n \"started\": \"t3\",\n \"finished\": \"u3\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n", + "[\n {\n \"commit\": \"a2\",\n \"ref\": \"request\",\n \"started\": \"t4\",\n \"finished\": \"u4\",\n \"summary\": null,\n \"json\": \"/runs/a2.json\",\n \"log\": \"/runs/a2.log\"\n }\n]\n" +]; + + +test run_done_equals_the_pythons_on_every_document { + var i : usize = 0; + while (i < RD_N) { + assert lt_run_done(RD_DOC[i]) == (RD_DONE[i] == 1); + i = i + 1; + } +} + +test the_admitted_requests_equal_the_pythons_on_every_directory { + var keys : [16]u64 = undefined; + var ages : [16]i64 = undefined; + var ord : [16]u32 = undefined; + var act : [16]u8 = undefined; + var adm : [16]u32 = undefined; + var facts : [2048]u8 = undefined; + var cur : [1]usize = [0]; + var i : usize = 0; + while (i < AD_N) { + const n : usize = AD_OFF[i + 1] - AD_OFF[i]; + var j : usize = 0; + while (j < n) { + ages[j] = AD_AGES[AD_OFF[i] + j]; + keys[j] = (AD_NOW - (ages[j] as u64)) * 1000000000; + j = j + 1; + } + cur[0] = 0; + const r : usize = lt_admit(AD_NAMES[i], &keys, &ages, n, AD_KNOWN[i], &ord, &act, &adm, &facts, 2048, &cur); + assert r == AD_NADM[i]; + j = 0; + while (j < n) { + assert act[j] == AD_ACT[AD_OFF[i] + j]; + j = j + 1; + } + var k : usize = 0; + while (k < r) { + assert adm[k] == AD_ADM[AD_AOFF[i] + k]; + k = k + 1; + } + assert lx_out_is(&facts, cur[0], AD_FACTS[i]) == true; + i = i + 1; + } +} + +test the_schedule_facts_and_the_judges_answer_equal_the_pythons { + var out : [256]u8 = undefined; + var sp : [2]usize = undefined; + var i : usize = 0; + while (i < SF_N) { + const w : usize = lt_schedule_facts(SF_MOVED[i] == 1, SF_READY[i], SF_COUNT[i], &out, 256, 0); + assert lx_out_is(&out, w, SF_TEXT[i]) == true; + i = i + 1; + } + var j : usize = 0; + while (j < SN_N) { + const nx : u8 = lt_schedule_next(SN_OUT[j], SN_JUDGE[j] == 1, &sp); + assert nx == SN_NEXT[j]; + if (nx != LT_NEXT_ERROR) { + if (sp[0] == LAB_NO) { + assert lx_out_is("0", 1, SN_COUNT[j]) == true; + } else { + assert lab_same_span(SN_OUT[j], sp[0], sp[1], SN_COUNT[j], 0, SN_COUNT[j].len) == true; + } + } + j = j + 1; + } +} + +test the_ratchet_step_is_read_as_the_pythons_ratchet_reads_it { + var out : [1024]u8 = undefined; + var i : usize = 0; + while (i < RT_N) { + const kind : u8 = lt_step_kind(RT_FILES[i] == 1, RT_RAN[i] == 1, RT_RC[i], RT_ERR[i], RT_OUT[i]); + assert kind == RT_KIND[i]; + assert lt_step_ok(kind, RT_RC[i], RT_OUT[i]) == RT_OK[i]; + if (kind == LT_STEP_UNPARSABLE) { + const w : usize = lt_step_error(RT_ERR[i], RT_OUT[i], &out, 1024, 0); + assert lx_out_is(&out, w, RT_TEXT[i]) == true; + } + i = i + 1; + } +} + +test the_index_after_a_publish_equals_the_pythons_on_every_run { + var out : [8192]u8 = undefined; + var i : usize = 0; + while (i < PB_N) { + var old : string = ""; + if (PB_FIRST[i] == 0) { old = PB_NEW[i - 1]; } + const w : usize = lt_index_publish(old, PB_DOC[i], PB_SHA[i], &out, 8192, 0); + assert lx_out_is(&out, w, PB_NEW[i]) == true; + i = i + 1; + } +} +// END GENERATED diff --git a/specs/lab/lab_t27b_text.t27 b/specs/lab/lab_t27b_text.t27 new file mode 100644 index 0000000000..6a4916c51a --- /dev/null +++ b/specs/lab/lab_t27b_text.t27 @@ -0,0 +1,240 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/lab/lab_t27b_text.t27 -- the few text readers and writers the t27b lab's decisions need that +; specs/lab/text.t27 (LabText, issue #11041) does not hold (issue #11042, epic #11040). +; -- +; The lab decisions of contrib/railway/t27b-lab/lab.py read text the way Python reads it. LabText holds +; the rules for lines, spaces, characters and spans once, for every lab spec, and this file does not +; restate them: str.splitlines, str.strip and s[:n] come from there. What is here is only what LabText +; lacks, and each piece has a reason: +; lx_ubreak_len, lx_uline_end the lines of a process's output read with text=True (universal newlines): +; a break is \n, \r\n or a lone \r, and nothing else; \v, \f and the +; Unicode breaks do not split such a line. parse_cargo_test reads these. +; lx_dec_value int(digits) held at the largest u64: a longer run reads as that maximum +; where LabText.lab_count_of refuses it (the report's `FAIL N` is nonzero +; whatever its size, so a refusal would change a verdict) +; lx_is_digit, lx_digits_end the run of ASCII digits (the regex \d in the ASCII range) +; lx_is_word the regex \w in the ASCII range +; lx_add_sat a sum of counts that does not wrap +; lx_put_idec, lx_put_pad "%d" of an int that may be negative, and the padding of "%-19s" +; lx_out_is the check a test makes on what a writer wrote +; The regex \d and \w also match other Unicode digits and letters; t27c's reports and cargo's lines +; carry none, and these readers do not match them. +; A reader takes the text and offsets and returns offsets; a writer takes the out buffer, its capacity +; and the cursor and returns the new cursor, which still advances when the buffer is full. +; ASCII only (L3). phi^2 + 1/phi^2 = 3 | TRINITY + +module LabT27bText; + +use lab::text::{lab_put_lit, lab_put_count}; + +/// The largest value a reader returns: a longer run of digits saturates here. +pub const LX_BIG : u64 = 18446744073709551615; + +pub fn lx_is_digit(b : u8) -> bool { + return b >= 48 and b <= 57; +} + +/// A regex \w byte in the ASCII range: a letter, a digit or the underscore. +pub fn lx_is_word(b : u8) -> bool { + if (b >= 48 and b <= 57) { return true; } + if (b >= 65 and b <= 90) { return true; } + if (b >= 97 and b <= 122) { return true; } + return b == 95; +} + +/// The end of the run of digits that starts at t[a], within t[a..b]. +pub fn lx_digits_end(t : string, a : usize, b : usize) -> usize { + var k : usize = a; + while (k < b and lx_is_digit(t[k])) { + k = k + 1; + } + return k; +} + +/// The value of the digits t[a..b]: int(text). LX_BIG when it does not fit. +pub fn lx_dec_value(t : string, a : usize, b : usize) -> u64 { + var n : u64 = 0; + var k : usize = a; + while (k < b) { + const d : u64 = (t[k] - 48) as u64; + if (n > (LX_BIG - d) / 10) { return LX_BIG; } + n = n * 10 + d; + k = k + 1; + } + return n; +} + +/// a + b, held at LX_BIG. +pub fn lx_add_sat(a : u64, b : u64) -> u64 { + if (a > LX_BIG - b) { return LX_BIG; } + return a + b; +} + +/// The length of the break at t[at] in universal-newline text: 2 for \r\n, 1 for \n or a lone \r, else 0. +pub fn lx_ubreak_len(t : string, at : usize) -> usize { + if (at >= t.len) { return 0; } + if (t[at] == 13) { + if (at + 1 < t.len and t[at + 1] == 10) { return 2; } + return 1; + } + if (t[at] == 10) { return 1; } + return 0; +} + +/// The end of the universal-newline line that starts at `at`: its break, or t.len. +pub fn lx_uline_end(t : string, at : usize) -> usize { + var k : usize = at; + while (k < t.len and lx_ubreak_len(t, k) == 0) { + k = k + 1; + } + return k; +} + +/// Writes v with its sign: "%d" of an int that may be negative (an age after a clock step). +pub fn lx_put_idec(out : []u8, cap : usize, w : usize, v : i64) -> usize { + if (v >= 0) { return lab_put_count(out, cap, w, v as u64); } + const x : usize = lab_put_lit(out, cap, w, "-"); + return lab_put_count(out, cap, x, (0 - (v + 1)) as u64 + 1); +} + +/// Writes n spaces: the padding of "%-19s". +pub fn lx_put_pad(out : []u8, cap : usize, w : usize, n : usize) -> usize { + var k : usize = 0; + while (k < n) { + if (w + k < cap) { out[w + k] = 32; } + k = k + 1; + } + return w + n; +} + +/// Is out[0..w] exactly want: the check every test makes on what a writer wrote. +pub fn lx_out_is(out : []const u8, w : usize, want : string) -> bool { + if (w != want.len) { return false; } + var k : usize = 0; + while (k < w) { + if (out[k] != want[k]) { return false; } + k = k + 1; + } + return true; +} + +test digits_and_words_are_the_ascii_regex_classes { + assert lx_is_digit(48) == true; + assert lx_is_digit(57) == true; + assert lx_is_digit(47) == false; + assert lx_is_digit(58) == false; + assert lx_is_word(48) == true; + assert lx_is_word(57) == true; + assert lx_is_word(65) == true; + assert lx_is_word(90) == true; + assert lx_is_word(97) == true; + assert lx_is_word(122) == true; + assert lx_is_word(95) == true; + assert lx_is_word(47) == false; + assert lx_is_word(58) == false; + assert lx_is_word(64) == false; + assert lx_is_word(91) == false; + assert lx_is_word(94) == false; + assert lx_is_word(96) == false; + assert lx_is_word(123) == false; + assert lx_is_word(46) == false; + assert lx_is_word(32) == false; +} + +test a_digit_run_ends_where_the_digits_do { + assert lx_digits_end("123x", 0, 4) == 3; + assert lx_digits_end("x123", 0, 4) == 0; + assert lx_digits_end("123", 0, 3) == 3; + assert lx_digits_end("12 3", 1, 4) == 2; + assert lx_digits_end("12 3", 3, 4) == 4; + assert lx_digits_end("", 0, 0) == 0; + assert lx_digits_end("123456", 0, 3) == 3; +} + +test a_decimal_reads_exactly_and_saturates_where_python_is_larger { + assert lx_dec_value("0", 0, 1) == 0; + assert lx_dec_value("007", 0, 3) == 7; + assert lx_dec_value("", 0, 0) == 0; + assert lx_dec_value("1844674407370955161", 0, 19) == 1844674407370955161; + assert lx_dec_value("18446744073709551614", 0, 20) == 18446744073709551614; + assert lx_dec_value("18446744073709551615", 0, 20) == 18446744073709551615; + assert lx_dec_value("18446744073709551616", 0, 20) == LX_BIG; + assert lx_dec_value("99999999999999999999", 0, 20) == LX_BIG; + assert lx_dec_value("100000000000000000000000", 0, 24) == LX_BIG; + assert lx_dec_value("0000000000000000000000000012", 0, 28) == 12; + assert lx_dec_value("x12y", 1, 3) == 12; +} + +test sums_of_counts_never_wrap { + assert lx_add_sat(1, 2) == 3; + assert lx_add_sat(0, 0) == 0; + assert lx_add_sat(LX_BIG, 0) == LX_BIG; + assert lx_add_sat(LX_BIG - 1, 1) == LX_BIG; + assert lx_add_sat(LX_BIG - 1, 2) == LX_BIG; + assert lx_add_sat(LX_BIG, LX_BIG) == LX_BIG; + assert lx_add_sat(10, LX_BIG - 10) == LX_BIG; +} + +test a_universal_newline_line_ends_at_lf_crlf_or_a_lone_cr_and_nowhere_else { + assert lx_ubreak_len("a\nb", 1) == 1; + assert lx_ubreak_len("a\x0d\nb", 1) == 2; + assert lx_ubreak_len("a\x0db", 1) == 1; + assert lx_ubreak_len("a\x0d", 1) == 1; + assert lx_ubreak_len("a\x0d\x0d\nb", 1) == 1; + assert lx_ubreak_len("a\x0bb", 1) == 0; + assert lx_ubreak_len("a\x0cb", 1) == 0; + assert lx_ubreak_len("a\x1cb", 1) == 0; + assert lx_ubreak_len("a\x1db", 1) == 0; + assert lx_ubreak_len("a\x1eb", 1) == 0; + assert lx_ubreak_len("ab", 1) == 0; + assert lx_ubreak_len("ab", 2) == 0; + assert lx_ubreak_len("ab", 9) == 0; + assert lx_uline_end("ab\ncd", 0) == 2; + assert lx_uline_end("ab\ncd", 3) == 5; + assert lx_uline_end("ab\x0bcd\ne", 0) == 5; + assert lx_uline_end("ab\x0d\ncd", 0) == 2; + assert lx_uline_end("", 0) == 0; +} + +test a_signed_decimal_carries_its_sign { + var out : [40]u8 = undefined; + assert lx_out_is(&out, lx_put_idec(&out, 40, 0, 0), "0") == true; + assert lx_out_is(&out, lx_put_idec(&out, 40, 0, 12), "12") == true; + assert lx_out_is(&out, lx_put_idec(&out, 40, 0, -1), "-1") == true; + assert lx_out_is(&out, lx_put_idec(&out, 40, 0, -300), "-300") == true; + assert lx_out_is(&out, lx_put_idec(&out, 40, 0, 9223372036854775807), "9223372036854775807") == true; + assert lx_out_is(&out, lx_put_idec(&out, 40, 0, -9223372036854775807), "-9223372036854775807") == true; + assert lx_put_idec(&out, 2, 0, -1050) == 5; +} + +test padding_writes_spaces_and_a_clipped_write_leaves_the_byte_at_cap_alone { + var out : [8]u8 = undefined; + var k : usize = 0; + while (k < 8) { + out[k] = 0; + k = k + 1; + } + var w : usize = lab_put_lit(&out, 8, 0, "ab"); + w = lx_put_pad(&out, 8, w, 3); + assert lx_out_is(&out, w, "ab ") == true; + k = 0; + while (k < 8) { + out[k] = 0; + k = k + 1; + } + assert lx_put_pad(&out, 3, 0, 5) == 5; + assert out[2] == 32; + assert out[3] == 0; + assert lx_put_pad(&out, 8, 6, 0) == 6; + assert out[6] == 0; +} + +test out_is_refuses_a_length_or_a_byte_that_differs { + var out : [4]u8 = undefined; + const w : usize = lab_put_lit(&out, 4, 0, "abc"); + assert lx_out_is(&out, w, "abc") == true; + assert lx_out_is(&out, w, "abd") == false; + assert lx_out_is(&out, w, "ab") == false; + assert lx_out_is(&out, w, "abcd") == false; + assert lx_out_is(&out, 0, "") == true; +}