export function deepEqual(a, b, message) { if (!is_equal(a, b)) { throw new Error(message || `Expected ${JSON.stringify(a)} to equal ${JSON.stringify(b)}`); } } function is_equal(a, b) { if (a && typeof a === 'object') { const is_array = Array.isArray(a); if (Array.isArray(b) !== is_array) return false; if (is_array) { if (a.length !== b.length) return false; return a.every((value, i) => is_equal(value, b[i])); } const a_keys = Object.keys(a).sort(); const b_keys = Object.keys(b).sort(); if (a_keys.join(',') !== b_keys.join(',')) return false; return a_keys.every(key => is_equal(a[key], b[key])); } return a === b; } export function equal(a, b, message) { if (a != b) throw new Error(message || `Expected ${a} to equal ${b}`); } export function ok(condition, message) { if (!condition) throw new Error(message || `Expected ${condition} to be truthy`); } export function htmlEqual(actual, expected, message) { return deepEqual( normalizeHtml(window, actual), normalizeHtml(window, expected), message ); } function normalizeHtml(window, html) { try { const node = window.document.createElement('div'); node.innerHTML = html .replace(//g, '') .replace(/>[\s\r\n]+<') .trim(); return node.innerHTML.replace(/<\/?noscript\/?>/g, ''); } catch (err) { throw new Error(`Failed to normalize HTML:\n${html}`); } }