import assert from 'node:assert/strict'; import { expect } from '@playwright/test'; export async function verifyVisualEffects(page, operation) { await expect.poll(async()=>page.evaluate(()=>globalThis.__trainingSceneDiagnostics().bridgeWorkshop.pending)).toBe(false); const d=await page.evaluate(()=>globalThis.__trainingSceneDiagnostics().bridgeWorkshop), targets=d.targets; for (const effect of operation.effects || []) { const t=targets.find(t=>t.id===effect.targetId); assert.ok(t,effect.targetId); if(d.modelBinding && t.id==='front-pump-hydraulic-pump'){assert.equal(t.visible,false);continue;} if(typeof effect.visible==='boolean')assert.equal(t.visible,effect.visible,t.id); const offset=effect.targetId==='bridge-gasket' && effect.offset?.[0] ? [2.3,0,1.31] : effect.offset; if(offset)assert.ok(t.position.every((v,i)=>Math.abs(v-t.home[i]-offset[i])<1e-5),t.id+' position'); } if(operation.kind==='rotate'){ const t=targets.find(t=>t.id===operation.targetId); if(t?.rotatingQuaternion){assert.deepEqual(t.quaternion,[0,0,0,1],'valve housing must stay fixed');assert.ok(Math.abs(t.rotatingQuaternion[3])<0.999,'handle must visibly turn');} } if(d.modelBinding){ assert.equal(d.modelBinding.boltCount,4);assert.equal(d.modelBinding.mountedOnVehicle,true); const installed=targets.find(t=>t.id==='bridge-new-pump'); if(operation.targetId==='bridge-new-pump'){ const expected=d.modelBinding.sourceBounds; for(const key of ['min','max'])assert.ok(installed.worldBounds[key].every((v,i)=>Math.abs(v-expected[key][i])<0.001),'new pump must occupy original source bounds'); } } }