From c93e32ebb35b58d878fc03bb1ba3ce378277c027 Mon Sep 17 00:00:00 2001 From: Benito Palacios Sanchez Date: Tue, 28 Nov 2023 06:33:05 +0100 Subject: [PATCH] :bug: WriteTo truncates output file --- src/Yarhl.UnitTests/IO/DataStreamTests.cs | 43 ++++++++++++++++++----- src/Yarhl/IO/DataStream.cs | 2 +- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/Yarhl.UnitTests/IO/DataStreamTests.cs b/src/Yarhl.UnitTests/IO/DataStreamTests.cs index d619cb79..e93f214c 100644 --- a/src/Yarhl.UnitTests/IO/DataStreamTests.cs +++ b/src/Yarhl.UnitTests/IO/DataStreamTests.cs @@ -1368,17 +1368,44 @@ public void WriteToWhenLengthZeroCreatesEmptyFile() { string tempFile = Path.Combine( Path.GetTempPath(), - Path.GetRandomFileName(), Path.GetRandomFileName()); - DataStream stream = new DataStream(); - stream.WriteTo(tempFile); + try { + var stream = new DataStream(); + stream.WriteTo(tempFile); - Assert.That(File.Exists(tempFile), Is.True); - FileStream fs = new FileStream(tempFile, FileMode.Open, FileAccess.Read); - Assert.AreEqual(0, fs.Length); - fs.Dispose(); - File.Delete(tempFile); + Assert.That(File.Exists(tempFile), Is.True); + + using var fs = new FileStream(tempFile, FileMode.Open, FileAccess.Read); + Assert.That(fs.Length, Is.EqualTo(0)); + } finally { + File.Delete(tempFile); + } + } + + [Test] + public void WriteToWhenTruncatesExistingFile() + { + string tempFile = Path.Combine( + Path.GetTempPath(), + Path.GetRandomFileName()); + + byte[] expected = new byte[] { 0xCA, 0xFE }; + using var stream = new DataStream(); + stream.Write(expected); + + try { + // Pre-fill the output file with some long content + File.WriteAllText(tempFile, "hello world!"); + + // Overwrite with 2 bytes stream content + stream.WriteTo(tempFile); + + byte[] actual = File.ReadAllBytes(tempFile); + Assert.That(actual, Is.EquivalentTo(expected)); + } finally { + File.Delete(tempFile); + } } [Test] diff --git a/src/Yarhl/IO/DataStream.cs b/src/Yarhl/IO/DataStream.cs index 4ce701eb..b57dccd6 100644 --- a/src/Yarhl/IO/DataStream.cs +++ b/src/Yarhl/IO/DataStream.cs @@ -616,7 +616,7 @@ public void WriteSegmentTo(long start, long length, string fileOut) } // We use FileStream so it creates a file even when the length is zero - using var segment = new FileStream(fileOut, FileMode.OpenOrCreate, FileAccess.Write); + using var segment = new FileStream(fileOut, FileMode.Create, FileAccess.Write); WriteSegmentTo(start, length, segment); }