1 // DirectoryInfoTest.cs - NUnit Test Cases for System.IO.DirectoryInfo class
4 // Ville Palo (vi64pa@koti.soon.fi)
5 // Sebastien Pouliot <sebastien@ximian.com>
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
11 using NUnit.Framework;
13 using System.Collections;
16 namespace MonoTests.System.IO
19 public class DirectoryInfoTest : Assertion
21 string TempFolder = Path.Combine (Path.GetTempPath (), "MonoTests.System.IO.Tests");
23 static readonly char DSC = Path.DirectorySeparatorChar;
27 protected void SetUp ()
29 current = Directory.GetCurrentDirectory ();
30 if (Directory.Exists (TempFolder))
31 Directory.Delete (TempFolder, true);
32 Directory.CreateDirectory (TempFolder);
36 protected void TearDown ()
38 if (Directory.Exists (TempFolder))
39 Directory.Delete (TempFolder, true);
40 Directory.SetCurrentDirectory (current);
46 string path = TempFolder + DSC + "DIT.Ctr.Test";
49 FileInfo info = new FileInfo (path);
50 AssertEquals ("test#01", true, info.DirectoryName.EndsWith (".Tests"));
51 AssertEquals ("test#02", false, info.Exists);
52 AssertEquals ("test#03", ".Test", info.Extension);
53 AssertEquals ("test#05", "DIT.Ctr.Test", info.Name);
57 [ExpectedException(typeof(ArgumentNullException))]
58 public void CtorArgumentNullException ()
60 DirectoryInfo info = new DirectoryInfo (null);
64 [ExpectedException(typeof(ArgumentException))]
65 public void CtorArgumentException1 ()
67 DirectoryInfo info = new DirectoryInfo ("");
71 [ExpectedException(typeof(ArgumentException))]
72 public void CtorArgumentException2 ()
74 DirectoryInfo info = new DirectoryInfo (" ");
78 [ExpectedException(typeof(ArgumentException))]
79 public void CtorArgumentException3 ()
82 foreach (char c in Path.InvalidPathChars) {
85 DirectoryInfo info = new DirectoryInfo (path);
91 string path = TempFolder + DSC + "DIT.Exists.Test";
95 DirectoryInfo info = new DirectoryInfo (path);
96 AssertEquals ("test#01", false, info.Exists);
98 Directory.CreateDirectory (path);
99 AssertEquals ("test#02", false, info.Exists);
100 info = new DirectoryInfo (path);
101 AssertEquals ("test#03", true, info.Exists);
110 string path = TempFolder + DSC + "DIT.Name.Test";
114 DirectoryInfo info = new DirectoryInfo (path);
115 AssertEquals ("test#01", "DIT.Name.Test", info.Name);
117 info = Directory.CreateDirectory (path);
118 AssertEquals ("test#02", "DIT.Name.Test", info.Name);
127 public void Parent ()
129 string path = TempFolder + DSC + "DIT.Parent.Test";
133 DirectoryInfo info = new DirectoryInfo (path);
134 AssertEquals ("test#01", "MonoTests.System.IO.Tests", info.Parent.Name);
136 info = Directory.CreateDirectory (path);
137 AssertEquals ("test#02", "MonoTests.System.IO.Tests", info.Parent.Name);
145 public void Create ()
147 string path = TempFolder + DSC + "DIT.Create.Test";
151 DirectoryInfo info = new DirectoryInfo (path);
152 AssertEquals ("test#01", false, info.Exists);
154 AssertEquals ("test#02", false, info.Exists);
155 info = new DirectoryInfo (path);
156 AssertEquals ("test#03", true, info.Exists);
163 public void CreateSubdirectory ()
165 string sub_path = Path.Combine ("test01", "test02");
167 DirectoryInfo info = new DirectoryInfo (TempFolder);
168 info.CreateSubdirectory (sub_path);
169 Assert ("test#01", Directory.Exists (Path.Combine (TempFolder, sub_path)));
171 DeleteDir (Path.Combine (TempFolder, sub_path));
177 [ExpectedException(typeof(ArgumentException))]
178 public void CreateSubdirectoryEmptyString ()
180 new DirectoryInfo (".").CreateSubdirectory ("");
184 public void Delete1 ()
186 string path = TempFolder + DSC + "DIT.Delete1.Test";
190 Directory.CreateDirectory (path);
191 DirectoryInfo info = new DirectoryInfo (path);
192 AssertEquals ("test#01", true, info.Exists);
195 AssertEquals ("test#02", true, info.Exists);
197 info = new DirectoryInfo (path);
198 AssertEquals ("test#03", false, info.Exists);
205 public void Delete2 ()
207 string path = TempFolder + DSC + "DIT.Delete2.Test";
211 Directory.CreateDirectory (path);
212 File.Create (path + DSC + "test").Close ();
213 DirectoryInfo info = new DirectoryInfo (path);
214 AssertEquals ("test#01", true, info.Exists);
217 AssertEquals ("test#02", true, info.Exists);
219 info = new DirectoryInfo (path);
220 AssertEquals ("test#03", false, info.Exists);
227 [ExpectedException (typeof (IOException))]
228 public void DeleteIOException1 ()
230 string path = TempFolder + DSC + "DIT.DeleteIOException1.Test";
234 Directory.CreateDirectory (path);
235 File.Create (path + DSC + "test").Close ();
236 DirectoryInfo info = new DirectoryInfo (path);
244 [ExpectedException (typeof (IOException))]
245 public void DeleteIOException2 ()
247 string path = TempFolder + DSC + "DIT.DeleteIOException2.Test";
251 Directory.CreateDirectory (path);
252 File.Create (path + DSC + "test").Close ();
253 DirectoryInfo info = new DirectoryInfo (path);
262 public void FullName ()
264 DirectoryInfo di = new DirectoryInfo ("something");
265 Assert ("Exists", !di.Exists);
266 Assert ("FullName", di.FullName.EndsWith ("something"));
268 di = new DirectoryInfo ("something" + Path.DirectorySeparatorChar);
269 AssertEquals ("DirectorySeparatorChar", Path.DirectorySeparatorChar, di.FullName [di.FullName.Length - 1]);
271 di = new DirectoryInfo ("something" + Path.AltDirectorySeparatorChar);
272 AssertEquals ("AltDirectorySeparatorChar", Path.DirectorySeparatorChar, di.FullName [di.FullName.Length - 1]);
276 public void FullName_RootDirectory ()
278 DirectoryInfo di = new DirectoryInfo (String.Empty + Path.DirectorySeparatorChar);
279 if (Path.DirectorySeparatorChar == '/') {
280 // can't be sure of the root drive under windows
281 AssertEquals ("FullName", "/", di.FullName);
283 AssertNull ("Parent", di.Parent);
285 di = new DirectoryInfo (String.Empty + Path.AltDirectorySeparatorChar);
286 if (Path.DirectorySeparatorChar == '/') {
287 // can't be sure of the root drive under windows
288 AssertEquals ("FullName-Alt", "/", di.FullName);
290 AssertNull ("Parent-Alt", di.Parent);
294 public void GetDirectories1 ()
296 string path = TempFolder + DSC + "DIT.GetDirectories1.Test";
299 DirectoryInfo info = Directory.CreateDirectory (path);
300 AssertEquals ("test#01", 0, info.GetDirectories ().Length);
302 Directory.CreateDirectory (path + DSC + "1");
303 Directory.CreateDirectory (path + DSC + "2");
304 File.Create (path + DSC + "filetest").Close ();
305 AssertEquals ("test#02", 2, info.GetDirectories ().Length);
307 Directory.Delete (path + DSC + 2);
308 AssertEquals ("test#02", 1, info.GetDirectories ().Length);
316 public void GetDirectories2 ()
318 string path = TempFolder + DSC + "DIT.GetDirectories2.Test";
321 DirectoryInfo info = Directory.CreateDirectory (path);
322 AssertEquals ("test#01", 0, info.GetDirectories ("*").Length);
324 Directory.CreateDirectory (path + DSC + "test120");
325 Directory.CreateDirectory (path + DSC + "test210");
326 Directory.CreateDirectory (path + DSC + "atest330");
327 Directory.CreateDirectory (path + DSC + "test220");
328 Directory.CreateDirectory (path + DSC + "rest");
329 Directory.CreateDirectory (path + DSC + "rest" + DSC + "subdir");
330 File.Create (path + DSC + "filetest").Close ();
332 AssertEquals ("test#02", 5, info.GetDirectories ("*").Length);
333 AssertEquals ("test#03", 3, info.GetDirectories ("test*").Length);
334 AssertEquals ("test#04", 2, info.GetDirectories ("test?20").Length);
335 AssertEquals ("test#05", 0, info.GetDirectories ("test?").Length);
336 AssertEquals ("test#06", 0, info.GetDirectories ("test[12]*").Length);
337 AssertEquals ("test#07", 2, info.GetDirectories ("test2*0").Length);
338 AssertEquals ("test#08", 4, info.GetDirectories ("*test*").Length);
340 AssertEquals ("test#09", 6, info.GetDirectories ("*", SearchOption.AllDirectories).Length);
349 [ExpectedException (typeof (DirectoryNotFoundException))]
350 public void GetDirectoriesDirectoryNotFoundException1 ()
352 string path = TempFolder + DSC + "DIT.GetDirectoriesDirectoryNotFoundException1.Test";
356 DirectoryInfo info = new DirectoryInfo (path);
357 info.GetDirectories ();
364 [ExpectedException (typeof (DirectoryNotFoundException))]
365 public void GetDirectoriesDirectoryNotFoundException2 ()
367 string path = TempFolder + DSC + "DIT.GetDirectoriesDirectoryNotFoundException2.Test";
371 DirectoryInfo info = new DirectoryInfo (path);
372 info.GetDirectories ("*");
379 [ExpectedException (typeof (ArgumentNullException))]
380 public void GetDirectoriesArgumentNullException ()
382 string path = TempFolder + DSC + "DIT.GetDirectoriesArgumentNullException.Test";
386 DirectoryInfo info = new DirectoryInfo (path);
387 info.GetDirectories (null);
394 public void GetFiles1 ()
396 string path = TempFolder + DSC + "DIT.GetFiles1.Test";
400 DirectoryInfo info = Directory.CreateDirectory (path);
401 AssertEquals ("test#01", 0, info.GetFiles ().Length);
402 File.Create (path + DSC + "file1").Close ();
403 File.Create (path + DSC + "file2").Close ();
404 Directory.CreateDirectory (path + DSC + "directory1");
405 AssertEquals ("test#02", 2, info.GetFiles ().Length);
413 public void GetFiles2()
415 string path = TempFolder + DSC + "DIT.GetFiles2.Test";
419 DirectoryInfo info = Directory.CreateDirectory (path);
420 AssertEquals ("test#01", 0, info.GetFiles ("*").Length);
421 File.Create (path + DSC + "file120file").Close ();
422 File.Create (path + DSC + "file220file").Close ();
423 File.Create (path + DSC + "afile330file").Close ();
424 File.Create (path + DSC + "test.abc").Close ();
425 File.Create (path + DSC + "test.abcd").Close ();
426 File.Create (path + DSC + "test.abcdef").Close ();
427 Directory.CreateDirectory (path + DSC + "dir");
429 AssertEquals ("test#02", 6, info.GetFiles ("*").Length);
430 AssertEquals ("test#03", 2, info.GetFiles ("file*file").Length);
431 AssertEquals ("test#04", 3, info.GetFiles ("*file*").Length);
432 AssertEquals ("test#05", 2, info.GetFiles ("file?20file").Length);
433 AssertEquals ("test#07", 1, info.GetFiles ("*.abcd").Length);
434 AssertEquals ("test#08", 2, info.GetFiles ("*.abcd*").Length);
441 [ExpectedException (typeof (DirectoryNotFoundException))]
442 public void GetFilesDirectoryNotFoundException1 ()
444 string path = TempFolder + DSC + "DIT.GetFilesDirectoryNotFoundException1.Test";
448 DirectoryInfo info = new DirectoryInfo (path);
457 [ExpectedException (typeof (DirectoryNotFoundException))]
458 public void GetFilesDirectoryNotFoundException2 ()
460 string path = TempFolder + DSC + "DIT.GetFilesDirectoryNotFoundException2.Test";
464 DirectoryInfo info = new DirectoryInfo (path);
473 [ExpectedException (typeof (ArgumentNullException))]
474 public void GetFilesArgumentNullException ()
476 string path = TempFolder + DSC + "DIT.GetFilesArgumentNullException.Test";
480 DirectoryInfo info = new DirectoryInfo (path);
481 info.GetFiles (null);
488 public void MoveTo ()
490 string path1 = TempFolder + DSC + "DIT.MoveTo.Soucre.Test";
491 string path2 = TempFolder + DSC + "DIT.MoveTo.Dest.Test";
496 DirectoryInfo info1 = Directory.CreateDirectory (path1);
497 DirectoryInfo info2 = new DirectoryInfo (path2);
499 AssertEquals ("test#01", true, info1.Exists);
500 AssertEquals ("test#02", false, info2.Exists);
502 info1.MoveTo (path2);
503 AssertEquals ("test#03", true, info1.Exists);
504 AssertEquals ("test#04", false, info2.Exists);
506 info1 = new DirectoryInfo (path1);
507 info2 = new DirectoryInfo (path2);
508 AssertEquals ("test#05", false, info1.Exists);
509 AssertEquals ("test#06", true, info2.Exists);
518 [ExpectedException (typeof (ArgumentNullException))]
519 public void MoveToArgumentNullException ()
521 string path = TempFolder + DSC + "DIT.MoveToArgumentNullException.Test";
525 DirectoryInfo info = Directory.CreateDirectory (path);
534 [ExpectedException (typeof (IOException))]
535 public void MoveToIOException1 ()
537 string path = TempFolder + DSC + "DIT.MoveToIOException1.Test";
541 DirectoryInfo info = Directory.CreateDirectory (path);
549 [ExpectedException (typeof (ArgumentException))]
550 public void MoveToArgumentException1 ()
552 string path = TempFolder + DSC + "DIT.MoveToArgumentException1.Test";
556 DirectoryInfo info = Directory.CreateDirectory (path);
564 [ExpectedException (typeof (ArgumentException))]
565 public void MoveToArgumentException2 ()
567 string path = TempFolder + DSC + "DIT.MoveToArgumentException2.Test";
571 DirectoryInfo info = Directory.CreateDirectory (path);
579 [ExpectedException (typeof (ArgumentException))]
580 public void MoveToArgumentException3 ()
582 string path = TempFolder + DSC + "DIT.MoveToArgumentException3.Test";
586 DirectoryInfo info = Directory.CreateDirectory (path);
587 info.MoveTo (Path.InvalidPathChars [0].ToString ());
594 [ExpectedException (typeof (IOException))]
595 public void MoveToIOException2 ()
597 string path = TempFolder + DSC + "DIT.MoveToIOException2.Test";
601 DirectoryInfo info = new DirectoryInfo (path);
608 private void DeleteDir (string path)
610 if (Directory.Exists (path))
611 Directory.Delete (path, true);
615 public void DirectoryNameWithSpace ()
617 // check for Unix platforms - see FAQ for more details
618 // http://www.mono-project.com/FAQ:_Technical#How_to_detect_the_execution_platform_.3F
619 int platform = (int) Environment.OSVersion.Platform;
620 if ((platform == 4) || (platform == 128)) {
621 DeleteDir ("this has a space at the end ");
622 string path = Path.Combine (TempFolder, "this has a space at the end ");
623 Directory.CreateDirectory (path);
624 DirectoryInfo i = new DirectoryInfo (path);
626 foreach (FileInfo f in i.GetFiles ()) // This used to throw
632 public void LastWriteTime ()
634 DirectoryInfo info = new DirectoryInfo (TempFolder);
635 info.LastWriteTime = new DateTime (2003, 6, 4, 6, 4, 0);
637 DateTime time = Directory.GetLastWriteTime (TempFolder);
638 AssertEquals ("test#01", 2003, time.Year);
639 AssertEquals ("test#02", 6, time.Month);
640 AssertEquals ("test#03", 4, time.Day);
641 AssertEquals ("test#04", 6, time.Hour);
642 AssertEquals ("test#05", 4, time.Minute);
643 AssertEquals ("test#06", 0, time.Second);
645 time = TimeZone.CurrentTimeZone.ToLocalTime (
646 Directory.GetLastWriteTimeUtc (TempFolder));
647 AssertEquals ("test#07", 2003, time.Year);
648 AssertEquals ("test#08", 6, time.Month);
649 AssertEquals ("test#09", 4, time.Day);
650 AssertEquals ("test#10", 6, time.Hour);
651 AssertEquals ("test#11", 4, time.Minute);
652 AssertEquals ("test#12", 0, time.Second);
656 public void LastWriteTimeUtc ()
658 DirectoryInfo info = new DirectoryInfo (TempFolder);
659 info.LastWriteTimeUtc = new DateTime (2003, 6, 4, 6, 4, 0);
661 DateTime time = TimeZone.CurrentTimeZone.ToUniversalTime (
662 Directory.GetLastWriteTime (TempFolder));
663 AssertEquals ("test#1", 2003, time.Year);
664 AssertEquals ("test#2", 6, time.Month);
665 AssertEquals ("test#3", 4, time.Day);
666 AssertEquals ("test#4", 6, time.Hour);
667 AssertEquals ("test#5", 4, time.Minute);
668 AssertEquals ("test#6", 0, time.Second);
670 time = Directory.GetLastWriteTimeUtc (TempFolder);
671 AssertEquals ("test#7", 2003, time.Year);
672 AssertEquals ("test#8", 6, time.Month);
673 AssertEquals ("test#9", 4, time.Day);
674 AssertEquals ("test#10", 6, time.Hour);
675 AssertEquals ("test#11", 4, time.Minute);
676 AssertEquals ("test#12", 0, time.Second);
680 [Category("TargetJvmNotSupported")] // LastAccessTime not supported for TARGET_JVM
681 public void LastAccessTime ()
683 DirectoryInfo info = new DirectoryInfo (TempFolder);
684 info.LastAccessTime = DateTime.Now;
688 [Category("TargetJvmNotSupported")] // LastAccessTime not supported for TARGET_JVM
689 public void LastAccessTimeUtc ()
691 DirectoryInfo info = new DirectoryInfo (TempFolder);
692 info.LastAccessTimeUtc = DateTime.Now;
696 [Category("TargetJvmNotSupported")] // CreationTime not supported for TARGET_JVM
697 public void CreationTime ()
699 DirectoryInfo info = new DirectoryInfo (TempFolder);
700 info.CreationTime = DateTime.Now;
704 [Category("TargetJvmNotSupported")] // CreationTime not supported for TARGET_JVM
705 public void CreationTimeUtc ()
707 DirectoryInfo info = new DirectoryInfo (TempFolder);
708 info.CreationTimeUtc = DateTime.Now;
712 private void CheckName (string name)
714 DirectoryInfo di = new DirectoryInfo (name);
715 AssertEquals (name + ".Name", "share", di.Name);
716 AssertEquals (name + ".Parent.Name", "usr", di.Parent.Name);
720 public void Name_Bug76903 ()
722 CheckName ("/usr/share");
723 CheckName ("/usr/share/");
724 CheckName ("/usr/share/.");
725 CheckName ("/usr/share/./");
726 CheckName ("/usr/share/blabla/../");
727 CheckName ("/usr/lib/../share/.");
731 public void Hang_76191 ()
733 // from bug #76191 (hangs on Windows)
734 DirectoryInfo di = new DirectoryInfo (Environment.CurrentDirectory);
735 Stack s = new Stack ();
737 while (di.Parent != null) {
741 while (s.Count > 0) {
742 di = (DirectoryInfo) s.Pop ();
743 Assert (di.Name, di.Exists);
747 private void WindowsParentFullName (string name, string expected)
749 DirectoryInfo di = new DirectoryInfo (name);
750 if (di.Parent == null)
751 AssertNull (name, expected);
753 AssertEquals (name, expected, di.Parent.FullName);
757 public void WindowsSystem32_76191 ()
760 // check for Unix platforms - see FAQ for more details
761 // http://www.mono-project.com/FAQ:_Technical#How_to_detect_the_execution_platform_.3F
762 int platform = (int) Environment.OSVersion.Platform;
763 if ((platform == 4) || (platform == 128))
767 Directory.SetCurrentDirectory (@"C:\WINDOWS\system32");
768 WindowsParentFullName ("C:", "C:\\WINDOWS");
769 WindowsParentFullName ("C:\\", null);
770 WindowsParentFullName ("C:\\dir", "C:\\");
771 WindowsParentFullName ("C:\\dir\\", "C:\\");
772 WindowsParentFullName ("C:\\dir\\dir", "C:\\dir");
773 WindowsParentFullName ("C:\\dir\\dir\\", "C:\\dir");
777 public void Parent_Bug77090 ()
779 DirectoryInfo di = new DirectoryInfo ("/home");
780 if (Path.DirectorySeparatorChar == '\\') {
781 Assert ("/home parent (Windows path)", di.Parent.Name.EndsWith (":\\"));
784 AssertEquals ("/home parent", "/", di.Parent.Name);
785 AssertNull ("/home parent parent", di.Parent.Parent);