1515// See the License for the specific language governing permissions and
1616// limitations under the License.
1717using System ;
18+ using System . Collections ;
1819using System . Collections . Generic ;
1920using System . IO ;
2021using System . Linq ;
@@ -195,6 +196,70 @@ public void ShouldReadRecordMessageReturningPath()
195196 }
196197
197198
199+ //00 79 B1 71 92 B3 4E 02 91 86 50 65 72 73 6F 6E A1 84 6E 61 6D 65 81 63 92 A2 83 72 65 6C B5 52 03 02 05 84 4F 57 4E 53 A0 87 70 72 6F 64 75 63 74 B3 4E 05 91 87 50 72 6F 64 75 63 74 A1 84 6E 61 6D 65 84 69 70 6F 64 A2 83 72 65 6C B5 52 02 02 03 84 4F 57 4E 53 A0 87 70 72 6F 64 75 63 74 B3 4E 03 91 87 50 72 6F 64 75 63 74 A1 84 6E 61 6D 65 88 63 6F 6D 70 75 74 65 72
200+ //[RECORD [Neo4j.Driver.Internal.Node, [[{rel : Neo4j.Driver.Internal.Relationship}, {product : Neo4j.Driver.Internal.Node}], [{rel : Neo4j.Driver.Internal.Relationship}, {product : Neo4j.Driver.Internal.Node}]]]]
201+ [ Fact ]
202+ public void ShouldReadRecordMessageWithInnerStructs ( )
203+ {
204+ var fields = new object [ 0 ] ;
205+ var mockInput =
206+ IOExtensions . CreateMockStream (
207+ "00 79 B1 71 92 B3 4E 02 91 86 50 65 72 73 6F 6E A1 84 6E 61 6D 65 81 63 92 A2 83 72 65 6C B5 52 03 02 05 84 4F 57 4E 53 A0 87 70 72 6F 64 75 63 74 B3 4E 05 91 87 50 72 6F 64 75 63 74 A1 84 6E 61 6D 65 84 69 70 6F 64 A2 83 72 65 6C B5 52 02 02 03 84 4F 57 4E 53 A0 87 70 72 6F 64 75 63 74 B3 4E 03 91 87 50 72 6F 64 75 63 74 A1 84 6E 61 6D 65 88 63 6F 6D 70 75 74 65 72 00 00" ) ;
208+ var mockResponseHandler = new Mock < IMessageResponseHandler > ( ) ;
209+ mockResponseHandler . Setup ( x => x . HandleRecordMessage ( It . IsAny < object [ ] > ( ) ) )
210+ . Callback < object [ ] > ( x => fields = x ) ;
211+ var reader = new BoltReader ( mockInput . Object ) ;
212+
213+ reader . Read ( mockResponseHandler . Object ) ;
214+
215+ mockResponseHandler . Verify ( x => x . HandleRecordMessage ( It . IsAny < object [ ] > ( ) ) , Times . Once ) ;
216+
217+ fields . Should ( ) . NotBeNull ( ) ;
218+ fields . Should ( ) . HaveCount ( 2 ) ;
219+
220+ fields [ 0 ] . Should ( ) . BeAssignableTo < INode > ( ) ;
221+ fields [ 0 ] . ValueAs < INode > ( ) . Labels . Should ( ) . Contain ( "Person" ) ;
222+ fields [ 0 ] . ValueAs < INode > ( ) . Properties . Keys . Should ( ) . Contain ( "name" ) ;
223+ fields [ 0 ] . ValueAs < INode > ( ) . Properties . Values . Should ( ) . Contain ( "c" ) ;
224+
225+ fields [ 1 ] . Should ( ) . BeAssignableTo < IList > ( ) ;
226+
227+ var el0 = ( ( IList ) fields [ 1 ] ) [ 0 ] ;
228+ el0 . Should ( ) . BeAssignableTo < IDictionary < string , object > > ( ) ;
229+ el0 . ValueAs < IDictionary < string , object > > ( ) . Should ( ) . ContainKey ( "rel" ) ;
230+ var rel0 = el0 . ValueAs < IDictionary < string , object > > ( ) [ "rel" ] ;
231+ rel0 . Should ( ) . BeAssignableTo < IRelationship > ( ) ;
232+ rel0 . ValueAs < IRelationship > ( ) . Type . Should ( ) . Be ( "OWNS" ) ;
233+ rel0 . ValueAs < IRelationship > ( ) . StartNodeId . Should ( ) . Be ( 2L ) ;
234+ rel0 . ValueAs < IRelationship > ( ) . EndNodeId . Should ( ) . Be ( 5L ) ;
235+ rel0 . ValueAs < IRelationship > ( ) . Properties . Should ( ) . BeEmpty ( ) ;
236+
237+ el0 . ValueAs < IDictionary < string , object > > ( ) . Should ( ) . ContainKey ( "product" ) ;
238+ var prod0 = el0 . ValueAs < IDictionary < string , object > > ( ) [ "product" ] ;
239+ prod0 . Should ( ) . BeAssignableTo < INode > ( ) ;
240+ prod0 . ValueAs < INode > ( ) . Labels . Should ( ) . Contain ( "Product" ) ;
241+ prod0 . ValueAs < INode > ( ) . Properties . Keys . Should ( ) . Contain ( "name" ) ;
242+ prod0 . ValueAs < INode > ( ) . Properties . Values . Should ( ) . Contain ( "ipod" ) ;
243+
244+ var el1 = ( ( IList ) fields [ 1 ] ) [ 1 ] ;
245+ el1 . Should ( ) . BeAssignableTo < IDictionary < string , object > > ( ) ;
246+ el1 . ValueAs < IDictionary < string , object > > ( ) . Should ( ) . ContainKey ( "rel" ) ;
247+ var rel1 = el1 . ValueAs < IDictionary < string , object > > ( ) [ "rel" ] ;
248+ rel1 . Should ( ) . BeAssignableTo < IRelationship > ( ) ;
249+ rel1 . ValueAs < IRelationship > ( ) . Type . Should ( ) . Be ( "OWNS" ) ;
250+ rel1 . ValueAs < IRelationship > ( ) . StartNodeId . Should ( ) . Be ( 2L ) ;
251+ rel1 . ValueAs < IRelationship > ( ) . EndNodeId . Should ( ) . Be ( 3L ) ;
252+ rel1 . ValueAs < IRelationship > ( ) . Properties . Should ( ) . BeEmpty ( ) ;
253+
254+ el1 . ValueAs < IDictionary < string , object > > ( ) . Should ( ) . ContainKey ( "product" ) ;
255+ var prod1 = el1 . ValueAs < IDictionary < string , object > > ( ) [ "product" ] ;
256+ prod1 . Should ( ) . BeAssignableTo < INode > ( ) ;
257+ prod1 . ValueAs < INode > ( ) . Labels . Should ( ) . Contain ( "Product" ) ;
258+ prod1 . ValueAs < INode > ( ) . Properties . Keys . Should ( ) . Contain ( "name" ) ;
259+ prod1 . ValueAs < INode > ( ) . Properties . Values . Should ( ) . Contain ( "computer" ) ;
260+ }
261+
262+
198263 [ Fact ]
199264 public void ShouldReadRecordMessageReturningNumberNodeRelationShipPath ( )
200265 {
@@ -560,9 +625,9 @@ private static object ReadFromByteArrayChunked(byte[] bytes)
560625 [ Fact ]
561626 public void ShouldThrowExceptionWhenStructSignatureNotRecognized ( )
562627 {
563- var structure = new PackStreamStruct ( ( byte ) 'C' , Enumerable . Empty < object > ( ) ) ;
628+ var bytes = "00 07 B5 43 01 02 03 80 a0 00 00" . ToByteArray ( ) ;
564629
565- var ex = Record . Exception ( ( ) => BoltReader . UnpackStructure ( structure ) ) ;
630+ var ex = Record . Exception ( ( ) => ReadFromByteArrayChunked ( bytes ) ) ;
566631
567632 ex . Should ( ) . NotBeNull ( ) ;
568633 ex . Should ( ) . BeOfType < ProtocolException > ( ) ;
@@ -573,10 +638,7 @@ public void ShouldUnpackRelationshipCorrectly()
573638 {
574639 var bytes = "00 07 B5 52 01 02 03 80 a0 00 00" . ToByteArray ( ) ;
575640
576- var structure = ReadFromByteArrayChunked ( bytes ) as PackStreamStruct ;
577- structure . Should ( ) . NotBeNull ( ) ;
578-
579- var rel = BoltReader . UnpackStructure ( structure ) as IRelationship ;
641+ var rel = ReadFromByteArrayChunked ( bytes ) as IRelationship ;
580642 rel . Should ( ) . NotBeNull ( ) ;
581643
582644 rel . Id . Should ( ) . Be ( 1 ) ;
@@ -591,10 +653,7 @@ public void ShouldUnpackNodeCorrectly()
591653 {
592654 var bytes = "00 06 B3 4E 01 90 A0 00 00 00" . ToByteArray ( ) ;
593655
594- var structure = ReadFromByteArrayChunked ( bytes ) as PackStreamStruct ;
595- structure . Should ( ) . NotBeNull ( ) ;
596-
597- var n = BoltReader . UnpackStructure ( structure ) as INode ;
656+ var n = ReadFromByteArrayChunked ( bytes ) as INode ;
598657 n . Should ( ) . NotBeNull ( ) ;
599658
600659 n . Id . Should ( ) . Be ( 1 ) ;
@@ -607,10 +666,7 @@ public void ShouldUnpackPathCorrectly()
607666 {
608667 var bytes = "00 0A B3 50 91 B3 4E 01 90 A0 90 90 00 00" . ToByteArray ( ) ;
609668
610- var structure = ReadFromByteArrayChunked ( bytes ) as PackStreamStruct ;
611- structure . Should ( ) . NotBeNull ( ) ;
612-
613- var p = BoltReader . UnpackStructure ( structure ) as IPath ;
669+ var p = ReadFromByteArrayChunked ( bytes ) as IPath ;
614670 p . Should ( ) . NotBeNull ( ) ;
615671
616672 p . Start . Should ( ) . NotBeNull ( ) ;
@@ -630,10 +686,7 @@ public void ShouldUnpackZeroLenghPathCorrectly()
630686 "00 2C B3 50 91 B3 4E C9 03 E9 92 86 50 65 72 73 6F 6E 88 45 6D 70 6C 6F 79 65 65 A2 84 6E 61 6D 65 85 41 6C 69 63 65 83 61 67 65 21 90 90 00 00"
631687 . ToByteArray ( ) ;
632688
633- var structure = ReadFromByteArrayChunked ( bytes ) as PackStreamStruct ;
634- structure . Should ( ) . NotBeNull ( ) ;
635-
636- var p = BoltReader . UnpackStructure ( structure ) as IPath ;
689+ var p = ReadFromByteArrayChunked ( bytes ) as IPath ;
637690 p . Should ( ) . NotBeNull ( ) ;
638691
639692 p . Start . Should ( ) . NotBeNull ( ) ;
@@ -652,10 +705,7 @@ public void ShouldUnpackPathWithLenghOneCorrectly()
652705 "00 66 B3 50 92 B3 4E C9 03 E9 92 86 50 65 72 73 6F 6E 88 45 6D 70 6C 6F 79 65 65 A2 84 6E 61 6D 65 85 41 6C 69 63 65 83 61 67 65 21 B3 4E C9 03 EA 92 86 50 65 72 73 6F 6E 88 45 6D 70 6C 6F 79 65 65 A2 84 6E 61 6D 65 83 42 6F 62 83 61 67 65 2C 91 B3 72 0C 85 4B 4E 4F 57 53 A1 85 73 69 6E 63 65 C9 07 CF 92 01 01 00 00"
653706 . ToByteArray ( ) ;
654707
655- var structure = ReadFromByteArrayChunked ( bytes ) as PackStreamStruct ;
656- structure . Should ( ) . NotBeNull ( ) ;
657-
658- var p = BoltReader . UnpackStructure ( structure ) as IPath ;
708+ var p = ReadFromByteArrayChunked ( bytes ) as IPath ;
659709 p . Should ( ) . NotBeNull ( ) ;
660710
661711 p . Nodes . Should ( ) . HaveCount ( 2 ) ;
@@ -675,10 +725,7 @@ public void ShouldUnpackPathWithRelationshipTraversedAgainstItsDirectionCorrectl
675725 "00 b0 B35094B34EC903E99286506572736F6E88456D706C6F796565A2846E616D6585416C6963658361676521B34EC903EA9286506572736F6E88456D706C6F796565A2846E616D6583426F62836167652CB34EC903EB9186506572736F6EA1846E616D65854361726F6CB34EC903EC90A1846E616D65844461766593B3720C854B4E4F5753A18573696E6365C907CFB37220884449534C494B4553A0B372228A4D4152524945445F544FA0960101FE020303 00 00"
676726 . ToByteArray ( ) ;
677727
678- var structure = ReadFromByteArrayChunked ( bytes ) as PackStreamStruct ;
679- structure . Should ( ) . NotBeNull ( ) ;
680-
681- var p = BoltReader . UnpackStructure ( structure ) as IPath ;
728+ var p = ReadFromByteArrayChunked ( bytes ) as IPath ;
682729 p . Should ( ) . NotBeNull ( ) ;
683730
684731 p . Nodes . Should ( ) . HaveCount ( 4 ) ;
@@ -715,10 +762,7 @@ public void ShouldUnpackPathWithNodeVisitedMulTimesCorrectly()
715762 "00 9E B35093B34EC903E99286506572736F6E88456D706C6F796565A2846E616D6585416C6963658361676521B34EC903EA9286506572736F6E88456D706C6F796565A2846E616D6583426F62836167652CB34EC903EB9186506572736F6EA1846E616D65854361726F6C93B3720C854B4E4F5753A18573696E6365C907CFB3720D854C494B4553A0B37220884449534C494B4553A09A0101FF0002020301FD02 00 00"
716763 . ToByteArray ( ) ;
717764
718- var structure = ReadFromByteArrayChunked ( bytes ) as PackStreamStruct ;
719- structure . Should ( ) . NotBeNull ( ) ;
720-
721- var p = BoltReader . UnpackStructure ( structure ) as IPath ;
765+ var p = ReadFromByteArrayChunked ( bytes ) as IPath ;
722766 p . Should ( ) . NotBeNull ( ) ;
723767
724768 p . Nodes . Should ( ) . HaveCount ( 6 ) ;
@@ -759,10 +803,7 @@ public void ShouldUnpackPathWithRelTraversedMulTimesInSameDirectionCorrectly()
759803 "00 BE B35094B34EC903E99286506572736F6E88456D706C6F796565A2846E616D6585416C6963658361676521B34EC903EB9186506572736F6EA1846E616D65854361726F6CB34EC903EA9286506572736F6E88456D706C6F796565A2846E616D6583426F62836167652CB34EC903EC90A1846E616D65844461766594B3720D854C494B4553A0B37220884449534C494B4553A0B3720C854B4E4F5753A18573696E6365C907CFB372228A4D4152524945445F544FA09A01010202FD0001010403 00 00"
760804 . ToByteArray ( ) ;
761805
762- var structure = ReadFromByteArrayChunked ( bytes ) as PackStreamStruct ;
763- structure . Should ( ) . NotBeNull ( ) ;
764-
765- var p = BoltReader . UnpackStructure ( structure ) as IPath ;
806+ var p = ReadFromByteArrayChunked ( bytes ) as IPath ;
766807 p . Should ( ) . NotBeNull ( ) ;
767808
768809 p . Nodes . Should ( ) . HaveCount ( 6 ) ;
@@ -803,10 +844,7 @@ public void ShouldUnpackPathWithLoopCorrectly()
803844 "00 50 B35092B34EC903EB9186506572736F6EA1846E616D65854361726F6CB34EC903EC90A1846E616D65844461766592B372228A4D4152524945445F544FA0B3722C89574F524B535F464F52A09401010201 00 00"
804845 . ToByteArray ( ) ;
805846
806- var structure = ReadFromByteArrayChunked ( bytes ) as PackStreamStruct ;
807- structure . Should ( ) . NotBeNull ( ) ;
808-
809- var p = BoltReader . UnpackStructure ( structure ) as IPath ;
847+ var p = ReadFromByteArrayChunked ( bytes ) as IPath ;
810848 p . Should ( ) . NotBeNull ( ) ;
811849
812850 p . Nodes . Should ( ) . HaveCount ( 3 ) ;
0 commit comments