@ndbx/runtime
Version:
The `@ndbx/runtime` package provides a runtime environment to embed NodeBox visualizations directly into React applications. NodeBox is a powerful tool for creating interactive and generative visualizations, and this runtime allows you to integrate those
96 lines (86 loc) • 3.99 kB
text/typescript
import { expect, it } from "vitest";
import { evaluateNetwork, findRenderedNodeOutputs } from "../src";
import { connectNodeToNode, createNode, setRenderedNode, setValue } from "../src/mutation.js";
import { createTestContext } from "./util.js";
it("can evaluate a simple function", async () => {
const { cx, network } = createTestContext();
const value1 = createNode(cx, network, "test/math/value")!;
setValue(cx, network, value1, "value", { type: "VALUE", value: 5 });
setRenderedNode(cx, network, value1);
const item = cx.lookupItemByName("test/math/value");
await evaluateNetwork(cx, network);
const outputs = findRenderedNodeOutputs(cx, network);
expect(outputs.size).toEqual(1);
expect(Array.from(outputs.keys())).toEqual(["out"]);
const output = outputs.get("out");
expect(output).toEqual([{ value: 5 }]);
});
it("can evaluate connected functions", async () => {
const { cx, network } = createTestContext();
const value1 = createNode(cx, network, "test/math/value")!;
setValue(cx, network, value1, "value", { type: "VALUE", value: 5 });
const negate1 = createNode(cx, network, "test/math/negate");
const valueFn = cx.lookupItemById(value1.fn);
const negateFn = cx.lookupItemById(negate1.fn);
const valueOut = valueFn.outputPorts[0];
const negateIn = negateFn.inputPorts[0];
connectNodeToNode(cx, network, value1, valueOut, negate1, negateIn);
setRenderedNode(cx, network, negate1);
await evaluateNetwork(cx, network);
const outputs = findRenderedNodeOutputs(cx, network);
const output = outputs.get("out");
expect(output).toEqual([{ value: -5 }]);
});
it("can evaluate an expression", async () => {
const { cx, network } = createTestContext();
network.width = 1234;
const value1 = createNode(cx, network, "test/math/value")!;
setValue(cx, network, value1, "value", { type: "EXPRESSION", expression: "network.width" });
setRenderedNode(cx, network, value1);
await evaluateNetwork(cx, network);
const outputs = findRenderedNodeOutputs(cx, network);
const output = outputs.get("out");
expect(output).toEqual([{ value: 1234 }]);
});
it.skip("can cycle lists", async () => {
let result: any[];
let plan = createTestContext();
plan = createNetwork(plan, "main");
plan = createNode(plan, "main", "math.makeNumbers");
plan = createNode(plan, "main", "math.negate");
plan = connect(plan, "main", "makeNumbers1", "negate1", "v");
plan = setRenderedNode(plan, "main", "negate1");
result = await evalFunction(plan, "test.main");
expect(result).toEqual([-11, -22, -33]);
});
it.skip("can cycle two lists", async () => {
let result: any[];
let plan = createTestContext();
plan = createNetwork(plan, "main");
plan = createNode(plan, "main", "math.makeNumbers");
plan = createNode(plan, "main", "math.makeNumbers");
plan = setValue(plan, "main", "makeNumbers1", "s", "1;2;3;4");
plan = setValue(plan, "main", "makeNumbers2", "s", "0;1000");
plan = createNode(plan, "main", "math.add");
plan = connect(plan, "main", "makeNumbers1", "add1", "a");
plan = connect(plan, "main", "makeNumbers2", "add1", "b");
plan = setRenderedNode(plan, "main", "add1");
result = await evalFunction(plan, "test.main");
// 1 + 0; 2 + 1000; 3 + 0; 4 + 1000
expect(result).toEqual([1, 1002, 3, 1004]);
});
it.skip("can evaluate inlets", async () => {
let result: any[];
let plan = createTestContext();
plan = createNetwork(plan, "main");
plan = createNode(plan, "main", "math.add");
plan = setRenderedNode(plan, "main", "add1");
result = await evalFunction(plan, "test.main");
expect(result).toEqual([8]);
plan = addParameter(plan, "main", { name: "a", type: "float", value: 20, takesList: false });
plan = addParameter(plan, "main", { name: "b", type: "float", value: 40, takesList: false });
plan = connectInlet(plan, "main", 0, "add1", "a");
plan = connectInlet(plan, "main", 1, "add1", "b");
result = await evalFunction(plan, "test.main");
expect(result).toEqual([60]);
});