ComfyUI calls a media input missing when its value is not in the widget's list. The MaskEditor writes the file it saved into the image widget, and no list has that file until the lists are refreshed, so the node was flagged the next time it came out of bypass. Both nodes now add a picture to their list once it has loaded. Load Image + Pad also follows a picture written that way, as the crop node does.
57 lines
3.0 KiB
JavaScript
57 lines
3.0 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { test } from "node:test";
|
|
|
|
import { filterMedia, mediaLabel, mediaViewQuery, moveHighlight, unlistedMedia } from "../js/shared/media_list.mjs";
|
|
|
|
test("mediaViewQuery names the file, its subfolder and its folder type", () => {
|
|
assert.equal(mediaViewQuery("photo.png"), "filename=photo.png&subfolder=&type=input");
|
|
assert.equal(mediaViewQuery("pasted/image (2).png"), "filename=image+%282%29.png&subfolder=pasted&type=input");
|
|
assert.equal(mediaViewQuery("clip.mp4 [output]"), "filename=clip.mp4&subfolder=&type=output");
|
|
assert.equal(mediaViewQuery("a\\b\\c.webp"), "filename=c.webp&subfolder=a%2Fb&type=input");
|
|
assert.equal(mediaViewQuery(""), "");
|
|
assert.equal(mediaViewQuery(null), "");
|
|
});
|
|
|
|
test("filterMedia keeps values holding every term, ignoring case", () => {
|
|
const values = ["pasted/ausboss_night_bridge.png", "ausboss_day_sky_square.mp4", "Night_Alley.PNG"];
|
|
assert.deepEqual(filterMedia(values, ""), values);
|
|
assert.deepEqual(filterMedia(values, " "), values);
|
|
assert.deepEqual(filterMedia(values, "night"), ["pasted/ausboss_night_bridge.png", "Night_Alley.PNG"]);
|
|
assert.deepEqual(filterMedia(values, "night png pasted"), ["pasted/ausboss_night_bridge.png"]);
|
|
assert.deepEqual(filterMedia(values, "mp4 sky"), ["ausboss_day_sky_square.mp4"]);
|
|
assert.deepEqual(filterMedia(values, "missing"), []);
|
|
assert.deepEqual(filterMedia(undefined, "x"), []);
|
|
assert.deepEqual(filterMedia([1, 22], "2"), ["22"]);
|
|
});
|
|
|
|
test("mediaLabel splits the dim folder from the name and marks non-input folders", () => {
|
|
assert.deepEqual(mediaLabel("pasted/image.png"), { folder: "pasted/", name: "image.png" });
|
|
assert.deepEqual(mediaLabel("image.png"), { folder: "", name: "image.png" });
|
|
assert.deepEqual(mediaLabel("renders/out.mp4 [output]"), { folder: "renders/", name: "out.mp4 [output]" });
|
|
assert.deepEqual(mediaLabel(""), { folder: "", name: "" });
|
|
});
|
|
|
|
test("unlistedMedia names a value the list lacks, with or without its folder tail", () => {
|
|
const values = ["photo.png", "pasted/image.png"];
|
|
assert.equal(unlistedMedia(values, "clipspace-painted-masked-1.png [input]"), "clipspace-painted-masked-1.png [input]");
|
|
assert.equal(unlistedMedia(values, "new.png"), "new.png");
|
|
assert.equal(unlistedMedia(values, "photo.png"), "");
|
|
assert.equal(unlistedMedia(values, "photo.png [input]"), "");
|
|
assert.equal(unlistedMedia(["photo.png [input]"], "photo.png [input]"), "");
|
|
assert.equal(unlistedMedia(values, ""), "");
|
|
assert.equal(unlistedMedia(values, null), "");
|
|
assert.equal(unlistedMedia(undefined, "photo.png"), "");
|
|
assert.equal(unlistedMedia(() => values, "new.png"), "");
|
|
});
|
|
|
|
test("moveHighlight stops at the ends and starts from the right end", () => {
|
|
assert.equal(moveHighlight(-1, 1, 5), 0);
|
|
assert.equal(moveHighlight(-1, -1, 5), 4);
|
|
assert.equal(moveHighlight(0, -1, 5), 0);
|
|
assert.equal(moveHighlight(4, 1, 5), 4);
|
|
assert.equal(moveHighlight(2, 8, 5), 4);
|
|
assert.equal(moveHighlight(3, -8, 5), 0);
|
|
assert.equal(moveHighlight(9, 1, 5), 0);
|
|
assert.equal(moveHighlight(0, 1, 0), -1);
|
|
});
|