char-slop/berry
multipurpose self-modifiable agentic harness
git clone https://git.t4t.associates/char-slop/berry
4cce09f
main
1import type { HeaderContext } from "@berry/api/web.ts" ; 2import { assertEquals , assertStrictEquals } from "@std/assert" ; 3import { viewContext , withDom } from "@berry/util/dom.ts" ; 4import { headerWidgets } from "./header.ts" ; 5 6Deno . test ( "reloading a header widget replaces it without disturbing its neighbors or leaving stale nodes" , () => 7withDom (() => { 8const widgets = headerWidgets (); 9const disposed :Element [] = []; 10const create = () => { 11const element = document . createElement ( "button" ); 12return { 13 element, 14update ( context :HeaderContext ) { 15element . textContent = context . tid ; 16}, 17dispose () { 18disposed . push ( element ); 19}, 20}; 21}; 22const first = { name :"first" , create}; 23const second = { name :"second" , create}; 24const context = ( tid :string ) => viewContext ({ tid}); 25widgets . update ([ first , second ], context ); 26const original = widgets . element . firstElementChild ! ; 27const neighbor = widgets . element . lastElementChild ! ; 28 29const reloaded = { name :"first" , create :() => create () }; 30widgets . update ([ second , reloaded ], context ); 31const replacement = widgets . element . lastElementChild ! ; 32assertEquals ( widgets . element . contains ( original ), false ); 33assertStrictEquals ( widgets . element . firstElementChild , neighbor ); 34assertEquals ( replacement . textContent , first . name ); 35assertEquals ( disposed , [ original ]); 36 37widgets . update ([ second ], context ); 38assertEquals ( widgets . element . contains ( replacement ), false ); 39assertStrictEquals ( widgets . element . firstElementChild , neighbor ); 40assertEquals ( disposed , [ original , replacement ]); 41widgets . dispose (); 42assertEquals ( disposed , [ original , replacement , neighbor ]); 43}));