#include "../kit/file.h" #include "../kit/string_ref.h" #define KIT_TEST_FILE file #include "../kit/kit_test.h" TEST("path cache") { str_builder_t user = path_user(NULL); str_builder_t cache = path_cache(NULL); DA_RESIZE(cache, cache.size + 1); cache.values[cache.size - 1] = '\0'; DA_RESIZE(cache, cache.size - 1); str_builder_t expected = #if defined(_WIN32) && !defined(__CYGWIN__) path_join(WRAP_STR(user), SZ("AppData" PATH_DELIM "Local"), NULL); #elif defined(__APPLE__) path_join(WRAP_STR(user), SZ("Library" PATH_DELIM "Caches"), NULL); #else path_join(WRAP_STR(user), SZ(".cache"), NULL); #endif REQUIRE(AR_EQUAL(cache, expected)); DA_DESTROY(user); DA_DESTROY(cache); DA_DESTROY(expected); } TEST("path normalize one") { str_t foo = SZ("foo/bar/../baz"); str_t foo_norm = SZ("foo" PATH_DELIM "baz"); str_builder_t bar = path_norm(foo, NULL); REQUIRE(AR_EQUAL(foo_norm, bar)); DA_DESTROY(bar); } TEST("path normalize two") { str_t foo = SZ("foo/bar/../../baz"); str_t foo_norm = SZ("baz"); str_builder_t bar = path_norm(foo, NULL); REQUIRE(AR_EQUAL(foo_norm, bar)); DA_DESTROY(bar); } TEST("path normalize parent") { str_t foo = SZ("../baz"); str_t foo_norm = SZ(".." PATH_DELIM "baz"); str_builder_t bar = path_norm(foo, NULL); REQUIRE(AR_EQUAL(foo_norm, bar)); DA_DESTROY(bar); } TEST("path normalize double parent") { str_t foo = SZ("foo/../../baz"); str_t foo_norm = SZ(".." PATH_DELIM "baz"); str_builder_t bar = path_norm(foo, NULL); REQUIRE(AR_EQUAL(foo_norm, bar)); DA_DESTROY(bar); } TEST("path normalize windows delim") { str_t foo = SZ("foo\\bar\\..\\baz"); str_t foo_norm = SZ("foo" PATH_DELIM "baz"); str_builder_t bar = path_norm(foo, NULL); REQUIRE(AR_EQUAL(foo_norm, bar)); DA_DESTROY(bar); } TEST("path join no delim") { str_t foo = SZ("foo"); str_t bar = SZ("bar"); str_t joined = SZ("foo" PATH_DELIM "bar"); str_builder_t foobar = path_join(foo, bar, NULL); REQUIRE(AR_EQUAL(joined, foobar)); DA_DESTROY(foobar); } TEST("path join delim left") { str_t foo = SZ("foo/"); str_t bar = SZ("bar"); str_t joined = SZ("foo" PATH_DELIM "bar"); str_builder_t foobar = path_join(foo, bar, NULL); REQUIRE(AR_EQUAL(joined, foobar)); DA_DESTROY(foobar); } TEST("join delim right") { str_t foo = SZ("foo"); str_t bar = SZ("/bar"); str_t joined = SZ("foo" PATH_DELIM "bar"); str_builder_t foobar = path_join(foo, bar, NULL); REQUIRE(AR_EQUAL(joined, foobar)); DA_DESTROY(foobar); } TEST("path join delim both") { str_t foo = SZ("foo/"); str_t bar = SZ("/bar"); str_t joined = SZ("foo" PATH_DELIM "bar"); str_builder_t foobar = path_join(foo, bar, NULL); REQUIRE(AR_EQUAL(joined, foobar)); DA_DESTROY(foobar); } TEST("path user") { str_builder_t user = path_user(NULL); REQUIRE(user.size > 0); DA_DESTROY(user); } TEST("path index relative") { str_t foobar = SZ("foo/bar"); str_t foo = SZ("foo"); str_t bar = SZ("bar"); REQUIRE(AR_EQUAL(path_index(foobar, 0), foo)); REQUIRE(AR_EQUAL(path_index(foobar, 1), bar)); REQUIRE(path_index(foobar, 2).size == 0); } TEST("path index absolute") { str_t foobar = SZ("/foo/bar"); str_t foo = SZ("foo"); str_t bar = SZ("bar"); REQUIRE(AR_EQUAL(path_index(foobar, 0), foo)); REQUIRE(AR_EQUAL(path_index(foobar, 1), bar)); REQUIRE(path_index(foobar, 2).size == 0); } TEST("path index windows disk name") { str_t foobar = SZ("c:\\foo\\bar"); str_t disk = SZ("c:"); str_t foo = SZ("foo"); str_t bar = SZ("bar"); REQUIRE(AR_EQUAL(path_index(foobar, 0), disk)); REQUIRE(AR_EQUAL(path_index(foobar, 1), foo)); REQUIRE(AR_EQUAL(path_index(foobar, 2), bar)); REQUIRE(path_index(foobar, 3).size == 0); } TEST("path take relative") { str_t foobar = SZ("foo/bar/"); str_t foo = SZ("foo"); str_t bar = SZ("foo/bar"); str_t bar_end = SZ("foo/bar/"); REQUIRE(AR_EQUAL(path_take(foobar, 0), foo)); REQUIRE(AR_EQUAL(path_take(foobar, 1), bar)); REQUIRE(AR_EQUAL(path_take(foobar, 2), bar_end)); } TEST("path take absolute") { str_t foobar = SZ("/foo/bar"); str_t foo = SZ("/foo"); str_t bar = SZ("/foo/bar"); REQUIRE(AR_EQUAL(path_take(foobar, 0), foo)); REQUIRE(AR_EQUAL(path_take(foobar, 1), bar)); } TEST("path take windows disk name") { str_t foobar = SZ("c:\\foo\\bar"); str_t disk = SZ("c:"); str_t foo = SZ("c:\\foo"); str_t bar = SZ("c:\\foo\\bar"); REQUIRE(AR_EQUAL(path_take(foobar, 0), disk)); REQUIRE(AR_EQUAL(path_take(foobar, 1), foo)); REQUIRE(AR_EQUAL(path_take(foobar, 2), bar)); } TEST("create folder") { str_t folder_name = SZ("test_folder"); REQUIRE_EQ(folder_create(folder_name), KIT_OK); REQUIRE_EQ(path_type(folder_name), PATH_FOLDER); REQUIRE_EQ(folder_remove(folder_name), KIT_OK); REQUIRE_EQ(path_type(folder_name), PATH_NONE); } TEST("create folder recursive") { REQUIRE_EQ(folder_create_recursive( SZ("test_folder" PATH_DELIM "foo" PATH_DELIM "bar")), KIT_OK); REQUIRE_EQ(path_type(SZ("test_folder")), PATH_FOLDER); REQUIRE_EQ(path_type(SZ("test_folder" PATH_DELIM "foo")), PATH_FOLDER); REQUIRE_EQ( path_type(SZ("test_folder" PATH_DELIM "foo" PATH_DELIM "bar")), PATH_FOLDER); REQUIRE_EQ(file_remove_recursive(SZ("test_folder"), NULL), KIT_OK); printf(" 1 \n"); fflush(stdout); REQUIRE_EQ(path_type(SZ("test_folder")), PATH_NONE); printf(" 2 \n"); fflush(stdout); } TEST("file remove") { FILE *f = fopen("test_file", "wb"); fclose(f); REQUIRE_EQ(path_type(SZ("test_file")), PATH_FILE); REQUIRE_EQ(file_remove(SZ("test_file")), KIT_OK); REQUIRE_EQ(path_type(SZ("test_file")), PATH_NONE); REQUIRE_EQ(file_remove(SZ("unexisted_file_foo_bar")), KIT_ERROR_UNLINK_FAILED); } TEST("file map read") { char buf[] = "bar"; FILE *f = fopen("foo", "wb"); fwrite(buf, 1, 3, f); fclose(f); mapped_file_t mf = file_map(SZ("foo"), 3, FILE_MAP_PRIVATE); REQUIRE_EQ(mf.status, KIT_OK); if (mf.status == KIT_OK) { REQUIRE_EQ(memcmp(buf, mf.bytes, 3), 0); file_unmap(&mf); } file_remove(SZ("foo")); } TEST("file map write") { mapped_file_t mf = file_map(SZ("foo"), 3, FILE_MAP_SHARED); REQUIRE_EQ(mf.status, KIT_OK); if (mf.status == KIT_OK) { memcpy(mf.bytes, "bar", 3); file_unmap(&mf); char buf[3]; FILE *f = fopen("foo", "rb"); i64 n = (i64) fread(buf, 1, 3, f); REQUIRE_EQ(n, 3); fclose(f); if (n == 3) REQUIRE_EQ(memcmp(buf, "bar", 3), 0); file_remove(SZ("foo")); } } #undef KIT_TEST_FILE