Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 
 

50 wiersze
4.1 KiB

  1. import fs from 'node:fs';
  2. import assert from 'node:assert/strict';
  3. import {chromium} from '@playwright/test';
  4. import {login,call} from './role-permissions-live.mjs';
  5. const dir='reports/bridge-content-authoring-20260924',fixture=JSON.parse(fs.readFileSync(dir+'/fixture.json','utf8'));
  6. const signed=await login('root'),checks=[];
  7. const browser=await chromium.launch({channel:'msedge',headless:true,args:['--enable-unsafe-swiftshader']});
  8. try{const page=await browser.newPage({viewport:{width:1440,height:1000}});
  9. await page.goto('http://127.0.0.1:6180/');
  10. for(const item of fixture.items){
  11. const response=await call('tran/v1/content/projects/'+item.modelProjectId,signed.accessToken);assert.equal(response.status,200);
  12. const result=await page.evaluate(async content=>{
  13. const style=document.createElement('style');style.textContent='.authoring-test .training-shell,.authoring-test .training-main,.authoring-test .training-viewport{width:100%!important;height:100%!important;min-height:0!important;min-width:0!important;display:block!important;padding:0!important}.authoring-test .training-shell>:not(.training-main),.authoring-test .training-main>:not(.training-viewport),.authoring-test .training-viewport>:not(canvas){display:none!important}';document.head.append(style);
  14. const host=document.createElement('div');host.className='authoring-test';host.style.cssText='position:fixed;inset:0;width:700px;height:500px;z-index:999999';document.body.append(host);
  15. const {createProductionPreview}=await import('/src/features/content-production/preview.js');
  16. const viewer=await createProductionPreview(host,content.productionDefinition),checks=[];
  17. try{const actions=viewer.configure(content.productionActions);viewer.overview();
  18. const overview=viewer.inspect();
  19. for(let i=0;i<actions.length;i++){
  20. viewer.select(i);const before=viewer.inspect().targets[i];
  21. await viewer.play(i,{...actions[i],motion:{...actions[i].motion,durationMs:100}});
  22. const after=viewer.inspect().targets[i];
  23. checks.push({id:actions[i].id,target:actions[i].targetId,kind:actions[i].motion.kind,before,after});
  24. }
  25. const pending=viewer.play(0,{...actions[0],motion:{...actions[0].motion,durationMs:900}});
  26. viewer.pause();const cancelled=await pending,paused=viewer.inspect().paused;
  27. const changed=structuredClone(content.productionDefinition),items=changed.scenario.sceneResource.snapshot.objects;
  28. changed.authoringBaseObjects ||= structuredClone(items);
  29. const item=items.find(item=>item.assetRole!=='environment'&&!/terrain|地形/i.test(item.sourceName));
  30. item.position[0]+=0.25;
  31. const secondHost=host.cloneNode(false);document.body.append(secondHost);
  32. const second=await createProductionPreview(secondHost,changed);
  33. let placement;
  34. try{const after=second.inspect().sceneObjects.find(o=>o.sceneId===item.sceneId),before=overview.sceneObjects.find(o=>o.sceneId===item.sceneId);placement={sceneId:item.sceneId,deltaX:after.position[0]-before.position[0]};}
  35. finally{second.destroy();secondHost.remove();}
  36. viewer.resume();return {overview,checks,paused,cancelled,resumed:!viewer.inspect().paused,placement};
  37. }finally{viewer.destroy();host.remove();style.remove();}
  38. },response.data.currentVersion.content);
  39. assert.ok(result.paused&&result.resumed);
  40. assert.equal(result.cancelled,false);
  41. assert.ok(Math.abs(result.placement.deltaX-0.25)<1e-6,JSON.stringify(result.placement));
  42. for(const action of result.checks){assert.ok([...action.after.position,...action.after.quaternion,...action.after.projected].every(Number.isFinite),action.id);
  43. assert.ok(Math.abs(action.before.projected[0])<0.01&&Math.abs(action.before.projected[1])<0.01,action.id+' focus');
  44. if(action.kind!=='state')assert.notDeepEqual([action.after.position,action.after.quaternion],[action.before.position,action.before.quaternion],action.id+' must move');
  45. }
  46. assert.equal(result.checks.length,item.actions);checks.push({task:item.taskCode,...result});console.log(item.taskCode+': '+result.checks.length+' actions');
  47. }
  48. fs.writeFileSync(dir+'/actions-result.json',JSON.stringify({pass:true,checks},null,2));
  49. }finally{await browser.close();}