Files
SystemSimulationApp/frontend/tests/e2e/amesim-medium.spec.ts
T

203 lines
6.9 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { expect, test } from "@playwright/test";
import { prepareApp } from "./fixtures";
test.beforeEach(async ({ page }) => {
await prepareApp(page);
});
test("拖入介质定义后可供气动元件选择,删除定义会回退到内置空气", async ({
page,
}) => {
await page.goto("/");
const canvas = page.locator(".flow-canvas .react-flow__pane");
await page
.getByRole("button", { name: /空气介质定义/ })
.dragTo(canvas, { targetPosition: { x: 280, y: 220 } });
const mediumNode = page.locator(
'.flow-canvas .react-flow__node[data-id="amesim_ideal_air_medium_1"]',
);
await expect(mediumNode).toBeVisible();
await mediumNode.click();
await expect(page.getByLabel("介质定义索引(自动分配)")).toHaveValue("1");
const propertyModelSelect = page.getByLabel("物性计算模型");
await expect(propertyModelSelect).toHaveValue("0");
await expect(propertyModelSelect.locator('option[value="0"]')).toHaveText(
"理想气体",
);
await page
.getByRole("button", { name: /AMESim 气动测试元件/ })
.dragTo(canvas, { targetPosition: { x: 650, y: 360 } });
const pneumaticNode = page.locator(
'.flow-canvas .react-flow__node[data-id="amesim_pneumatic_test_1"]',
);
await expect(pneumaticNode).toBeVisible();
await pneumaticNode.click();
const mediumSelect = page.getByLabel("介质物性索引");
await expect(mediumSelect).toHaveValue("0");
await expect(mediumSelect.locator('option[value="0"]')).toHaveText("0");
await expect(mediumSelect.locator('option[value="1"]')).toHaveText("1");
await mediumSelect.selectOption("1");
await expect(mediumSelect).toHaveValue("1");
await mediumNode.click();
await page.getByRole("button", { name: "删除 (Delete)" }).click();
await expect(mediumNode).toHaveCount(0);
await pneumaticNode.click();
await expect(page.getByLabel("介质物性索引")).toHaveValue("0");
const consolePanel = page.getByRole("complementary", {
name: "仿真控制台",
exact: true,
});
await page.getByRole("button", { name: "展开仿真控制台" }).click();
await expect(consolePanel).toContainText(
"介质定义已删除,1 个介质物性引用已切回 0 — 空气(理想气体,内置默认)",
);
await page.getByRole("button", { name: "生成系统 XML" }).click();
const xmlBlock = consolePanel.getByLabel("生成的系统 XML");
await expect(xmlBlock).toContainText('mediumReferenceVersion="1"');
await expect(xmlBlock).toContainText('<Parameter name="gi" value="0"');
});
test("介质定义的物性计算模型会写入 XML", async ({ page }) => {
await page.goto("/");
const canvas = page.locator(".flow-canvas .react-flow__pane");
await page
.getByRole("button", { name: /空气介质定义/ })
.dragTo(canvas, { targetPosition: { x: 280, y: 220 } });
const mediumNode = page.locator(
'.flow-canvas .react-flow__node[data-id="amesim_ideal_air_medium_1"]',
);
await mediumNode.click();
await expect(page.getByLabel("物性计算模型")).toHaveValue("0");
await page.getByRole("button", { name: "生成系统 XML" }).click();
const consolePanel = page.getByRole("complementary", {
name: "仿真控制台",
exact: true,
});
await expect(consolePanel.getByLabel("生成的系统 XML")).toContainText(
'<Parameter name="property_model" value="0"',
);
});
test("氦气介质自动分配 gi,并以 Peng–Robinson 模型写入 XML", async ({
page,
}) => {
await page.goto("/");
const canvas = page.locator(".flow-canvas .react-flow__pane");
await page
.getByRole("button", { name: /空气介质定义/ })
.dragTo(canvas, { targetPosition: { x: 240, y: 180 } });
await page
.getByRole("button", { name: /氦气介质定义/ })
.dragTo(canvas, { targetPosition: { x: 520, y: 180 } });
const heliumNode = page.locator(
'.flow-canvas .react-flow__node[data-id="amesim_helium_medium_1"]',
);
await expect(heliumNode).toBeVisible();
await heliumNode.click();
await expect(page.getByLabel("介质定义索引(自动分配)")).toHaveValue("2");
const propertyModelSelect = page.getByLabel("物性计算模型");
await expect(propertyModelSelect).toHaveValue("0");
await expect(propertyModelSelect.locator('option[value="0"]')).toHaveText(
"Peng–Robinson",
);
await page
.getByRole("button", { name: /AMESim 气动测试元件/ })
.dragTo(canvas, { targetPosition: { x: 760, y: 360 } });
const pneumaticNode = page.locator(
'.flow-canvas .react-flow__node[data-id="amesim_pneumatic_test_1"]',
);
await expect(pneumaticNode).toBeVisible();
await pneumaticNode.click();
const mediumSelect = page.getByLabel("介质物性索引");
await expect(mediumSelect.locator("option")).toHaveText(["0", "1", "2"]);
await mediumSelect.selectOption("2");
await expect(mediumSelect).toHaveValue("2");
await page.getByRole("button", { name: "生成系统 XML" }).click();
const consolePanel = page.getByRole("complementary", {
name: "仿真控制台",
exact: true,
});
const xmlBlock = consolePanel.getByLabel("生成的系统 XML");
await expect(xmlBlock).toContainText('type="amesim_helium_medium"');
await expect(xmlBlock).toContainText('<Parameter name="gi" value="2"');
await expect(xmlBlock).toContainText(
'<Parameter name="property_model" value="0"',
);
const xml = await xmlBlock.textContent();
expect(xml).toMatch(
/<Component[^>]+type="amesim_helium_medium"[\s\S]*?<Parameter name="gi" value="2"[\s\S]*?<Parameter name="property_model" value="0"[\s\S]*?<\/Component>/,
);
expect(xml).toMatch(
/<Component[^>]+type="amesim_pneumatic_test"[\s\S]*?<Parameter name="gi" value="2"[\s\S]*?<\/Component>/,
);
});
test("导入工程中的未知物性计算模型会被检查出来", async ({ page }) => {
await page.goto("/");
const project = {
name: "invalid-property-model",
mediumReferenceVersion: 1,
nodes: [
{
id: "amesim_ideal_air_medium_1",
type: "simulationComponent",
position: { x: 280, y: 220 },
data: {
label: "空气介质_1",
componentType: "amesim_ideal_air_medium",
modelType: "amesim_ideal_air_medium",
ports: [],
parameters: { gi: 1, property_model: 99 },
parameterUnits: {},
rotation: 0,
mirrored: false,
},
},
],
edges: [],
simulation: {
t_start: 0,
t_stop: 1,
step: 0.1,
max_step: 0.05,
method: "RK45",
},
};
await page.locator('input[type="file"]').setInputFiles({
name: "invalid-property-model.json",
mimeType: "application/json",
buffer: Buffer.from(JSON.stringify(project)),
});
await page.getByRole("button", { name: "检查模型" }).click();
const consolePanel = page.getByRole("complementary", {
name: "仿真控制台",
exact: true,
});
await expect(consolePanel).toContainText(
"空气介质_1:物性计算模型不在支持的可选项中",
);
});