102 lines
2.9 KiB
TypeScript
102 lines
2.9 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
countGeneratedImageSlots,
|
|
resolveDisplayImageSlots,
|
|
resolveGroupedImageSlotPhase,
|
|
resolveImageSlotPhase,
|
|
shouldShowImageSlotGrid,
|
|
} from '@/lib/image-generation/slot-state'
|
|
|
|
describe('image slot state', () => {
|
|
it('counts only slots with image urls', () => {
|
|
expect(countGeneratedImageSlots([
|
|
{ imageUrl: 'a.png' },
|
|
{ imageUrl: null },
|
|
{ imageUrl: 'b.png' },
|
|
])).toBe(2)
|
|
})
|
|
|
|
it('distinguishes generate and regenerate phases', () => {
|
|
expect(resolveImageSlotPhase({ imageUrl: null }, true)).toBe('generating')
|
|
expect(resolveImageSlotPhase({ imageUrl: 'a.png' }, true)).toBe('regenerating')
|
|
expect(resolveImageSlotPhase({ imageUrl: null }, false)).toBe('idle-empty')
|
|
expect(resolveImageSlotPhase({ imageUrl: 'a.png' }, false)).toBe('idle-filled')
|
|
})
|
|
|
|
it('keeps completed filled slots idle while the group still has empty pending slots', () => {
|
|
expect(resolveGroupedImageSlotPhase(
|
|
{ imageUrl: 'a.png' },
|
|
{ isGroupRunning: true, isSlotRunning: false, hasPendingEmptySlots: true },
|
|
)).toBe('idle-filled')
|
|
|
|
expect(resolveGroupedImageSlotPhase(
|
|
{ imageUrl: null },
|
|
{ isGroupRunning: true, isSlotRunning: true, hasPendingEmptySlots: true },
|
|
)).toBe('generating')
|
|
})
|
|
|
|
it('hides legacy empty slots when the location is idle', () => {
|
|
const displaySlots = resolveDisplayImageSlots([
|
|
{ imageUrl: 'a.png' },
|
|
{ imageUrl: null },
|
|
{ imageUrl: null },
|
|
], {
|
|
hasRunningTask: false,
|
|
requestedCount: 1,
|
|
})
|
|
|
|
expect(displaySlots).toHaveLength(1)
|
|
expect(displaySlots[0]?.imageUrl).toBe('a.png')
|
|
})
|
|
|
|
it('shows only one slot while running a single-image location generation', () => {
|
|
const displaySlots = resolveDisplayImageSlots([
|
|
{ imageUrl: null },
|
|
{ imageUrl: null },
|
|
{ imageUrl: null },
|
|
], {
|
|
hasRunningTask: true,
|
|
requestedCount: 1,
|
|
})
|
|
|
|
expect(displaySlots).toHaveLength(1)
|
|
})
|
|
|
|
it('shows requested placeholders while running a multi-image location generation', () => {
|
|
const displaySlots = resolveDisplayImageSlots([
|
|
{ imageUrl: 'a.png' },
|
|
{ imageUrl: null },
|
|
{ imageUrl: null },
|
|
{ imageUrl: null },
|
|
], {
|
|
hasRunningTask: true,
|
|
requestedCount: 4,
|
|
})
|
|
|
|
expect(displaySlots).toHaveLength(4)
|
|
})
|
|
|
|
it('shows slot grid only after generation is active or meaningful', () => {
|
|
expect(shouldShowImageSlotGrid({
|
|
totalSlotCount: 3,
|
|
generatedCount: 0,
|
|
hasRunningTask: false,
|
|
hasAnyError: false,
|
|
})).toBe(false)
|
|
|
|
expect(shouldShowImageSlotGrid({
|
|
totalSlotCount: 3,
|
|
generatedCount: 0,
|
|
hasRunningTask: true,
|
|
hasAnyError: false,
|
|
})).toBe(true)
|
|
|
|
expect(shouldShowImageSlotGrid({
|
|
totalSlotCount: 3,
|
|
generatedCount: 1,
|
|
hasRunningTask: false,
|
|
hasAnyError: false,
|
|
})).toBe(true)
|
|
})
|
|
})
|