Filesystem.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright (C) 2009-2021, 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::WRITE));
  13. file.close();
  14. // Check
  15. ANKI_TEST_EXPECT_EQ(fileExists("./tmp"), true);
  16. }
  17. ANKI_TEST(Util, Directory)
  18. {
  19. HeapAllocator<U8> alloc(allocAligned, nullptr);
  20. // Destroy previous
  21. if(directoryExists("./dir"))
  22. {
  23. ANKI_TEST_EXPECT_NO_ERR(removeDirectory("./dir", alloc));
  24. }
  25. // Create simple directory
  26. ANKI_TEST_EXPECT_NO_ERR(createDirectory("./dir"));
  27. File file;
  28. ANKI_TEST_EXPECT_NO_ERR(file.open("./dir/tmp", FileOpenFlag::WRITE));
  29. file.close();
  30. ANKI_TEST_EXPECT_EQ(fileExists("./dir/tmp"), true);
  31. ANKI_TEST_EXPECT_NO_ERR(removeDirectory("./dir", alloc));
  32. ANKI_TEST_EXPECT_EQ(fileExists("./dir/tmp"), false);
  33. ANKI_TEST_EXPECT_EQ(directoryExists("./dir"), false);
  34. // A bit more complex
  35. ANKI_TEST_EXPECT_NO_ERR(createDirectory("./dir"));
  36. ANKI_TEST_EXPECT_NO_ERR(createDirectory("./dir/rid"));
  37. ANKI_TEST_EXPECT_NO_ERR(file.open("./dir/rid/tmp", FileOpenFlag::WRITE));
  38. file.close();
  39. ANKI_TEST_EXPECT_EQ(fileExists("./dir/rid/tmp"), true);
  40. ANKI_TEST_EXPECT_NO_ERR(removeDirectory("./dir", alloc));
  41. return;
  42. ANKI_TEST_EXPECT_EQ(fileExists("./dir/rid/tmp"), false);
  43. ANKI_TEST_EXPECT_EQ(directoryExists("./dir/rid"), false);
  44. ANKI_TEST_EXPECT_EQ(directoryExists("./dir"), false);
  45. }
  46. ANKI_TEST(Util, HomeDir)
  47. {
  48. HeapAllocator<char> alloc(allocAligned, nullptr);
  49. StringAuto out(alloc);
  50. ANKI_TEST_EXPECT_NO_ERR(getHomeDirectory(out));
  51. printf("home dir %s\n", &out[0]);
  52. ANKI_TEST_EXPECT_GT(out.getLength(), 0);
  53. }
  54. ANKI_TEST(Util, WalkDir)
  55. {
  56. HeapAllocator<char> alloc(allocAligned, nullptr);
  57. class Path
  58. {
  59. public:
  60. CString m_path;
  61. Bool m_isDir;
  62. };
  63. class Ctx
  64. {
  65. public:
  66. Array<Path, 4> m_paths = {
  67. {{"./data", true}, {"./data/dir", true}, {"./data/file1", false}, {"./data/dir/file2", false}}};
  68. U32 m_foundMask = 0;
  69. HeapAllocator<char> m_alloc;
  70. } ctx;
  71. ctx.m_alloc = alloc;
  72. Error err = removeDirectory("./data", alloc);
  73. (void)err;
  74. // Create some dirs and some files
  75. for(U32 i = 0; i < ctx.m_paths.getSize(); ++i)
  76. {
  77. if(ctx.m_paths[i].m_isDir)
  78. {
  79. ANKI_TEST_EXPECT_NO_ERR(createDirectory(ctx.m_paths[i].m_path));
  80. }
  81. else
  82. {
  83. File file;
  84. ANKI_TEST_EXPECT_NO_ERR(file.open(ctx.m_paths[i].m_path, FileOpenFlag::WRITE));
  85. }
  86. }
  87. // Walk crnt dir
  88. ANKI_TEST_EXPECT_NO_ERR(walkDirectoryTree("./data", alloc, [&](const CString& fname, Bool isDir) -> Error {
  89. for(U32 i = 0; i < ctx.m_paths.getSize(); ++i)
  90. {
  91. StringAuto p(ctx.m_alloc);
  92. p.sprintf("./data/%s", fname.cstr());
  93. if(ctx.m_paths[i].m_path == p)
  94. {
  95. ANKI_TEST_EXPECT_EQ(ctx.m_paths[i].m_isDir, isDir);
  96. ctx.m_foundMask |= 1 << i;
  97. }
  98. }
  99. return Error::NONE;
  100. }));
  101. ANKI_TEST_EXPECT_EQ(ctx.m_foundMask, 0b1110);
  102. // Test error
  103. U32 count = 0;
  104. ANKI_TEST_EXPECT_ERR(walkDirectoryTree("./data///dir////", alloc,
  105. [&count](const CString& fname, Bool isDir) -> Error {
  106. ++count;
  107. return Error::FUNCTION_FAILED;
  108. }),
  109. Error::FUNCTION_FAILED);
  110. ANKI_TEST_EXPECT_EQ(count, 1);
  111. }