a post-component library for building user-interfaces on the web.
at push-qwruonslltow 43 lines 1.4 kB view raw
1import { tests } from './runtime.ts' 2 3export function test(name: string, fn: () => void | Promise<void>): void { 4 tests.push({ name, fn }) 5} 6 7export { bench } from 'mitata' 8 9function raise(message: string, fn: Function) { 10 const error = new Error(message) 11 Error.captureStackTrace?.(error, fn) 12 throw error 13} 14 15export function assert(value: unknown, message?: string): asserts value { 16 if (!value) raise(message ?? 'assertion failed', assert) 17} 18 19export function assert_eq<T>(actual: T, expected: T, message?: string): asserts actual { 20 if (actual !== expected) raise(message ?? `Expected ${expected} but got ${actual}`, assert_eq) 21} 22 23export function assert_deep_eq<T>(actual: T, expected: T, message?: string): asserts actual { 24 if (!deep_eq(actual, expected)) { 25 raise( 26 message ?? `Expected ${JSON.stringify(expected, null, 2)} but got ${JSON.stringify(actual, null, 2)}`, 27 assert_deep_eq, 28 ) 29 } 30} 31 32function deep_eq(a: any, b: any): boolean { 33 if (a === b) return true 34 if (Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) return false 35 if (!(typeof a === 'object' || typeof b === 'object')) return false 36 const a_keys = Object.keys(a) 37 const b_keys = new Set(Object.keys(b)) 38 if (a_keys.length !== b_keys.size) return false 39 for (const key of a_keys) { 40 if (!b_keys.has(key) || !deep_eq(a[key], b[key])) return false 41 } 42 return true 43}