import test from "node:test"; import assert from "node:assert/strict"; import { readFile } from "node:fs/promises"; import { parseGcode, createDemoGcode } from "../src/lib/gcode.js"; import { samplePath, formatTime } from "../src/lib/playback.js"; test("原文件保留运动和停顿,不虚构挤出层", async () => { const text = await readFile( new URL("../public/data/spring-festival.gcode", import.meta.url), "utf8", ); const data = parseGcode(text, "春节序曲.gcode"); assert.equal(data.lineCount, 232); assert.equal(data.segments.length, 231); assert.equal(data.segments.filter((segment) => !segment.dwell).length, 230); assert.equal(data.hasExtrusion, false); assert.equal(data.layers.length, 0); assert.equal(data.temperature, null); assert.ok(Math.abs(data.duration - 29.0092304845) < 0.0001); assert.equal(data.segments.at(-1).to.x, 75.20450529681415); assert.equal(data.segments.at(-1).to.z, 10); }); test("绝对、相对运动与独立挤出模式", () => { const data = parseGcode( "G90\nM83\nG1 X10 E1 F600\nG91\nG1 X5 E1\nG90\nM82\nG92 E0\nG1 X20 E1", "模式测试", ); assert.equal(data.segments.at(-1).to.x, 20); assert.equal(data.extrusion, 3); assert.equal(data.layers.length, 1); }); test("停顿与时间插值准确", () => { const data = parseGcode("G1 X10 F600\nG4 P1000\nG1 X20", "停顿测试"); assert.equal(data.duration, 3); assert.equal(samplePath(data, 0.5).position.x, 5); assert.equal(samplePath(data, 1.5).position.x, 10); assert.equal(samplePath(data, 2.5).position.x, 15); assert.equal(samplePath(data, 99).position.x, 20); assert.equal(formatTime(125), "02:05"); }); test("示例拥有独立的 100 层挤出数据", () => { const data = parseGcode(createDemoGcode(), "成型示例"); assert.equal(data.layers.length, 100); assert.equal(data.hasExtrusion, true); assert.equal(data.temperature, 210); assert.equal(data.bedTemperature, 60); assert.equal(data.layers.at(-1).z, 40); assert.equal(samplePath(data, data.layers[49].time + 0.001).layer, 50); }); test("英寸与回零指令", () => { const data = parseGcode("G20\nG1 X1 F60\nG28 X\nG1 X2", "单位测试"); assert.equal(data.segments[0].to.x, 25.4); assert.equal(data.segments[1].from.x, 0); assert.equal(data.segments[1].to.x, 50.8); }); test("无效文件拒绝,圆弧限制明确", () => { assert.throws(() => parseGcode("; 空文件", "空文件"), /未找到/); const data = parseGcode("G1 X10 F600\nG2 X20 I5", "圆弧文件"); assert.equal(data.warnings.length, 1); });