summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/paths.cc63
-rw-r--r--test/testenv.cc44
-rw-r--r--test/testenv.hh22
3 files changed, 129 insertions, 0 deletions
diff --git a/test/paths.cc b/test/paths.cc
new file mode 100644
index 0000000..b07e459
--- /dev/null
+++ b/test/paths.cc
@@ -0,0 +1,63 @@
+#include "paths.hh"
+
+#include "testenv.hh"
+
+#include <gtest/gtest.h>
+
+namespace {
+
+class PathsTest : public TestEnv {};
+
+} // namespace
+
+TEST_F(PathsTest, home) {
+ setenv("HOME", "foo-bar");
+ EXPECT_EQ("foo-bar", paths::home());
+ unsetenv("HOME");
+ EXPECT_NE("foo-bar", paths::home());
+ setenv("HOME", "");
+ EXPECT_NE("", paths::home());
+}
+
+TEST_F(PathsTest, config_dirs) {
+ setenv("XDG_CONFIG_HOME", "foo");
+ setenv("XDG_CONFIG_DIRS", "bar:fum::foo");
+ auto dirs = paths::config_dirs();
+ EXPECT_EQ(3, dirs.size());
+ if (dirs.size() >= 3) {
+ EXPECT_EQ("foo", dirs[0]);
+ EXPECT_EQ("bar", dirs[1]);
+ EXPECT_EQ("fum", dirs[2]);
+ }
+ setenv("HOME", "home");
+ unsetenv("XDG_CONFIG_HOME");
+ unsetenv("XDG_CONFIG_DIRS");
+ dirs = paths::config_dirs();
+ EXPECT_EQ(2, dirs.size());
+ if (dirs.size() >= 2) {
+ EXPECT_EQ("home/.config", dirs[0]);
+ EXPECT_EQ("/etc/xdg", dirs[1]);
+ }
+}
+
+TEST_F(PathsTest, data_dirs) {
+ setenv("XDG_DATA_HOME", "foo");
+ setenv("XDG_DATA_DIRS", "bar:fum::foo");
+ auto dirs = paths::data_dirs();
+ EXPECT_EQ(3, dirs.size());
+ if (dirs.size() >= 3) {
+ EXPECT_EQ("foo", dirs[0]);
+ EXPECT_EQ("bar", dirs[1]);
+ EXPECT_EQ("fum", dirs[2]);
+ }
+ setenv("HOME", "home");
+ unsetenv("XDG_DATA_HOME");
+ unsetenv("XDG_DATA_DIRS");
+ dirs = paths::data_dirs();
+ EXPECT_EQ(3, dirs.size());
+ if (dirs.size() >= 3) {
+ EXPECT_EQ("home/.local/share", dirs[0]);
+ EXPECT_EQ("/usr/local/share/", dirs[1]);
+ EXPECT_EQ("/usr/share/", dirs[2]);
+ }
+}
diff --git a/test/testenv.cc b/test/testenv.cc
new file mode 100644
index 0000000..56701a4
--- /dev/null
+++ b/test/testenv.cc
@@ -0,0 +1,44 @@
+#include "testenv.hh"
+
+#include <cstdlib>
+#include <optional>
+#include <string>
+
+void TestEnv::setenv(std::string const& name, std::string const& value) {
+ saveenv(name);
+
+ // NOLINTNEXTLINE(misc-include-cleaner)
+ ::setenv(name.c_str(), value.c_str(), 1);
+}
+
+void TestEnv::unsetenv(std::string const& name) {
+ saveenv(name);
+
+ // NOLINTNEXTLINE(misc-include-cleaner)
+ ::unsetenv(name.c_str());
+}
+
+void TestEnv::TearDown() {
+ for (auto const& pair : env_) {
+ if (pair.second.has_value()) {
+ // NOLINTNEXTLINE(misc-include-cleaner)
+ ::setenv(pair.first.c_str(), pair.second->c_str(), 1);
+ } else {
+ // NOLINTNEXTLINE(misc-include-cleaner)
+ ::unsetenv(pair.first.c_str());
+ }
+ }
+}
+
+void TestEnv::saveenv(std::string const& name) {
+ auto it = env_.find(name);
+ if (it != env_.end())
+ return;
+
+ auto* str = getenv(name.c_str());
+ if (str == nullptr) {
+ env_.emplace(name, std::nullopt);
+ } else {
+ env_.emplace(name, str);
+ }
+}
diff --git a/test/testenv.hh b/test/testenv.hh
new file mode 100644
index 0000000..abe0bc8
--- /dev/null
+++ b/test/testenv.hh
@@ -0,0 +1,22 @@
+#ifndef TESTENV_HH
+#define TESTENV_HH
+
+#include <gtest/gtest.h>
+#include <map>
+#include <optional>
+#include <string>
+
+class TestEnv : public testing::Test {
+ protected:
+ void setenv(std::string const& name, std::string const& value);
+ void unsetenv(std::string const& name);
+
+ void TearDown() override;
+
+ private:
+ void saveenv(std::string const& name);
+
+ std::map<std::string, std::optional<std::string>> env_;
+};
+
+#endif // TESTENV_HH