Files
foundryvtt-reve-de-dragon/tests/scripts/tc-12-calendrier.sh
T

116 lines
5.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# ============================================================================
# TC-12 — Calendrier / Temps
# Usage: ./tc-12-calendrier.sh [--navigate]
# ============================================================================
set -uo pipefail
source "$(dirname "$0")/tc-header.sh"
echo ""
echo "╔══════════════════════════════════════════════════════════════╗"
echo "║ TC-12 — Calendrier / Temps ║"
echo "╚══════════════════════════════════════════════════════════════╝"
echo ""
tc_ensure_ready
# ============================================================================
echo "--- TC-12-001: Calendrier visible ---"
# ============================================================================
R=$(jse_get_async "
try {
const cal = game.system.rdd?.calendrier;
if (!cal) return {error: 'no calendrier'};
const el = document.querySelector('.calendar, #rdd-calendar, [class*=calendar]');
const visible = el !== null && el.offsetParent !== null;
return { exists: !!cal, visible, tag: el?.tagName };
} catch(e) { return {error: e?.message || String(e)}; }
")
EXISTS=$(eval_ok "$R" exists)
ERR=$(eval_ok "$R" error)
[ "$EXISTS" = "True" ] && pass "TC-12-001: calendrier existe" || fail "TC-12-001: KO ($ERR)"
# ============================================================================
echo "--- TC-12-002: Heure Draconique ---"
# ============================================================================
R=$(jse_get_async "
try {
const cal = game.system.rdd?.calendrier;
if (!cal) return {error: 'no calendrier'};
const timestamp = cal.timestamp || cal.getTimestamp?.();
const heure = cal.dateCourante?.()?.getHeure?.() ?? cal.getCurrentHeure?.();
const date = cal.dateCourante?.();
return { heure, hasDate: !!date, timestamp };
} catch(e) { return {error: e?.message || String(e)}; }
")
HEURE=$(eval_ok "$R" heure)
HASDATE=$(eval_ok "$R" hasDate)
ERR=$(eval_ok "$R" error)
[ "$HASDATE" = "True" ] && pass "TC-12-002: heure draconique = $HEURE" || fail "TC-12-002: KO ($ERR)"
# ============================================================================
echo "--- TC-12-003: Avancement du temps ---"
# ============================================================================
R=$(jse_get_async "
try {
const cal = game.system.rdd?.calendrier;
if (!cal) return {error: 'no calendrier'};
const ts = cal.timestamp;
const before = ts.indexDate + ':' + ts.indexMinute;
const newTs = ts.addJours(1);
if (cal.setNewTimestamp) await cal.setNewTimestamp(newTs);
else if (cal.incrementerJour) await cal.incrementerJour();
await new Promise(r => setTimeout(r, 500));
const after = cal.timestamp.indexDate + ':' + cal.timestamp.indexMinute;
const changed = before !== after;
return { before, after, changed };
} catch(e) { return {error: e?.message || String(e)}; }
")
CHANGED=$(eval_ok "$R" changed)
ERR=$(eval_ok "$R" error)
[ "$CHANGED" = "True" ] && pass "TC-12-003: temps avance" || fail "TC-12-003: KO ($ERR)"
# ============================================================================
echo "--- TC-12-004: Nombres Astraux ---"
# ============================================================================
R=$(jse_get_async "
try {
const cal = game.system.rdd?.calendrier;
if (!cal) return {error: 'no calendrier'};
const na = cal.getNombresAstraux?.() ?? cal.nombresAstraux;
return { hasNA: !!na, na: typeof na === 'object' ? JSON.stringify(na).substring(0, 200) : na };
} catch(e) { return {error: e?.message || String(e)}; }
")
HASNA=$(eval_ok "$R" hasNA)
ERR=$(eval_ok "$R" error)
[ "$HASNA" = "True" ] && pass "TC-12-004: nombres astraux disponibles" || fail "TC-12-004: KO ($ERR)"
# ============================================================================
echo "--- TC-12-007: Chronologie ---"
# ============================================================================
R=$(jse_get_async "
try {
const { DialogChronologie } = await import('/systems/foundryvtt-reve-de-dragon/module/dialog-chronologie.js');
if (!DialogChronologie) return {error: 'no DialogChronologie'};
await DialogChronologie.create();
await new Promise(r => setTimeout(r, 2000));
const el = document.querySelector('.dialog-chronologie, [class*=chronolog]');
const ok = !!el;
// Close it
const apps = Object.values(ui.windows).filter(w => w.constructor?.name?.includes('Chronolog'));
for (const a of apps) await a.close();
if (!apps.length && el) el.remove();
return { opened: ok };
} catch(e) { return {error: e?.message || String(e)}; }
")
OPENED=$(eval_ok "$R" opened)
ERR=$(eval_ok "$R" error)
[ "$OPENED" = "True" ] && pass "TC-12-007: chronologie ouverte" || fail "TC-12-007: KO ($ERR)"
# ============================================================================
echo ""
echo "--- Console errors ---"
ERRS=$(tc_console_errors)
[ "$ERRS" -le 5 ] 2>/dev/null && pass "Console errors ≤5 ($ERRS)" || fail "Console errors: $ERRS"
tc_summary