/** Minimal assertions for the imported Main agent cases, without Node or Vitest. */ export const cases: {name:string;run:()=>any}[]=[] export const it=(name:string,run:()=>any)=>cases.push({name,run}) export const describe=(_name:string,run:()=>any)=>run() export const assert=(value:any,message:string)=>{if(!value)throw new Error(message)} const same=(a:any,b:any):boolean=>b?.__contains ? b.values.every((v:any)=>a.includes(v)) : JSON.stringify(a)===JSON.stringify(b) const subset=(a:any,b:any):boolean=>b && typeof b==='object' ? Object.entries(b).every(([k,v])=>subset(a?.[k],v)) : a===b export function expect(value:any,negate=false):any { const check=(ok:boolean)=>assert(negate?!ok:ok,`Expected ${String(value)}${negate?' not':''} to match`) const result:any={ toBe:(b:any)=>check(value===b),toEqual:(b:any)=>check(same(value,b)),toHaveLength:(n:number)=>check(value.length===n), toMatchObject:(b:any)=>check(subset(value,b)),toMatch:(b:RegExp)=>check(b.test(value)),toContain:(b:any)=>check(value.includes(b)), toBeUndefined:()=>check(value===undefined),toBeDefined:()=>check(value!==undefined),toBeGreaterThanOrEqual:(b:number)=>check(value>=b), toThrow:(b:any)=>{let error;try{value()}catch(e){error=e}check(error!==undefined && (b instanceof RegExp?b.test(String(error)):String(error).includes(b)))}, } Object.defineProperty(result,'not',{get:()=>expect(value,!negate)}) Object.defineProperty(result,'rejects',{get:()=>({toThrow:async(b:string)=>{let error;try{await value}catch(e){error=e}check(error!==undefined&&String(error).includes(b))}})}) return result } expect.arrayContaining=(values:any[])=>({__contains:true,values}) export async function until(condition:()=>any) { const deadline=Date.now()+5000 while(!await condition()) {assert(Date.now()setTimeout(resolve,0))} } export const setImmediate=(callback:any)=>setTimeout(callback,0)