mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-08-31 10:18:57 +00:00
117 lines
2.9 KiB
TypeScript
117 lines
2.9 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import type { LaunchablePhoneAppId } from '@/types/apps'
|
|
import { HOME_GRID_PAGE_SIZE, type HomeSlot } from '@/utils/homeLayout'
|
|
import { layoutSpringboardHomePages } from '@/utils/springboardLayout'
|
|
|
|
function app(id: string): LaunchablePhoneAppId {
|
|
return id as LaunchablePhoneAppId
|
|
}
|
|
|
|
describe('springboard app page layout', () => {
|
|
it('closes visual gaps per page while keeping page membership', () => {
|
|
const grid = new Array<LaunchablePhoneAppId | null>(
|
|
HOME_GRID_PAGE_SIZE * 2,
|
|
).fill(null)
|
|
grid[20] = app('row-six')
|
|
grid[24] = app('page-two')
|
|
|
|
const pages = layoutSpringboardHomePages(grid, new Map(), 2)
|
|
|
|
expect(pages).toHaveLength(2)
|
|
expect(pages[0]?.cells[0]).toMatchObject({
|
|
item: 'row-six',
|
|
sourceIndex: 20,
|
|
})
|
|
expect(pages[0]?.cells[1]).toMatchObject({ item: null, sourceIndex: 1 })
|
|
expect(pages[1]?.cells[0]).toMatchObject({
|
|
item: 'page-two',
|
|
sourceIndex: 24,
|
|
})
|
|
})
|
|
|
|
it('reflows apps forward around widgets without swapping their order', () => {
|
|
const grid = new Array<LaunchablePhoneAppId | null>(
|
|
HOME_GRID_PAGE_SIZE,
|
|
).fill(null)
|
|
for (let index = 0; index < 8; index += 1) grid[index] = app(`app-${index}`)
|
|
|
|
const pages = layoutSpringboardHomePages(
|
|
grid,
|
|
new Map([[1, new Set([0, 1, 4, 5])]]),
|
|
1,
|
|
)
|
|
|
|
expect(
|
|
pages[0]?.cells.slice(0, 12).map((cell) => cell?.item ?? null),
|
|
).toEqual([
|
|
null,
|
|
null,
|
|
'app-0',
|
|
'app-1',
|
|
null,
|
|
null,
|
|
'app-2',
|
|
'app-3',
|
|
'app-4',
|
|
'app-5',
|
|
'app-6',
|
|
'app-7',
|
|
])
|
|
})
|
|
|
|
it('reflows folders as one item and keeps their source index', () => {
|
|
const grid = new Array<HomeSlot>(HOME_GRID_PAGE_SIZE).fill(null)
|
|
grid[0] = app('mail')
|
|
grid[1] = {
|
|
apps: [app('clock'), app('notes')],
|
|
id: 'folder-tools-123456',
|
|
name: 'Tools',
|
|
type: 'folder',
|
|
}
|
|
|
|
const pages = layoutSpringboardHomePages(
|
|
grid,
|
|
new Map([[1, new Set([0, 1])]]),
|
|
1,
|
|
)
|
|
|
|
expect(pages[0]?.cells[2]).toMatchObject({
|
|
item: 'mail',
|
|
sourceIndex: 0,
|
|
})
|
|
expect(pages[0]?.cells[3]).toMatchObject({
|
|
item: {
|
|
apps: ['clock', 'notes'],
|
|
id: 'folder-tools-123456',
|
|
type: 'folder',
|
|
},
|
|
sourceIndex: 1,
|
|
})
|
|
})
|
|
|
|
it('maps widget overflow to the visible destination page and offset', () => {
|
|
const grid = Array.from({ length: HOME_GRID_PAGE_SIZE }, (_, index) =>
|
|
app(`app-${index}`),
|
|
)
|
|
const pages = layoutSpringboardHomePages(
|
|
grid,
|
|
new Map([[1, new Set([0, 1, 2, 3])]]),
|
|
2,
|
|
)
|
|
|
|
expect(pages[1]?.cells[0]).toMatchObject({
|
|
item: 'app-20',
|
|
sourceIndex: 20,
|
|
targetOffset: 0,
|
|
targetPage: 2,
|
|
})
|
|
expect(pages[1]?.cells[1]).toMatchObject({
|
|
item: 'app-21',
|
|
sourceIndex: 21,
|
|
targetOffset: 1,
|
|
targetPage: 2,
|
|
})
|
|
})
|
|
})
|