summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/plugins/boost/FileLocator.cpp27
-rw-r--r--src/plugins/boost/FileLocator.hpp2
-rw-r--r--test/plugins/boost/FileLocatorTest.cpp85
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);
+}
}