diff options
author | sanine <sanine.not@pm.me> | 2022-08-27 23:52:56 -0500 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2022-08-27 23:52:56 -0500 |
commit | a4dd0ad63c00f4dee3b86dfd3075d1d61b2b3180 (patch) | |
tree | 13bd5bfa15e6fea2a12f176bae79adf9c6fd0933 /3rdparty/plibsys/tests/pdir_test.cpp | |
parent | bde3e4f1bb7b8f8abca0884a7d994ee1c17a66b1 (diff) |
add plibsys
Diffstat (limited to '3rdparty/plibsys/tests/pdir_test.cpp')
-rw-r--r-- | 3rdparty/plibsys/tests/pdir_test.cpp | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/3rdparty/plibsys/tests/pdir_test.cpp b/3rdparty/plibsys/tests/pdir_test.cpp new file mode 100644 index 0000000..7b1689d --- /dev/null +++ b/3rdparty/plibsys/tests/pdir_test.cpp @@ -0,0 +1,248 @@ +/* + * The MIT License + * + * Copyright (C) 2015-2017 Alexander Saprykin <saprykin.spb@gmail.com> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * 'Software'), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "plibsys.h" +#include "ptestmacros.h" + +#include <string.h> + +P_TEST_MODULE_INIT (); + +#define PDIR_ENTRY_DIR "test_2" +#define PDIR_ENTRY_FILE "test_file.txt" +#define PDIR_TEST_DIR "." P_DIR_SEPARATOR "pdir_test_dir" +#define PDIR_TEST_DIR_IN "." P_DIR_SEPARATOR "pdir_test_dir" P_DIR_SEPARATOR "test_2" +#define PDIR_TEST_FILE "." P_DIR_SEPARATOR "pdir_test_dir" P_DIR_SEPARATOR "test_file.txt" + +extern "C" ppointer pmem_alloc (psize nbytes) +{ + P_UNUSED (nbytes); + return (ppointer) NULL; +} + +extern "C" ppointer pmem_realloc (ppointer block, psize nbytes) +{ + P_UNUSED (block); + P_UNUSED (nbytes); + return (ppointer) NULL; +} + +extern "C" void pmem_free (ppointer block) +{ + P_UNUSED (block); +} + +P_TEST_CASE_BEGIN (pdir_nomem_test) +{ + p_libsys_init (); + + PMemVTable vtable; + + vtable.free = pmem_free; + vtable.malloc = pmem_alloc; + vtable.realloc = pmem_realloc; + + P_TEST_CHECK (p_mem_set_vtable (&vtable) == TRUE); + + /* Cleanup previous run */ + p_dir_remove (PDIR_TEST_DIR_IN, NULL); + p_dir_remove (PDIR_TEST_DIR, NULL); + + P_TEST_REQUIRE (p_dir_create (PDIR_TEST_DIR, 0777, NULL) == TRUE); + P_TEST_REQUIRE (p_dir_create (PDIR_TEST_DIR_IN, 0777, NULL) == TRUE); + + P_TEST_CHECK (p_dir_new (PDIR_TEST_DIR"/", NULL) == NULL); + + /* Revert memory management back */ + p_mem_restore_vtable (); + + /* Try out of memory when iterating */ + PDir *dir = p_dir_new (PDIR_TEST_DIR"/", NULL); + P_TEST_CHECK (dir != NULL); + + vtable.free = pmem_free; + vtable.malloc = pmem_alloc; + vtable.realloc = pmem_realloc; + + P_TEST_CHECK (p_mem_set_vtable (&vtable) == TRUE); + + P_TEST_CHECK (p_dir_get_next_entry (dir, NULL) == NULL); + + /* Cleanup */ + p_mem_restore_vtable (); + + p_dir_free (dir); + + P_TEST_CHECK (p_dir_remove (PDIR_TEST_DIR_IN, NULL) == TRUE); + P_TEST_CHECK (p_dir_remove (PDIR_TEST_DIR, NULL) == TRUE); + + p_libsys_shutdown (); +} +P_TEST_CASE_END () + +P_TEST_CASE_BEGIN (pdir_general_test) +{ + p_libsys_init (); + + P_TEST_CHECK (p_dir_new (NULL, NULL) == NULL); + P_TEST_CHECK (p_dir_new ("." P_DIR_SEPARATOR "pdir_test_dir_new", NULL) == NULL); + P_TEST_CHECK (p_dir_create (NULL, -1, NULL) == FALSE); +#ifndef P_OS_VMS + P_TEST_CHECK (p_dir_create ("." P_DIR_SEPARATOR "pdir_test_dir_new" P_DIR_SEPARATOR "test_dir", -1, NULL) == FALSE); +#endif + P_TEST_CHECK (p_dir_remove (NULL, NULL) == FALSE); + P_TEST_CHECK (p_dir_remove ("." P_DIR_SEPARATOR "pdir_test_dir_new", NULL) == FALSE); + P_TEST_CHECK (p_dir_is_exists (NULL) == FALSE); + P_TEST_CHECK (p_dir_is_exists ("." P_DIR_SEPARATOR "pdir_test_dir_new") == FALSE); + P_TEST_CHECK (p_dir_get_path (NULL) == NULL); + P_TEST_CHECK (p_dir_get_next_entry (NULL, NULL) == NULL); + P_TEST_CHECK (p_dir_rewind (NULL, NULL) == FALSE); + + p_dir_entry_free (NULL); + p_dir_free (NULL); + + /* Cleanup previous run */ + p_dir_remove (PDIR_TEST_DIR_IN, NULL); + p_dir_remove (PDIR_TEST_DIR, NULL); + + P_TEST_REQUIRE (p_dir_create (PDIR_TEST_DIR, 0777, NULL) == TRUE); + P_TEST_REQUIRE (p_dir_create (PDIR_TEST_DIR, 0777, NULL) == TRUE); + P_TEST_REQUIRE (p_dir_create (PDIR_TEST_DIR_IN, 0777, NULL) == TRUE); + P_TEST_REQUIRE (p_dir_create (PDIR_TEST_DIR_IN, 0777, NULL) == TRUE); + + FILE *file = fopen (PDIR_TEST_FILE, "w"); + P_TEST_REQUIRE (file != NULL); + P_TEST_REQUIRE (p_file_is_exists (PDIR_TEST_FILE) == TRUE); + + fprintf (file, "This is a test file string\n"); + + P_TEST_CHECK (fclose (file) == 0); + + P_TEST_CHECK (p_dir_is_exists (PDIR_TEST_DIR) == TRUE); + P_TEST_CHECK (p_dir_is_exists (PDIR_TEST_DIR_IN) == TRUE); + + PDir *dir = p_dir_new (PDIR_TEST_DIR"/", NULL); + + P_TEST_CHECK (dir != NULL); + + pint dir_count = 0; + pint file_count = 0; + pboolean has_entry_dir = FALSE; + pboolean has_entry_file = FALSE; + + PDirEntry *entry; + + while ((entry = p_dir_get_next_entry (dir, NULL)) != NULL) { + P_TEST_CHECK (entry->name != NULL); + + switch (entry->type) { + case P_DIR_ENTRY_TYPE_DIR: + ++dir_count; + break; + case P_DIR_ENTRY_TYPE_FILE: + ++file_count; + break; + case P_DIR_ENTRY_TYPE_OTHER: + default: + break; + } + + if (strcmp (entry->name, PDIR_ENTRY_DIR) == 0) + has_entry_dir = TRUE; + else if (strcmp (entry->name, PDIR_ENTRY_FILE) == 0) + has_entry_file = TRUE; + + p_dir_entry_free (entry); + } + + P_TEST_CHECK (dir_count > 0 && dir_count < 4); + P_TEST_CHECK (file_count == 1); + P_TEST_CHECK (has_entry_dir == TRUE); + P_TEST_CHECK (has_entry_file == TRUE); + + P_TEST_CHECK (p_dir_rewind (dir, NULL) == TRUE); + + pint dir_count_2 = 0; + pint file_count_2 = 0; + has_entry_dir = FALSE; + has_entry_file = FALSE; + + while ((entry = p_dir_get_next_entry (dir, NULL)) != NULL) { + P_TEST_CHECK (entry->name != NULL); + + switch (entry->type) { + case P_DIR_ENTRY_TYPE_DIR: + ++dir_count_2; + break; + case P_DIR_ENTRY_TYPE_FILE: + ++file_count_2; + break; + case P_DIR_ENTRY_TYPE_OTHER: + default: + break; + } + + if (strcmp (entry->name, PDIR_ENTRY_DIR) == 0) + has_entry_dir = TRUE; + else if (strcmp (entry->name, PDIR_ENTRY_FILE) == 0) + has_entry_file = TRUE; + + p_dir_entry_free (entry); + } + + P_TEST_CHECK (dir_count_2 > 0 && dir_count_2 < 4); + P_TEST_CHECK (file_count_2 == 1); + P_TEST_CHECK (has_entry_dir == TRUE); + P_TEST_CHECK (has_entry_file == TRUE); + + /* Compare two previous attempts */ + P_TEST_CHECK (dir_count == dir_count_2); + P_TEST_CHECK (file_count == file_count_2); + + /* Remove all stuff */ + P_TEST_CHECK (p_file_remove (PDIR_TEST_FILE, NULL) == TRUE); + P_TEST_CHECK (p_dir_remove (PDIR_TEST_DIR, NULL) == FALSE); + P_TEST_CHECK (p_dir_remove (PDIR_TEST_DIR_IN, NULL) == TRUE); + P_TEST_CHECK (p_dir_remove (PDIR_TEST_DIR, NULL) == TRUE); + + P_TEST_CHECK (p_dir_is_exists (PDIR_TEST_DIR_IN) == FALSE); + P_TEST_CHECK (p_dir_is_exists (PDIR_TEST_DIR) == FALSE); + + pchar *orig_path = p_dir_get_path (dir); + P_TEST_CHECK (strcmp (orig_path, PDIR_TEST_DIR"/") == 0); + p_free (orig_path); + + p_dir_free (dir); + + p_libsys_shutdown (); +} +P_TEST_CASE_END () + +P_TEST_SUITE_BEGIN() +{ + P_TEST_SUITE_RUN_CASE (pdir_nomem_test); + P_TEST_SUITE_RUN_CASE (pdir_general_test); +} +P_TEST_SUITE_END() |