Filesystem.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <Tests/Framework/Framework.h>
  6. #include <AnKi/Util/Filesystem.h>
  7. #include <AnKi/Util/File.h>
  8. ANKI_TEST(Util, FileExists)
  9. {
  10. // Create file
  11. File file;
  12. ANKI_TEST_EXPECT_NO_ERR(file.open("./tmp", FileOpenFlag::kWrite));
  13. file.close();
  14. // Check
  15. ANKI_TEST_EXPECT_EQ(fileExists("./tmp"), true);
  16. }
  17. ANKI_TEST(Util, Directory)
  18. {
  19. // Destroy previous
  20. if(directoryExists("./dir"))
  21. {
  22. ANKI_TEST_EXPECT_NO_ERR(removeDirectory("./dir"));
  23. }
  24. // Create simple directory
  25. ANKI_TEST_EXPECT_NO_ERR(createDirectory("./dir"));
  26. File file;
  27. ANKI_TEST_EXPECT_NO_ERR(file.open("./dir/tmp", FileOpenFlag::kWrite));
  28. file.close();
  29. ANKI_TEST_EXPECT_EQ(fileExists("./dir/tmp"), true);
  30. ANKI_TEST_EXPECT_NO_ERR(removeDirectory("./dir"));
  31. ANKI_TEST_EXPECT_EQ(fileExists("./dir/tmp"), false);
  32. ANKI_TEST_EXPECT_EQ(directoryExists("./dir"), false);
  33. // A bit more complex
  34. ANKI_TEST_EXPECT_NO_ERR(createDirectory("./dir"));
  35. ANKI_TEST_EXPECT_NO_ERR(createDirectory("./dir/rid"));
  36. ANKI_TEST_EXPECT_NO_ERR(file.open("./dir/rid/tmp", FileOpenFlag::kWrite));
  37. file.close();
  38. ANKI_TEST_EXPECT_EQ(fileExists("./dir/rid/tmp"), true);
  39. ANKI_TEST_EXPECT_NO_ERR(removeDirectory("./dir"));
  40. ANKI_TEST_EXPECT_EQ(fileExists("./dir/rid/tmp"), false);
  41. ANKI_TEST_EXPECT_EQ(directoryExists("./dir/rid"), false);
  42. ANKI_TEST_EXPECT_EQ(directoryExists("./dir"), false);
  43. }
  44. ANKI_TEST(Util, HomeDir)
  45. {
  46. String out;
  47. ANKI_TEST_EXPECT_NO_ERR(getHomeDirectory(out));
  48. printf("home dir %s\n", &out[0]);
  49. ANKI_TEST_EXPECT_GT(out.getLength(), 0);
  50. }
  51. ANKI_TEST(Util, WalkDir)
  52. {
  53. class Path
  54. {
  55. public:
  56. CString m_path;
  57. Bool m_isDir;
  58. };
  59. class Ctx
  60. {
  61. public:
  62. Array<Path, 4> m_paths = {{{"./data", true}, {"./data/dir", true}, {"./data/file1", false}, {"./data/dir/file2", false}}};
  63. U32 m_foundMask = 0;
  64. } ctx;
  65. [[maybe_unused]] const Error err = removeDirectory("./data");
  66. // Create some dirs and some files
  67. for(U32 i = 0; i < ctx.m_paths.getSize(); ++i)
  68. {
  69. if(ctx.m_paths[i].m_isDir)
  70. {
  71. ANKI_TEST_EXPECT_NO_ERR(createDirectory(ctx.m_paths[i].m_path));
  72. }
  73. else
  74. {
  75. File file;
  76. ANKI_TEST_EXPECT_NO_ERR(file.open(ctx.m_paths[i].m_path, FileOpenFlag::kWrite));
  77. }
  78. }
  79. // Walk crnt dir
  80. ANKI_TEST_EXPECT_NO_ERR(walkDirectoryTree("./data", [&](WalkDirectoryArgs& args) -> Error {
  81. for(U32 i = 0; i < ctx.m_paths.getSize(); ++i)
  82. {
  83. String p;
  84. p.sprintf("./data/%s", args.m_path.cstr());
  85. if(ctx.m_paths[i].m_path == p)
  86. {
  87. ANKI_TEST_EXPECT_EQ(ctx.m_paths[i].m_isDir, args.m_isDirectory);
  88. ctx.m_foundMask |= 1 << i;
  89. }
  90. }
  91. return Error::kNone;
  92. }));
  93. ANKI_TEST_EXPECT_EQ(ctx.m_foundMask, 0b1110);
  94. // Test error
  95. U32 count = 0;
  96. ANKI_TEST_EXPECT_ERR(walkDirectoryTree("./data///dir////",
  97. [&count]([[maybe_unused]] WalkDirectoryArgs& args) -> Error {
  98. ++count;
  99. return Error::kFunctionFailed;
  100. }),
  101. Error::kFunctionFailed);
  102. ANKI_TEST_EXPECT_EQ(count, 1);
  103. }