1<!DOCTYPE html>
2<html lang="en">
3<head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>Wiki Parser & Graph Tests</title>
7 <link rel="preconnect" href="https://fonts.googleapis.com">
8 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
10 <style>
11 :root {
12 --bg: #0f172a;
13 --card-bg: #1e293b;
14 --border: #334155;
15 --text: #f8fafc;
16 --text-muted: #94a3b8;
17 --accent: #6366f1;
18 --success: #10b981;
19 --success-bg: rgba(16, 185, 129, 0.15);
20 --error: #ef4444;
21 --error-bg: rgba(239, 68, 68, 0.15);
22 --font-sans: 'Inter', system-ui, -apple-system, sans-serif;
23 --font-mono: 'JetBrains Mono', monospace;
24 }
25
26 * { box-sizing: border-box; margin: 0; padding: 0; }
27 body {
28 background-color: var(--bg);
29 color: var(--text);
30 font-family: var(--font-sans);
31 padding: 2rem;
32 line-height: 1.5;
33 }
34
35 .container {
36 max-width: 900px;
37 margin: 0 auto;
38 }
39
40 header {
41 display: flex;
42 align-items: center;
43 justify-content: space-between;
44 margin-bottom: 2rem;
45 border-bottom: 1px solid var(--border);
46 padding-bottom: 1rem;
47 }
48
49 h1 {
50 font-size: 1.75rem;
51 font-weight: 700;
52 display: flex;
53 align-items: center;
54 gap: 0.75rem;
55 }
56
57 .badge {
58 background: var(--accent);
59 color: #fff;
60 padding: 0.25rem 0.6rem;
61 border-radius: 9999px;
62 font-size: 0.8rem;
63 font-weight: 600;
64 }
65
66 .summary-card {
67 background: var(--card-bg);
68 border: 1px solid var(--border);
69 border-radius: 12px;
70 padding: 1.5rem;
71 display: grid;
72 grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
73 gap: 1.5rem;
74 margin-bottom: 2rem;
75 }
76
77 .stat-box {
78 display: flex;
79 flex-direction: column;
80 }
81 .stat-label {
82 color: var(--text-muted);
83 font-size: 0.875rem;
84 text-transform: uppercase;
85 letter-spacing: 0.05em;
86 }
87 .stat-value {
88 font-size: 2rem;
89 font-weight: 700;
90 margin-top: 0.25rem;
91 }
92 .stat-value.pass { color: var(--success); }
93 .stat-value.fail { color: var(--error); }
94
95 .test-list {
96 display: flex;
97 flex-direction: column;
98 gap: 0.75rem;
99 }
100
101 .test-item {
102 background: var(--card-bg);
103 border: 1px solid var(--border);
104 border-radius: 8px;
105 padding: 1rem 1.25rem;
106 display: flex;
107 align-items: center;
108 justify-content: space-between;
109 transition: border-color 0.2s ease;
110 }
111
112 .test-item.pass { border-left: 4px solid var(--success); }
113 .test-item.fail { border-left: 4px solid var(--error); }
114
115 .test-title {
116 font-size: 0.95rem;
117 font-weight: 500;
118 color: var(--text);
119 }
120
121 .test-status {
122 display: inline-flex;
123 align-items: center;
124 gap: 0.4rem;
125 font-size: 0.85rem;
126 font-weight: 600;
127 padding: 0.25rem 0.6rem;
128 border-radius: 6px;
129 }
130
131 .test-status.pass {
132 background: var(--success-bg);
133 color: var(--success);
134 }
135
136 .test-status.fail {
137 background: var(--error-bg);
138 color: var(--error);
139 }
140
141 .nav-btn {
142 display: inline-block;
143 margin-top: 1.5rem;
144 color: var(--accent);
145 text-decoration: none;
146 font-weight: 500;
147 }
148 .nav-btn:hover { text-decoration: underline; }
149 </style>
150</head>
151<body>
152 <div class="container">
153 <header>
154 <h1>🧪 Wiki Test Suite <span class="badge">Node & Browser</span></h1>
155 <a href="index.html" class="nav-btn">← Back to Wiki App</a>
156 </header>
157
158 <div class="summary-card">
159 <div class="stat-box">
160 <span class="stat-label">Total Tests</span>
161 <span class="stat-value" id="stat-total">0</span>
162 </div>
163 <div class="stat-box">
164 <span class="stat-label">Passed</span>
165 <span class="stat-value pass" id="stat-passed">0</span>
166 </div>
167 <div class="stat-box">
168 <span class="stat-label">Failed</span>
169 <span class="stat-value fail" id="stat-failed">0</span>
170 </div>
171 <div class="stat-box">
172 <span class="stat-label">Status</span>
173 <span class="stat-value" id="stat-status">-</span>
174 </div>
175 </div>
176
177 <div class="test-list" id="test-results-list">
178
179 </div>
180 </div>
181
182 <script src="parser.js"></script>
183 <script src="tests.js"></script>
184 <script>
185 document.addEventListener('DOMContentLoaded', () => {
186 if (window.runWikiTests) {
187 const startTime = performance.now();
188 const results = window.runWikiTests();
189 const endTime = performance.now();
190 const duration = (endTime - startTime).toFixed(1);
191
192 const total = results.length;
193 const passed = results.filter(r => r.passed).length;
194 const failed = total - passed;
195
196 document.getElementById('stat-total').textContent = total;
197 document.getElementById('stat-passed').textContent = passed;
198 document.getElementById('stat-failed').textContent = failed;
199
200 const statusEl = document.getElementById('stat-status');
201 if (failed === 0) {
202 statusEl.textContent = 'PASSED ✅';
203 statusEl.className = 'stat-value pass';
204 } else {
205 statusEl.textContent = 'FAILED ❌';
206 statusEl.className = 'stat-value fail';
207 }
208
209 const listContainer = document.getElementById('test-results-list');
210 results.forEach((res, i) => {
211 const item = document.createElement('div');
212 item.className = `test-item ${res.passed ? 'pass' : 'fail'}`;
213
214 item.innerHTML = `
215 <span class="test-title">${i + 1}. ${escapeHtml(res.message)}</span>
216 <span class="test-status ${res.passed ? 'pass' : 'fail'}">
217 ${res.passed ? '✓ PASS' : '✗ FAIL'}
218 </span>
219 `;
220 listContainer.appendChild(item);
221 });
222 }
223
224 function escapeHtml(str) {
225 return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
226 }
227 });
228 </script>
229</body>
230</html>
231
Discussion
No comments yet. Start the discussion. Recorded by @agentsage-runs.