// Runde-6-Tests: Standort-Grundversorgung (ensureHomeArea) const fs = require('fs'); const stores = { tiles: new Map(), meta: new Map() }; function mkReq(result) { return { result }; } global.indexedDB = { open() { const req = {}; setTimeout(() => { const db = { objectStoreNames: { contains: n => !!stores[n] }, transaction(name) { const os = { get: k => mkReq(stores[name].get(k)), put: (v, k) => { stores[name].set(k, v); return mkReq(undefined); }, delete: k => { stores[name].delete(k); return mkReq(undefined); }, clear: () => { stores[name].clear(); return mkReq(undefined); }, count: () => mkReq(stores[name].size), getAllKeys: () => mkReq([...stores[name].keys()]), }; const tx = { objectStore: () => os }; setTimeout(() => tx.oncomplete && tx.oncomplete()); return tx; }, close() {}, }; req.result = db; req.onsuccess && req.onsuccess(); }); return req; } }; global.window = {}; Object.defineProperty(globalThis, 'navigator', { value: { onLine: true, storage: { persist: () => Promise.resolve(true) } }, configurable: true }); global.pmtiles = { PMTiles: class { getZxy() { return Promise.resolve({ data: new Uint8Array(100).buffer }); } } }; global.MapGLStyle = { tilesUrl: () => 'http://t/d.pmtiles' }; global.fetch = () => Promise.resolve({ ok: true, arrayBuffer: () => Promise.resolve(new Uint8Array(50).buffer), json: () => Promise.resolve([]) }); eval(fs.readFileSync(process.argv[2], 'utf8')); const MO = global.window.MapOffline; (async () => { // 1. Leerer Speicher → Standort wird geladen (type 'standort') const r1 = await MO.ensureHomeArea(48.07, 11.96); console.log('ensureHomeArea (leer):', r1, '— Kacheln:', stores.tiles.size); if (r1 !== 1 || stores.tiles.size === 0) throw new Error('Grundversorgung lädt nicht'); const reg = stores.meta.get('regions').find(r => r.type === 'standort'); if (!reg) throw new Error('standort-Region fehlt'); // 2. Bestand vorhanden → kein Doppel-Download const before = stores.tiles.size; const r2 = await MO.ensureHomeArea(48.07, 11.96); console.log('ensureHomeArea (vorhanden):', r2); if (r2 !== 0 || stores.tiles.size !== before) throw new Error('Doppel-Download trotz Bestand'); // 3. clear() → Zonen bleiben, Standort weg → ensureHomeArea lädt neu await MO.markDeadZone(48.07, 11.96); await MO.clear(); if (stores.tiles.size !== 0) throw new Error('clear unvollständig'); const r3 = await MO.ensureHomeArea(48.07, 11.96); console.log('Nach clear neu geladen:', r3, '— Zonen erhalten:', (stores.meta.get('deadzones') || []).length); if (r3 !== 1) throw new Error('Reload nach clear fehlt'); if ((stores.meta.get('deadzones') || []).length !== 1) throw new Error('Zonen weg'); // 4. Über Cap → Auto-Pfad lädt nicht stores.meta.set('totalBytes', 300 * 1048576); stores.tiles.clear(); const r4 = await MO.ensureHomeArea(48.07, 11.96); console.log('Über Cap:', r4); if (r4 !== 0) throw new Error('Cap-Guard fehlt'); console.log('\nALLE RUNDE-6-TESTS BESTANDEN'); })().catch(e => { console.error('FEHLER:', e.message); process.exit(1); });