Separate Studio 2 source and canvas and apply size and seed choices
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
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)}
|
||||
})
|
||||
@@ -1,3 +1,4 @@
|
||||
import {queueSeeds} from '../shared/studio2/seed.mjs'
|
||||
import test from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import {readFileSync,mkdtempSync,mkdirSync,writeFileSync,existsSync} from 'node:fs'
|
||||
@@ -16,7 +17,7 @@ function fixture(mode='video') {
|
||||
const job={status:'running',clientId:'client',library:{}}
|
||||
let id=0
|
||||
const scope={
|
||||
watchProgress:()=>()=>{},compilePrompt,saveRecord(){},update(r,state){r.state=state;phases.push(state)},acquireSharedGpu:async()=>true,ensureComfyReady:async()=>{},emitJob(){},
|
||||
queueSeeds,watchProgress:()=>()=>{},compilePrompt,saveRecord(){},update(r,state){r.state=state;phases.push(state)},acquireSharedGpu:async()=>true,ensureComfyReady:async()=>{},emitJob(){},
|
||||
prepareGraph:async r=>{queued.push({hero:r.request.identityStillId,start:r.request.startClipId,action:r.request.promptSections.action});return {}},queuePrompt:async()=>({prompt_id:`p${++id}`}),
|
||||
fetchHistory:async p=>({[p]:{status:{status_str:'success'},outputs:{}}}),comfyFetch:()=>{throw new Error('Unexpected network call')},
|
||||
extractVideo:()=>({filename:'video.mp4',subfolder:'preview/studio2/r',type:'output'}),extractEditedImage:()=>({filename:'image.png',subfolder:'preview/studio2/r',type:'output'}),
|
||||
|
||||
Reference in New Issue
Block a user