@@ -26,6 +26,13 @@ func TestElementExtractor(t *testing.T) {
2626 D uint64
2727 }
2828
29+ type nilFields struct {
30+ A * int64
31+ B string
32+ C * testStruct
33+ D []testStruct
34+ }
35+
2936 type nestedTestStruct struct {
3037 A string
3138 B testStruct
@@ -131,6 +138,27 @@ func TestElementExtractor(t *testing.T) {
131138 assert .Equal (t , iInput .Interface (), newInput )
132139 })
133140
141+ t .Run ("TransformToOnChain and TransformToOffChain works on nil ptr by initialising empty values" , func (t * testing.T ) {
142+ inputType , err := extractor .RetypeToOffChain (reflect .TypeOf (nilFields {}), "" )
143+ require .NoError (t , err )
144+
145+ iInput := reflect .Indirect (reflect .New (inputType ))
146+ output , err := extractor .TransformToOnChain (iInput .Interface (), "" )
147+ require .NoError (t , err )
148+
149+ expected := nilFields {}
150+ assert .Equal (t , expected , output )
151+
152+ newInput , err := extractor .TransformToOffChain (expected , "" )
153+ require .NoError (t , err )
154+
155+ // Lossy modification
156+ iInput .FieldByName ("A" ).Set (reflect .ValueOf ([]* int64 {}))
157+ iInput .FieldByName ("C" ).Set (reflect .ValueOf ([]* testStruct {}))
158+ iInput .FieldByName ("D" ).Set (reflect .ValueOf ([][]testStruct {}))
159+ assert .Equal (t , iInput .Interface (), newInput )
160+ })
161+
134162 t .Run ("TransformToOnChain and TransformToOffChain returns error if input type was not from TransformToOnChain" , func (t * testing.T ) {
135163 _ , err := invalidExtractor .TransformToOnChain (testStruct {}, "" )
136164 assert .True (t , errors .Is (err , types .ErrInvalidType ))
0 commit comments