Skip to content

Commit 55a82b0

Browse files
rkoeningerfgreinacher
authored andcommitted
Don't allow files and directories with the same name (#322)
* Replace both EnsurePathEnds... with .CleanPath extension * Used GetFile, SetEntry in MockFileSystem * Simplified CleanPath to remove trailing slashes, except on drive root * Fixed GetPathWithCorrectDirectoryCapitalization to consider paths don't end with slashes * Fixed issue in MockDirectory.GetFilesInternal where trailing slash was assumed * Fixed tests by removing expectation of trailing slashes * Used MockUnixSupport in StringExtensionsTests * Fixed (?) file move test (did this test make sense before?) * Fixed some tests expecting trailing slashes * MockFile.Exists no longer depends on matching path in AllDirectories MockFileSystem.FileExists trims trailing slashes before checking * Fixed more tests that expected trailing slashes * Fixed test that depended on being able to have a directory and file with the same name * Removed trailing slash from test * Made use of WindowsOnly in TrimSlashes_DriveRoot tests * Added test from #223 to confirm that issue is fixed * Added a couple of tests to confirm #208 is fixed * Made TrimSlashes() handle Unix slash root better Added UnixOnlyAttribute, UnixSpecifics to mirror WindowsOnlyAttribute/Specifics * Removed some Windows-specific code introduced into GetFilesInternal * Replaced MoveTo test with 1 with pre-existing target and 1 with pre-existing target dir * Added Copy/Move tests for MockFile * Added Assert, added Tests suffix to test class * Removed redundant tests Used WindowsOnly on existing tests * Removed expanded WindowsOnly reason message from 6 File Copy/Move tests * Moved new files to changed project path
1 parent def8603 commit 55a82b0

13 files changed

Lines changed: 249 additions & 83 deletions

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

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public void MockDirectory_GetFiles_ShouldFilterByExtensionBasedSearchPatternWith
9595
var fileSystem = SetupFileSystem();
9696
fileSystem.AddFile(additionalFilePath, new MockFileData(string.Empty));
9797
fileSystem.AddFile(XFS.Path(@"c:\a\a\c.gifx.xyz"), new MockFileData(string.Empty));
98-
fileSystem.AddFile(XFS.Path(@"c:\a\a\c.gifx\xyz"), new MockFileData(string.Empty));
98+
fileSystem.AddFile(XFS.Path(@"c:\a\a\c.gifz\xyz"), new MockFileData(string.Empty));
9999
var expected = new[]
100100
{
101101
XFS.Path(@"c:\a.gif"),
@@ -489,7 +489,7 @@ public void MockDirectory_CreateDirectory_ShouldCreateFolderInMemoryFileSystem()
489489

490490
// Assert
491491
Assert.IsTrue(fileSystem.FileExists(XFS.Path(@"c:\bar\")));
492-
Assert.IsTrue(fileSystem.AllDirectories.Any(d => d == XFS.Path(@"c:\bar\")));
492+
Assert.IsTrue(fileSystem.AllDirectories.Any(d => d == XFS.Path(@"c:\bar")));
493493
}
494494

495495
// Issue #210
@@ -625,7 +625,7 @@ public void MockDirectory_Delete_ShouldThrowDirectoryNotFoundException()
625625

626626
var ex = Assert.Throws<DirectoryNotFoundException>(() => fileSystem.Directory.Delete(XFS.Path(@"c:\baz")));
627627

628-
Assert.That(ex.Message, Is.EqualTo(XFS.Path("c:\\baz\\") + " does not exist or could not be found."));
628+
Assert.That(ex.Message, Is.EqualTo(XFS.Path("c:\\baz") + " does not exist or could not be found."));
629629
}
630630

631631
[Test]
@@ -640,7 +640,7 @@ public void MockDirectory_Delete_ShouldThrowIOException()
640640

641641
var ex = Assert.Throws<IOException>(() => fileSystem.Directory.Delete(XFS.Path(@"c:\bar")));
642642

643-
Assert.That(ex.Message, Is.EqualTo("The directory specified by " + XFS.Path("c:\\bar\\") + " is read-only, or recursive is false and " + XFS.Path("c:\\bar\\") + " is not an empty directory."));
643+
Assert.That(ex.Message, Is.EqualTo("The directory specified by " + XFS.Path("c:\\bar") + " is read-only, or recursive is false and " + XFS.Path("c:\\bar") + " is not an empty directory."));
644644
}
645645

646646
[Test]
@@ -665,7 +665,7 @@ public void MockDirectory_Delete_ShouldDeleteDirectoryRecursively()
665665
public void MockDirectory_GetFileSystemEntries_Returns_Files_And_Directories()
666666
{
667667
string testPath = XFS.Path(@"c:\foo\bar.txt");
668-
string testDir = XFS.Path(@"c:\foo\bar\");
668+
string testDir = XFS.Path(@"c:\foo\bar");
669669
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
670670
{
671671
{ testPath, new MockFileData("Demo text content") },
@@ -674,8 +674,8 @@ public void MockDirectory_GetFileSystemEntries_Returns_Files_And_Directories()
674674

675675
var entries = fileSystem.Directory.GetFileSystemEntries(XFS.Path(@"c:\foo")).OrderBy(k => k);
676676
Assert.AreEqual(2, entries.Count());
677-
Assert.AreEqual(testDir, entries.Last());
678-
Assert.AreEqual(testPath, entries.First());
677+
Assert.AreEqual(testDir, entries.First());
678+
Assert.AreEqual(testPath, entries.Last());
679679
}
680680

681681
[Test]
@@ -867,12 +867,12 @@ public void MockDirectory_GetDirectories_Returns_Child_Directories()
867867
var directories = fileSystem.Directory.GetDirectories(XFS.Path(@"A:\folder1")).ToArray();
868868

869869
//Check that it does not returns itself
870-
Assert.IsFalse(directories.Contains(XFS.Path(@"A:\folder1\")));
870+
Assert.IsFalse(directories.Contains(XFS.Path(@"A:\folder1")));
871871

872872
//Check that it correctly returns all child directories
873873
Assert.AreEqual(2, directories.Count());
874-
Assert.IsTrue(directories.Contains(XFS.Path(@"A:\folder1\folder2\")));
875-
Assert.IsTrue(directories.Contains(XFS.Path(@"A:\folder1\folder4\")));
874+
Assert.IsTrue(directories.Contains(XFS.Path(@"A:\folder1\folder2")));
875+
Assert.IsTrue(directories.Contains(XFS.Path(@"A:\folder1\folder4")));
876876
}
877877

878878
[Test]
@@ -890,7 +890,7 @@ public void MockDirectory_GetDirectories_WithTopDirectories_ShouldOnlyReturnTopD
890890
var actualResult = fileSystem.Directory.GetDirectories(XFS.Path(@"c:\Folder\"), "*.foo");
891891

892892
// Assert
893-
Assert.That(actualResult, Is.EquivalentTo(new []{XFS.Path(@"C:\Folder\.foo\"), XFS.Path(@"C:\Folder\foo.foo\")}));
893+
Assert.That(actualResult, Is.EquivalentTo(new []{XFS.Path(@"C:\Folder\.foo"), XFS.Path(@"C:\Folder\foo.foo")}));
894894
}
895895

896896
[Test]
@@ -937,7 +937,7 @@ public void MockDirectory_GetDirectories_RelativeDirectory_WithChildren_ShouldRe
937937

938938
// Assert
939939
CollectionAssert.AreEqual(
940-
new[] { XFS.Path(currentDirectory + @"\" + relativeDirPath + @"\child\") },
940+
new[] { XFS.Path(currentDirectory + @"\" + relativeDirPath + @"\child") },
941941
actualResult
942942
);
943943
}
@@ -972,7 +972,7 @@ public void MockDirectory_GetDirectories_WithAllDirectories_ShouldReturnsAllMatc
972972
var actualResult = fileSystem.Directory.GetDirectories(XFS.Path(@"c:\Folder\"), "*.foo", SearchOption.AllDirectories);
973973

974974
// Assert
975-
Assert.That(actualResult, Is.EquivalentTo(new[] { XFS.Path(@"C:\Folder\.foo\"), XFS.Path(@"C:\Folder\foo.foo\"), XFS.Path(@"C:\Folder\.foo\.foo\") }));
975+
Assert.That(actualResult, Is.EquivalentTo(new[] { XFS.Path(@"C:\Folder\.foo"), XFS.Path(@"C:\Folder\foo.foo"), XFS.Path(@"C:\Folder\.foo\.foo") }));
976976
}
977977

978978
[Test]
@@ -1011,12 +1011,12 @@ public void MockDirectory_EnumerateDirectories_Returns_Child_Directories()
10111011
var directories = fileSystem.Directory.EnumerateDirectories(XFS.Path(@"A:\folder1")).ToArray();
10121012

10131013
//Check that it does not returns itself
1014-
Assert.IsFalse(directories.Contains(XFS.Path(@"A:\folder1\")));
1014+
Assert.IsFalse(directories.Contains(XFS.Path(@"A:\folder1")));
10151015

10161016
//Check that it correctly returns all child directories
10171017
Assert.AreEqual(2, directories.Count());
1018-
Assert.IsTrue(directories.Contains(XFS.Path(@"A:\folder1\folder2\")));
1019-
Assert.IsTrue(directories.Contains(XFS.Path(@"A:\folder1\folder4\")));
1018+
Assert.IsTrue(directories.Contains(XFS.Path(@"A:\folder1\folder2")));
1019+
Assert.IsTrue(directories.Contains(XFS.Path(@"A:\folder1\folder4")));
10201020
}
10211021

10221022
[Test]
@@ -1034,7 +1034,7 @@ public void MockDirectory_EnumerateDirectories_WithTopDirectories_ShouldOnlyRetu
10341034
var actualResult = fileSystem.Directory.EnumerateDirectories(XFS.Path(@"c:\Folder\"), "*.foo");
10351035

10361036
// Assert
1037-
Assert.That(actualResult, Is.EquivalentTo(new[] { XFS.Path(@"C:\Folder\.foo\"), XFS.Path(@"C:\Folder\foo.foo\") }));
1037+
Assert.That(actualResult, Is.EquivalentTo(new[] { XFS.Path(@"C:\Folder\.foo"), XFS.Path(@"C:\Folder\foo.foo") }));
10381038
}
10391039

10401040
[Test]
@@ -1052,7 +1052,7 @@ public void MockDirectory_EnumerateDirectories_WithAllDirectories_ShouldReturnsA
10521052
var actualResult = fileSystem.Directory.EnumerateDirectories(XFS.Path(@"c:\Folder\"), "*.foo", SearchOption.AllDirectories);
10531053

10541054
// Assert
1055-
Assert.That(actualResult, Is.EquivalentTo(new[] { XFS.Path(@"C:\Folder\.foo\"), XFS.Path(@"C:\Folder\foo.foo\"), XFS.Path(@"C:\Folder\.foo\.foo\") }));
1055+
Assert.That(actualResult, Is.EquivalentTo(new[] { XFS.Path(@"C:\Folder\.foo"), XFS.Path(@"C:\Folder\foo.foo"), XFS.Path(@"C:\Folder\.foo\.foo") }));
10561056
}
10571057

10581058
[Test]
@@ -1473,7 +1473,7 @@ public void MockDirectory_EnumerateFileSystemEntries_ShouldReturnAllFilesBelowPa
14731473
XFS.Path(@"c:\a\a\a.txt"),
14741474
XFS.Path(@"c:\a\a\b.txt"),
14751475
XFS.Path(@"c:\a\a\c.gif"),
1476-
XFS.Path(@"c:\a\a\")
1476+
XFS.Path(@"c:\a\a")
14771477
};
14781478

14791479
// Act
@@ -1526,5 +1526,15 @@ public void MockDirectory_GetAccessControl_ShouldReturnNewDirectorySecurity()
15261526
// Assert
15271527
Assert.That(result, Is.Not.Null);
15281528
}
1529+
1530+
[Test]
1531+
public void MockDirectory_SetCreationTime_ShouldNotThrowWithoutTrailingBackslash()
1532+
{
1533+
var path = XFS.Path(@"C:\NoTrailingBackslash");
1534+
var fs = new MockFileSystem();
1535+
fs.Directory.CreateDirectory(path);
1536+
fs.Directory.SetCreationTime(path, DateTime.Now);
1537+
fs.Directory.Delete(path);
1538+
}
15291539
}
15301540
}

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

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -400,19 +400,45 @@ public void MockFileInfo_OpenText_ShouldReturnStringContentOfFile()
400400
}
401401

402402
[Test]
403-
public void MockFileInfo_MoveTo_ShouldUpdateFileInfoDirectoryAndFullName()
403+
public void MockFileInfo_MoveTo_NonExistentDestination_ShouldUpdateFileInfoDirectoryAndFullName()
404404
{
405405
var fileSystem = new MockFileSystem();
406-
fileSystem.AddFile(XFS.Path(@"c:\temp\file.txt"), new MockFileData(@"line 1\r\nline 2"));
407-
var fileInfo = fileSystem.FileInfo.FromFileName(XFS.Path(@"c:\temp\file.txt"));
408-
string destinationFolder = XFS.Path(@"c:\temp2");
409-
string destination = XFS.Path(destinationFolder + @"\file.txt");
410-
fileSystem.AddDirectory(destination);
406+
var sourcePath = XFS.Path(@"c:\temp\file.txt");
407+
var destinationFolder = XFS.Path(@"c:\temp2");
408+
var destinationPath = XFS.Path(destinationFolder + @"\file.txt");
409+
fileSystem.AddFile(sourcePath, new MockFileData("1"));
410+
var fileInfo = fileSystem.FileInfo.FromFileName(sourcePath);
411+
fileSystem.AddDirectory(destinationFolder);
411412

412-
fileInfo.MoveTo(destination);
413+
fileInfo.MoveTo(destinationPath);
413414

414415
Assert.AreEqual(fileInfo.DirectoryName, destinationFolder);
415-
Assert.AreEqual(fileInfo.FullName, destination);
416+
Assert.AreEqual(fileInfo.FullName, destinationPath);
417+
}
418+
419+
[Test]
420+
public void MockFileInfo_MoveTo_NonExistentDestinationFolder_ShouldThrowDirectoryNotFoundException()
421+
{
422+
var fileSystem = new MockFileSystem();
423+
var sourcePath = XFS.Path(@"c:\temp\file.txt");
424+
var destinationPath = XFS.Path(@"c:\temp2\file.txt");
425+
fileSystem.AddFile(sourcePath, new MockFileData("1"));
426+
var fileInfo = fileSystem.FileInfo.FromFileName(sourcePath);
427+
428+
Assert.Throws<DirectoryNotFoundException>(() => fileInfo.MoveTo(destinationPath));
429+
}
430+
431+
[Test]
432+
public void MockFileInfo_MoveTo_ExistingDestination_ShouldThrowExceptionAboutFileAlreadyExisting()
433+
{
434+
var fileSystem = new MockFileSystem();
435+
var sourcePath = XFS.Path(@"c:\temp\file.txt");
436+
var destinationPath = XFS.Path(@"c:\temp2\file.txt");
437+
fileSystem.AddFile(sourcePath, new MockFileData("1"));
438+
var fileInfo = fileSystem.FileInfo.FromFileName(sourcePath);
439+
fileSystem.AddFile(destinationPath, new MockFileData("2"));
440+
441+
Assert.Throws<IOException>(() => fileInfo.MoveTo(destinationPath));
416442
}
417443

418444
[Test]

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ public void MockFile_Move_ShouldThrowArgumentNullExceptionWhenSourceIsNull_Messa
7575
}
7676

7777
[Test]
78-
public void MockFile_Move_ShouldThrowArgumentNullExceptionWhenSourceIsNull_ParamName() {
78+
public void MockFile_Move_ShouldThrowArgumentNullExceptionWhenSourceIsNull_ParamName()
79+
{
7980
string destFilePath = XFS.Path(@"c:\something\demo.txt");
8081
var fileSystem = new MockFileSystem();
8182

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

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,8 @@ public void MockFileSystem_AddFile_ShouldMatchCapitalization_PerfectMatch()
138138

139139
Assert.Contains(XFS.Path(@"C:\test\file.txt"), fileSystem.AllFiles.ToList());
140140
Assert.Contains(XFS.Path(@"C:\LOUD\file.txt"), fileSystem.AllFiles.ToList());
141-
Assert.Contains(XFS.Path(@"C:\test\SUBDirectory\"), fileSystem.AllDirectories.ToList());
142-
Assert.Contains(XFS.Path(@"C:\LOUD\SUBDirectory\"), fileSystem.AllDirectories.ToList());
141+
Assert.Contains(XFS.Path(@"C:\test\SUBDirectory"), fileSystem.AllDirectories.ToList());
142+
Assert.Contains(XFS.Path(@"C:\LOUD\SUBDirectory"), fileSystem.AllDirectories.ToList());
143143
}
144144

145145
[Test]
@@ -156,8 +156,8 @@ public void MockFileSystem_AddFile_ShouldMatchCapitalization_PartialMatch()
156156

157157
Assert.Contains(XFS.Path(@"C:\test\subtest\file.txt"), fileSystem.AllFiles.ToList());
158158
Assert.Contains(XFS.Path(@"C:\LOUD\SUBLOUD\file.txt"), fileSystem.AllFiles.ToList());
159-
Assert.Contains(XFS.Path(@"C:\test\subtest\SUBDirectory\"), fileSystem.AllDirectories.ToList());
160-
Assert.Contains(XFS.Path(@"C:\LOUD\SUBLOUD\SUBDirectory\"), fileSystem.AllDirectories.ToList());
159+
Assert.Contains(XFS.Path(@"C:\test\subtest\SUBDirectory"), fileSystem.AllDirectories.ToList());
160+
Assert.Contains(XFS.Path(@"C:\LOUD\SUBLOUD\SUBDirectory"), fileSystem.AllDirectories.ToList());
161161
}
162162

163163
[Test]
@@ -174,8 +174,8 @@ public void MockFileSystem_AddFile_ShouldMatchCapitalization_PartialMatch_Furthe
174174

175175
Assert.Contains(XFS.Path(@"C:\test\subtest\new\file.txt"), fileSystem.AllFiles.ToList());
176176
Assert.Contains(XFS.Path(@"C:\LOUD\SUBLOUD\new\file.txt"), fileSystem.AllFiles.ToList());
177-
Assert.Contains(XFS.Path(@"C:\test\subtest\new\SUBDirectory\"), fileSystem.AllDirectories.ToList());
178-
Assert.Contains(XFS.Path(@"C:\LOUD\SUBLOUD\new\SUBDirectory\"), fileSystem.AllDirectories.ToList());
177+
Assert.Contains(XFS.Path(@"C:\test\subtest\new\SUBDirectory"), fileSystem.AllDirectories.ToList());
178+
Assert.Contains(XFS.Path(@"C:\LOUD\SUBLOUD\new\SUBDirectory"), fileSystem.AllDirectories.ToList());
179179
}
180180

181181
[Test]
@@ -243,13 +243,26 @@ public void MockFileSystem_AllNodes_ShouldReturnAllNodes()
243243
{
244244
XFS.Path(@"c:\something\demo.txt"),
245245
XFS.Path(@"c:\something\other.gif"),
246-
XFS.Path(@"d:\foobar\"),
246+
XFS.Path(@"d:\foobar"),
247247
XFS.Path(@"d:\foo\bar")
248248
};
249249

250250
var result = fileSystem.AllNodes;
251251

252252
Assert.AreEqual(expectedNodes, result);
253253
}
254+
255+
[Test]
256+
[TestCase(@"C:\path")]
257+
[TestCase(@"C:\path\")]
258+
public void MockFileSystem_AddDirectory_TrailingSlashAllowedButNotRequired(string path)
259+
{
260+
var fileSystem = new MockFileSystem();
261+
var path2 = XFS.Path(path);
262+
263+
fileSystem.AddDirectory(path2);
264+
265+
Assert.IsTrue(fileSystem.FileExists(path2));
266+
}
254267
}
255268
}

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

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
namespace System.IO.Abstractions.TestingHelpers.Tests
44
{
5+
using XFS = MockUnixSupport;
6+
57
[TestFixture]
6-
public class StringExtensions
8+
public class StringExtensionsTests
79
{
810
[Test]
911
public void SplitLines_InputWithOneLine_ShouldReturnOnlyOneLine()
@@ -56,5 +58,59 @@ public void SplitLines_InputWithTwoLinesSeparatedWithAllLineEndings_ShouldReturn
5658
Assert.That(result, Is.EquivalentTo(expected));
5759
}
5860

61+
[Test]
62+
[WindowsOnly(WindowsSpecifics.Drives)]
63+
public void TrimSlashes_DriveRoot_PreserveTrailingSlash()
64+
{
65+
Assert.AreEqual(@"c:\", @"c:\".TrimSlashes());
66+
}
67+
68+
[Test]
69+
[WindowsOnly(WindowsSpecifics.Drives)]
70+
public void TrimSlashes_DriveRoot_AppendsTrailingSlash()
71+
{
72+
Assert.AreEqual(@"c:\", @"c:".TrimSlashes());
73+
}
74+
75+
[Test]
76+
[WindowsOnly(WindowsSpecifics.Drives)]
77+
public void TrimSlashes_DriveRoot_TrimsExcessTrailingSlash()
78+
{
79+
Assert.AreEqual(@"c:\", @"c:\\".TrimSlashes());
80+
}
81+
82+
[Test]
83+
[WindowsOnly(WindowsSpecifics.Drives)]
84+
public void TrimSlashes_DriveRoot_NormalizeAlternateSlash()
85+
{
86+
Assert.AreEqual(@"c:\", @"c:/".TrimSlashes());
87+
}
88+
89+
[Test]
90+
[WindowsOnly(WindowsSpecifics.Drives)]
91+
public void TrimSlashes_RootedPath_TrimsAllTrailingSlashes()
92+
{
93+
Assert.AreEqual(@"c:\x", @"c:\x\".TrimSlashes());
94+
}
95+
96+
[Test]
97+
public void TrimSlashes_RootedPath_DontAlterPathWithoutTrailingSlashes()
98+
{
99+
Assert.AreEqual(XFS.Path(@"c:\x"), XFS.Path(@"c:\x").TrimSlashes());
100+
}
101+
102+
[Test]
103+
[UnixOnly(UnixSpecifics.SlashRoot)]
104+
public void TrimSlashes_SlashRoot_TrimsExcessTrailingSlash()
105+
{
106+
Assert.AreEqual("/", "//".TrimSlashes());
107+
}
108+
109+
[Test]
110+
[UnixOnly(UnixSpecifics.SlashRoot)]
111+
public void TrimSlashes_SlashRoot_PreserveSlashRoot()
112+
{
113+
Assert.AreEqual("/", "/".TrimSlashes());
114+
}
59115
}
60116
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using NUnit.Framework;
2+
using NUnit.Framework.Interfaces;
3+
4+
namespace System.IO.Abstractions.TestingHelpers.Tests
5+
{
6+
internal sealed class UnixOnlyAttribute : Attribute, ITestAction
7+
{
8+
private readonly string reason;
9+
10+
public UnixOnlyAttribute(string reason)
11+
{
12+
this.reason = reason;
13+
}
14+
15+
public ActionTargets Targets => ActionTargets.Test;
16+
17+
public void BeforeTest(ITest test)
18+
{
19+
if (!MockUnixSupport.IsUnixPlatform())
20+
{
21+
Assert.Inconclusive(reason);
22+
}
23+
}
24+
25+
public void AfterTest(ITest test) { }
26+
}
27+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace System.IO.Abstractions.TestingHelpers.Tests
2+
{
3+
internal static class UnixSpecifics
4+
{
5+
public const string SlashRoot = "Filesystem root is just '/' in Unix";
6+
}
7+
}

0 commit comments

Comments
 (0)