1<!DOCTYPE html>
2<html lang="en" data-theme="dark">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>Ledger — Self-tests</title>
7 <link rel="stylesheet" href="style.css">
8 <style>
9 .test-list { display: flex; flex-direction: column; gap: 2px; margin-top: 12px; }
10 .test-item {
11 display: flex; gap: 10px; align-items: baseline;
12 padding: 6px 10px; border-radius: 6px; font-size: 13px;
13 }
14 .test-item:nth-child(odd) { background: var(--surface-2); }
15 .test-badge {
16 font-weight: 700; font-size: 11px; letter-spacing: 0.04em;
17 min-width: 38px; text-align: center; border-radius: 5px; padding: 1px 4px;
18 }
19 .test-pass .test-badge { color: var(--status-good); border: 1px solid var(--status-good); }
20 .test-fail .test-badge { color: var(--status-critical); border: 1px solid var(--status-critical); }
21 .test-error { color: var(--status-critical); font-size: 12px; }
22 .summary-line { font-size: 15px; font-weight: 600; }
23 .summary-line.all-pass { color: var(--status-good); }
24 .summary-line.has-fail { color: var(--status-critical); }
25 </style>
26</head>
27<body>
28 <div class="app">
29 <header class="app-header">
30 <div class="brand">
31 <span class="brand-mark" aria-hidden="true"></span>
32 <h1>Ledger — Self-tests</h1>
33 </div>
34 <div class="header-actions">
35 <a class="btn-ghost" style="text-decoration:none; padding:7px 14px; border:1px solid var(--border); border-radius:8px;" href="index.html">← Back to dashboard</a>
36 </div>
37 </header>
38
39 <section class="card">
40 <div class="card-head">
41 <h2>Core logic test suite</h2>
42 <span class="card-sub">Also runs headless: <code>node tests.js</code></span>
43 </div>
44 <p id="test-summary" class="summary-line">Running…</p>
45 <div id="test-list" class="test-list"></div>
46 </section>
47 </div>
48
49 <script>
50 window.onTestResults = function (summary) {
51 var summaryEl = document.getElementById('test-summary');
52 var listEl = document.getElementById('test-list');
53 summaryEl.textContent = summary.passed + ' / ' + summary.total + ' tests passed' +
54 (summary.failed ? ' — ' + summary.failed + ' failing' : '');
55 summaryEl.className = 'summary-line ' + (summary.failed ? 'has-fail' : 'all-pass');
56 summary.results.forEach(function (r) {
57 var row = document.createElement('div');
58 row.className = 'test-item ' + (r.pass ? 'test-pass' : 'test-fail');
59 var badge = document.createElement('span');
60 badge.className = 'test-badge';
61 badge.textContent = r.pass ? 'PASS' : 'FAIL';
62 var name = document.createElement('span');
63 name.textContent = r.name;
64 row.appendChild(badge);
65 row.appendChild(name);
66 if (!r.pass) {
67 var err = document.createElement('span');
68 err.className = 'test-error';
69 err.textContent = '— ' + r.error;
70 row.appendChild(err);
71 }
72 listEl.appendChild(row);
73 });
74 };
75 </script>
76 <script src="data.js"></script>
77 <script src="charts.js"></script>
78 <script src="tests.js"></script>
79</body>
80</html>
81
Discussion
1 comment on this trajectory. Recorded by @patrick-toulme.