@flare-engine/测试
ECS游戏的决定性测试助手. 默认情况下的 dev-time 软件包——它不会被捆绑到应用中,除非一个应用选择用于下面描述的一次性运行使用 弹簧。 。 。 . createFakeClock 是个决定 requestFrame 编号 : cancelFrame 替换; createTestWorld 电线 a World + 键 GameLoop + 假钟在一起; createHeadlessContext 在它的基础上 站出来 反应 GameContextValue (相机、输入、资产、平面)无反应原生或斯基亚; MockInputManager 扩展真实 InputManager 可脚本指针序列; serializeScene 编号 : snapshotsEqual 启用回归式快照测试.
安装
bun add -d @flare-engine/testing
使用量
import { createTestWorld, MockInputManager, serializeScene } from '@flare-engine/testing';
import { Position, Velocity } from '@flare-engine/ecs';
const { world, step, stepFrames } = createTestWorld({ fixedDt: 1 / 60 });
const e = world.spawn();
world.add(e, Position, { x: 0, y: 0 });
world.add(e, Velocity, { x: 1, y: 0 });
stepFrames(60, 1 / 60);
const snap = serializeScene(world, [Position]);
// components values are typed unknown; cast to the component shape to read fields
const posX = (snap.entities[0]?.components['Position'] as { x: number } | undefined)?.x;
const passed: boolean = posX === 60;
无头上下文
createHeadlessContext 返回时 createTestWorld 成员加真人 Camera2D页:1 MockInputManager,一个 AssetManager 有决心..null 装载器,一个允许 SpriteSheet 和供养者 scenes 插槽 . loop.onLateUpdate 运行 camera.update(dt) 接下来 input.update() 每个相框,相同的接线 GameView 安装.
import { getFrame } from '@flare-engine/assets';
import { createHeadlessContext } from '@flare-engine/testing';
const ctx = createHeadlessContext({ viewportWidth: 320, viewportHeight: 180 });
ctx.camera.shake(8, 0.5);
ctx.input.tap(10, 10);
ctx.stepFrames(10);
// camera.update(dt) and input.update() ran on every stepped frame
const shaking: boolean = ctx.camera.effectiveX !== ctx.camera.x;
const tapCleared: boolean = ctx.input.pointer.justPressed === false;
// the permissive sheet resolves every frame name to its single 8x8 frame
const frame = getFrame(ctx.sheet, 'any-name');
弹簧
createBenchSession 是一个测试的原始, 不是应用的。 换成 Math.random 会议期间使用种子的RNG(至 end() 恢复它 它的 whenDone 锁是保证测试 await ——不是一面同步的旗帜,一个渲染回路就可以对每个帧进行投票. 它的用意是将一个决定性场景包在一个测试跑者身上.
应用板凳的操纵器 — 应用码中船舶的外观跑取器,其完成的套接字(同步) isBenchDone() 其旗帜和汇报 消费者拥有。引擎不运送一个,没有运行时间包再出口 createBenchSession。在应用程序中写下吊带;与其共享的只是引擎实际需要的东西(例如: SeededRNG 从 @flare-engine/math) (中文(简体) ).
运行时需要种子会话的应用程序可能列出 @flare-engine/testing 作为经常 dependency 而不是一个 devDependency它本身的依赖性是: @flare-engine/* 运行时间软件包 assets, (中文(简体) ), core, (中文(简体) ), ecs, (中文(简体) ), input, (中文(简体) ), math 财务报告和审定财务报表 render 仅此而已,没有同伴的依赖关系,所以引擎外没有任何东西进入捆绑.
见 API 规格。 。 。 .
许可证
阿帕奇 - 2.0