unit-VirtualFileSystem.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #define CATCH_CONFIG_ENABLE_BENCHMARKING
  2. #include <catch2/catch_all.hpp>
  3. #include <gul/VirtualFileSystem.h>
  4. void tree(gul::VFS const & fs, gul::VFS::vfs_path_type root = "/", std::string prefix="")
  5. {
  6. fs.for_each(root, [&](auto const & v)
  7. {
  8. std::cout << prefix << v << std::endl;
  9. if(fs.is_directory(root / v))
  10. {
  11. tree(fs, root/v, prefix + " ");
  12. }
  13. });
  14. }
  15. SCENARIO("SDF")
  16. {
  17. gul::VFS fs;
  18. fs.mount("/A", std::filesystem::path(CMAKE_SOURCE_DIR));
  19. fs.mkdir("/B");
  20. REQUIRE(fs.exists("/B"));
  21. REQUIRE(fs.exists("/A/test/CMakeLists.txt"));
  22. REQUIRE(fs.exists("/A"));
  23. }
  24. SCENARIO("Mount host folders in separate locations in root folder")
  25. {
  26. gul::VFS fs;
  27. fs.mount("/src", std::filesystem::path(CMAKE_SOURCE_DIR));
  28. fs.mount("/src2", std::filesystem::path(CMAKE_SOURCE_DIR));
  29. {
  30. auto [mount, stem] = fs.splitMount("/src/cmake/Coverage.cmake");
  31. REQUIRE(mount == "/src");
  32. REQUIRE(stem == "cmake/Coverage.cmake");
  33. }
  34. {
  35. auto [mount, stem] = fs.splitMount("/src2/cmake/Coverage.cmake");
  36. REQUIRE(mount == "/src2");
  37. REQUIRE(stem == "cmake/Coverage.cmake");
  38. }
  39. REQUIRE(fs.exists("/"));
  40. REQUIRE(fs.exists("/src"));
  41. REQUIRE(fs.exists("/src/test"));
  42. REQUIRE(fs.exists("/src/test/CMakeLists.txt")); // exists on filesystem
  43. REQUIRE(fs.exists("/src/cmake"));
  44. REQUIRE(fs.exists("/src/cmake/Coverage.cmake"));
  45. REQUIRE(fs.is_directory("/"));
  46. REQUIRE(fs.is_directory("/src"));
  47. REQUIRE(fs.is_directory("/src/test"));
  48. fs.mkdir("/build");
  49. fs.mkdir("/test");
  50. fs.mkdir("/test/hello/world");
  51. fs.unmount("/src2");
  52. REQUIRE(!fs.exists("/src2"));
  53. REQUIRE(!fs.is_directory("/src2"));
  54. REQUIRE(!fs.is_file("/src2"));
  55. }
  56. SCENARIO("Mount two host folders inside a virtual folder")
  57. {
  58. gul::VFS fs;
  59. fs.mkdir("/res");
  60. fs.mount("/res/src" , std::filesystem::path(CMAKE_SOURCE_DIR)/"cmake");
  61. fs.mount("/res/src2", std::filesystem::path(CMAKE_SOURCE_DIR)/"test");
  62. {
  63. auto [mount, stem] = fs.splitMount("/res/src/Coverage.cmake");
  64. REQUIRE(mount == "/res/src");
  65. REQUIRE(stem == "Coverage.cmake");
  66. }
  67. {
  68. auto [mount, stem] = fs.splitMount("/res/src2/CMakeLists.txt");
  69. REQUIRE(mount == "/res/src2");
  70. REQUIRE(stem == "CMakeLists.txt");
  71. }
  72. REQUIRE(fs.exists("/"));
  73. REQUIRE(fs.exists("/res/src"));
  74. REQUIRE(fs.exists("/res/src/Coverage.cmake"));
  75. REQUIRE(fs.exists("/res/src2/CMakeLists.txt")); // exists on filesystem
  76. REQUIRE(fs.is_directory("/"));
  77. REQUIRE(fs.is_directory("/res/src"));
  78. REQUIRE(fs.is_directory("/res/src2"));
  79. //REQUIRE(fs.is_directory("/res/src/test"));
  80. // tree(fs);
  81. }
  82. SCENARIO("Union mount two host folders")
  83. {
  84. gul::Mount M;
  85. gul::VFS fs;
  86. fs.mount("/res", {
  87. std::filesystem::path(CMAKE_SOURCE_DIR)/"cmake"
  88. ,std::filesystem::path(CMAKE_SOURCE_DIR)/"test"
  89. });
  90. REQUIRE(fs.exists("/res/CMakeLists.txt"));
  91. REQUIRE(fs.exists("/res/Coverage.cmake"));
  92. REQUIRE(fs.exists("/res/data/test.obj"));
  93. tree(fs);
  94. }
  95. #if 1
  96. SCENARIO("Mount a folder inside the structure of another mount")
  97. {
  98. gul::Mount M;
  99. gul::VFS fs;
  100. fs.mount("/test", {
  101. std::filesystem::path(CMAKE_SOURCE_DIR)/"test"
  102. });
  103. tree(fs);
  104. REQUIRE(fs.exists("/test/data/test.obj"));
  105. fs.mount("/test/data", {
  106. std::filesystem::path(CMAKE_SOURCE_DIR)/"cmake"
  107. });
  108. REQUIRE(fs.exists("/test/data/Coverage.cmake"));
  109. std::shared_ptr<std::ostream> d = std::shared_ptr<std::ostringstream>();
  110. tree(fs);
  111. }
  112. #endif