test(graph): ruthless coverage for v2.0.8 memory-state colour mode

80 new vitest cases exhaustively exercising the v2.0.8 colour-mode
additions, taking total dashboard coverage to 251 tests.

Pure-function correctness:
- getMemoryState: 12 retention boundaries including exact thresholds,
  NaN, ±Infinity, negative, and >1 values + determinism across 10k
  random samples.
- getNodeColor: per-node-type mapping in type mode (all 8 types),
  per-bucket mapping in state mode, unknown-type fallback, and the
  invariants that type mode ignores retention + state mode ignores type.
- MEMORY_STATE_COLORS: valid 6-digit hex, all four buckets distinct,
  zero overlap with NODE_TYPE_COLORS.
- MEMORY_STATE_DESCRIPTIONS: threshold parentheticals match getMemoryState
  bucket boundaries (70 / 40 / 10), all four lines distinct.

NodeManager state machine:
- default mode 'type', field writable pre-createNodes.
- setColorMode is idempotent (early return verified via copy() spy counts).
- setColorMode calls color.copy + emissive.copy + glow.color.copy exactly
  once per node per transition, never replaces mesh / glow / material
  references, preserves userData.{nodeId,type,retention}.
- rapid 5× type <-> state toggle preserves all three maps.
- addNode during state mode inherits the mode; subsequent switch to
  type correctly retints the live-added node.
- suppressed-node interaction: setColorMode updates color + emissive but
  never touches opacity or emissiveIntensity (v2.0.5 SIF channel stays
  isolated from v2.0.8 colour channel).
- defensive paths: missing glow, missing userData.retention, missing
  userData.type — all degrade to sane defaults without throwing.

Also refreshes the embedded dashboard build so the Rust binary picks up
the new SvelteKit chunks with the memory-state-colors feature baked in.
This commit is contained in:
Sam Valladares 2026-04-19 21:12:06 -05:00
parent 318d4db147
commit d7f0fe03e0
56 changed files with 682 additions and 18 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
import{a as r}from"../chunks/BOu53idK.js";import{w as t}from"../chunks/UvrLlSZu.js";export{t as load_css,r as start};

View file

@ -1 +0,0 @@
import{a as r}from"../chunks/00s_zK56.js";import{w as t}from"../chunks/FMdNDkar.js";export{t as load_css,r as start};

View file

@ -1 +1 @@
import"../chunks/Bzak7iHL.js";import"../chunks/CrlWs-6R.js";import{p as h,f as g,t as d,a as l,d as v,e as s,r as o}from"../chunks/VE8Jor13.js";import{s as p}from"../chunks/DHnEMX8z.js";import{a as _,f as x}from"../chunks/7UNxJI5L.js";import{i as $}from"../chunks/jyeIy8pa.js";import{p as m}from"../chunks/FMdNDkar.js";import{s as k}from"../chunks/00s_zK56.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var E=x("<h1> </h1> <p> </p>",1);function D(f,n){h(n,!1),$();var t=E(),r=g(t),c=s(r,!0);o(r);var a=v(r,2),u=s(a,!0);o(a),d(()=>{var e;p(c,i.status),p(u,(e=i.error)==null?void 0:e.message)}),_(f,t),l()}export{D as component};
import"../chunks/Bzak7iHL.js";import"../chunks/CrlWs-6R.js";import{p as h,f as g,t as d,a as l,d as v,e as s,r as o}from"../chunks/VE8Jor13.js";import{s as p}from"../chunks/DHnEMX8z.js";import{a as _,f as x}from"../chunks/7UNxJI5L.js";import{i as $}from"../chunks/jyeIy8pa.js";import{p as m}from"../chunks/UvrLlSZu.js";import{s as k}from"../chunks/BOu53idK.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var E=x("<h1> </h1> <p> </p>",1);function D(f,n){h(n,!1),$();var t=E(),r=g(t),c=s(r,!0);o(r);var a=v(r,2),u=s(a,!0);o(a),d(()=>{var e;p(c,i.status),p(u,(e=i.error)==null?void 0:e.message)}),_(f,t),l()}export{D as component};

View file

@ -1 +1 @@
import"../chunks/Bzak7iHL.js";import"../chunks/CrlWs-6R.js";import{o as p}from"../chunks/DWVWfZUn.js";import{p as r,a as t}from"../chunks/VE8Jor13.js";import{i as a}from"../chunks/jyeIy8pa.js";import{g as m}from"../chunks/00s_zK56.js";function u(i,o){r(o,!1),p(()=>m("/graph",{replaceState:!0})),a(),t()}export{u as component};
import"../chunks/Bzak7iHL.js";import"../chunks/CrlWs-6R.js";import{o as p}from"../chunks/DWVWfZUn.js";import{p as r,a as t}from"../chunks/VE8Jor13.js";import{i as a}from"../chunks/jyeIy8pa.js";import{g as m}from"../chunks/BOu53idK.js";function u(i,o){r(o,!1),p(()=>m("/graph",{replaceState:!0})),a(),t()}export{u as component};

View file

@ -1,4 +1,4 @@
var Cc=Object.defineProperty;var Pc=(i,t,e)=>t in i?Cc(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var zt=(i,t,e)=>Pc(i,typeof t!="symbol"?t+"":t,e);import"../chunks/Bzak7iHL.js";import{o as Ll,a as Ul}from"../chunks/DWVWfZUn.js";import{p as fs,I as Dc,a as ps,e as At,d as Dt,O as Lc,r as bt,t as on,g as V,u as ei,f as Il,s as De,h as te,c as Uc}from"../chunks/VE8Jor13.js";import{s as me,d as Nl,a as Ge}from"../chunks/DHnEMX8z.js";import{i as Zn}from"../chunks/JkhlGLjU.js";import{e as cr,i as sa}from"../chunks/ByItJEsC.js";import{a as we,f as Ue,c as Ic}from"../chunks/7UNxJI5L.js";import{s as Pe,r as Fl}from"../chunks/Cu3VmnGp.js";import{s as Er}from"../chunks/BR2EHpd7.js";import{s as $a}from"../chunks/ussr1V5_.js";import{b as Ol}from"../chunks/BRHZEveZ.js";import{b as Bl}from"../chunks/B5Pq2mnD.js";import{s as Nc,a as Fc}from"../chunks/AcZBvMXu.js";import{b as Oc}from"../chunks/FMdNDkar.js";import{b as Bc}from"../chunks/DHakDdar.js";import{p as cs}from"../chunks/ykT2B6d3.js";import{N as zl}from"../chunks/BNytumrp.js";import"../chunks/CrlWs-6R.js";import{i as zc}from"../chunks/jyeIy8pa.js";import{a as Zi}from"../chunks/DcQGRi49.js";import{e as kc}from"../chunks/XIUN5r_Y.js";/**
var Cc=Object.defineProperty;var Pc=(i,t,e)=>t in i?Cc(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var zt=(i,t,e)=>Pc(i,typeof t!="symbol"?t+"":t,e);import"../chunks/Bzak7iHL.js";import{o as Ll,a as Ul}from"../chunks/DWVWfZUn.js";import{p as fs,I as Dc,a as ps,e as At,d as Dt,O as Lc,r as bt,t as on,g as V,u as ei,f as Il,s as De,h as te,c as Uc}from"../chunks/VE8Jor13.js";import{s as me,d as Nl,a as Ge}from"../chunks/DHnEMX8z.js";import{i as Zn}from"../chunks/JkhlGLjU.js";import{e as cr,i as sa}from"../chunks/ByItJEsC.js";import{a as we,f as Ue,c as Ic}from"../chunks/7UNxJI5L.js";import{s as Pe,r as Fl}from"../chunks/Cu3VmnGp.js";import{s as Er}from"../chunks/BR2EHpd7.js";import{s as $a}from"../chunks/ussr1V5_.js";import{b as Ol}from"../chunks/BRHZEveZ.js";import{b as Bl}from"../chunks/B5Pq2mnD.js";import{s as Nc,a as Fc}from"../chunks/AcZBvMXu.js";import{b as Oc}from"../chunks/UvrLlSZu.js";import{b as Bc}from"../chunks/DHakDdar.js";import{p as cs}from"../chunks/ykT2B6d3.js";import{N as zl}from"../chunks/BNytumrp.js";import"../chunks/CrlWs-6R.js";import{i as zc}from"../chunks/jyeIy8pa.js";import{a as Zi}from"../chunks/DcQGRi49.js";import{e as kc}from"../chunks/XIUN5r_Y.js";/**
* @license
* Copyright 2010-2024 Three.js Authors
* SPDX-License-Identifier: MIT