/// <summary> /// Validate Node1 -> ByteArray1 -> Node2 -> ByteArray2 /// </summary> private T CheckSerializationRoundTrip <T>(T node) where T : Node { byte[] firstPass; T node2; using (var writerStream = new MemoryStream()) using (var writer = new BuildXLWriter(false, writerStream, true, false)) { // Serialize (Node1 -> ByteArray1) node.Serialize(writer); // Copy for validation firstPass = writerStream.ToArray(); } using (var readerStream = new MemoryStream(firstPass)) using (var reader = new BuildXLReader(true, readerStream, true)) { // Deserialize (ByteArray1 -> Node2) DeserializationContext context = new DeserializationContext(null, reader, m_pathTable, GetLineMap()); node2 = Node.Read <T>(context); } if (node.Kind == SyntaxKind.None) { Assert.Null(node2); return(null); } else { Assert.NotNull(node2); byte[] secondPass; using (var writerStream2 = new MemoryStream()) using (var writer2 = new BuildXLWriter(false, writerStream2, true, false)) { // Reserialize (Node2 -> ByteArray2) node2.Serialize(writer2); // Copy for validation secondPass = writerStream2.ToArray(); } // Compare byte arrays (ByteArray1 and ByteArray2) XAssert.AreArraysEqual(firstPass, secondPass, true); // Compare ASTs (Node1 and Node2) ConstructorTests.ValidateEqual(null, typeof(T), node, node2, string.Empty, null); return(node2); } }
private void TestFileModuleLiteralOrAbove(FileModuleLiteral node, Type type) { using (var ms = new MemoryStream()) { using (var writer = new BuildXLWriter(false, ms, true, false)) using (var reader = new BuildXLReader(true, ms, true)) { // Serialize node.Serialize(writer); // Copy for validation byte[] firstPass = ms.ToArray(); // Reset the stream pointer to the start for deserializing ms.Position = 0; // Deserialize DeserializationContext context = new DeserializationContext(null, reader, m_pathTable, node.LineMap); var node2 = FileModuleLiteral.Read(reader, context.PathTable, GlobalModuleLiteral, ModuleRegistry); Assert.NotNull(node2); // Reset the stream pointer to the start for serializing ms.Position = 0; // Reserialize node2.Serialize(writer); // Copy for validation byte[] secondPass = ms.ToArray(); // Compare byte arrays Assert.Equal(firstPass, secondPass); // Compare ASTs ConstructorTests.ValidateEqual(null, type, node, node2, nameof(type), null); } } }