refactor socket types
This commit is contained in:
@@ -1,8 +1,31 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
|
||||
import { SOCKET_COMPATIBILITY } from '../src/constants.js';
|
||||
import {
|
||||
DATA_TYPES,
|
||||
getAcceptedSocketTypes,
|
||||
isDataSocketSpec,
|
||||
socketSpecAcceptsType,
|
||||
} from '../src/constants.js';
|
||||
|
||||
test('SAVE_VALUE accepts ANNOTATION_SOURCE inputs', () => {
|
||||
assert.equal(SOCKET_COMPATIBILITY.SAVE_VALUE.has('ANNOTATION_SOURCE'), true);
|
||||
test('intrinsic socket compatibility still allows INT to connect to FLOAT sockets', () => {
|
||||
assert.equal(socketSpecAcceptsType('INT', 'FLOAT'), true);
|
||||
assert.equal(socketSpecAcceptsType('FLOAT', 'INT'), true);
|
||||
});
|
||||
|
||||
test('retired save alias types are no longer first-class socket types', () => {
|
||||
assert.equal(DATA_TYPES.has('SAVE_VALUE'), false);
|
||||
assert.equal(DATA_TYPES.has('SAVE_LAYER'), false);
|
||||
});
|
||||
|
||||
test('accepted_types extend canonical socket compatibility without reintroducing alias types', () => {
|
||||
const spec = ['MEASURE_TABLE', { accepted_types: ['RECORD_TABLE'] }];
|
||||
|
||||
assert.equal(isDataSocketSpec(spec), true);
|
||||
assert.deepEqual(
|
||||
Array.from(getAcceptedSocketTypes(spec)).sort(),
|
||||
['MEASURE_TABLE', 'RECORD_TABLE'],
|
||||
);
|
||||
assert.equal(socketSpecAcceptsType('RECORD_TABLE', spec), true);
|
||||
assert.equal(socketSpecAcceptsType('LINE', spec), false);
|
||||
});
|
||||
|
||||
@@ -478,3 +478,89 @@ test('hasBlockingAutoRunInput skips required file widgets when a connected socke
|
||||
|
||||
assert.equal(hasBlockingAutoRunInput(node, edges), false);
|
||||
});
|
||||
|
||||
test('serializeExecutionGraph treats accepted_types inputs as sockets, not widgets', () => {
|
||||
const nodes = [
|
||||
{
|
||||
id: '1',
|
||||
data: {
|
||||
className: 'TableSource',
|
||||
definition: {
|
||||
input: { required: {}, optional: {} },
|
||||
output: ['RECORD_TABLE'],
|
||||
output_name: ['rows'],
|
||||
manual_trigger: false,
|
||||
},
|
||||
widgetValues: {},
|
||||
},
|
||||
},
|
||||
{
|
||||
id: '2',
|
||||
data: {
|
||||
className: 'PrintTable',
|
||||
definition: {
|
||||
input: {
|
||||
required: {
|
||||
table: ['MEASURE_TABLE', { accepted_types: ['RECORD_TABLE'] }],
|
||||
},
|
||||
optional: {},
|
||||
},
|
||||
manual_trigger: false,
|
||||
},
|
||||
widgetValues: { table: 'should-not-serialize' },
|
||||
},
|
||||
},
|
||||
];
|
||||
const edges = [
|
||||
{
|
||||
source: '1',
|
||||
sourceHandle: 'output::0::RECORD_TABLE',
|
||||
target: '2',
|
||||
targetHandle: 'input::table::MEASURE_TABLE',
|
||||
},
|
||||
];
|
||||
|
||||
const prompt = serializeExecutionGraph(nodes, edges);
|
||||
|
||||
assert.deepEqual(prompt, {
|
||||
'1': {
|
||||
class_type: 'TableSource',
|
||||
inputs: {},
|
||||
},
|
||||
'2': {
|
||||
class_type: 'PrintTable',
|
||||
inputs: { table: ['1', 0] },
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
test('hasBlockingAutoRunInput still blocks unconnected accepted_types sockets', () => {
|
||||
const node = {
|
||||
id: '2',
|
||||
data: {
|
||||
definition: {
|
||||
manual_trigger: false,
|
||||
input: {
|
||||
required: {
|
||||
input: ['DATA_FIELD', { accepted_types: ['IMAGE', 'LINE', 'RECORD_TABLE'] }],
|
||||
},
|
||||
optional: {},
|
||||
},
|
||||
},
|
||||
widgetValues: {},
|
||||
},
|
||||
};
|
||||
|
||||
assert.equal(hasBlockingAutoRunInput(node, []), true);
|
||||
assert.equal(
|
||||
hasBlockingAutoRunInput(node, [
|
||||
{
|
||||
source: '1',
|
||||
sourceHandle: 'output::0::RECORD_TABLE',
|
||||
target: '2',
|
||||
targetHandle: 'input::input::DATA_FIELD',
|
||||
},
|
||||
]),
|
||||
false,
|
||||
);
|
||||
});
|
||||
|
||||
@@ -58,7 +58,7 @@ test('buildNodeClipboardPayload keeps only selected nodes and internal edges', (
|
||||
source: '2',
|
||||
sourceHandle: 'output::0::IMAGE',
|
||||
target: '3',
|
||||
targetHandle: 'input::value::SAVE_VALUE',
|
||||
targetHandle: 'input::value::DATA_FIELD',
|
||||
},
|
||||
];
|
||||
|
||||
@@ -166,7 +166,7 @@ test('buildNodeClipboardPayloadForIds can include upstream external edges for du
|
||||
source: '2',
|
||||
sourceHandle: 'output::0::IMAGE',
|
||||
target: '3',
|
||||
targetHandle: 'input::value::SAVE_VALUE',
|
||||
targetHandle: 'input::value::DATA_FIELD',
|
||||
},
|
||||
];
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ test('buildDefaultWidgetValues keeps non-data required widget defaults', () => {
|
||||
input: {
|
||||
required: {
|
||||
input: ['ANNOTATION_SOURCE', { label: 'Input' }],
|
||||
table: ['MEASURE_TABLE', { accepted_types: ['RECORD_TABLE'] }],
|
||||
shape: [['line', 'rectangle', 'circle', 'arrow'], { default: 'arrow' }],
|
||||
stroke_color: ['STRING', { default: '#ff0000', color_picker: true }],
|
||||
stroke_width: ['INT', { default: 3 }],
|
||||
|
||||
Reference in New Issue
Block a user