diff options
author | Vicent Marti <tanoku@gmail.com> | 2010-06-12 03:08:52 +0200 |
---|---|---|
committer | Vicent Marti <tanoku@gmail.com> | 2010-07-15 23:37:05 +0200 |
commit | b231ef3acdcf396dba5f83f89488be7519da551a (patch) | |
tree | 6dc05568057b37706c8453b3e24645a351fef6a3 | |
parent | 088a731f00a39fb3158dc9150b7c8d176df51867 (diff) | |
download | libgit2-b231ef3acdcf396dba5f83f89488be7519da551a.tar.gz |
Add new tests: t0502-table, t0503-tableit
"t0502-table" tests for basic functionality of the objects
table:
table_create (creating a new object table)
table_populate (fill & lookup on the object table)
table_resize (dynamically resize the table)
"t0503-tableit" tests the iterator for object tables:
table_iterator (make sure the iterator reaches all objects)
Signed-off-by: Vicent Marti <tanoku@gmail.com>
-rw-r--r-- | tests/t0502-table.c | 123 | ||||
-rw-r--r-- | tests/t0503-tableit.c | 47 |
2 files changed, 170 insertions, 0 deletions
diff --git a/tests/t0502-table.c b/tests/t0502-table.c new file mode 100644 index 000000000..f68f0b1b9 --- /dev/null +++ b/tests/t0502-table.c @@ -0,0 +1,123 @@ +#include "test_lib.h" +#include "test_helpers.h" +#include "commit.h" +#include "revobject.h" +#include "hash.h" + + +BEGIN_TEST(table_create) + + git_revpool_table *table = NULL; + + table = git_revpool_table_create(55); + must_be_true(table != NULL); + must_be_true(table->size_mask + 1 == 64); + + git_revpool_table_free(table); + +END_TEST + +BEGIN_TEST(table_populate) + + const int objects_n = 32; + int i; + git_revpool_object *objects; + git_revpool_table *table = NULL; + + table = git_revpool_table_create(objects_n * 2); + must_be_true(table != NULL); + + objects = git__malloc(objects_n * sizeof(git_revpool_object)); + memset(objects, 0x0, objects_n * sizeof(git_revpool_object)); + + /* populate the hash table */ + for (i = 0; i < objects_n; ++i) { + git_hash_buf(&(objects[i].id), &i, sizeof(int)); + must_pass(git_revpool_table_insert(table, &(objects[i]))); + } + + /* make sure all the inserted objects can be found */ + for (i = 0; i < objects_n; ++i) { + git_oid id; + git_revpool_object *ob; + + git_hash_buf(&id, &i, sizeof(int)); + ob = git_revpool_table_lookup(table, &id); + + must_be_true(ob != NULL); + must_be_true(ob == &(objects[i])); + } + + /* make sure we cannot find inexisting objects */ + for (i = 0; i < 50; ++i) { + int hash_id; + git_oid id; + + hash_id = (rand() % 50000) + objects_n; + git_hash_buf(&id, &hash_id, sizeof(int)); + must_be_true(git_revpool_table_lookup(table, &id) == NULL); + } + + git_revpool_table_free(table); + free(objects); + +END_TEST + + +BEGIN_TEST(table_resize) + + const int objects_n = 64; + int i; + unsigned int old_size; + git_revpool_object *objects; + git_revpool_table *table = NULL; + + table = git_revpool_table_create(objects_n); + must_be_true(table != NULL); + + objects = git__malloc(objects_n * sizeof(git_revpool_object)); + memset(objects, 0x0, objects_n * sizeof(git_revpool_object)); + + old_size = table->size_mask + 1; + + /* populate the hash table -- should be automatically resized */ + for (i = 0; i < objects_n; ++i) { + git_hash_buf(&(objects[i].id), &i, sizeof(int)); + must_pass(git_revpool_table_insert(table, &(objects[i]))); + } + + must_be_true(table->size_mask > old_size); + + /* make sure all the inserted objects can be found */ + for (i = 0; i < objects_n; ++i) { + git_oid id; + git_revpool_object *ob; + + git_hash_buf(&id, &i, sizeof(int)); + ob = git_revpool_table_lookup(table, &id); + + must_be_true(ob != NULL); + must_be_true(ob == &(objects[i])); + } + + /* force another resize */ + old_size = table->size_mask + 1; + git_revpool_table_resize(table); + must_be_true(table->size_mask > old_size); + + /* make sure all the inserted objects can be found */ + for (i = 0; i < objects_n; ++i) { + git_oid id; + git_revpool_object *ob; + + git_hash_buf(&id, &i, sizeof(int)); + ob = git_revpool_table_lookup(table, &id); + + must_be_true(ob != NULL); + must_be_true(ob == &(objects[i])); + } + + git_revpool_table_free(table); + free(objects); + +END_TEST diff --git a/tests/t0503-tableit.c b/tests/t0503-tableit.c new file mode 100644 index 000000000..8e9e1e4f9 --- /dev/null +++ b/tests/t0503-tableit.c @@ -0,0 +1,47 @@ +#include "test_lib.h" +#include "test_helpers.h" +#include "commit.h" +#include "revobject.h" +#include "hash.h" + +typedef struct _aux_object { + git_revpool_object object; + int visited; +} aux_object; + + +BEGIN_TEST(table_iterator) + + const int objects_n = 32; + int i; + aux_object *objects, *ob; + + git_revpool_table *table = NULL; + git_revpool_tableit iterator; + + table = git_revpool_table_create(objects_n * 2); + must_be_true(table != NULL); + + objects = git__malloc(objects_n * sizeof(aux_object)); + memset(objects, 0x0, objects_n * sizeof(aux_object)); + + /* populate the hash table */ + for (i = 0; i < objects_n; ++i) { + git_hash_buf(&(objects[i].object.id), &i, sizeof(int)); + must_pass(git_revpool_table_insert(table, (git_revpool_object *)&(objects[i]))); + } + + git_revpool_tableit_init(table, &iterator); + + /* iterate through all nodes, mark as visited */ + while ((ob = (aux_object *)git_revpool_tableit_next(&iterator)) != NULL) + ob->visited = 1; + + /* make sure all nodes have been visited */ + for (i = 0; i < objects_n; ++i) + must_be_true(objects[i].visited); + + git_revpool_table_free(table); + free(objects); + +END_TEST |