11import {
2+ definedTypeLinkNode ,
3+ definedTypeNode ,
24 enumEmptyVariantTypeNode ,
35 enumStructVariantTypeNode ,
46 enumTupleVariantTypeNode ,
@@ -7,15 +9,18 @@ import {
79 Node ,
810 NumberFormat ,
911 numberTypeNode ,
12+ programLinkNode ,
13+ programNode ,
1014 publicKeyTypeNode ,
15+ rootNode ,
1116 stringTypeNode ,
1217 structFieldTypeNode ,
1318 structTypeNode ,
1419 tupleTypeNode ,
1520} from '@codama/nodes' ;
1621import { expect , test } from 'vitest' ;
1722
18- import { getByteSizeVisitor , LinkableDictionary , NodeStack , visit , Visitor } from '../src' ;
23+ import { getByteSizeVisitor , getRecordLinkablesVisitor , LinkableDictionary , NodeStack , visit , Visitor } from '../src' ;
1924
2025const expectSize = ( node : Node , expectedSize : number | null ) => {
2126 expect ( visit ( node , getByteSizeVisitor ( new LinkableDictionary ( ) , new NodeStack ( ) ) as Visitor < number | null > ) ) . toBe (
@@ -104,3 +109,38 @@ test('it gets the size of variable data enums', () => {
104109 null ,
105110 ) ;
106111} ) ;
112+
113+ test ( 'it follows linked nodes using the correct paths' , ( ) => {
114+ // Given two link nodes designed so that the path would
115+ // fail if we did not save and restored linked paths.
116+ const programA = programNode ( {
117+ definedTypes : [
118+ definedTypeNode ( {
119+ name : 'typeA' ,
120+ type : definedTypeLinkNode ( 'typeB1' , programLinkNode ( 'programB' ) ) ,
121+ } ) ,
122+ ] ,
123+ name : 'programA' ,
124+ publicKey : '1111' ,
125+ } ) ;
126+ const programB = programNode ( {
127+ definedTypes : [
128+ definedTypeNode ( { name : 'typeB1' , type : definedTypeLinkNode ( 'typeB2' ) } ) ,
129+ definedTypeNode ( { name : 'typeB2' , type : numberTypeNode ( 'u64' ) } ) ,
130+ ] ,
131+ name : 'programB' ,
132+ publicKey : '2222' ,
133+ } ) ;
134+ const root = rootNode ( programA , [ programB ] ) ;
135+
136+ // And given a recorded linkables dictionary.
137+ const linkables = new LinkableDictionary ( ) ;
138+ visit ( root , getRecordLinkablesVisitor ( linkables ) ) ;
139+
140+ // When we visit the first defined type.
141+ const visitor = getByteSizeVisitor ( linkables , new NodeStack ( [ root , programA ] ) ) ;
142+ const result = visit ( programA . definedTypes [ 0 ] , visitor ) ;
143+
144+ // Then we expect the final linkable to be resolved.
145+ expect ( result ) . toBe ( 8 ) ;
146+ } ) ;
0 commit comments