Skip to content

Commit 035d63e

Browse files
Copilotstephentoub
andcommitted
Add tests for trailing spaces/periods and embedded whitespace scenarios
Co-authored-by: stephentoub <2642209+stephentoub@users.noreply.github.com>
1 parent f722681 commit 035d63e

File tree

5 files changed

+211
-0
lines changed

5 files changed

+211
-0
lines changed

src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/File/Copy.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,50 @@ public void WindowsCopyWithProblematicNames(string sourceFileName, string destFi
496496
Assert.True(File.Exists(sourcePath));
497497
Assert.True(File.Exists(destPath));
498498
}
499+
500+
[ConditionalTheory(nameof(UsingNewNormalization))]
501+
[InlineData("trailing ", "destination")]
502+
[InlineData("source", "trailing ")]
503+
[InlineData("trailing.", "destination")]
504+
[InlineData("source", "trailing.")]
505+
[PlatformSpecific(TestPlatforms.Windows)]
506+
public void WindowsCopyWithTrailingSpacePeriod_ViaExtendedSyntax(string sourceFileName, string destFileName)
507+
{
508+
// Files with trailing spaces/periods require \\?\ syntax on Windows
509+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
510+
string sourcePath = Path.Combine(testDir.FullName, sourceFileName);
511+
string destPath = Path.Combine(testDir.FullName, destFileName);
512+
513+
// Create source with extended syntax if needed
514+
string sourceToCreate = sourceFileName.TrimEnd(' ', '.') != sourceFileName ? @"\\?\" + sourcePath : sourcePath;
515+
File.Create(sourceToCreate).Dispose();
516+
517+
// Copy with extended syntax if needed
518+
string sourceToCopy = sourceFileName.TrimEnd(' ', '.') != sourceFileName ? @"\\?\" + sourcePath : sourcePath;
519+
string destToCopy = destFileName.TrimEnd(' ', '.') != destFileName ? @"\\?\" + destPath : destPath;
520+
521+
Copy(sourceToCopy, destToCopy);
522+
523+
Assert.True(File.Exists(sourceToCopy));
524+
Assert.True(File.Exists(destToCopy));
525+
}
526+
527+
[Theory]
528+
[InlineData("name with spaces", "dest with spaces")]
529+
[InlineData("name.with.periods", "dest.with.periods")]
530+
[PlatformSpecific(TestPlatforms.Windows)]
531+
public void WindowsCopyEmbeddedSpacesPeriods(string sourceFileName, string destFileName)
532+
{
533+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
534+
string sourcePath = Path.Combine(testDir.FullName, sourceFileName);
535+
string destPath = Path.Combine(testDir.FullName, destFileName);
536+
537+
File.Create(sourcePath).Dispose();
538+
Copy(sourcePath, destPath);
539+
540+
Assert.True(File.Exists(sourcePath));
541+
Assert.True(File.Exists(destPath));
542+
}
499543
}
500544

501545
/// <summary>

src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/File/Create.cs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,63 @@ public void WindowsLeadingDot(string fileName)
431431
}
432432
}
433433

434+
[ConditionalTheory(nameof(UsingNewNormalization))]
435+
[InlineData("trailing ")]
436+
[InlineData("trailing ")]
437+
[InlineData("trailing.")]
438+
[InlineData("trailing..")]
439+
[InlineData("trailing .")]
440+
[InlineData("trailing. ")]
441+
[PlatformSpecific(TestPlatforms.Windows)]
442+
public void WindowsTrailingSpacePeriod_CreateViaExtendedSyntax(string fileName)
443+
{
444+
// Files with trailing spaces/periods require \\?\ syntax on Windows
445+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
446+
string filePath = Path.Combine(testDir.FullName, fileName);
447+
string extendedPath = @"\\?\" + filePath;
448+
449+
using (Create(extendedPath))
450+
{
451+
Assert.True(File.Exists(extendedPath));
452+
}
453+
454+
// Verify we can find it via enumeration
455+
string[] files = Directory.GetFiles(testDir.FullName);
456+
Assert.Contains(files, f => Path.GetFileName(f) == fileName);
457+
}
458+
459+
[Theory]
460+
[InlineData("name with spaces")]
461+
[InlineData("name with multiple spaces")]
462+
[InlineData("name.with.periods")]
463+
[InlineData("name with spaces.txt")]
464+
[PlatformSpecific(TestPlatforms.Windows)]
465+
public void WindowsEmbeddedSpacesPeriods(string fileName)
466+
{
467+
// Embedded spaces and periods should work fine
468+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
469+
string filePath = Path.Combine(testDir.FullName, fileName);
470+
using (Create(filePath))
471+
{
472+
Assert.True(File.Exists(filePath));
473+
}
474+
}
475+
476+
[Theory]
477+
[InlineData("name with spaces")]
478+
[InlineData("name.with.periods")]
479+
[InlineData("name\twith\ttabs")]
480+
[PlatformSpecific(TestPlatforms.AnyUnix)]
481+
public void UnixEmbeddedSpecialChars(string fileName)
482+
{
483+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
484+
string filePath = Path.Combine(testDir.FullName, fileName);
485+
using (Create(filePath))
486+
{
487+
Assert.True(File.Exists(filePath));
488+
}
489+
}
490+
434491
#endregion
435492
}
436493

src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/File/Delete.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,40 @@ public void WindowsDeleteProblematicNames(string fileName)
250250
Assert.False(File.Exists(filePath));
251251
}
252252

253+
[ConditionalTheory(nameof(UsingNewNormalization))]
254+
[InlineData("trailing ")]
255+
[InlineData("trailing ")]
256+
[InlineData("trailing.")]
257+
[InlineData("trailing..")]
258+
[PlatformSpecific(TestPlatforms.Windows)]
259+
public void WindowsDeleteTrailingSpacePeriod_ViaExtendedSyntax(string fileName)
260+
{
261+
// Files with trailing spaces/periods require \\?\ syntax on Windows
262+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
263+
string filePath = Path.Combine(testDir.FullName, fileName);
264+
string extendedPath = @"\\?\" + filePath;
265+
266+
File.Create(extendedPath).Dispose();
267+
Assert.True(File.Exists(extendedPath));
268+
269+
Delete(extendedPath);
270+
Assert.False(File.Exists(extendedPath));
271+
}
272+
273+
[Theory]
274+
[InlineData("name with spaces")]
275+
[InlineData("name.with.periods")]
276+
[PlatformSpecific(TestPlatforms.Windows)]
277+
public void WindowsDeleteEmbeddedSpacesPeriods(string fileName)
278+
{
279+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
280+
string filePath = Path.Combine(testDir.FullName, fileName);
281+
File.Create(filePath).Dispose();
282+
Assert.True(File.Exists(filePath));
283+
Delete(filePath);
284+
Assert.False(File.Exists(filePath));
285+
}
286+
253287
#endregion
254288
}
255289
}

src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/File/Exists.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,38 @@ public void WindowsExistsProblematicNames(string fileName)
273273
Assert.True(Exists(filePath));
274274
}
275275

276+
[ConditionalTheory(nameof(UsingNewNormalization))]
277+
[InlineData("trailing ")]
278+
[InlineData("trailing ")]
279+
[InlineData("trailing.")]
280+
[InlineData("trailing..")]
281+
[PlatformSpecific(TestPlatforms.Windows)]
282+
public void WindowsExistsTrailingSpacePeriod_ViaExtendedSyntax(string fileName)
283+
{
284+
// Files with trailing spaces/periods require \\?\ syntax on Windows
285+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
286+
string filePath = Path.Combine(testDir.FullName, fileName);
287+
string extendedPath = @"\\?\" + filePath;
288+
289+
File.Create(extendedPath).Dispose();
290+
Assert.True(Exists(extendedPath));
291+
292+
// Without extended syntax, the trailing space/period is trimmed
293+
Assert.False(Exists(filePath));
294+
}
295+
296+
[Theory]
297+
[InlineData("name with spaces")]
298+
[InlineData("name.with.periods")]
299+
[PlatformSpecific(TestPlatforms.Windows)]
300+
public void WindowsExistsEmbeddedSpacesPeriods(string fileName)
301+
{
302+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
303+
string filePath = Path.Combine(testDir.FullName, fileName);
304+
File.Create(filePath).Dispose();
305+
Assert.True(Exists(filePath));
306+
}
307+
276308
#endregion
277309
}
278310

src/libraries/System.Runtime/tests/System.IO.FileSystem.Tests/File/Move.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,5 +467,49 @@ public void WindowsMoveWithProblematicNames(string sourceFileName, string destFi
467467
Assert.False(File.Exists(srcPath));
468468
Assert.True(File.Exists(destPath));
469469
}
470+
471+
[ConditionalTheory(nameof(UsingNewNormalization))]
472+
[InlineData("trailing ", "destination")]
473+
[InlineData("source", "trailing ")]
474+
[InlineData("trailing.", "destination")]
475+
[InlineData("source", "trailing.")]
476+
[PlatformSpecific(TestPlatforms.Windows)]
477+
public void WindowsMoveWithTrailingSpacePeriod_ViaExtendedSyntax(string sourceFileName, string destFileName)
478+
{
479+
// Files with trailing spaces/periods require \\?\ syntax on Windows
480+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
481+
string srcPath = Path.Combine(testDir.FullName, sourceFileName);
482+
string destPath = Path.Combine(testDir.FullName, destFileName);
483+
484+
// Create source with extended syntax if needed
485+
string sourceToCreate = sourceFileName.TrimEnd(' ', '.') != sourceFileName ? @"\\?\" + srcPath : srcPath;
486+
File.Create(sourceToCreate).Dispose();
487+
488+
// Move with extended syntax if needed
489+
string sourceToMove = sourceFileName.TrimEnd(' ', '.') != sourceFileName ? @"\\?\" + srcPath : srcPath;
490+
string destToMove = destFileName.TrimEnd(' ', '.') != destFileName ? @"\\?\" + destPath : destPath;
491+
492+
Move(sourceToMove, destToMove);
493+
494+
Assert.False(File.Exists(sourceToMove));
495+
Assert.True(File.Exists(destToMove));
496+
}
497+
498+
[Theory]
499+
[InlineData("name with spaces", "dest with spaces")]
500+
[InlineData("name.with.periods", "dest.with.periods")]
501+
[PlatformSpecific(TestPlatforms.Windows)]
502+
public void WindowsMoveEmbeddedSpacesPeriods(string sourceFileName, string destFileName)
503+
{
504+
DirectoryInfo testDir = Directory.CreateDirectory(GetTestFilePath());
505+
string srcPath = Path.Combine(testDir.FullName, sourceFileName);
506+
string destPath = Path.Combine(testDir.FullName, destFileName);
507+
508+
File.Create(srcPath).Dispose();
509+
Move(srcPath, destPath);
510+
511+
Assert.False(File.Exists(srcPath));
512+
Assert.True(File.Exists(destPath));
513+
}
470514
}
471515
}

0 commit comments

Comments
 (0)