+ std::string path, result, removed;
+
+ /*
+ Test fs::IsDirDelimiter
+ */
+ UASSERT(fs::IsDirDelimiter('/') == true);
+ UASSERT(fs::IsDirDelimiter('A') == false);
+ UASSERT(fs::IsDirDelimiter(0) == false);
+ #ifdef _WIN32
+ UASSERT(fs::IsDirDelimiter('\\') == true);
+ #else
+ UASSERT(fs::IsDirDelimiter('\\') == false);
+ #endif
+
+ /*
+ Test fs::PathStartsWith
+ */
+ {
+ const int numpaths = 12;
+ std::string paths[numpaths] = {
+ "",
+ p("/"),
+ p("/home/user/minetest"),
+ p("/home/user/minetest/bin"),
+ p("/home/user/.minetest"),
+ p("/tmp/dir/file"),
+ p("/tmp/file/"),
+ p("/tmP/file"),
+ p("/tmp"),
+ p("/tmp/dir"),
+ p("/home/user2/minetest/worlds"),
+ p("/home/user2/minetest/world"),
+ };
+ /*
+ expected fs::PathStartsWith results
+ 0 = returns false
+ 1 = returns true
+ 2 = returns false on windows, false elsewhere
+ 3 = returns true on windows, true elsewhere
+ 4 = returns true if and only if
+ FILESYS_CASE_INSENSITIVE is true
+ */
+ int expected_results[numpaths][numpaths] = {
+ {1,2,0,0,0,0,0,0,0,0,0,0},
+ {1,1,0,0,0,0,0,0,0,0,0,0},
+ {1,1,1,0,0,0,0,0,0,0,0,0},
+ {1,1,1,1,0,0,0,0,0,0,0,0},
+ {1,1,0,0,1,0,0,0,0,0,0,0},
+ {1,1,0,0,0,1,0,0,1,1,0,0},
+ {1,1,0,0,0,0,1,4,1,0,0,0},
+ {1,1,0,0,0,0,4,1,4,0,0,0},
+ {1,1,0,0,0,0,0,0,1,0,0,0},
+ {1,1,0,0,0,0,0,0,1,1,0,0},
+ {1,1,0,0,0,0,0,0,0,0,1,0},
+ {1,1,0,0,0,0,0,0,0,0,0,1},
+ };
+
+ for (int i = 0; i < numpaths; i++)
+ for (int j = 0; j < numpaths; j++){
+ /*verbosestream<<"testing fs::PathStartsWith(\""
+ <<paths[i]<<"\", \""
+ <<paths[j]<<"\")"<<std::endl;*/
+ bool starts = fs::PathStartsWith(paths[i], paths[j]);
+ int expected = expected_results[i][j];
+ if(expected == 0){
+ UASSERT(starts == false);
+ }
+ else if(expected == 1){
+ UASSERT(starts == true);
+ }
+ #ifdef _WIN32
+ else if(expected == 2){
+ UASSERT(starts == false);
+ }
+ else if(expected == 3){
+ UASSERT(starts == true);
+ }
+ #else
+ else if(expected == 2){
+ UASSERT(starts == true);
+ }
+ else if(expected == 3){
+ UASSERT(starts == false);
+ }
+ #endif
+ else if(expected == 4){
+ UASSERT(starts == (bool)FILESYS_CASE_INSENSITIVE);
+ }
+ }
+ }
+
+ /*
+ Test fs::RemoveLastPathComponent
+ */
+ UASSERT(fs::RemoveLastPathComponent("") == "");
+ path = p("/home/user/minetest/bin/..//worlds/world1");
+ result = fs::RemoveLastPathComponent(path, &removed, 0);
+ UASSERT(result == path);
+ UASSERT(removed == "");
+ result = fs::RemoveLastPathComponent(path, &removed, 1);
+ UASSERT(result == p("/home/user/minetest/bin/..//worlds"));
+ UASSERT(removed == p("world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 2);
+ UASSERT(result == p("/home/user/minetest/bin/.."));
+ UASSERT(removed == p("worlds/world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 3);
+ UASSERT(result == p("/home/user/minetest/bin"));
+ UASSERT(removed == p("../worlds/world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 4);
+ UASSERT(result == p("/home/user/minetest"));
+ UASSERT(removed == p("bin/../worlds/world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 5);
+ UASSERT(result == p("/home/user"));
+ UASSERT(removed == p("minetest/bin/../worlds/world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 6);
+ UASSERT(result == p("/home"));
+ UASSERT(removed == p("user/minetest/bin/../worlds/world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 7);
+ #ifdef _WIN32
+ UASSERT(result == "C:");
+ #else
+ UASSERT(result == "");
+ #endif
+ UASSERT(removed == p("home/user/minetest/bin/../worlds/world1"));
+
+ /*
+ Now repeat the test with a trailing delimiter
+ */
+ path = p("/home/user/minetest/bin/..//worlds/world1/");
+ result = fs::RemoveLastPathComponent(path, &removed, 0);
+ UASSERT(result == path);
+ UASSERT(removed == "");
+ result = fs::RemoveLastPathComponent(path, &removed, 1);
+ UASSERT(result == p("/home/user/minetest/bin/..//worlds"));
+ UASSERT(removed == p("world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 2);
+ UASSERT(result == p("/home/user/minetest/bin/.."));
+ UASSERT(removed == p("worlds/world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 3);
+ UASSERT(result == p("/home/user/minetest/bin"));
+ UASSERT(removed == p("../worlds/world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 4);
+ UASSERT(result == p("/home/user/minetest"));
+ UASSERT(removed == p("bin/../worlds/world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 5);
+ UASSERT(result == p("/home/user"));
+ UASSERT(removed == p("minetest/bin/../worlds/world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 6);
+ UASSERT(result == p("/home"));
+ UASSERT(removed == p("user/minetest/bin/../worlds/world1"));
+ result = fs::RemoveLastPathComponent(path, &removed, 7);
+ #ifdef _WIN32
+ UASSERT(result == "C:");
+ #else
+ UASSERT(result == "");
+ #endif
+ UASSERT(removed == p("home/user/minetest/bin/../worlds/world1"));
+
+ /*
+ Test fs::RemoveRelativePathComponent
+ */
+ path = p("/home/user/minetest/bin");
+ result = fs::RemoveRelativePathComponents(path);
+ UASSERT(result == path);
+ path = p("/home/user/minetest/bin/../worlds/world1");
+ result = fs::RemoveRelativePathComponents(path);
+ UASSERT(result == p("/home/user/minetest/worlds/world1"));
+ path = p("/home/user/minetest/bin/../worlds/world1/");
+ result = fs::RemoveRelativePathComponents(path);
+ UASSERT(result == p("/home/user/minetest/worlds/world1"));
+ path = p(".");
+ result = fs::RemoveRelativePathComponents(path);
+ UASSERT(result == "");
+ path = p("./subdir/../..");
+ result = fs::RemoveRelativePathComponents(path);
+ UASSERT(result == "");
+ path = p("/a/b/c/.././../d/../e/f/g/../h/i/j/../../../..");
+ result = fs::RemoveRelativePathComponents(path);
+ UASSERT(result == p("/a/e"));
+ }
+};
+
+#define TEST_CONFIG_TEXT_BEFORE \
+ "leet = 1337\n" \
+ "leetleet = 13371337\n" \
+ "leetleet_neg = -13371337\n" \
+ "floaty_thing = 1.1\n" \
+ "stringy_thing = asd /( ¤%&(/\" BLÖÄRP\n" \
+ "coord = (1, 2, 4.5)\n" \
+ " # this is just a comment\n" \
+ "this is an invalid line\n" \
+ "asdf = {\n" \
+ " a = 5\n" \
+ " bb = 2.5\n" \
+ " ccc = \"\"\"\n" \
+ "testy\n" \
+ " testa \n" \
+ "\"\"\"\n" \
+ "\n" \
+ "}\n" \
+ "blarg = \"\"\" \n" \
+ "some multiline text\n" \
+ " with leading whitespace!\n" \
+ "\"\"\"\n" \
+ "np_terrain = 5, 40, (250, 250, 250), 12341, 5, 0.7, 2.4\n" \
+ "zoop = true"
+
+#define TEST_CONFIG_TEXT_AFTER \
+ "leet = 1337\n" \
+ "leetleet = 13371337\n" \
+ "leetleet_neg = -13371337\n" \
+ "floaty_thing = 1.1\n" \
+ "stringy_thing = asd /( ¤%&(/\" BLÖÄRP\n" \
+ "coord = (1, 2, 4.5)\n" \
+ " # this is just a comment\n" \
+ "this is an invalid line\n" \
+ "asdf = {\n" \
+ " a = 5\n" \
+ " bb = 2.5\n" \
+ " ccc = \"\"\"\n" \
+ "testy\n" \
+ " testa \n" \
+ "\"\"\"\n" \
+ "\n" \
+ "}\n" \
+ "blarg = \"\"\" \n" \
+ "some multiline text\n" \
+ " with leading whitespace!\n" \
+ "\"\"\"\n" \
+ "np_terrain = {\n" \
+ " flags = defaults\n" \
+ " lacunarity = 2.4\n" \
+ " octaves = 6\n" \
+ " offset = 3.5\n" \
+ " persistence = 0.7\n" \
+ " scale = 40\n" \
+ " seed = 12341\n" \
+ " spread = (250,250,250)\n" \
+ "}\n" \
+ "zoop = true\n" \
+ "coord2 = (1,2,3.3)\n" \
+ "floaty_thing_2 = 1.2\n" \
+ "groupy_thing = {\n" \
+ " animals = cute\n" \
+ " num_apples = 4\n" \
+ " num_oranges = 53\n" \
+ "}\n"
+
+struct TestSettings: public TestBase
+{
+ void Run()
+ {
+ try {