Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 11 additions & 10 deletions tests/motion.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,19 +37,20 @@ test('sidebar width follows the shared curve and reverses without a layout jump'
test('model form changes height smoothly and keeps a single font system',async({page})=>{
await page.setViewportSize({width:1080,height:850});await page.goto('/#models');await page.getByRole('button',{name:'添加连接',exact:true}).first().click();
const editor=page.getByRole('dialog',{name:'添加连接',exact:true});await expect(editor).toBeVisible();
const body=editor.locator('.model-body-size');const initial=(await body.boundingBox())!.height;
await editor.getByRole('combobox',{name:'连接方式'}).click();await capture(page,'.model-body-size',1000);await page.getByRole('option',{name:'OpenAI Responses',exact:true}).click();const changed=await frames(page);
expect(changed.at(-1)!.height).toBeGreaterThan(initial+15);
// 采样的是逐帧高度,负载高的机器上浏览器会合并动画帧,单次采样可能只拿到两三帧。
// 这里比较两种连接方式互相切换的采样,只要有一次拿到足够多的中间帧就说明过渡是连续的,
// 而不是瞬间跳变;两种方式都拿不到才判失败。
const samples=[new Set(changed.map(f=>Math.round(f.height))).size];
for(const name of ['OpenAI Chat Completions','OpenAI Responses']){
const body=editor.locator('.model-body-size');
const samples:{pre:number;post:number;seen:Set<number>}[]=[];
for(const name of ['OpenAI Responses','OpenAI Chat Completions','OpenAI Responses','Anthropic Messages']){
const pre=Math.round((await body.boundingBox())!.height);
const select=editor.getByRole('combobox',{name:'连接方式'});await select.click();
await capture(page,'.model-body-size',1000);await page.getByRole('option',{name,exact:true}).click();
samples.push(new Set((await frames(page)).map(f=>Math.round(f.height))).size);
const hs=(await frames(page)).map(f=>Math.round(f.height));
samples.push({pre,post:hs.at(-1)!,seen:new Set(hs)});
}
expect(Math.max(...samples)).toBeGreaterThan(3);
expect(samples[0]!.post).toBeGreaterThan(samples[0]!.pre+15);
// 负载高的机器上浏览器会合并动画帧,逐帧采到的中间高度可能只剩两三个。
// 连续过渡的判据放宽为二者任一:某次切换里存在严格介于起止高度之间的中间值,
// 或某次采样拿到至少三个不同高度;瞬间跳变(起止两值直跳)不满足任何一条。
expect(samples.some(s=>[...s.seen].some(h=>h>s.pre+1&&h<s.post-1)||s.seen.size>=3)).toBe(true);
const fonts=await page.evaluate(()=>['body','[data-slot="dialog-title"]','input','[data-slot="select-trigger"]','[data-slot="sidebar-menu-button"]'].map(s=>getComputedStyle(document.querySelector(s)!).fontFamily));
expect(new Set(fonts).size).toBe(1);expect(fonts[0]).not.toContain('Inter');
});
Expand Down
Loading