diff options
author | Bram Moolenaar <Bram@vim.org> | 2011-03-22 20:52:37 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2011-03-22 20:52:37 +0100 |
commit | b3c5284c5b228794bd17f63bb5fa8d78e5d22ecd (patch) | |
tree | 20f7e7db00e82282b0bdd27eded18449ce77e310 | |
parent | b05b10a3c0367c0b7bbe4fbe9b287ca46b92b05b (diff) | |
download | vim-git-b3c5284c5b228794bd17f63bb5fa8d78e5d22ecd.tar.gz |
Add missing files for patch 7.3.143.v7.3.143
-rw-r--r-- | src/memfile_test.c | 145 | ||||
-rw-r--r-- | src/testdir/test77.in | 27 | ||||
-rw-r--r-- | src/testdir/test77.ok | 1 |
3 files changed, 173 insertions, 0 deletions
diff --git a/src/memfile_test.c b/src/memfile_test.c new file mode 100644 index 000000000..e9f32b36e --- /dev/null +++ b/src/memfile_test.c @@ -0,0 +1,145 @@ +/* vi:set ts=8 sts=4 sw=4: + * + * VIM - Vi IMproved by Bram Moolenaar + * + * Do ":help uganda" in Vim to read copying and usage conditions. + * Do ":help credits" in Vim to see a list of people who contributed. + * See README.txt for an overview of the Vim source code. + */ + +/* + * memfile_test.c: Unittests for memfile.c + * Mostly by Ivan Krasilnikov. + */ + +#undef NDEBUG +#include <assert.h> + +/* Must include main.c because it contains much more than just main() */ +#define NO_VIM_MAIN +#include "main.c" + +/* This file has to be included because the tested functions are static */ +#include "memfile.c" + +#define index_to_key(i) ((i) ^ 15167) +#define TEST_COUNT 50000 + +static void test_mf_hash __ARGS((void)); + +/* + * Test mf_hash_*() functions. + */ + static void +test_mf_hash() +{ + mf_hashtab_T ht; + mf_hashitem_T *item; + blocknr_T key; + long_u i; + long_u num_buckets; + + mf_hash_init(&ht); + + /* insert some items and check invariants */ + for (i = 0; i < TEST_COUNT; i++) + { + assert(ht.mht_count == i); + + /* check that number of buckets is a power of 2 */ + num_buckets = ht.mht_mask + 1; + assert(num_buckets > 0 && (num_buckets & (num_buckets - 1)) == 0); + + /* check load factor */ + assert(ht.mht_count <= (num_buckets << MHT_LOG_LOAD_FACTOR)); + + if (i < (MHT_INIT_SIZE << MHT_LOG_LOAD_FACTOR)) + { + /* first expansion shouldn't have occurred yet */ + assert(num_buckets == MHT_INIT_SIZE); + assert(ht.mht_buckets == ht.mht_small_buckets); + } + else + { + assert(num_buckets > MHT_INIT_SIZE); + assert(ht.mht_buckets != ht.mht_small_buckets); + } + + key = index_to_key(i); + assert(mf_hash_find(&ht, key) == NULL); + + /* allocate and add new item */ + item = (mf_hashitem_T *)lalloc_clear(sizeof(mf_hashtab_T), FALSE); + assert(item != NULL); + item->mhi_key = key; + mf_hash_add_item(&ht, item); + + assert(mf_hash_find(&ht, key) == item); + + if (ht.mht_mask + 1 != num_buckets) + { + /* hash table was expanded */ + assert(ht.mht_mask + 1 == num_buckets * MHT_GROWTH_FACTOR); + assert(i + 1 == (num_buckets << MHT_LOG_LOAD_FACTOR)); + } + } + + /* check presence of inserted items */ + for (i = 0; i < TEST_COUNT; i++) + { + key = index_to_key(i); + item = mf_hash_find(&ht, key); + assert(item != NULL); + assert(item->mhi_key == key); + } + + /* delete some items */ + for (i = 0; i < TEST_COUNT; i++) + { + if (i % 100 < 70) + { + key = index_to_key(i); + item = mf_hash_find(&ht, key); + assert(item != NULL); + assert(item->mhi_key == key); + + mf_hash_rem_item(&ht, item); + assert(mf_hash_find(&ht, key) == NULL); + + mf_hash_add_item(&ht, item); + assert(mf_hash_find(&ht, key) == item); + + mf_hash_rem_item(&ht, item); + assert(mf_hash_find(&ht, key) == NULL); + + vim_free(item); + } + } + + /* check again */ + for (i = 0; i < TEST_COUNT; i++) + { + key = index_to_key(i); + item = mf_hash_find(&ht, key); + + if (i % 100 < 70) + { + assert(item == NULL); + } + else + { + assert(item != NULL); + assert(item->mhi_key == key); + } + } + + /* free hash table and all remaining items */ + mf_hash_free_all(&ht); +} + + int +main() +{ + test_mf_hash(); + return 0; +} diff --git a/src/testdir/test77.in b/src/testdir/test77.in new file mode 100644 index 000000000..441845c34 --- /dev/null +++ b/src/testdir/test77.in @@ -0,0 +1,27 @@ +Inserts 2 million lines with consecutive integers starting from 1 +(essentially, the output of GNU's seq 1 2000000), writes them to Xtest +and writes its cksum to test.out. + +We need 2 million lines to trigger a call to mf_hash_grow(). If it would mess +up the lines the checksum would differ. + +cksum is part of POSIX and so should be available on most Unixes. +If it isn't available then the test will be skipped. + +STARTTEST +:so small.vim +:if !executable("cksum") +: e! test.ok +: w! test.out +: qa! +:endif +:set fileformat=unix undolevels=-1 +ggdG +:let i = 1 +:while i <= 2000000 | call append(i, range(i, i + 99)) | let i += 100 | endwhile +ggdd +:w! Xtest +:!cksum Xtest > test.out +:qa! +ENDTEST + diff --git a/src/testdir/test77.ok b/src/testdir/test77.ok new file mode 100644 index 000000000..11f148c73 --- /dev/null +++ b/src/testdir/test77.ok @@ -0,0 +1 @@ +3678979763 14888896 Xtest |