diff options
-rw-r--r-- | src/plugins/boost/FileLocator.cpp | 27 | ||||
-rw-r--r-- | src/plugins/boost/FileLocator.hpp | 2 | ||||
-rw-r--r-- | test/plugins/boost/FileLocatorTest.cpp | 85 |
3 files changed, 108 insertions, 6 deletions
diff --git a/src/plugins/boost/FileLocator.cpp b/src/plugins/boost/FileLocator.cpp index fdbe4d6..ed9d0c9 100644 --- a/src/plugins/boost/FileLocator.cpp +++ b/src/plugins/boost/FileLocator.cpp @@ -41,7 +41,29 @@ ResourceLocator::Location FileLocator::locate(const std::string &path, const std::string &relativeTo, const Type type) const { - // TODO: Implement Properly + boost::filesystem::path base(relativeTo); + // use the / operator to append the path. + base /= path; + // if we already found a fitting resource there, use that. + if (boost::filesystem::exists(base)) { + std::string location = + boost::filesystem::canonical(base).generic_string(); + return ResourceLocator::Location(true, *this, type, location); + } + // otherwise look in the search paths. + auto it = searchPaths.find(type); + if (it != searchPaths.end()) { + for (boost::filesystem::path p : it->second) { + p /= path; + if (boost::filesystem::exists(p)) { + std::string location = + boost::filesystem::canonical(p).generic_string(); + return ResourceLocator::Location(true, *this, type, location); + } + } + } + // if we find the resource in none of the search paths we return a location. + // with the found flag set to false. ResourceLocator::Location l(false, *this, type, ""); return l; } @@ -49,8 +71,7 @@ ResourceLocator::Location FileLocator::locate(const std::string &path, std::unique_ptr<std::istream> FileLocator::stream( const std::string &location) const { - std::unique_ptr<std::istream> ifs { - new std::ifstream(location)}; + std::unique_ptr<std::istream> ifs{new std::ifstream(location)}; return std::move(ifs); } } diff --git a/src/plugins/boost/FileLocator.hpp b/src/plugins/boost/FileLocator.hpp index 41826b8..9cb705c 100644 --- a/src/plugins/boost/FileLocator.hpp +++ b/src/plugins/boost/FileLocator.hpp @@ -25,7 +25,7 @@ #include <set> #include <vector> -#include <boost/filesystem/path.hpp> +#include <boost/filesystem.hpp> namespace ousia { diff --git a/test/plugins/boost/FileLocatorTest.cpp b/test/plugins/boost/FileLocatorTest.cpp index 7730492..2057a9f 100644 --- a/test/plugins/boost/FileLocatorTest.cpp +++ b/test/plugins/boost/FileLocatorTest.cpp @@ -55,11 +55,92 @@ TEST(FileLocator, testAddSearchPath) ASSERT_EQ(3, instance.getSearchPaths().size()); - auto it = - instance.getSearchPaths().find(ResourceLocator::Type::DOMAIN_DESC); + it = instance.getSearchPaths().find(ResourceLocator::Type::DOMAIN_DESC); ASSERT_EQ(2, it->second.size()); ASSERT_EQ(".", it->second[0].generic_string()); ASSERT_EQ("..", it->second[1].generic_string()); } + +void assert_located( + const FileLocator &instance, const std::string &path, + const std::string &relativeTo, + ResourceLocator::Type type = ResourceLocator::Type::DOMAIN_DESC) +{ + ResourceLocator::Location loc = instance.locate(path, relativeTo, type); + ASSERT_TRUE(loc.found); + boost::filesystem::path p(loc.location); + ASSERT_TRUE(boost::filesystem::exists(p)); + ASSERT_EQ(path, p.filename()); +} + +void assert_not_located( + const FileLocator &instance, const std::string &path, + const std::string &relativeTo, + ResourceLocator::Type type = ResourceLocator::Type::DOMAIN_DESC) +{ + ResourceLocator::Location loc = instance.locate(path, relativeTo, type); + ASSERT_FALSE(loc.found); +} + +TEST(FileLocator, testLocate) +{ + // Initialization + boost::filesystem::path start("."); + start = boost::filesystem::canonical(start); + std::string relativeTo; + + if (start.filename() == "build") { + relativeTo = ".."; + start = start.parent_path(); + } else if (start.filename() == "application") { + relativeTo = "."; + } else { + ASSERT_TRUE(false); + } + FileLocator instance; + + // We should be able to find the CMakeLists file in the main directory. + assert_located(instance, "CMakeLists.txt", relativeTo); + // But not the FileLocator.hpp + assert_not_located(instance, "FileLocator.hpp", relativeTo); + + // Add the respective search path. + instance.addSearchPath(start / "src/plugins/boost", + {ResourceLocator::Type::DOMAIN_DESC}); + // Now we should be able to find both. + assert_located(instance, "CMakeLists.txt", relativeTo); + assert_located(instance, "FileLocator.hpp", relativeTo); + // but only with the correct type. + assert_not_located(instance, "FileLocator.hpp", relativeTo, + ResourceLocator::Type::SCRIPT); +} + +TEST(FileLocator, testStream) +{ + // Initialization + boost::filesystem::path start("."); + start = boost::filesystem::canonical(start); + std::string relativeTo; + + if (start.filename() == "build") { + relativeTo = ".."; + start = start.parent_path(); + } else if (start.filename() == "application") { + relativeTo = "."; + } else { + ASSERT_TRUE(false); + } + FileLocator instance; + // Locate the CMakeLists.txt + ResourceLocator::Location loc = instance.locate( + "CMakeLists.txt", relativeTo, ResourceLocator::Type::DOMAIN_DESC); + // Stream the content. + auto is_ptr = loc.stream(); + // get the beginning. + char buf[256]; + is_ptr->getline(buf, 256); + std::string first_line(buf); + ASSERT_EQ("# Ousía", first_line); +} } |