mirror of
https://github.com/noodlapp/noodl.git
synced 2026-01-11 23:02:53 +01:00
Co-Authored-By: Eric Tuvesson <eric.tuvesson@gmail.com> Co-Authored-By: mikaeltellhed <2311083+mikaeltellhed@users.noreply.github.com> Co-Authored-By: kotte <14197736+mrtamagotchi@users.noreply.github.com> Co-Authored-By: Anders Larsson <64838990+anders-topp@users.noreply.github.com> Co-Authored-By: Johan <4934465+joolsus@users.noreply.github.com> Co-Authored-By: Tore Knudsen <18231882+torekndsn@users.noreply.github.com> Co-Authored-By: victoratndl <99176179+victoratndl@users.noreply.github.com>
319 lines
7.5 KiB
JavaScript
319 lines
7.5 KiB
JavaScript
const NodeLibrary = require('@noodl-models/nodelibrary').NodeLibrary;
|
|
const BasicNodeType = require('@noodl-models/nodelibrary/BasicNodeType').BasicNodeType;
|
|
const UnknownNodeType = require('@noodl-models/nodelibrary/UnknownNodeType').UnknownNodeType;
|
|
|
|
const { ComponentModel } = require('@noodl-models/componentmodel');
|
|
const { ProjectModel } = require('@noodl-models/projectmodel');
|
|
|
|
describe('Node library tests', function () {
|
|
beforeEach(() => {
|
|
//reload fresh library for every test
|
|
window.NodeLibraryData = require('../nodegraph/nodelibrary');
|
|
for (const module of NodeLibrary.instance.modules) {
|
|
NodeLibrary.instance.unregisterModule(module);
|
|
}
|
|
|
|
NodeLibrary.instance.loadLibrary();
|
|
});
|
|
|
|
it('can detect compatibale port types', function () {
|
|
// Equal types
|
|
expect(NodeLibrary.instance.canCastPortTypes('string', 'string')).toBe(true);
|
|
expect(
|
|
NodeLibrary.instance.canCastPortTypes(
|
|
{
|
|
name: 'string'
|
|
},
|
|
'string'
|
|
)
|
|
).toBe(true);
|
|
expect(
|
|
NodeLibrary.instance.canCastPortTypes('string', {
|
|
name: 'string'
|
|
})
|
|
).toBe(true);
|
|
|
|
// Not equal and cannot cast
|
|
expect(
|
|
NodeLibrary.instance.canCastPortTypes('string', {
|
|
name: 'signal'
|
|
})
|
|
).toBe(false);
|
|
|
|
// Star types are compatible with everything
|
|
expect(
|
|
NodeLibrary.instance.canCastPortTypes('*', {
|
|
name: 'number'
|
|
})
|
|
).toBe(true);
|
|
|
|
// Casting
|
|
expect(
|
|
NodeLibrary.instance.canCastPortTypes('number', {
|
|
name: 'string'
|
|
})
|
|
).toBe(true);
|
|
});
|
|
|
|
it('can find compatible port types', function () {
|
|
// Single type
|
|
expect(
|
|
NodeLibrary.instance.findCompatiblePortType([
|
|
{
|
|
direction: 'to',
|
|
type: 'string'
|
|
}
|
|
])
|
|
).toEqual({
|
|
name: 'string'
|
|
});
|
|
|
|
// Multiple connections, same type, with modifiers
|
|
expect(
|
|
NodeLibrary.instance.findCompatiblePortType([
|
|
{
|
|
direction: 'to',
|
|
type: 'string'
|
|
},
|
|
{
|
|
direction: 'from',
|
|
type: {
|
|
name: 'string',
|
|
multiline: true
|
|
}
|
|
}
|
|
])
|
|
).toEqual({
|
|
name: 'string',
|
|
multiline: true
|
|
});
|
|
|
|
// Is enums merged
|
|
expect(
|
|
NodeLibrary.instance.findCompatiblePortType([
|
|
{
|
|
direction: 'to',
|
|
type: {
|
|
name: 'enum',
|
|
enums: ['a', 'b']
|
|
}
|
|
},
|
|
{
|
|
direction: 'from',
|
|
type: {
|
|
name: 'enum',
|
|
enums: ['b', 'c']
|
|
}
|
|
}
|
|
])
|
|
).toEqual({
|
|
name: 'enum',
|
|
enums: ['a', 'b', 'c']
|
|
});
|
|
|
|
// Find compatible type and merge
|
|
expect(
|
|
NodeLibrary.instance.findCompatiblePortType([
|
|
{
|
|
direction: 'to',
|
|
type: {
|
|
name: 'number',
|
|
allowConnectionsOnly: true
|
|
}
|
|
},
|
|
{
|
|
direction: 'to',
|
|
type: 'boolean'
|
|
}
|
|
])
|
|
).toEqual({
|
|
name: 'number',
|
|
allowConnectionsOnly: true
|
|
});
|
|
|
|
// Find compatible type, mixed direction
|
|
expect(
|
|
NodeLibrary.instance.findCompatiblePortType([
|
|
{
|
|
direction: 'to',
|
|
type: {
|
|
name: 'number',
|
|
allowEditOnly: true
|
|
}
|
|
},
|
|
{
|
|
direction: 'to',
|
|
type: 'boolean'
|
|
},
|
|
{
|
|
direction: 'from',
|
|
type: 'number'
|
|
}
|
|
])
|
|
).toEqual({
|
|
name: 'number',
|
|
allowEditOnly: true
|
|
});
|
|
|
|
// Find compatible type, mixed direction
|
|
expect(
|
|
NodeLibrary.instance.findCompatiblePortType([
|
|
{
|
|
direction: 'to',
|
|
type: {
|
|
name: 'number'
|
|
}
|
|
},
|
|
{
|
|
direction: 'to',
|
|
type: 'boolean'
|
|
},
|
|
{
|
|
direction: 'from',
|
|
type: 'number'
|
|
},
|
|
{
|
|
direction: 'to',
|
|
type: 'color'
|
|
}
|
|
])
|
|
).toEqual({
|
|
name: 'string'
|
|
});
|
|
|
|
// Can't find compatible type
|
|
expect(
|
|
NodeLibrary.instance.findCompatiblePortType([
|
|
{
|
|
direction: 'to',
|
|
type: {
|
|
name: 'number',
|
|
allowEditOnly: true
|
|
}
|
|
},
|
|
{
|
|
direction: 'to',
|
|
type: 'boolean'
|
|
},
|
|
{
|
|
direction: 'from',
|
|
type: 'number'
|
|
},
|
|
{
|
|
direction: 'to',
|
|
type: 'referece'
|
|
}
|
|
])
|
|
).toBe(undefined);
|
|
});
|
|
|
|
it('can reload library', function () {
|
|
var p = ProjectModel.fromJSON(getProject());
|
|
NodeLibrary.instance.registerModule(p);
|
|
|
|
var n1 = p.components[0].graph.findNodeWithId('A');
|
|
var n2 = p.components[0].graph.findNodeWithId('B');
|
|
var n3 = p.components[0].graph.findNodeWithId('C');
|
|
var n4 = p.components[0].graph.findNodeWithId('D');
|
|
|
|
expect(n1.type instanceof BasicNodeType).toBe(true);
|
|
expect(n1.type.name).toBe('image');
|
|
expect(n2.type instanceof UnknownNodeType).toBe(true);
|
|
|
|
// Update library
|
|
NodeLibraryData.nodetypes.push({
|
|
name: 'newimage',
|
|
allowAsChild: true,
|
|
allowAsExclusiveRootOnly: true,
|
|
category: 'visuals',
|
|
ports: [
|
|
{
|
|
name: 'x',
|
|
type: {
|
|
name: 'number'
|
|
},
|
|
plug: 'input'
|
|
}
|
|
]
|
|
});
|
|
NodeLibrary.instance.reload();
|
|
|
|
// Both should be OK now
|
|
expect(n1.type instanceof BasicNodeType).toBe(true);
|
|
expect(n1.type.name).toBe('image');
|
|
|
|
expect(n2.type instanceof BasicNodeType).toBe(true);
|
|
expect(n2.type.name).toBe('newimage');
|
|
|
|
NodeLibrary.instance.unregisterModule(p);
|
|
});
|
|
|
|
it('can get types by name', () => {
|
|
expect(NodeLibrary.instance.getNodeTypeWithName('comp1')).toBeUndefined();
|
|
//get basic type from node library
|
|
expect(NodeLibrary.instance.getNodeTypeWithName('image')).toBeInstanceOf(BasicNodeType);
|
|
|
|
//get component type from a project
|
|
const p = ProjectModel.fromJSON(getProject());
|
|
NodeLibrary.instance.registerModule(p);
|
|
expect(NodeLibrary.instance.getNodeTypeWithName('comp1')).toBeInstanceOf(ComponentModel);
|
|
|
|
//add a new component and get the type
|
|
const newComponent = ComponentModel.fromJSON({
|
|
name: 'comp2',
|
|
graph: {
|
|
roots: [
|
|
{
|
|
id: 'B',
|
|
type: 'image'
|
|
}
|
|
]
|
|
}
|
|
});
|
|
p.addComponent(newComponent);
|
|
expect(NodeLibrary.instance.getNodeTypeWithName('comp2')).toBe(newComponent);
|
|
|
|
//remove the component again
|
|
p.removeComponent(newComponent);
|
|
expect(NodeLibrary.instance.getNodeTypeWithName('comp2')).toBeUndefined();
|
|
|
|
//unregister project and make sure the components aren't available anymore
|
|
NodeLibrary.instance.unregisterModule(p);
|
|
expect(NodeLibrary.instance.getNodeTypeWithName('comp1')).toBeUndefined();
|
|
expect(NodeLibrary.instance.getNodeTypeWithName('comp2')).toBeUndefined();
|
|
});
|
|
|
|
function getProject() {
|
|
return {
|
|
components: [
|
|
{
|
|
name: 'comp1',
|
|
graph: {
|
|
roots: [
|
|
{
|
|
id: 'A',
|
|
type: 'image'
|
|
},
|
|
{
|
|
id: 'B',
|
|
type: 'newimage'
|
|
},
|
|
{
|
|
id: 'C',
|
|
type: 'Event Sender',
|
|
parameters: {
|
|
channel: 'Channel0'
|
|
}
|
|
},
|
|
{
|
|
id: 'D',
|
|
type: 'Event Receiver'
|
|
}
|
|
]
|
|
}
|
|
}
|
|
]
|
|
};
|
|
}
|
|
});
|