fdm/tests/gcode.test.js

66 lines
2.5 KiB
JavaScript

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);
});