mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-06 16:10:09 +00:00
182 lines
5.7 KiB
TypeScript
182 lines
5.7 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from "vitest"
|
|
|
|
import { LGraphNode } from "@/litegraph"
|
|
|
|
import { createTestSubgraph } from "./fixtures/subgraphHelpers"
|
|
|
|
describe("SubgraphSlot visual feedback", () => {
|
|
let mockCtx: CanvasRenderingContext2D
|
|
let mockColorContext: any
|
|
let globalAlphaValues: number[]
|
|
|
|
beforeEach(() => {
|
|
// Clear the array before each test
|
|
globalAlphaValues = []
|
|
|
|
// Create a mock canvas context that tracks all globalAlpha values
|
|
const mockContext = {
|
|
_globalAlpha: 1,
|
|
get globalAlpha() {
|
|
return this._globalAlpha
|
|
},
|
|
set globalAlpha(value: number) {
|
|
this._globalAlpha = value
|
|
globalAlphaValues.push(value)
|
|
},
|
|
fillStyle: "",
|
|
strokeStyle: "",
|
|
lineWidth: 1,
|
|
beginPath: vi.fn(),
|
|
arc: vi.fn(),
|
|
fill: vi.fn(),
|
|
stroke: vi.fn(),
|
|
rect: vi.fn(),
|
|
fillText: vi.fn(),
|
|
}
|
|
mockCtx = mockContext as unknown as CanvasRenderingContext2D
|
|
|
|
// Create a mock color context
|
|
mockColorContext = {
|
|
defaultInputColor: "#FF0000",
|
|
defaultOutputColor: "#00FF00",
|
|
getConnectedColor: vi.fn().mockReturnValue("#0000FF"),
|
|
getDisconnectedColor: vi.fn().mockReturnValue("#AAAAAA"),
|
|
}
|
|
})
|
|
|
|
it("should render SubgraphInput slots with full opacity when dragging from compatible slot", () => {
|
|
const subgraph = createTestSubgraph()
|
|
const node = new LGraphNode("TestNode")
|
|
node.addInput("in", "number")
|
|
subgraph.add(node)
|
|
|
|
// Add a subgraph input
|
|
const subgraphInput = subgraph.addInput("value", "number")
|
|
|
|
// Simulate dragging from the subgraph input (which acts as output inside subgraph)
|
|
const nodeInput = node.inputs[0]
|
|
|
|
// Draw the slot with a compatible fromSlot
|
|
subgraphInput.draw({
|
|
ctx: mockCtx,
|
|
colorContext: mockColorContext,
|
|
fromSlot: nodeInput,
|
|
editorAlpha: 1,
|
|
})
|
|
|
|
// Should render with full opacity (not 0.4)
|
|
// Check that 0.4 was NOT set during drawing
|
|
expect(globalAlphaValues).not.toContain(0.4)
|
|
})
|
|
|
|
it("should render SubgraphInput slots with 40% opacity when dragging from another SubgraphInput", () => {
|
|
const subgraph = createTestSubgraph()
|
|
|
|
// Add two subgraph inputs
|
|
const subgraphInput1 = subgraph.addInput("value1", "number")
|
|
const subgraphInput2 = subgraph.addInput("value2", "number")
|
|
|
|
// Draw subgraphInput2 while dragging from subgraphInput1 (incompatible - both are outputs inside subgraph)
|
|
subgraphInput2.draw({
|
|
ctx: mockCtx,
|
|
colorContext: mockColorContext,
|
|
fromSlot: subgraphInput1,
|
|
editorAlpha: 1,
|
|
})
|
|
|
|
// Should render with 40% opacity
|
|
// Check that 0.4 was set during drawing
|
|
expect(globalAlphaValues).toContain(0.4)
|
|
})
|
|
|
|
it("should render SubgraphOutput slots with full opacity when dragging from compatible slot", () => {
|
|
const subgraph = createTestSubgraph()
|
|
const node = new LGraphNode("TestNode")
|
|
node.addOutput("out", "number")
|
|
subgraph.add(node)
|
|
|
|
// Add a subgraph output
|
|
const subgraphOutput = subgraph.addOutput("result", "number")
|
|
|
|
// Simulate dragging from a node output
|
|
const nodeOutput = node.outputs[0]
|
|
|
|
// Draw the slot with a compatible fromSlot
|
|
subgraphOutput.draw({
|
|
ctx: mockCtx,
|
|
colorContext: mockColorContext,
|
|
fromSlot: nodeOutput,
|
|
editorAlpha: 1,
|
|
})
|
|
|
|
// Should render with full opacity (not 0.4)
|
|
// Check that 0.4 was NOT set during drawing
|
|
expect(globalAlphaValues).not.toContain(0.4)
|
|
})
|
|
|
|
it("should render SubgraphOutput slots with 40% opacity when dragging from another SubgraphOutput", () => {
|
|
const subgraph = createTestSubgraph()
|
|
|
|
// Add two subgraph outputs
|
|
const subgraphOutput1 = subgraph.addOutput("result1", "number")
|
|
const subgraphOutput2 = subgraph.addOutput("result2", "number")
|
|
|
|
// Draw subgraphOutput2 while dragging from subgraphOutput1 (incompatible - both are inputs inside subgraph)
|
|
subgraphOutput2.draw({
|
|
ctx: mockCtx,
|
|
colorContext: mockColorContext,
|
|
fromSlot: subgraphOutput1,
|
|
editorAlpha: 1,
|
|
})
|
|
|
|
// Should render with 40% opacity
|
|
// Check that 0.4 was set during drawing
|
|
expect(globalAlphaValues).toContain(0.4)
|
|
})
|
|
|
|
// "not implmeneted yet"
|
|
// it("should render slots with full opacity when dragging between compatible SubgraphInput and SubgraphOutput", () => {
|
|
// const subgraph = createTestSubgraph()
|
|
|
|
// // Add subgraph input and output with matching types
|
|
// const subgraphInput = subgraph.addInput("value", "number")
|
|
// const subgraphOutput = subgraph.addOutput("result", "number")
|
|
|
|
// // Draw SubgraphOutput slot while dragging from SubgraphInput
|
|
// subgraphOutput.draw({
|
|
// ctx: mockCtx,
|
|
// colorContext: mockColorContext,
|
|
// fromSlot: subgraphInput,
|
|
// editorAlpha: 1,
|
|
// })
|
|
|
|
// // Should render with full opacity
|
|
// expect(mockCtx.globalAlpha).toBe(1)
|
|
// })
|
|
|
|
it("should render slots with 40% opacity when dragging between incompatible types", () => {
|
|
const subgraph = createTestSubgraph()
|
|
const node = new LGraphNode("TestNode")
|
|
node.addOutput("string_output", "string")
|
|
subgraph.add(node)
|
|
|
|
// Add subgraph output with incompatible type
|
|
const subgraphOutput = subgraph.addOutput("result", "number")
|
|
|
|
// Get the string output slot from the node
|
|
const nodeStringOutput = node.outputs[0]
|
|
|
|
// Draw the SubgraphOutput slot while dragging from a node output with incompatible type
|
|
subgraphOutput.draw({
|
|
ctx: mockCtx,
|
|
colorContext: mockColorContext,
|
|
fromSlot: nodeStringOutput,
|
|
editorAlpha: 1,
|
|
})
|
|
|
|
// Should render with 40% opacity due to type mismatch
|
|
// Check that 0.4 was set during drawing
|
|
expect(globalAlphaValues).toContain(0.4)
|
|
})
|
|
})
|