this repo has no description
1// test_multiverse.js — Playwright test for multiverse demo (per-package layout)
2const { chromium } = require('playwright');
3
4(async () => {
5 const browser = await chromium.launch();
6 const page = await browser.newPage();
7
8 const consoleMessages = [];
9 page.on('console', msg => consoleMessages.push(msg.text()));
10
11 const errors = [];
12 page.on('pageerror', err => errors.push(err.message));
13
14 console.log('Navigating to demo5_multiverse.html...');
15 await page.goto('http://localhost:8080/odoc-interactive-extension/demo5_multiverse.html');
16
17 // Wait for cells to render and execute (worker init + universe linking + eval)
18 console.log('Waiting for cells to execute...');
19 await page.waitForTimeout(15000);
20
21 // Check multiverse-specific behavior in console
22 const hasWorkerFrom9090 = consoleMessages.some(m =>
23 m.includes('9090'));
24 const hasStdlibFallback = consoleMessages.some(m =>
25 m.includes('stdlib_dcs not found') && m.includes('findlib discovery'));
26 const hasStdlibDiscovered = consoleMessages.some(m =>
27 m.includes('Found stdlib dcs via findlib'));
28 const hasDcsRewrite = consoleMessages.some(m =>
29 m.includes('Rewriting dcs_url'));
30 const hasUniverseLinking = consoleMessages.some(m =>
31 m.includes('universes'));
32 const hasInitFinished = consoleMessages.some(m =>
33 m.includes('init() finished'));
34 const hasSetupFinished = consoleMessages.some(m =>
35 m.includes('setup() finished'));
36 const hasInitError = consoleMessages.some(m =>
37 m.includes('init_error'));
38
39 // Check for correct outputs
40 const hasInt7 = consoleMessages.some(m =>
41 m.includes('int = 7'));
42 const hasGreeting = consoleMessages.some(m =>
43 m.includes('Hello, Multiverse World'));
44 const hasYojsonLoaded = consoleMessages.some(m =>
45 m.includes('Custom #require: yojson loaded'));
46 const hasJsonOutput = consoleMessages.some(m =>
47 m.includes('"source": "multiverse"') || m.includes('multiverse'));
48
49 console.log('');
50 console.log('=== Results ===');
51 console.log(` Worker loaded from port 9090: ${hasWorkerFrom9090 ? 'YES' : 'NO'}`);
52 console.log(` stdlib_dcs fallback triggered: ${hasStdlibFallback ? 'YES' : 'NO'}`);
53 console.log(` Stdlib discovered via findlib: ${hasStdlibDiscovered ? 'YES' : 'NO'}`);
54 console.log(` dcs_url rewritten to absolute: ${hasDcsRewrite ? 'YES' : 'NO'}`);
55 console.log(` Universe linking used: ${hasUniverseLinking ? 'YES' : 'NO'}`);
56 console.log(` Init completed: ${hasInitFinished ? 'YES' : 'NO'}`);
57 console.log(` Setup completed: ${hasSetupFinished ? 'YES' : 'NO'}`);
58 console.log(` Init error: ${hasInitError ? 'YES (BAD)' : 'NO (good)'}`);
59 console.log(` Output "int = 7": ${hasInt7 ? 'YES' : 'NO'}`);
60 console.log(` Output "Hello, Multiverse": ${hasGreeting ? 'YES' : 'NO'}`);
61 console.log(` Yojson loaded via #require: ${hasYojsonLoaded ? 'YES' : 'NO'}`);
62 console.log(` JSON output with "multiverse": ${hasJsonOutput ? 'YES' : 'NO'}`);
63
64 let passed = true;
65
66 if (!hasStdlibFallback) {
67 console.log('\nFAIL: stdlib_dcs fallback was not triggered (multiverse needs it)');
68 passed = false;
69 }
70 if (!hasStdlibDiscovered) {
71 console.log('\nFAIL: Stdlib was not discovered via findlib universe linking');
72 passed = false;
73 }
74 if (!hasDcsRewrite) {
75 console.log('\nFAIL: dcs_url was not rewritten to absolute URL');
76 passed = false;
77 }
78 if (!hasInitFinished) {
79 console.log('\nFAIL: Worker init did not complete');
80 passed = false;
81 }
82 if (!hasSetupFinished) {
83 console.log('\nFAIL: Worker setup did not complete');
84 passed = false;
85 }
86 if (hasInitError) {
87 console.log('\nFAIL: Worker reported init_error');
88 const errMsg = consoleMessages.find(m => m.includes('init_error'));
89 console.log(` ${errMsg}`);
90 passed = false;
91 }
92 if (!hasInt7) {
93 console.log('\nFAIL: Expected output "int = 7" not found');
94 passed = false;
95 }
96 if (!hasGreeting) {
97 console.log('\nFAIL: Expected output "Hello, Multiverse World" not found');
98 passed = false;
99 }
100 if (!hasYojsonLoaded) {
101 console.log('\nFAIL: Yojson was not loaded via #require');
102 passed = false;
103 }
104
105 if (passed) {
106 console.log('\nPASS: Multiverse demo working correctly');
107 } else {
108 console.log('\n--- Console messages (last 50) ---');
109 consoleMessages.slice(-50).forEach(m => console.log(` ${m.substring(0, 200)}`));
110 }
111
112 await browser.close();
113 process.exit(passed ? 0 : 1);
114})();