Files
JasonHoku-ComfyUI-Ultimate-…/tests/js/wfparams.test.js
T
Jason HokuandClaude Fable 5.1 13422104f4 feat(dashboard): wf_params facets, labels, workflow job panel
Quick Filter / Logic Filter (wf:<key>) / label overlay use item.wf_params. Sweep items get a
JOB button opening a read-only Workflow job panel with download/copy of the job's API prompt.
Standalone progress bar shows paused/cancelled.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-04 00:55:11 -08:00

66 lines
3.4 KiB
JavaScript

const test = require('node:test');
const assert = require('node:assert');
const wf = require('../../resources/logic_wfparams.js');
const items = [
{ id: 1, wf_params: { 'KSampler.cfg': 4, 'KSampler.sampler_name': 'euler', 'KSampler.steps': '20', 'A.seed': 1, 'B.seed': 2 } },
{ id: 2, wf_params: { 'KSampler.cfg': 5.5, 'KSampler.sampler_name': 'dpmpp', 'KSampler.steps': 30, 'A.seed': 1, 'B.seed': 2 } },
{ id: 3 },
{ id: 4, wf_params: { 'KSampler.cfg': 5.5, 'KSampler.sampler_name': 'euler' } },
];
test('wfParamKeys: sorted, numeric detection with mixed values, distinct counts', () => {
const keys = wf.wfParamKeys(items);
assert.deepStrictEqual(keys.map(k => k.key), ['A.seed', 'B.seed', 'KSampler.cfg', 'KSampler.sampler_name', 'KSampler.steps']);
const by = Object.fromEntries(keys.map(k => [k.key, k]));
assert.strictEqual(by['KSampler.cfg'].numeric, true);
assert.strictEqual(by['KSampler.cfg'].distinct, 2);
assert.strictEqual(by['KSampler.sampler_name'].numeric, false);
assert.strictEqual(by['KSampler.steps'].numeric, true); // '20' and 30 both parse
assert.strictEqual(by['A.seed'].distinct, 1);
assert.deepStrictEqual(wf.wfParamKeys(null), []);
assert.deepStrictEqual(wf.wfParamKeys([{ id: 1 }]), []);
});
test('wfParamKeys: one non-numeric value makes the key non-numeric; cache refreshes on length change', () => {
const arr = [{ wf_params: { k: 1 } }];
assert.strictEqual(wf.wfParamKeys(arr)[0].numeric, true);
assert.strictEqual(wf.wfParamKeys(arr), wf.wfParamKeys(arr)); // cached
arr.push({ wf_params: { k: 'abc' } });
assert.strictEqual(wf.wfParamKeys(arr)[0].numeric, false);
});
test('wfParamValue / wfParamNumber', () => {
assert.strictEqual(wf.wfParamValue(items[0], 'KSampler.cfg'), 4);
assert.strictEqual(wf.wfParamValue(items[2], 'KSampler.cfg'), null);
assert.strictEqual(wf.wfParamValue(items[3], 'nope'), null);
assert.strictEqual(wf.wfParamNumber(items[0], 'KSampler.steps'), 20);
assert.strictEqual(wf.wfParamNumber(items[0], 'KSampler.sampler_name'), null);
assert.strictEqual(wf.wfParamNumber(items[2], 'KSampler.cfg'), null);
});
test('wfParamMatches: tolerance for numbers, string equality otherwise', () => {
assert.ok(wf.wfParamMatches(items[1], 'KSampler.cfg', '5.5'));
assert.ok(wf.wfParamMatches({ wf_params: { c: 0.1 + 0.2 } }, 'c', 0.3));
assert.ok(!wf.wfParamMatches(items[1], 'KSampler.cfg', 5.6));
assert.ok(wf.wfParamMatches(items[0], 'KSampler.sampler_name', 'euler'));
assert.ok(!wf.wfParamMatches(items[0], 'KSampler.sampler_name', 'Euler'));
assert.ok(!wf.wfParamMatches(items[2], 'KSampler.cfg', 4));
});
test('wfShortLabel: last segment unless it collides', () => {
const keys = wf.wfParamKeys(items);
assert.strictEqual(wf.wfShortLabel('KSampler.cfg', keys), 'cfg');
assert.strictEqual(wf.wfShortLabel('A.seed', keys), 'A.seed');
assert.strictEqual(wf.wfShortLabel('B.seed', ['A.seed', 'B.seed']), 'B.seed');
assert.strictEqual(wf.wfShortLabel('plain', ['plain']), 'plain');
});
test('wfDisplay: 4 significant digits, strings cut at 24', () => {
assert.strictEqual(wf.wfDisplay(4), '4');
assert.strictEqual(wf.wfDisplay(0.123456), '0.1235');
assert.strictEqual(wf.wfDisplay(1234567), '1235000');
assert.strictEqual(wf.wfDisplay('euler'), 'euler');
assert.strictEqual(wf.wfDisplay('x'.repeat(40)).length, 24);
});