# _self_collision_test2.py — 자기몸충돌 감시 실효성 검증 [2026-07-19]
#   배경: 인덱스 누락으로 검사가 매번 내부 오류→catch가 삼켜 "충돌 없음" 오판(감시 무력화).
#   판정: ①홈 자세 무충돌+최근접거리 유한 ②접힘 자세 BASE↔U 검출 ③무작위 200자세 검출>0
import asyncio, json
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        br = await p.chromium.launch(headless=True)
        pg = await (await br.new_context()).new_page()
        await pg.set_viewport_size({'width': 1600, 'height': 900})
        await pg.goto('http://localhost:8090/DOZIKWORKS_OS_v5_locked.dc.html')
        await pg.wait_for_timeout(12000)
        r = await pg.evaluate("""()=>{
            const SC=window.DZW_SELF_COLLIDE;
            if(!SC||!SC.ready||!SC.ready()) return {준비:false};
            const J=(a)=>({S:a[0],L:a[1],U:a[2],R:a[3],B:a[4],T:a[5]});
            const 홈=SC.check(J([-0.1,-63.8,-36.7,0,-91,-5.5]));
            const 홈d=SC.dist(J([-0.1,-63.8,-36.7,0,-91,-5.5]));
            const 접힘=SC.check(J([0,-105,160,0,150,0]));
            let s=12345; const rnd=(a,b)=>{ s=(s*1103515245+12345)&0x7fffffff; return a+(s/0x7fffffff)*(b-a); };
            const lim=[[-180,180],[-105,155],[-86,160],[-200,200],[-150,150],[-455,455]];
            let n=0;
            for(let t=0;t<200;t++){ if(SC.check(J(lim.map(([a,b])=>rnd(a,b))))) n++; }
            return {준비:true, 홈, 홈최근접:홈d, 접힘, 무작위검출:n};
        }""")
        print('상태:', json.dumps(r, ensure_ascii=False))
        ok = (r.get('준비') and r.get('홈') is None
              and r.get('홈최근접', {}).get('d', 0) not in (None, 0) and r['홈최근접']['d'] < 1e9
              and r.get('접힘') == 'BASE↔U' and r.get('무작위검출', 0) > 0)
        print()
        print('=== 결과:', 'PASS' if ok else 'FAIL')
        await br.close()
        return 0 if ok else 1

raise SystemExit(asyncio.run(main()))
