open-standards/wai/wai-vector/tests/clock_track.rs
Transaction Science 2f147d2a30
Some checks failed
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 2m13s
standards workspaces build + test / aac-rs (pull_request) Successful in 1m58s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 50s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 34s
standards workspaces build + test / map-rs (pull_request) Successful in 31s
standards workspaces build + test / mesh-rs (pull_request) Successful in 31s
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Has been cancelled
no-vanity-metrics / WAI public text names no comparison (pull_request) Has been cancelled
no-vanity-metrics / WAI public text names no company or product (pull_request) Has been cancelled
standards workspaces build + test / arl-rs (pull_request) Has been cancelled
standards workspaces build + test / eoc-rs (pull_request) Has been cancelled
standards workspaces build + test / jcp-rs (pull_request) Has been cancelled
standards workspaces build + test / joule-ui-rs (pull_request) Has been cancelled
standards workspaces build + test / jouledesk-rs (pull_request) Has been cancelled
standards workspaces build + test / joulehook-rs (pull_request) Has been cancelled
standards workspaces build + test / proof-rs (pull_request) Has been cancelled
standards workspaces build + test / sandbox-rs (pull_request) Has been cancelled
standards workspaces build + test / sense-rs (pull_request) Has been cancelled
standards workspaces build + test / smart-byte-rs (pull_request) Has been cancelled
standards workspaces build + test / macOS energy backends (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cargo-class corpora · macos (pull_request) Has been cancelled
WAI conformance / quantum core and corpus under wasm32-wasip2 (wasmtime) (pull_request) Has been cancelled
WAI conformance / v2 vocabulary · manifests validate as stated (pull_request) Has been cancelled
WAI conformance / independent verifiers · claims, JWP, key discovery and integer payloads (Python) (pull_request) Has been cancelled
WAI conformance / delivery telemetry · CMCD and CMSD against an independent library (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · linux-arm64 (pull_request) Has been cancelled
WAI conformance / cross-arch byte-equality · macos (pull_request) Has been cancelled
WAI conformance / C2PA manifest emission · signed, read back, validated (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux (pull_request) Has been cancelled
WAI energy receipts / energy receipts · linux-arm64 (pull_request) Has been cancelled
WAI energy receipts / energy receipts · macos (pull_request) Has been cancelled
WAI section references / cited sections exist (pull_request) Has been cancelled
wai-vector vector graphics / linux-aarch64 (pull_request) Has been cancelled
wai-vector vector graphics / linux-x86_64 (pull_request) Has been cancelled
wai-vector vector graphics / macos-arm64 (pull_request) Has been cancelled
wai-vector vector graphics / wasm32-wasip2 (wasmtime) (pull_request) Has been cancelled
wai-vector vector graphics / wasm32 under Node (pull_request) Has been cancelled
wai-vector vector graphics / fuzz, peak allocation, comparison count (pull_request) Has been cancelled
workflow hygiene / every workflow supersedes its own queue (pull_request) Has been cancelled
standards workspaces build + test / openpay (pull_request) Has been cancelled
wai-vector: WOS1 and WVG1 with the refusal order of §2.7, the clock, tracks, the interval check and the cost (D7-2)
The reference crate of wai.graphics.vector (no_std + alloc, no
dependencies; SHA-256 is wai-ops's, by #[path]):
- WOS1 parsed with §2.1's load checks in order, and written;
- WVG1 split (steps 1-3, nothing allocated before the exact length),
  the record pass (step 4), the cross-record checks (step 5(a)-(h)),
  the sets by digest with at most length + 1 bytes read (step 6), the
  glyphs (7), the interval check (8) and the per-frame cost (9);
- the clock with the frame range by division, track evaluation, and
  placement;
- the JSON authoring form, one member per field, packing back to the
  same bytes;
- the CLI: check, cost, pack, unpack, vectors gen and verify;
- a wasm32 module and verify.mjs for Node.

The corpus wai/vector-conformance/ (arith, canonical, refusals,
geometry, cost) with its README's provenance line and a sha256.json
sidecar naming the div255 table; wai-vector.yml with native, wasip2,
node and fuzz jobs.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-11 03:59:47 -04:00

101 lines
4.3 KiB
Rust

//! §3.1, §3.2 and §2.7 *Render*: the frame range by division, and track evaluation.
use wai_vector::clock::{frame_range, frames, in_range};
use wai_vector::track::eval;
use wai_vector::wvg1::{Key, Table};
fn key(t: u32, value: i32, interp: u8) -> Key {
Key { t, value, interp, zero: [0; 3] }
}
/// At `P = 2^40` (tb = 2^20, a rate of 1/2^20), `g·P` does not fit 64 bits for
/// `g ≥ 2^23`, and wraps to 0 at `g = 2^24`. The range is decided by division.
#[test]
fn frame_range_by_division() {
let p = 1u64 << 40;
let (t0, dur) = (0u32, (1u32 << 31) - 1);
assert_eq!(frame_range(t0, dur, p), (0, 0));
for g in [1u64, 1 << 23, 1 << 24, (1 << 24) + 1, (1 << 31) - 1, 1 << 32, 1 << 63, u64::MAX] {
assert!(!in_range(g, t0, dur, p), "frame {g} is out of range at P = 2^40");
}
assert!(in_range(0, t0, dur, p));
// An ordinary rate: 25 fps at tb = 120000, from t0 = 4801 for one second.
let p = 4_800;
// Its last tick is 124,800 = 26·4800.
assert_eq!(frame_range(4_801, 120_000, p), (2, 26));
assert!(!in_range(1, 4_801, 120_000, p) && in_range(2, 4_801, 120_000, p) && in_range(26, 4_801, 120_000, p) && !in_range(27, 4_801, 120_000, p));
// A document with no frame at a rate: one tick between frame ticks.
assert_eq!(frames(1, 1, 4_800).count(), 0);
assert!(!in_range(0, 1, 1, 4_800));
}
/// M2: a 750-frame roll at an integer speed, keys on frame ticks, lands every frame on
/// the grid at every listed rate.
#[test]
fn integer_speed_roll_lands_on_the_grid() {
let tb = 120_000u64;
for (num, den) in [(25u64, 1u64), (30_000, 1_001), (60, 1), (24_000, 1_001)] {
let p = den * tb / num;
for k in [1i64, 3, -2, 7] {
for frames_n in [750u64, 749, 1] {
if frames_n * p >= 1 << 31 {
continue;
}
let v0 = 12_345i64;
let v1 = v0 + 256 * k * frames_n as i64;
let keys = [key(0, v0 as i32, 1), key((frames_n * p) as u32, v1 as i32, 0)];
for m in 0..=frames_n {
let v = eval(&keys, &[], (m * p) as i64);
assert_eq!(v, v0 + 256 * k * m as i64, "{num}/{den}, k = {k}, {frames_n} frames, frame {m}");
}
}
}
}
}
/// M5: every value lies between the two keys it interpolates, and each key's value is
/// reached exactly, for linear keys and for tables that are not monotone.
#[test]
fn values_stay_between_their_keys() {
let mut s = 0x2545_F491_4F6C_DD1Du64;
let mut rnd = |n: u64| {
s ^= s << 13;
s ^= s >> 7;
s ^= s << 17;
s % n
};
let mut tables = Vec::new();
for _ in 0..8 {
let mut e = [0u32; 17];
e[16] = 65_536;
for x in e.iter_mut().take(16).skip(1) {
*x = rnd(65_537) as u32;
}
tables.push(Table { e });
}
tables.push(Table { e: [0, 65536, 0, 65536, 0, 65536, 0, 65536, 0, 65536, 0, 65536, 0, 65536, 0, 65536, 65536] });
for case in 0..4_000 {
let n = 2 + rnd(4) as usize;
let mut t = rnd(1000) as u32;
let mut keys = Vec::new();
for i in 0..n {
let interp = if i + 1 == n { 0 } else { [0u8, 1, 2, 3, 10][rnd(5) as usize] };
let value = rnd(1 << 24) as i32 - (1 << 23);
keys.push(key(t, value, interp));
t += 1 + if case % 3 == 0 { rnd(1 << 30) as u32 / n as u32 } else { rnd(5_000) as u32 };
}
for (i, w) in keys.windows(2).enumerate() {
let (a, b) = (w[0], w[1]);
let (lo, hi) = (a.value.min(b.value) as i64, a.value.max(b.value) as i64);
assert_eq!(eval(&keys, &tables, i64::from(a.t)), i64::from(a.value), "key {i} exact");
for tau in [a.t as i64, a.t as i64 + 1, (a.t as i64 + b.t as i64) / 2, b.t as i64 - 1] {
let v = eval(&keys, &tables, tau);
assert!(lo <= v && v <= hi, "case {case}: {v} outside [{lo}, {hi}] at {tau}");
}
}
let last = keys[n - 1];
assert_eq!(eval(&keys, &tables, i64::from(last.t)), i64::from(last.value));
assert_eq!(eval(&keys, &tables, i64::from(last.t) + 99), i64::from(last.value));
assert_eq!(eval(&keys, &tables, i64::from(keys[0].t) - 1), i64::from(keys[0].value));
}
}