11import { describe , expect , it } from 'vitest' ;
22
33import type { IREdge , IRNode } from '../types.js' ;
4- import type { TransformMeta } from './graphValidation.js' ;
4+ import {
5+ createFakeGeneratorsForFeedback ,
6+ createFakeHydraOutputsOnly
7+ } from './__testutils__/fakeHydra.js' ;
8+ import { createTestMeta } from './__testutils__/meta.js' ;
59import { HydraEngine } from './HydraEngine.js' ;
610
7- function createMeta ( ) : TransformMeta {
8- const arityByName = new Map < string , 0 | 1 | 2 > ( ) ;
9- const kindByName = new Map < string , 'src' | 'coord' | 'color' | 'combine' | 'combineCoord' > ( ) ;
10- const paramIdsByName = new Map < string , string [ ] > ( ) ;
11- const paramDefaultsByName = new Map < string , unknown [ ] > ( ) ;
12-
13- arityByName . set ( 'osc' , 0 ) ;
14- kindByName . set ( 'osc' , 'src' ) ;
15- paramIdsByName . set ( 'osc' , [ 'frequency' , 'sync' , 'offset' ] ) ;
16- paramDefaultsByName . set ( 'osc' , [ 2 , 0.5 , 0 ] ) ;
17-
18- arityByName . set ( 'rotate' , 1 ) ;
19- kindByName . set ( 'rotate' , 'coord' ) ;
20- paramIdsByName . set ( 'rotate' , [ 'angle' , 'speed' ] ) ;
21- paramDefaultsByName . set ( 'rotate' , [ 0 , 0 ] ) ;
22-
23- arityByName . set ( 'blend' , 2 ) ;
24- kindByName . set ( 'blend' , 'combine' ) ;
25- paramIdsByName . set ( 'blend' , [ 'amount' ] ) ;
26- paramDefaultsByName . set ( 'blend' , [ 0.5 ] ) ;
27-
28- arityByName . set ( 'out' , 1 ) ;
29- kindByName . set ( 'out' , 'color' ) ;
30- paramIdsByName . set ( 'out' , [ ] ) ;
31- paramDefaultsByName . set ( 'out' , [ ] ) ;
32-
33- return { arityByName, kindByName, paramIdsByName, paramDefaultsByName } ;
34- }
35-
36- // Fake chain objects for testing
37- type FakeChain = {
38- kind : string ;
39- transforms : Array < { op : string ; otherChain ?: FakeChain ; args : unknown [ ] } > ;
40- outputIndex ?: number ;
41- input ?: FakeChain ;
42- input0 ?: FakeChain ;
43- input1 ?: FakeChain ;
44- rotate : ( this : FakeChain , ...args : unknown [ ] ) => FakeChain ;
45- blend : ( this : FakeChain , other : FakeChain , ...args : unknown [ ] ) => FakeChain ;
46- [ key : string ] : unknown ;
47- } ;
48-
49- function createFakeGenerators ( ) {
50- const chains : FakeChain [ ] = [ ] ;
51-
52- const makeChain = ( kind : string ) : FakeChain => {
53- const chain : FakeChain = {
54- kind,
55- transforms : [ ] ,
56- rotate : function ( this : FakeChain , ...args : unknown [ ] ) {
57- this . transforms . push ( { op : 'rotate' , args } ) ;
58- return this ;
59- } ,
60- blend : function ( this : FakeChain , other : FakeChain , ...args : unknown [ ] ) {
61- this . input0 = this ;
62- this . input1 = other ;
63- // Record the full call signature: other chain + user args
64- this . transforms . push ( { op : 'blend' , otherChain : other , args } ) ;
65- return this ;
66- } ,
67- out : function ( ) {
68- // Mock out method to avoid execution errors
69- return this ;
70- }
71- } ;
72- chains . push ( chain ) ;
73- return chain ;
74- } ;
75-
76- const generators = {
77- osc : ( ...args : unknown [ ] ) => {
78- const chain = makeChain ( 'osc' ) ;
79- chain . transforms . push ( { op : 'osc' , args } ) ;
80- return chain ;
81- } ,
82- src : ( output : { index ?: number } ) => {
83- const chain = makeChain ( 'src' ) ;
84- chain . outputIndex = output . index ?? 0 ;
85- chain . transforms . push ( { op : 'src' , args : [ output ] } ) ;
86- return chain ;
87- }
88- } ;
89-
90- return { generators, chains } ;
91- }
92-
93- function createFakeHydra ( outputCount = 4 ) {
94- const outputs = Array . from ( { length : outputCount } , ( _ , i ) => ( { index : i } ) ) ;
95- return {
96- outputs,
97- loop : {
98- start : ( ) => { } ,
99- stop : ( ) => { }
100- } ,
101- hush : ( ) => { } ,
102- setResolution : ( ) => { }
103- } ;
104- }
105-
10611describe ( 'HydraEngine feedback' , ( ) => {
10712 it ( 'unary forward + feedback cycle' , async ( ) => {
108- const meta = createMeta ( ) ;
109- const { generators, chains } = createFakeGenerators ( ) ;
13+ const meta = createTestMeta ( ) ;
14+ const { generators, chains } = createFakeGeneratorsForFeedback ( ) ;
11015 const engine = new HydraEngine ( meta , generators ) ;
11116
112- const fakeHydra = createFakeHydra ( ) ;
17+ const fakeHydra = createFakeHydraOutputsOnly ( ) ;
11318 // eslint-disable-next-line @typescript-eslint/no-explicit-any
11419 ( engine as any ) . hydra = fakeHydra ;
11520 // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -142,11 +47,11 @@ describe('HydraEngine feedback', () => {
14247 } ) ;
14348
14449 it ( 'unary feedback-only node' , async ( ) => {
145- const meta = createMeta ( ) ;
146- const { generators, chains } = createFakeGenerators ( ) ;
50+ const meta = createTestMeta ( ) ;
51+ const { generators, chains } = createFakeGeneratorsForFeedback ( ) ;
14752 const engine = new HydraEngine ( meta , generators ) ;
14853
149- const fakeHydra = createFakeHydra ( ) ;
54+ const fakeHydra = createFakeHydraOutputsOnly ( ) ;
15055 // eslint-disable-next-line @typescript-eslint/no-explicit-any
15156 ( engine as any ) . hydra = fakeHydra ;
15257 // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -177,11 +82,11 @@ describe('HydraEngine feedback', () => {
17782 } ) ;
17883
17984 it ( 'binary node mixed inputs' , async ( ) => {
180- const meta = createMeta ( ) ;
181- const { generators, chains } = createFakeGenerators ( ) ;
85+ const meta = createTestMeta ( ) ;
86+ const { generators, chains } = createFakeGeneratorsForFeedback ( ) ;
18287 const engine = new HydraEngine ( meta , generators ) ;
18388
184- const fakeHydra = createFakeHydra ( ) ;
89+ const fakeHydra = createFakeHydraOutputsOnly ( ) ;
18590 // eslint-disable-next-line @typescript-eslint/no-explicit-any
18691 ( engine as any ) . hydra = fakeHydra ;
18792 // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -216,11 +121,11 @@ describe('HydraEngine feedback', () => {
216121 } ) ;
217122
218123 it ( 'binary node pure feedback' , async ( ) => {
219- const meta = createMeta ( ) ;
220- const { generators, chains } = createFakeGenerators ( ) ;
124+ const meta = createTestMeta ( ) ;
125+ const { generators, chains } = createFakeGeneratorsForFeedback ( ) ;
221126 const engine = new HydraEngine ( meta , generators ) ;
222127
223- const fakeHydra = createFakeHydra ( ) ;
128+ const fakeHydra = createFakeHydraOutputsOnly ( ) ;
224129 // eslint-disable-next-line @typescript-eslint/no-explicit-any
225130 ( engine as any ) . hydra = fakeHydra ;
226131 // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -267,7 +172,7 @@ describe('HydraEngine feedback', () => {
267172 } ) ;
268173
269174 it ( 'runtime error when src generator unavailable' , async ( ) => {
270- const meta = createMeta ( ) ;
175+ const meta = createTestMeta ( ) ;
271176 const generators = {
272177 osc : ( ) => ( { transforms : [ ] } ) ,
273178 rotate : function ( ) {
@@ -280,7 +185,7 @@ describe('HydraEngine feedback', () => {
280185 } ;
281186 const engine = new HydraEngine ( meta , generators ) ;
282187
283- const fakeHydra = createFakeHydra ( ) ;
188+ const fakeHydra = createFakeHydraOutputsOnly ( ) ;
284189 // eslint-disable-next-line @typescript-eslint/no-explicit-any
285190 ( engine as any ) . hydra = fakeHydra ;
286191 // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -307,11 +212,11 @@ describe('HydraEngine feedback', () => {
307212 } ) ;
308213
309214 it ( 'mixer params are not dropped and implicit chain param is not in args' , async ( ) => {
310- const meta = createMeta ( ) ;
311- const { generators, chains } = createFakeGenerators ( ) ;
215+ const meta = createTestMeta ( ) ;
216+ const { generators, chains } = createFakeGeneratorsForFeedback ( ) ;
312217 const engine = new HydraEngine ( meta , generators ) ;
313218
314- const fakeHydra = createFakeHydra ( ) ;
219+ const fakeHydra = createFakeHydraOutputsOnly ( ) ;
315220 // eslint-disable-next-line @typescript-eslint/no-explicit-any
316221 ( engine as any ) . hydra = fakeHydra ;
317222 // eslint-disable-next-line @typescript-eslint/no-explicit-any
0 commit comments