import test from 'node:test' import assert from 'node:assert/strict' import {folderAssets,newestOutput,selectResult} from '../shared/studio2/viewer.mjs' import {restoreAsset,resolveSize} from '../shared/studio2/input.mjs' import {validateRequest} from '../shared/studio2/contracts.mjs' import {applyResolvedImageSize} from '../shared/studio2/graphs.mjs' const base={mode:'generate',engine:'flux',folderId:'f',prompt:'Walk'} test('completed outputs join all folder assets and select only the output canvas',()=>{ const source={id:'source',folderId:'f'},output={id:'result',kind:'still',studio2:{savedAt:2}} const jobs=[{request:{folderId:'f'},outputs:[output]}],library={stills:[source,{id:'other',folderId:'f'}],clips:[{id:'video',folderId:'f'}]} const strip=folderAssets(library,jobs,'f');assert.equal(strip.length,4) const state=selectResult({imageAId:'source',startClipId:'existing'},newestOutput(jobs,new Set(),'f')) assert.equal(state.selected.id,'result');assert.equal(state.imageAId,'source');assert.equal(state.startClipId,'existing') assert.equal(newestOutput(jobs,new Set(['result']),'f'),null) }) test('Use as input binds the selected still, not its original parent input',()=>{ const next=restoreAsset({settings:{}},{id:'output',kind:'still',studio2:{imageAId:'old-parent',settings:{aspect:'1:1',seed:1}}}) assert.equal(next.imageAId,'output');assert.equal(next.startClipId,'');assert.equal(next.settings.aspect,'1:1');assert.equal(next.settings.seedMode,'random') }) test('resolved aspect survives image graph default and megapixel scaling',()=>{ for(const aspect of ['auto','1:1','16:9','9:16']) { const size=resolveSize(aspect,{width:1024,height:1024}) const request=validateRequest({...base,settings:{aspect,...size}}) const graph=applyResolvedImageSize({latent:{inputs:{width:1344,height:768}},scale:{class_type:'ImageScaleToTotalPixels',inputs:{image:['load',0],megapixels:1}}},request.settings) assert.equal(graph.latent.inputs.width,size.width);assert.equal(graph.latent.inputs.height,size.height) assert.equal(graph.scale.inputs.crop,'disabled');assert.equal(graph.scale.inputs.width,size.width) if(['auto','1:1'].includes(aspect))assert.equal(size.width,size.height) } }) test('random Queues and shots differ; typed seed including 1 remains locked',()=>{ const a=validateRequest({...base,batch:['Turn','Sit']}),b=validateRequest(base) assert.notEqual(a.settings.seed,b.settings.seed);assert.equal(new Set(a.shotSeeds).size,3);assert.ok(a.shotSeeds.every(s=>s!==1)) for(const seed of [1,987]){const raw={...base,batch:['Turn'],settings:{seedMode:'locked',seed}};assert.deepEqual(validateRequest(raw).shotSeeds,[seed,seed]);assert.equal(validateRequest(raw).settings.seed,seed)} })