a post-component library for building user-interfaces on the web.
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}