Skip to content

Commit 9694572

Browse files
authored
Merge pull request #358 from robkeim/truncate-file-mode
Add support for opening a file in Truncate mode
2 parents 55a82b0 + ca6619b commit 9694572

3 files changed

Lines changed: 60 additions & 3 deletions

File tree

System.IO.Abstractions.TestingHelpers.Tests/MockFileCreateTests.cs

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ namespace System.IO.Abstractions.TestingHelpers.Tests
1212

1313
public class MockFileCreateTests
1414
{
15-
1615
[Test]
1716
public void Mockfile_Create_ShouldCreateNewStream()
1817
{
@@ -165,5 +164,58 @@ public void MockFile_Create_ShouldThrowDirectoryNotFoundExceptionIfCreatingAndPa
165164
var exception = Assert.Throws<DirectoryNotFoundException>(action);
166165
Assert.That(exception.Message, Does.StartWith("Could not find a part of the path"));
167166
}
167+
168+
[Test]
169+
public void MockFile_Create_TruncateShouldWriteNewContents()
170+
{
171+
// Arrange
172+
const string testFileName = @"c:\someFile.txt";
173+
var fileSystem = new MockFileSystem();
174+
175+
using (var stream = fileSystem.FileStream.Create(testFileName, FileMode.Create, FileAccess.Write))
176+
{
177+
using (var writer = new StreamWriter(stream))
178+
{
179+
writer.Write("original_text");
180+
}
181+
}
182+
183+
// Act
184+
using (var stream = fileSystem.FileStream.Create(testFileName, FileMode.Truncate, FileAccess.Write))
185+
{
186+
using (var writer = new StreamWriter(stream))
187+
{
188+
writer.Write("new_text");
189+
}
190+
}
191+
192+
// Assert
193+
Assert.That(fileSystem.File.ReadAllText(testFileName), Is.EqualTo("new_text"));
194+
}
195+
196+
[Test]
197+
public void MockFile_Create_TruncateShouldClearFileContentsOnOpen()
198+
{
199+
// Arrange
200+
const string testFileName = @"c:\someFile.txt";
201+
var fileSystem = new MockFileSystem();
202+
203+
using (var stream = fileSystem.FileStream.Create(testFileName, FileMode.Create, FileAccess.Write))
204+
{
205+
using (var writer = new StreamWriter(stream))
206+
{
207+
writer.Write("original_text");
208+
}
209+
}
210+
211+
// Act
212+
using (var stream = fileSystem.FileStream.Create(testFileName, FileMode.Truncate, FileAccess.Write))
213+
{
214+
// Opening the stream is enough to reset the contents
215+
}
216+
217+
// Assert
218+
Assert.That(fileSystem.File.ReadAllText(testFileName), Is.EqualTo(string.Empty));
219+
}
168220
}
169221
}

System.IO.Abstractions.TestingHelpers/MockFileStream.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ public enum StreamType
1212
{
1313
READ,
1414
WRITE,
15-
APPEND
15+
APPEND,
16+
TRUNCATE
1617
}
1718

1819
public MockFileStream(IMockFileDataAccessor mockFileDataAccessor, string path, StreamType streamType)
@@ -24,7 +25,7 @@ public MockFileStream(IMockFileDataAccessor mockFileDataAccessor, string path, S
2425
{
2526
/* only way to make an expandable MemoryStream that starts with a particular content */
2627
var data = mockFileDataAccessor.GetFile(path).Contents;
27-
if (data != null && data.Length > 0)
28+
if (data != null && data.Length > 0 && streamType != StreamType.TRUNCATE)
2829
{
2930
Write(data, 0, data.Length);
3031
Seek(0, StreamType.APPEND.Equals(streamType)

System.IO.Abstractions.TestingHelpers/MockFileStreamFactory.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ private static MockFileStream.StreamType GetStreamType(FileMode mode, FileAccess
7474
{
7575
return MockFileStream.StreamType.APPEND;
7676
}
77+
else if (mode == FileMode.Truncate)
78+
{
79+
return MockFileStream.StreamType.TRUNCATE;
80+
}
7781
else
7882
{
7983
return MockFileStream.StreamType.WRITE;

0 commit comments

Comments
 (0)