TestFileSystem.hx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. package test;
  2. import haxe.io.Bytes;
  3. import asys.FileSystem as NewFS;
  4. import asys.io.File as NewFile;
  5. import sys.FileSystem as OldFS;
  6. import sys.io.File as OldFile;
  7. using StringTools;
  8. class TestFileSystem extends Test {
  9. /**
  10. Tests `FileSystem.access`, `perm` from `FileSystem.stat`, and
  11. `FileSystem.chmod`.
  12. **/
  13. function testAccess():Void {
  14. // create a file
  15. OldFile.saveContent("resources-rw/access.txt", "");
  16. NewFS.chmod("resources-rw/access.txt", None);
  17. eq(NewFS.stat("resources-rw/access.txt").permissions, None);
  18. noExc(() -> NewFS.access("resources-rw/access.txt"));
  19. exc(() -> NewFS.access("resources-rw/access.txt", Read));
  20. NewFS.chmod("resources-rw/access.txt", "r-------x");
  21. eq(NewFS.stat("resources-rw/access.txt").permissions, "r-------x");
  22. noExc(() -> NewFS.access("resources-rw/access.txt", Read));
  23. exc(() -> NewFS.access("resources-rw/access.txt", Write));
  24. exc(() -> NewFS.access("resources-rw/access.txt", Execute));
  25. // cleanup
  26. NewFS.chmod("resources-rw/access.txt", "rw------x");
  27. OldFS.deleteFile("resources-rw/access.txt");
  28. }
  29. function testExists():Void {
  30. t(NewFS.exists("resources-ro/hello.txt"));
  31. t(NewFS.exists("resources-ro/binary.bin"));
  32. f(NewFS.exists("resources-ro/non-existent-file"));
  33. }
  34. function testMkdir():Void {
  35. // initially these directories don't exist
  36. f(OldFS.exists("resources-rw/mkdir"));
  37. f(OldFS.exists("resources-rw/mkdir/nested/dir"));
  38. // without `recursive`, this should not succeed
  39. exc(() -> NewFS.mkdir("resources-rw/mkdir/nested/dir"));
  40. // create a single directory
  41. NewFS.mkdir("resources-rw/mkdir");
  42. // create a directory recursively
  43. NewFS.mkdir("resources-rw/mkdir/nested/dir", true);
  44. t(OldFS.exists("resources-rw/mkdir"));
  45. t(OldFS.exists("resources-rw/mkdir/nested/dir"));
  46. f(OldFS.exists("resources-rw/mkdir/dir"));
  47. // raise if target already exists if not `recursive`
  48. exc(() -> NewFS.mkdir("resources-rw/mkdir/nested/dir"));
  49. // cleanup
  50. OldFS.deleteDirectory("resources-rw/mkdir/nested/dir");
  51. OldFS.deleteDirectory("resources-rw/mkdir/nested");
  52. OldFS.deleteDirectory("resources-rw/mkdir");
  53. }
  54. function testMkdtemp():Void {
  55. // empty `resources-rw` to begin with
  56. aeq(OldFS.readDirectory("resources-rw"), []);
  57. // create some temporary directories
  58. var dirs = [ for (i in 0...3) NewFS.mkdtemp("resources-rw/helloXXXXXX") ];
  59. for (f in OldFS.readDirectory("resources-rw")) {
  60. t(f.startsWith("hello"));
  61. t(OldFS.isDirectory('resources-rw/$f'));
  62. OldFS.deleteDirectory('resources-rw/$f');
  63. }
  64. // cleanup
  65. for (f in OldFS.readDirectory("resources-rw")) {
  66. OldFS.deleteDirectory('resources-rw/$f');
  67. }
  68. }
  69. function testReaddir():Void {
  70. aeq(NewFS.readdir("resources-rw"), []);
  71. aeq(NewFS.readdirTypes("resources-rw"), []);
  72. aeq(NewFS.readdir("resources-ro"), ["binary.bin", "hello.txt"]);
  73. var res = NewFS.readdirTypes("resources-ro");
  74. eq(res.length, 2);
  75. eq(res[0].name, "binary.bin");
  76. eq(res[0].isBlockDevice(), false);
  77. eq(res[0].isCharacterDevice(), false);
  78. eq(res[0].isDirectory(), false);
  79. eq(res[0].isFIFO(), false);
  80. eq(res[0].isFile(), true);
  81. eq(res[0].isSocket(), false);
  82. eq(res[0].isSymbolicLink(), false);
  83. // raises if target is not a directory or does not exist
  84. exc(() -> NewFS.readdir("resources-ro/hello.txt"));
  85. exc(() -> NewFS.readdir("resources-ro/non-existent-directory"));
  86. }
  87. function testRename():Void {
  88. // setup
  89. OldFile.saveContent("resources-rw/hello.txt", TestConstants.helloString);
  90. OldFile.saveContent("resources-rw/other.txt", "");
  91. OldFS.createDirectory("resources-rw/sub");
  92. OldFile.saveContent("resources-rw/sub/foo.txt", "");
  93. t(OldFS.exists("resources-rw/hello.txt"));
  94. f(OldFS.exists("resources-rw/world.txt"));
  95. // rename a file
  96. NewFS.rename("resources-rw/hello.txt", "resources-rw/world.txt");
  97. f(OldFS.exists("resources-rw/hello.txt"));
  98. t(OldFS.exists("resources-rw/world.txt"));
  99. eq(OldFile.getContent("resources-rw/world.txt"), TestConstants.helloString);
  100. // raises if the old path is non-existent
  101. exc(() -> NewFS.rename("resources-rw/non-existent", "resources-rw/foobar"));
  102. // raises if renaming file to directory
  103. exc(() -> NewFS.rename("resources-rw/world.txt", "resources-rw/sub"));
  104. // raises if renaming directory to file
  105. exc(() -> NewFS.rename("resources-rw/sub", "resources-rw/world.txt"));
  106. // rename a directory
  107. NewFS.rename("resources-rw/sub", "resources-rw/resub");
  108. f(OldFS.exists("resources-rw/sub"));
  109. t(OldFS.exists("resources-rw/resub"));
  110. aeq(OldFS.readDirectory("resources-rw/resub"), ["foo.txt"]);
  111. // renaming to existing file overrides it
  112. NewFS.rename("resources-rw/world.txt", "resources-rw/other.txt");
  113. f(OldFS.exists("resources-rw/world.txt"));
  114. t(OldFS.exists("resources-rw/other.txt"));
  115. eq(OldFile.getContent("resources-rw/other.txt"), TestConstants.helloString);
  116. // cleanup
  117. OldFS.deleteFile("resources-rw/other.txt");
  118. OldFS.deleteFile("resources-rw/resub/foo.txt");
  119. OldFS.deleteDirectory("resources-rw/resub");
  120. }
  121. function testStat():Void {
  122. var stat = NewFS.stat("resources-ro");
  123. t(stat.isDirectory());
  124. var stat = NewFS.stat("resources-ro/hello.txt");
  125. eq(stat.size, TestConstants.helloBytes.length);
  126. t(stat.isFile());
  127. var stat = NewFS.stat("resources-ro/binary.bin");
  128. eq(stat.size, TestConstants.binaryBytes.length);
  129. t(stat.isFile());
  130. var file = NewFS.open("resources-ro/binary.bin");
  131. var stat = file.stat();
  132. eq(stat.size, TestConstants.binaryBytes.length);
  133. t(stat.isFile());
  134. file.close();
  135. exc(() -> NewFS.stat("resources-ro/non-existent-file"));
  136. }
  137. /**
  138. Tests old filesystem APIs.
  139. `exists` is tested in `testExists`.
  140. **/
  141. /*
  142. function testCompat():Void {
  143. eq(NewFS.readFile("resources-ro/hello.txt").toString(), TestConstants.helloString);
  144. beq(NewFS.readFile("resources-ro/hello.txt"), TestConstants.helloBytes);
  145. beq(NewFS.readFile("resources-ro/binary.bin"), TestConstants.binaryBytes);
  146. t(NewFS.isDirectory("resources-ro"));
  147. f(NewFS.isDirectory("resources-ro/hello.txt"));
  148. aeq(NewFS.readDirectory("resources-ro"), ["binary.bin", "hello.txt"]);
  149. NewFS.createDirectory("resources-rw/foo");
  150. t(OldFS.exists("resources-rw/foo"));
  151. t(OldFS.isDirectory("resources-rw/foo"));
  152. NewFS.deleteDirectory("resources-rw/foo");
  153. f(OldFS.exists("resources-rw/foo"));
  154. }
  155. */
  156. }