Enhance transform session command tests for path points and surface snap targets
This commit is contained in:
@@ -12,7 +12,8 @@ import {
|
|||||||
resolveTransformTarget,
|
resolveTransformTarget,
|
||||||
supportsLocalTransformAxisConstraint,
|
supportsLocalTransformAxisConstraint,
|
||||||
supportsTransformAxisConstraint,
|
supportsTransformAxisConstraint,
|
||||||
supportsTransformOperation
|
supportsTransformOperation,
|
||||||
|
supportsTransformSurfaceSnapTarget
|
||||||
} from "../../src/core/transform-session";
|
} from "../../src/core/transform-session";
|
||||||
import {
|
import {
|
||||||
cloneBoxBrushGeometry,
|
cloneBoxBrushGeometry,
|
||||||
@@ -153,6 +154,16 @@ describe("transform session commit commands", () => {
|
|||||||
pathId: path.id,
|
pathId: path.id,
|
||||||
pointId: path.points[1].id
|
pointId: path.points[1].id
|
||||||
});
|
});
|
||||||
|
const pathPointsResolved = resolveTransformTarget(
|
||||||
|
document,
|
||||||
|
{
|
||||||
|
kind: "pathPoints",
|
||||||
|
pathId: path.id,
|
||||||
|
pointIds: [path.points[0].id, path.points[1].id]
|
||||||
|
},
|
||||||
|
"object",
|
||||||
|
path.points[1].id
|
||||||
|
);
|
||||||
|
|
||||||
expect(faceWrongModeResolved.target).toBeNull();
|
expect(faceWrongModeResolved.target).toBeNull();
|
||||||
expect(faceWrongModeResolved.message).toContain("Face mode");
|
expect(faceWrongModeResolved.message).toContain("Face mode");
|
||||||
@@ -188,6 +199,30 @@ describe("transform session commit commands", () => {
|
|||||||
pointId: path.points[1].id,
|
pointId: path.points[1].id,
|
||||||
initialPosition: path.points[1].position
|
initialPosition: path.points[1].position
|
||||||
});
|
});
|
||||||
|
expect(pathPointsResolved.target).toMatchObject({
|
||||||
|
kind: "pathPoints",
|
||||||
|
pathId: path.id,
|
||||||
|
activePointId: path.points[1].id,
|
||||||
|
initialPivot: {
|
||||||
|
x: 0.5,
|
||||||
|
y: 0.5,
|
||||||
|
z: 0
|
||||||
|
},
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
kind: "pathPoint",
|
||||||
|
pathId: path.id,
|
||||||
|
pointId: path.points[0].id,
|
||||||
|
initialPosition: path.points[0].position
|
||||||
|
},
|
||||||
|
{
|
||||||
|
kind: "pathPoint",
|
||||||
|
pathId: path.id,
|
||||||
|
pointId: path.points[1].id,
|
||||||
|
initialPosition: path.points[1].position
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
expect(objectResolved.target).not.toBeNull();
|
expect(objectResolved.target).not.toBeNull();
|
||||||
expect(
|
expect(
|
||||||
supportsTransformOperation(
|
supportsTransformOperation(
|
||||||
@@ -270,6 +305,29 @@ describe("transform session commit commands", () => {
|
|||||||
"scale"
|
"scale"
|
||||||
)
|
)
|
||||||
).toBe(false);
|
).toBe(false);
|
||||||
|
expect(
|
||||||
|
supportsTransformOperation(
|
||||||
|
pathPointsResolved.target as NonNullable<
|
||||||
|
typeof pathPointsResolved.target
|
||||||
|
>,
|
||||||
|
"translate"
|
||||||
|
)
|
||||||
|
).toBe(true);
|
||||||
|
expect(
|
||||||
|
supportsTransformOperation(
|
||||||
|
pathPointsResolved.target as NonNullable<
|
||||||
|
typeof pathPointsResolved.target
|
||||||
|
>,
|
||||||
|
"rotate"
|
||||||
|
)
|
||||||
|
).toBe(false);
|
||||||
|
expect(
|
||||||
|
supportsTransformSurfaceSnapTarget(
|
||||||
|
pathPointsResolved.target as NonNullable<
|
||||||
|
typeof pathPointsResolved.target
|
||||||
|
>
|
||||||
|
)
|
||||||
|
).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("applies axis-constraint rules across object and component transform sessions", () => {
|
it("applies axis-constraint rules across object and component transform sessions", () => {
|
||||||
@@ -589,6 +647,146 @@ describe("transform session commit commands", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("commits translated multi-selected path points through the shared transform command path", () => {
|
||||||
|
const path = createScenePath({
|
||||||
|
id: "path-transform-batch",
|
||||||
|
points: [
|
||||||
|
{
|
||||||
|
id: "path-transform-batch-a",
|
||||||
|
position: {
|
||||||
|
x: -1,
|
||||||
|
y: 0,
|
||||||
|
z: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "path-transform-batch-b",
|
||||||
|
position: {
|
||||||
|
x: 1,
|
||||||
|
y: 0,
|
||||||
|
z: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: "path-transform-batch-c",
|
||||||
|
position: {
|
||||||
|
x: 3,
|
||||||
|
y: 0,
|
||||||
|
z: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
const store = createEditorStore({
|
||||||
|
initialDocument: {
|
||||||
|
...createEmptySceneDocument({ name: "Path Batch Transform Fixture" }),
|
||||||
|
paths: {
|
||||||
|
[path.id]: path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const target = resolveTransformTarget(
|
||||||
|
store.getState().document,
|
||||||
|
{
|
||||||
|
kind: "pathPoints",
|
||||||
|
pathId: path.id,
|
||||||
|
pointIds: [path.points[0].id, path.points[2].id]
|
||||||
|
},
|
||||||
|
"object",
|
||||||
|
path.points[2].id
|
||||||
|
).target;
|
||||||
|
|
||||||
|
if (target === null || target.kind !== "pathPoints") {
|
||||||
|
throw new Error("Expected a path points transform target.");
|
||||||
|
}
|
||||||
|
|
||||||
|
const translateSession = createTransformSession({
|
||||||
|
source: "keyboard",
|
||||||
|
sourcePanelId: "topLeft",
|
||||||
|
operation: "translate",
|
||||||
|
target
|
||||||
|
});
|
||||||
|
|
||||||
|
translateSession.preview = {
|
||||||
|
kind: "pathPoints",
|
||||||
|
pivot: {
|
||||||
|
x: 2,
|
||||||
|
y: 3,
|
||||||
|
z: -1
|
||||||
|
},
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
pointId: path.points[0].id,
|
||||||
|
position: {
|
||||||
|
x: 0,
|
||||||
|
y: 2,
|
||||||
|
z: -1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pointId: path.points[2].id,
|
||||||
|
position: {
|
||||||
|
x: 4,
|
||||||
|
y: 4,
|
||||||
|
z: -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
store.executeCommand(
|
||||||
|
createCommitTransformSessionCommand(
|
||||||
|
store.getState().document,
|
||||||
|
translateSession
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(
|
||||||
|
store.getState().document.paths[path.id]?.points.map((point) => ({
|
||||||
|
id: point.id,
|
||||||
|
position: point.position
|
||||||
|
}))
|
||||||
|
).toEqual([
|
||||||
|
{
|
||||||
|
id: path.points[0].id,
|
||||||
|
position: {
|
||||||
|
x: 0,
|
||||||
|
y: 2,
|
||||||
|
z: -1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: path.points[1].id,
|
||||||
|
position: path.points[1].position
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: path.points[2].id,
|
||||||
|
position: {
|
||||||
|
x: 4,
|
||||||
|
y: 4,
|
||||||
|
z: -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]);
|
||||||
|
expect(store.getState().selection).toEqual({
|
||||||
|
kind: "pathPoints",
|
||||||
|
pathId: path.id,
|
||||||
|
pointIds: [path.points[0].id, path.points[2].id]
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(store.undo()).toBe(true);
|
||||||
|
expect(store.getState().document.paths[path.id]?.points).toEqual(
|
||||||
|
path.points
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(store.redo()).toBe(true);
|
||||||
|
expect(store.getState().selection).toEqual({
|
||||||
|
kind: "pathPoints",
|
||||||
|
pathId: path.id,
|
||||||
|
pointIds: [path.points[0].id, path.points[2].id]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
it("commits whitebox box rotate and scale transforms with undo and redo", () => {
|
it("commits whitebox box rotate and scale transforms with undo and redo", () => {
|
||||||
const brush = createBoxBrush({
|
const brush = createBoxBrush({
|
||||||
id: "brush-transform-main",
|
id: "brush-transform-main",
|
||||||
|
|||||||
Reference in New Issue
Block a user