Files
wehub-resource-sync 2114b14ee0
Sync main into demo / sync (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:35:26 +08:00

57 lines
1.7 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { inferWmrDefaultFrameRate } from '../os/wmr/WmrBundleCache';
import { VarContext } from '../os/wmr/engine/variables';
import type { WmrDocument, WmrFramerateController } from '../os/wmr/engine/types';
function makeDoc(frameRateAttr?: string): Pick<WmrDocument, 'frameRate' | 'root'> {
return {
frameRate: frameRateAttr === undefined ? 0 : Number.parseInt(frameRateAttr, 10) || 0,
root: {
tag: 'Widget',
attrs: frameRateAttr === undefined ? {} : { frameRate: frameRateAttr },
children: [],
},
};
}
const controller: WmrFramerateController = {
name: 'Fra',
initPause: true,
loop: false,
controlPoints: [
{ frameRate: 120, time: 0 },
{ frameRate: 120, time: 6000 },
{ frameRate: 0, time: 6100 },
],
};
describe('WMR frame rate inference', () => {
it('respects explicit root frameRate zero', () => {
expect(inferWmrDefaultFrameRate(makeDoc('0'), true)).toBe(0);
});
it('keeps the legacy animation fallback when frameRate is omitted', () => {
expect(inferWmrDefaultFrameRate(makeDoc(), true)).toBe(15);
});
it('uses positive root frameRate values directly', () => {
expect(inferWmrDefaultFrameRate(makeDoc('30'), true)).toBe(30);
});
});
describe('WMR framerate controllers', () => {
it('only contribute to the recommended frame rate while playing', () => {
const vars = new VarContext('test-framerate-controller');
vars.registerFramerateControllers([controller]);
expect(vars.getRecommendedFrameRate(0)).toBe(0);
vars.playAnimation('Fra', 'play');
expect(vars.getRecommendedFrameRate(0)).toBe(120);
vars.playAnimation('Fra', 'pause');
expect(vars.getRecommendedFrameRate(0)).toBe(0);
});
});