66 lines
2.5 KiB
JavaScript
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);
|
|
});
|