35 lines
3.8 KiB
HTML
35 lines
3.8 KiB
HTML
<!doctype html><meta charset="utf-8"><title>뷰어 자동 검증</title><pre id="result">검증 중</pre><iframe src="/" style="width:1280px;height:1000px;border:0"></iframe><script type="module">
|
|
const iframe = document.querySelector('iframe'), result = document.querySelector('#result');
|
|
const pause = () => new Promise(resolve => setTimeout(resolve, 120));
|
|
const checks = [];
|
|
const check = (condition, name) => { checks.push({ name, pass: !!condition }); if (!condition) throw Error(name); };
|
|
try {
|
|
for (let i = 0; i < 80 && !iframe.contentDocument?.querySelector('canvas'); i++) await pause();
|
|
const doc = iframe.contentDocument;
|
|
const click = async text => { const button = [...doc.querySelectorAll('button')].find(e => e.textContent === text); check(button, `버튼 존재: ${text}`); button.click(); await pause(); };
|
|
const canvas = doc.querySelector('canvas'); check(canvas?.width > 0, '3D 캔버스 생성');
|
|
check(doc.body.textContent.includes('154'), '원본 154 객체 표시');
|
|
for (const name of ['평면','정면','측면','A-A','B-B','전체']) await click(name);
|
|
await click('모두 숨김'); check(doc.querySelector('.panel-heading').textContent.includes('0 / 154'), '전체 숨김 반영');
|
|
await click('모두 표시'); check(doc.querySelector('.panel-heading').textContent.includes('94 / 154'), '반복선 제외한 전체 표시');
|
|
const details = doc.querySelector('details'); details.open = true;
|
|
const row = doc.querySelector('.part-row button'); row.click(); await pause();
|
|
check(doc.querySelector('.selection').textContent.includes('원본 선 번호'), '선택하면 원본 근거 표시');
|
|
await click('선택한 윤곽 숨기기'); check(doc.querySelector('.panel-heading').textContent.includes('93 / 154'), '개별 숨김 반영');
|
|
let captured; iframe.contentWindow.URL.createObjectURL = blob => { captured = blob; return 'blob:viewer-test'; }; doc.addEventListener('click', e => { if (e.target.closest('a[download]')) e.preventDefault(); }, true);
|
|
await click('3D OBJ ↓'); const obj = await captured.text(); check(obj.split('\n').filter(s => s.startsWith('o ')).length === 153, 'OBJ 내보내기 153개 객체'); check(!obj.includes('NaN'), 'OBJ 유효한 좌표'); check(obj.split('\n').filter(s => s.startsWith('f ')).length === 466, 'OBJ 연결 삼각면 466개');
|
|
const before = canvas.toDataURL(); canvas.dispatchEvent(new iframe.contentWindow.KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true })); await pause(); check(canvas.toDataURL() !== before, '키보드 회전 반영');
|
|
const beforeZoom = canvas.toDataURL(); canvas.dispatchEvent(new iframe.contentWindow.WheelEvent('wheel', { deltaY: -200, bubbles: true, cancelable: true })); await pause(); check(canvas.toDataURL() !== beforeZoom, '휠 확대 반영');
|
|
const input = doc.querySelector('.search'), setter = Object.getOwnPropertyDescriptor(iframe.contentWindow.HTMLInputElement.prototype, 'value').set;
|
|
setter.call(input, '없는부재'); input.dispatchEvent(new iframe.contentWindow.Event('input', { bubbles: true })); await pause();
|
|
check(doc.querySelector('.empty'), '윤곽 검색 빈 결과 표시');
|
|
await click('도면'); check(doc.querySelector('.drawing-preview'), '도면 발췌 표시');
|
|
await click('측구상세'); await pause(); check(doc.querySelector('.drawing-preview').getAttribute('src').includes('측구상세'), '상세도 전환');
|
|
await click('검증'); check(doc.querySelectorAll('.checks .pending').length === 3, '미검증 항목 구분');
|
|
await click('렌더링 보기'); check(doc.querySelector('.canvas-tag').textContent.includes('도면 검토용'), '시각화 구분');
|
|
result.textContent = JSON.stringify({ status: 'PASS', checks }, null, 2);
|
|
} catch(e) { result.textContent = JSON.stringify({ status:'FAIL', error:e.message, checks }, null, 2); }
|
|
</script>
|
|
|
|
|