@@ -685,6 +685,69 @@ test('encode / decode recursive types with shared non-recursive types', () => {
685685 expect ( decoded ) . toEqual ( toEncode ) ;
686686} ) ;
687687
688+ test ( 'encode / decode recursive record with shared opt nat8' , ( ) => {
689+ const MyRecursiveOpt = IDL . Rec ( ) ;
690+ MyRecursiveOpt . fill ( IDL . Opt ( IDL . Nat8 ) ) ;
691+
692+ const MyRecursiveRecord = IDL . Rec ( ) ;
693+ MyRecursiveRecord . fill (
694+ IDL . Record ( {
695+ field1 : IDL . Opt ( IDL . Nat8 ) ,
696+ field2 : IDL . Record ( {
697+ field3 : MyRecursiveOpt ,
698+ } ) ,
699+ } ) ,
700+ ) ;
701+
702+ expect ( ( ) => {
703+ const encoded = IDL . encode (
704+ [ MyRecursiveRecord ] ,
705+ [
706+ {
707+ field1 : [ ] ,
708+ field2 : {
709+ field3 : [ ] ,
710+ } ,
711+ } ,
712+ ] ,
713+ ) ;
714+ IDL . decode ( [ MyRecursiveRecord ] , encoded ) ;
715+ } ) . not . toThrow ( ) ;
716+ } ) ;
717+
718+ test ( 'encode / decode recursive types sharing opt nat8 across record and func return' , ( ) => {
719+ const recRecordFunc = IDL . Rec ( ) ;
720+ const recOpt = IDL . Rec ( ) ;
721+ recRecordFunc . fill ( IDL . Record ( { field1 : IDL . Func ( [ ] , [ IDL . Opt ( IDL . Nat8 ) ] ) , field2 : recOpt } ) ) ;
722+ recOpt . fill ( IDL . Record ( { field3 : IDL . Opt ( IDL . Nat8 ) } ) ) ;
723+
724+ const recRecordOpt = IDL . Rec ( ) ;
725+ const recOpt2 = IDL . Rec ( ) ;
726+ recOpt2 . fill ( IDL . Opt ( IDL . Nat8 ) ) ;
727+ recRecordOpt . fill ( IDL . Record ( { field4 : IDL . Opt ( IDL . Nat8 ) , field5 : recOpt2 } ) ) ;
728+
729+ const myRecRecordFunc = {
730+ field1 : [
731+ Principal . fromText ( 'bpyi5-2bzji-dsb2y-bav6a-jeig6-eakqa-ibawc-73crj-st4ac-berzm-mwy' ) ,
732+ '' ,
733+ ] ,
734+ field2 : {
735+ field3 : [ ] ,
736+ } ,
737+ } ;
738+ const myRecRecordOpt = {
739+ field4 : [ ] ,
740+ field5 : [ ] ,
741+ } ;
742+ const encodedRecRecordFunc = IDL . encode ( [ recRecordFunc ] , [ myRecRecordFunc ] ) ;
743+ const encodedRecRecordOpt = IDL . encode ( [ recRecordOpt ] , [ myRecRecordOpt ] ) ;
744+
745+ expect ( ( ) => {
746+ IDL . decode ( [ recRecordFunc ] , encodedRecRecordFunc ) ;
747+ IDL . decode ( [ recRecordOpt ] , encodedRecRecordOpt ) ;
748+ } ) . not . toThrow ( ) ;
749+ } ) ;
750+
688751test ( 'decode / encode unknown nested record' , ( ) => {
689752 const nestedType = IDL . Record ( { foo : IDL . Int32 , bar : IDL . Bool } ) ;
690753 const recordType = IDL . Record ( {
@@ -1156,8 +1219,8 @@ describe('IDL subtyping', () => {
11561219
11571220 describe ( 'Subtyping on records/variants normalizes field labels' , ( ) => {
11581221 // Checks we don't regress https://github.com/dfinity/icp-js-core/issues/1072
1159- testSub ( IDL . Record ( { a : IDL . Nat , " _98_" : IDL . Nat } ) , IDL . Record ( { " _97_" : IDL . Nat , b : IDL . Nat } ) ) ;
1160- testSub ( IDL . Variant ( { a : IDL . Nat , " _98_" : IDL . Nat } ) , IDL . Variant ( { " _97_" : IDL . Nat , b : IDL . Nat } ) ) ;
1222+ testSub ( IDL . Record ( { a : IDL . Nat , _98_ : IDL . Nat } ) , IDL . Record ( { _97_ : IDL . Nat , b : IDL . Nat } ) ) ;
1223+ testSub ( IDL . Variant ( { a : IDL . Nat , _98_ : IDL . Nat } ) , IDL . Variant ( { _97_ : IDL . Nat , b : IDL . Nat } ) ) ;
11611224 } ) ;
11621225
11631226 describe ( 'decoding function/service references' , ( ) => {
0 commit comments